[ { "metadata": { "title": "Plataforma | Documentação técnica", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=653566687", "path": "\\Plataforma Documentação técnica.md" }, "content": "Plataforma | Documentação técnica" }, { "metadata": { "title": "Plataforma | Documentação técnica", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=653566687", "path": "\\Plataforma Documentação técnica.md" }, "content": "Plataforma | Documentação técnica\n\n\n![](images\\documenta%C3%A7%C3%A3o-t%C3%A9cnica.png)\n\n---\n\nAqui você encontra detalhes técnicos sobre a plataforma TOTVS Fluig e fica por dentro de desenvolvimentos sobre ela.\n\n**oculto**\n\nOs documentos para os quais os *links* sobre segurança abaixo direcionam estão anexados na página [Segurança da plataforma](Plataforma Documentação técnica/Especificações Técnicas/Segurança da plataforma.md), ao atualizar esses documentos nela, serão automaticamente atualizados aqui.\n\n \n\n![](images\\dica.png)\n\n# [Atualização de segurança](Plataforma Documentação técnica/Desenvolvimento sobre a plataforma/Desenvolvimento de Datasets/Datasets acessando banco de dados externo.md)\n\nA equipe do TOTVS Fluig Plataforma, a partir das atualizações **1.6.5-210521 Liquid**, **1.7.0-210518 Lake** e **1.7.1-210518 Crystal Lake**, realizou uma atualização de segurança com o objetivo de tornar sua plataforma ainda mais segura para que você possa realizar todas as suas operações sem precisar se preocupar com ataques maliciosos. \nPor isso, orientamos a leitura da documentação [Datasets acessando banco de dados externo](Plataforma Documentação técnica/Desenvolvimento sobre a plataforma/Desenvolvimento de Datasets/Datasets acessando banco de dados externo.md) para que você possa ficar por dentro do modo correto de utilização deste procedimento. \nEstamos sempre trabalhando para que a sua experiência com a gente seja cada vez mais fluída e agradável.\n \n \n**Segurança nos padrões internacionais** \nO TOTVS Fluig passa por testes de segurança seguindo as principais metodologias internacionais. Ele faz parte do programa de *Bug Bounty* da TOTVS, que tem como principal objetivo identificar e corrigir potenciais vulnerabilidades em seu ambiente tecnológico de produtos, aderindo e seguindo as melhores práticas recomendadas pelo OWASP (*Open Web Application Security Project*), uma comunidade mundial dedicada a melhorar a segurança de *software*. Ao alinhar nossos processos com as diretrizes do OWASP, buscamos garantir a identificação e correção eficazes de potenciais vulnerabilidades em nossa plataforma, contribuindo para um ambiente digital mais seguro e resiliente. \n Possuímos certificados e atestados de reconhecimento que demonstram nosso compromisso em seguir as práticas do mercado para processos de desenvolvimento seguro. Esses documentos evidenciam que nossas metodologias e procedimentos estão alinhados com os mais altos padrões de segurança, validados por auditorias internas e externas. \nOs certificados e atestados, como os exemplificados abaixo, podem ser solicitados a qualquer momento por meio dos nossos canais de atendimento: \n     • [Certificado de conformidade em testes de segurança](https://tdn.totvs.com/download/attachments/653566687/TISBD%20-%20Certificado%20de%20Conformidade%20em%20testes%20de%20seguran%C3%A7a_FLUIG.pdf.pdf); \n     • [*Letter of attestation - Bounty program*.](https://tdn.totvs.com/download/attachments/653566687/Letter%20of%20attestation%20-%20Bounty%20program%20Fluig.pdf%20-%20254.706%20%C3%97%20297.039mm%20-%20Canva.pdf)\n\n![](images\\instala%C3%A7%C3%A3o.png)\n\n# [Guia de instalação](Plataforma Documentação técnica/Instalação e Atualização/Guia de instalação da plataforma.md)\n\nInstale a plataforma de forma fácil e rápida.\n\n![](images\\atualiza%C3%A7%C3%A3o.png)\n\n# [Guia de atualização](Plataforma Documentação técnica/Instalação e Atualização/Guia de atualização da plataforma.md)\n\nAtualize sempre sua plataforma para aproveitar todas as novidades liberadas.\n\n![](images\\matriz-portabilidade.png)\n\n# [Matriz de portabilidade](Plataforma Documentação técnica/Especificações Técnicas/Matriz de Portabilidade.md)\n\nSaiba quais são os requisitos necessários utilizar a plataforma como sistema operacional e navegadores.\n\n![](images\\dimensionamento.png)\n\n# [Dimensionamento](Plataforma Documentação técnica/Especificações Técnicas/Dimensionamento.md)\n\nConheça modelos para definir a melhor infraestrutura considerando suas necessidades atuais e futuras.\n\n![](images\\portais.png)\n\n# [Portais](Plataforma Documentação técnica/Recurso de Páginas e Widgets (WCM).md)/Estrutura de páginas.md)\n\nCrie portais para a sua empresa para agregar valor ao seu negócio.\n\n![](images\\layouts.png)\n\n# [*Layouts*](Plataforma Documentação técnica/Recurso de Páginas e Widgets (WCM).md)/Construção de Widgets e Layouts/Layouts.md)\n\nDesenvolva *layouts*modernos e atraentes para suas páginas.\n\n![](images\\widgets.png)\n\n# [*Widgets*](Plataforma Documentação técnica/Recurso de Páginas e Widgets (WCM).md)/Construção de Widgets e Layouts/Widgets.md)\n\nConstrua *widgets* personalizadas para suas páginas.\n\n![](images\\formul%C3%A1rios.png)\n\n# [Formulários](Plataforma Documentação técnica/Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários.md)\n\nDesenvolva e configure formulários de acordo com sua necessidade." }, { "metadata": {}, "content": "# Biblioteca de Snippets: JAVA\n\n## Origem: Criando um aplicativo para enviar notificações" }, { "metadata": {}, "content": "```java\npackage com.fluig;\nimport java.util.HashMap;\nimport javax.annotation.PostConstruct;\nimport javax.ejb.Singleton;\nimport javax.ejb.Startup;\nimport javax.jms.JMSException;\nimport javax.jms.ObjectMessage;\nimport javax.jms.Queue;\nimport javax.jms.QueueConnection;\nimport javax.jms.QueueConnectionFactory;\nimport javax.jms.QueueSender;\nimport javax.jms.QueueSession;\nimport javax.naming.InitialContext;\nimport javax.naming.NamingException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n/**\n * Registra o aplicatico como listener para os alertas.\n */\n@Startup\n@Singleton\npublic class StartupLoader {\n\tprivate transient Logger log = LoggerFactory.getLogger(StartupLoader.class);\n\t/*\n\t * Nome da fila que será usada para receber os alertas.\n\t */\n\tprivate static final String QUEUE = \"AlertSenderSampleQueue\";\n\t/**\n\t * ID do tenante para o qual será registrado. Quando houver mais de um\n\t * tenante, deverá fazer uma chamada para cada tenante.\n\t */\n\tprivate static final Long TENANT_ID = 10097l;\n\t@PostConstruct\n\tprivate void startup() {\n\t\tlog.info(\"Inicializando aplicativo\");\n\t\ttry {\n\t\t\tInitialContext ic = new InitialContext();\n\t\t\tQueue q = (Queue) ic\n\t\t\t\t\t.lookup(\"java:global/TOTVSTechAsyncQueue\");\n\t\t\tQueueConnectionFactory factory = (QueueConnectionFactory) ic\n\t\t\t\t\t.lookup(\"java:global/FluigRemoteXAConnectionFactory\");\n\t\t\tQueueConnection connection = factory.createQueueConnection();\n\t\t\tQueueSession session = null;\n\t\t\tQueueSender sender = null;\n\t\t\ttry {\n\t\t\t\tsession = connection.createQueueSession(false,\n\t\t\t\t\t\tjavax.jms.Session.AUTO_ACKNOWLEDGE);\n\t\t\t\tsender = session.createSender(q);\n\t\t\t\tHashMap values = new HashMap();\n\t\t\t\t// Código do aplicativo.\n\t\t\t\tvalues.put(\"applicationKey\", \"alert.app.sender.sample\");\n\t\t\t\t// Chave da descrição do aplicativo.\n\t\t\t\tvalues.put(\"descriptionKey\",\n\t\t\t\t\t\t\"alert.app.sender.sample.description\");\n\t\t\t\t// ID do tenante.\n\t\t\t\tvalues.put(\"tenantId\", TENANT_ID);\n\t\t\t\tObjectMessage msg = session.createObjectMessage();\n\t\t\t\tmsg.setObject(values);\n\t\t\t\tmsg.setStringProperty(\"action\", \"registerAlertAppSender\");\n\t\t\t\tsender.send(msg);\n\t\t\t\tlog.info(\"Inicialização do aplicativo OK\");\n\t\t\t} finally {\n\t\t\t\tif (sender != null) {\n\t\t\t\t\tsender.close();\n\t\t\t\t}\n\t\t\t\tif (session != null) {\n\t\t\t\t\tsession.close();\n\t\t\t\t}\n\t\t\t\tif (connection != null) {\n\t\t\t\t\tconnection.close();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (NamingException ex) {\n\t\t\tlog.error(\"Nao foi possivel registrar o serviço de notificação via whatsapp\");\n\t\t\tex.printStackTrace();\n\t\t} catch (JMSException ex) {\n\t\t\tlog.error(\"Nao foi possivel registrar o serviço de notificação via whatsapp\");\n\t\t\tex.printStackTrace();\n\t\t}\n\t}\n}\n```" }, { "metadata": {}, "content": "## Origem: Criando um aplicativo para enviar notificações\n```java\npackage com.fluig;\nimport java.io.Serializable;\nimport java.util.Map;\nimport javax.ejb.ActivationConfigProperty;\nimport javax.ejb.EJB;\nimport javax.ejb.MessageDriven;\nimport javax.ejb.TransactionAttribute;\nimport javax.ejb.TransactionAttributeType;\nimport javax.jms.JMSException;\nimport javax.jms.Message;\nimport javax.jms.MessageListener;\nimport javax.jms.ObjectMessage;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n/**\n * Esta é a classe que será chamada pela Central de Notificações para enviar\n * alertas por este aplicativo.\n */\n@MessageDriven(name = \"topic/FluigNotificationTopic\", mappedName = \"FluigNotificationTopic\", activationConfig = {\n\t\t@ActivationConfigProperty(propertyName = \"acknowledgeMode\", propertyValue = \"Auto-acknowledge\"),\n\t\t@ActivationConfigProperty(propertyName = \"destinationType\", propertyValue = \"javax.jms.Topic\"),\n\t\t@ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"FluigNotificationTopic\")\n})\npublic class AlertSampleMDBBean implements MessageListener {\n\tprivate static final Logger log = LoggerFactory\n\t\t\t.getLogger(AlertSampleMDBBean.class);\n\t@EJB(lookup = TxtSenderService.JNDI_REMOTE_NAME)\n\tprivate TxtSenderService service;\n\t@Override\n\t@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)\n\tpublic void onMessage(final Message message) {\n\t\tif (message instanceof ObjectMessage) {\n\t\t\tfinal ObjectMessage msg = (ObjectMessage) message;\n\t\t\ttry {\n\t\t\t\tfinal Serializable obj = msg.getObject();\n\t\t\t\tif (log.isDebugEnabled()) {\n\t\t\t\t\tlog.debug(\"AlertSenderSampleQueue.onMessage - obj: \" + obj);\n\t\t\t\t}\n\t\t\t\tservice.sendAlert((Map) obj);\n\t\t\t\tif (log.isDebugEnabled()) {\n\t\t\t\t\tlog.debug(\"AlertSenderSampleQueue.onMessage - FIM\");\n\t\t\t\t}\n\t\t\t} catch (final JMSException ex) {\n\t\t\t\tlog.error(ex.getMessage(), ex);\n\t\t\t}\n\t\t}\n\t}\n}\n```" }, { "metadata": {}, "content": "# Biblioteca de Snippets: JAVASCRIPT\n\n## Origem: Acessando Datasets\n```javascript\nvar newDataset = DatasetBuilder.newDataset();\n newDataset.addColumn(\"Document ID\");\n newDataset.addColumn(\"Document version\");\n newDataset.addColumn(\"Document Name\");\n newDataset.addColumn(\"Document Type\");\n\n var listDocuments = datasets.get(\"document\").search({\n \"documentType\": [\"1\", \"2\"]\n });\n\n for(var index = 0; index < listDocuments.length; index++) {\n newDataset.addRow([\n listDocuments[index][\"documentPK.documentId\"], \n listDocuments[index][\"documentPK.version\"],\n listDocuments[index].documentDescription,\n listDocuments[index].documentType\n ]);\n }\n\n return newDataset;\n```\n\n## Origem: Acessando Datasets\n```javascript\nvar newDataset = DatasetBuilder.newDataset();\n newDataset.addColumn(\"Document ID\");\n newDataset.addColumn(\"Document version\");\n newDataset.addColumn(\"Document Name\");\n newDataset.addColumn(\"Document Type\");\n\n var listDocuments = datasets.get(\"document\").search({\n \"documentDescription\": {\n \"value\": \"%API%\",\n \"like\": true\n },\n \"limit\": 5\n });\n\n for(var index = 0; index < listDocuments.length; index++) {\n newDataset.addRow([\n listDocuments[index][\"documentPK.documentId\"], \n listDocuments[index][\"documentPK.version\"],\n listDocuments[index].documentDescription,\n listDocuments[index][\"documentType\"]\n ]);\n }\n\n return newDataset;\n```\n\n## Origem: Construção do Dataset Avançado" }, { "metadata": {}, "content": "```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar dataset = DatasetBuilder.newDataset();\n\t \n\t//Cria as colunas\n\tdataset.addColumn(\"Sigla\");\n\tdataset.addColumn(\"Estado\");\n\tdataset.addColumn(\"Capital\");\n\tdataset.addColumn(\"Area\");\n\t \n\t//Cria os registros\n\tdataset.addRow(new Array(\"AM\", \"Amazonas\", \"Manaus\", 1570746));\n\tdataset.addRow(new Array(\"PA\", \"Pará\", \"Belém\", 1247690));\n\tdataset.addRow(new Array(\"MT\", \"Mato Grosso\", \"Cuiabá\", 903358));\n\tdataset.addRow(new Array(\"TO\", \"Tocantins\", \"Palmas\", 277621));\n\tdataset.addRow(new Array(\"PI\", \"Piauí\", \"Teresina\", 251529));\n\t\n\treturn dataset;\n}\n```\n\n## Origem: Construção do Dataset Avançado\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar company;\n\tvar initialDate;\n\tvar finalDate;\n\tif (constraints != null) {\n\t\tfor (var i = 0; i < constraints.length; i++) {\n\t\t\tif (constraints[i].fieldName == \"company\") { \n\t\t\t\tcompany = constraints[i].initialValue; \n\t\t\t}\n\t\t\telse if (constraints[i].fieldName == \"date\") { \n\t\t\t\tinitialDate = constraints[i].initialValue; \n\t\t\t\tfinalDate = constraints[i].finalValue; \n\t\t\t}\n\t\t}\n\t}\n\t.\n\t.\n\t.\n}\n```\n\n## Origem: Construção do Dataset Avançado" }, { "metadata": {}, "content": "```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar dataset = DatasetBuilder.newDataset();\n\tdataset.addColumn(\"DDD\");\n\tdataset.addColumn(\"Fone\");\n\tdataset.addColumn(\"Nome\");\n\t\n\tvar tempDataset = getDefaultValues(); // consulta a fonte de dados do dataset\n\t\t\n\tif(constraints!=null && constraints.length){ //se tiver constraint filtra\n\t\t\n\t\tif(constraints[0].constraintType==ConstraintType.MUST) { // implementação somente para o MUST\n\t\t\t\n\t\t\tfor(var a=0;a<\ttempDataset.length;a++){\n\t\t\t\t// se o valor inicial da constraint for igual ao valor do campo na constraint adiciona a linha\n\t\t\t\tif(constraints[0].initialValue==tempDataset[a][constraints[0].fieldName]){ \n\t\t\t\t\tdataset.addRow(new Array(tempDataset[a][\"DDD\"], tempDataset[a][\"Fone\"],tempDataset[a][\"Nome\"]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else { // se não tiver constraint adiciona todas as linhas\n\t\tfor(var a=0;a<\ttempDataset.length;a++){\n\t\t\tdataset.addRow(new Array(tempDataset[a][\"DDD\"], tempDataset[a][\"Fone\"],tempDataset[a][\"Nome\"]));\n\t\t}\n\t}\n\t\n\treturn dataset;\n}\n\nfunction getDefaultValues(){ // retorna valores default para serem filtrados\n\treturn \t[{\n\t\t\t\tDDD: \"47\",\n\t\t\t\tFone: \"1111-1111\",\n\t\t\t\tNome: \"Marcos\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tDDD: \"47\",\n\t\t\t\tFone: \"2222-2222\",\n\t\t\t\tNome: \"Roberto\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tDDD: \"41\",\n\t\t\t\tFone: \"3333-3333\",\n\t\t\t\tNome: \"Maria\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tDDD: \"31\",\n\t\t\t\tFone: \"4444-4444\",\n\t\t\t\tNome: \"Francisco\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tDDD: \"11\",\n\t\t\t\tFone: \"5555-5555\",\n\t\t\t\tNome: \"Michel\"\n\t\t\t}];\n}\n```\n\n## Origem: Construção do Dataset Avançado\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar c1 = DatasetFactory.createConstraint(\"DDD\", \"47\", \"47\", ConstraintType.MUST);\n\t\n\tvar dataset = DatasetFactory.getDataset(\"exemploFiltro\", null, new Array(c1), null);\n\treturn dataset;\n}\n```\n\n## Origem: Construção do Dataset Avançado\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar companyId = getValue(\"WKCompany\");\n\tvar currentUser = getValue(\"WKUser\");\n\t.\n\t.\n\t.\n}\n```" }, { "metadata": {}, "content": "## Origem: Construção do Dataset Avançado" }, { "metadata": {}, "content": "```javascript\nfunction createDataset(fields, constraints, sortFields) {\n var newDataset = DatasetBuilder.newDataset();\n try{ \n var dataset = \"\";\n var filter = [];\n var currentUser = getValue(\"WKUser\"); //Código do usuário logado\n var currentCompany = getValue(\"WKCompany\"); //Código da empresa do usuário logado\n \n var groupCode = \"grupo\"; //Código do grupo que o usuário precisa pertencer para passar na validação.\n dataset = \"colleagueGroup\" //Nome do dataset que pesquisa a relação de grupos e usuários.\n \n filter= [DatasetFactory.createConstraint(\"colleagueGroupPK.companyId\", currentCompany , currentCompany, ConstraintType.MUST), \n DatasetFactory.createConstraint(\"colleagueGroupPK.colleagueId\", currentUser , currentUser, ConstraintType.MUST), \n DatasetFactory.createConstraint(\"colleagueGroupPK.groupId\", groupCode, groupCode, ConstraintType.MUST)]; //Cria o filtro para empresa, usuário e grupo.\n\n /** Codigo para pesquisar por papel ao invés de grupo.\n * \n var roleCode = \"papel\"; //Código do papel que o usuário precisa pertencer para passar na validação.\n dataset = \"workflowColleagueRole\" //Nome do dataset que pesquisa a relação de papéis e usuários.\n \n filter= [DatasetFactory.createConstraint(\"workflowColleagueRolePK.companyId\", currentCompany , currentCompany, ConstraintType.MUST), \n DatasetFactory.createConstraint(\"workflowColleagueRolePK.colleagueId\", currentUser , currentUser, ConstraintType.MUST), \n DatasetFactory.createConstraint(\"workflowColleagueRolePK.roleId\", roleCode, roleCode, ConstraintType.MUST)];\n */\n var validation = DatasetFactory.getDataset(dataset, null, filter, null); //Realiza a chamada do dataset\n \n if(validation.rowsCount==1){ //Se tiver uma linha quer dizer que o usuário logado faz parte do grupo/papel informado\n //Esse retorno é só para informar que passou da validação, mas aqui dentro ficaria o codigo que o usuário tem permissão de acesso.\n newDataset.addColumn(\"SUCCESS\");\n newDataset.addRow([\"ok\"]);\n } else {\n //Esse retorno é só para informar que o usuário não faz parte do grupo/papel. \n newDataset.addColumn(\"ERROR\");\n newDataset.addRow([\"sem permissão\"]);\n }\n \n } catch(e) {\n newDataset.addColumn(\"ERROR\");\n newDataset.addRow([\"chamada incorreta\"]);\n return newDataset; \n }\n return newDataset;\n}\n```" }, { "metadata": {}, "content": "## Origem: Construção do Dataset Avançado\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n var c1 = null;\n var c2 = null;\n var filter = null;\n \n if (constraints.length > 0)\n {\n c1 = DatasetFactory.createConstraint(\"mail\", \"%\" + constraints[0].initialValue + \"%\" , \"%\" + constraints[0].finalValue + \"%\", ConstraintType.SHOULD);\n c2 = DatasetFactory.createConstraint(\"mail\", \"%%\", \"%%\", ConstraintType.SHOULD);\n\n\n c1.setLikeSearch(true);\n c2.setLikeSearch(true);\n filter = new Array (c1, c2);\n } \n var dataset = DatasetFactory.getDataset(\"colleague\", null, filter, sortFields);\n \n return dataset;\n}\n```\n\n## Origem: Construção do Dataset Avançado" }, { "metadata": {}, "content": "```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\t\n\t//Cria as colunas\n\tvar dataset = DatasetBuilder.newDataset();\n\tdataset.addColumn(\"NumFormulario\");\n\tdataset.addColumn(\"Id\");\n\tdataset.addColumn(\"Peca\");\n\tdataset.addColumn(\"Quantidade\");\n\t\n\t//Cria a constraint para buscar os formulários ativos\n\tvar cst = DatasetFactory.createConstraint(\"metadata#active\", true, true, ConstraintType.MUST);\n\tvar constraints = new Array(cst);\n\t\n\tvar datasetPrincipal = DatasetFactory.getDataset(\"dsExemploPaiFilho\", null, constraints, null);\n\t\n\tfor (var i = 0; i < datasetPrincipal.rowsCount; i++) {\n\t\tvar documentId = datasetPrincipal.getValue(i, \"metadata#id\");\n\t\tvar documentVersion = datasetPrincipal.getValue(i, \"metadata#version\");\n\t\t\n\t\t//Cria as constraints para buscar os campos filhos, passando o tablename, número da formulário e versão\n\t\tvar c1 = DatasetFactory.createConstraint(\"tablename\", \"tabelaPecas\" ,\"tabelaPecas\", ConstraintType.MUST);\n\t\tvar c2 = DatasetFactory.createConstraint(\"metadata#id\", documentId, documentId, ConstraintType.MUST);\n\t\tvar c3 = DatasetFactory.createConstraint(\"metadata#version\", documentVersion, documentVersion, ConstraintType.MUST);\n\t\tvar constraintsFilhos = new Array(c1, c2, c3);\n\n\t\t//Busca o dataset\n\t\tvar datasetFilhos = DatasetFactory.getDataset(\"dsExemploPaiFilho\", null, constraintsFilhos, null);\n\n\t\tfor (var j = 0; j < datasetFilhos.rowsCount; j++) {\n\t\t\t//Adiciona os valores nas colunas respectivamente.\n\t\t\tdataset.addRow(new Array(\n\t\t\t\t\tdocumentId,\n\t\t\t\t\tdatasetFilhos.getValue(j, \"wdk_sequence_id\"), \n\t\t\t\t\tdatasetFilhos.getValue(j, \"peca\"), \n\t\t\t\t\tdatasetFilhos.getValue(j, \"qtde\")));\n\t\t}\n\t}\n\t\n\treturn dataset;\n}\n```\n\n## Origem: Datasets acessando banco de dados externo" }, { "metadata": {}, "content": "```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar newDataset = DatasetBuilder.newDataset();\n\tlog.info(\"QUERY: \" + myQuery);\n\tvar dataSource = \"/jdbc/MeuDataSet\";\n\tvar ic = new javax.naming.InitialContext();\n\tvar ds = ic.lookup(dataSource);\n\tvar created = false;\n\tvar myQuery = \"select * from pessoas\";\n\ttry {\n\t\tvar conn = ds.getConnection();\n\t\tvar stmt = conn.createStatement();\n\t\tvar rs = stmt.executeQuery(myQuery);\n\t\tvar columnCount = rs.getMetaData().getColumnCount();\n\t\twhile (rs.next()) {\n\t\t\tif (!created) {\n\t\t\t\tfor (var i = 1; i <= columnCount; i++) {\n\t\t\t\t\tnewDataset.addColumn(rs.getMetaData().getColumnName(i));\n\t\t\t\t}\n\t\t\t\tcreated = true;\n\t\t\t}\n\t\t\tvar Arr = new Array();\n\t\t\tfor (var i = 1; i <= columnCount; i++) {\n\t\t\t\tvar obj = rs.getObject(rs.getMetaData().getColumnName(i));\n\t\t\t\tif (null != obj) {\n\t\t\t\t\tArr[i - 1] = rs.getObject(rs.getMetaData().getColumnName(i)).toString();\n\t\t\t\t} else {\n\t\t\t\t\tArr[i - 1] = \"null\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tnewDataset.addRow(Arr);\n\t\t}\n\t} catch (e) {\n\t\tlog.error(\"ERRO==============> \" + e.message);\n\t} finally {\n\t\tif (rs != null) {\n\t\t\trs.close();\n\t\t}\n\t\tif (stmt != null) {\n\t\t\tstmt.close();\n\t\t}\n\t\tif (conn != null) {\n\t\t\tconn.close();\n\t\t}\n\t}\n\treturn newDataset;\n}\n```\n\n## Origem: Sincronização de datasets" }, { "metadata": {}, "content": "```javascript\nfunction onSync(lastSyncDate) {\n\tvar dataset = DatasetBuilder.newDataset();\n\tvar integracao = ServiceManager.getService('FLUIG3');\n\tvar serviceLocator = integracao\n\t\t\t.instantiate('pkgWkfSolicPagamento.FLUIGLocator');\n\tvar service = serviceLocator.getFLUIGSOAP();\n\tvar cdEmp = 1; // código empresa pagadora\n\tvar cdFilial = 0; // todas as filiais\n\tvar cdTitulo = 0; // todos os titulos\n\tvar cdPrefixo = \"\"\n\tvar cnpj = 0; // cnpj fornecedor\n\tvar codForn = 0; // cod universal para todos os fornecedores\n\tvar lojaForn = 0; // loja fornecedor\n\t// Invocando o servico passando a data da ultima sincronização com a plataforma.\n\t// O webservice foi preparado para trazer apenas os dados desde a ultima\n\t// sincronização.\n\tvar retorno = service.CONSPAG(cdEmp, cdFilial, cdTitulo, cdPrefixo, cnpj,\n\t\t\tcodForn.toString(), lojaForn.toString(), lastSyncDate);\n\tvar arrayListaTitulo = retorno.getLISTACPAG();\n\tfor (var i = 0; i < arrayListaTitulo.length; i++) {\n\t\tvar r = arrayListaTitulo[i];\n\t\tif (r.getCE_TIPO() == \"ADD\") {\n\t\t\tdataset.addRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r\n\t\t\t\t\t.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r\n\t\t\t\t\t.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r\n\t\t\t\t\t.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r\n\t\t\t\t\t.getCE_PIS(), r.getCE_COFINS()));\n\t\t} else if (r.getCE_TIPO() == \"MOD\") {\n\t\t\t\n\t\t\tdataset.updateRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r\n\t\t\t\t\t.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r\n\t\t\t\t\t.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r\n\t\t\t\t\t.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r\n\t\t\t\t\t.getCE_PIS(), r.getCE_COFINS()));\n\t\t\t\n\t\t} else if (r.getCE_TIPO() == \"DEL\") {\n\t\t\t\n\t\t\tdataset.deleteRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r\n\t\t\t\t\t.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r\n\t\t\t\t\t.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r\n\t\t\t\t\t.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r\n\t\t\t\t\t.getCE_PIS(), r.getCE_COFINS()));\n\t\t\t\n\t\t} else {\n\t\t\t// Estado do registro é desconhecido no cache \n\t\t\tdataset.addOrUpdateRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r\n\t\t\t\t\t.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r\n\t\t\t\t\t.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r\n\t\t\t\t\t.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r\n\t\t\t\t\t.getCE_PIS(), r.getCE_COFINS()));\n\t\t\t\n\t\t\t\n\t\t}\n\t}\n\n\treturn dataset;\n}\n```" }, { "metadata": {}, "content": "## Origem: Sincronização de datasets\n```javascript\nfunction onSync(lastSyncDate) {\n\tvar dataset = DatasetBuilder.newDataset();\n\tdataset.addRow(new Array(2256, \"SÃO PAULO\", 1058, \"6\", \"ESPORTE\"));\n dataset.addRow(new Array(1874, \"RECIFE\", 1258, \"1247690\", \"2\", \"CALÇADOS\"));\n dataset.addRow(new Array(1205, \"RIO DE JANEIRO\", 2594, \"10\", \"MOVEIS\"));\n dataset.addRow(new Array(985, \"FLORIANOPOLIS\", 2269, \"10\", , \"ELETRONICOS\"));\n\n\treturn dataset;\n}\n```\n\n## Origem: Eventos de Formulário\n```javascript\nfunction displayFields(form, customHTML) {\n if ( form.getFormMode() == “MOD” ) {\n form.setValue('RNC_colab_abertura', new java.lang.Integer(1));\n }\n}\n```\n\n## Origem: Eventos de Formulário\n```javascript\nfunction displayFields(form, customHTML) { \n form.setVisible(\"campoA\", false);\n form.setVisibleById(\"linha___1\", false);\n}\n```\n\n## Origem: Eventos de Formulário\n```javascript\n**displayFields.js - Clique para expandir** Expandir origem\n```\n\n## Origem: Eventos de Formulário\n```javascript\nConforme explicado, o *customHTML* permite personalizar o formulário diretamente pelo método displayFields. Este exemplo, adaptado dos nos [Exemplos Avançados](../Plataforma Documentação técnica/Recurso de Processos (BPM).md)/Desenvolvimento de Workflow/Exemplos avançados.md), mostra como usar o displayFields para, no formulário, ter acesso ao modo de visualização, código do solicitante e número da atividade. Além de preencher alguns campos da solicitação com a data atual e o nome do solicitante:\n```\n\n## Origem: Eventos de Formulário" }, { "metadata": {}, "content": "```javascript\nPara que os dados sejam carregados e apresentados em tela, principalmente em dispositivos *mobile*, é necessário chamar as funções que irão carregá-los dentro de uma estrutura de *read*.\n\nA invocação dos métodos que irão popular o formulário deve estar contida dentro de uma chamada $(function(), garantindo assim o carregamento dos arquivos exigidos pelo formulário antes das funções.\n\nPor exemplo, deseja-se carregar dados de produtos em um formulário. Para que isto ocorra, foi criada uma função *loadProdutos()* que irá preencher um *grid* inserido no formulário HTML. Neste caso a chamada desta função dentro do *displayFields* ficaria:\n```\n\n## Origem: Eventos de Formulário - Exemplo de novo modelo\n```javascript\nfunction displayFields(form, customHTML) {\n if ( form.getFormMode() == “MOD” ) {\n form.setValue('RNC_colab_abertura', new java.lang.Integer(1));\n }\n}\n```\n\n## Origem: Eventos de Formulário - Exemplo de novo modelo\n```javascript\nfunction displayFields(form, customHTML) { \n form.setVisible(\"campoA\", false);\n form.setVisibleById(\"linha___1\", false);\n}\n```\n\n## Origem: Eventos de Formulário - Exemplo de novo modelo\n```javascript\n**displayFields.js - Clique para expandir** Expandir origem\n```\n\n## Origem: Eventos de Formulário - Exemplo de novo modelo\n```javascript\nConforme explicado, o *customHTML* permite personalizar o formulário diretamente pelo método displayFields. Este exemplo, adaptado dos nos [Exemplos Avançados](../Plataforma Documentação técnica/Recurso de Processos (BPM).md)/Desenvolvimento de Workflow/Exemplos avançados.md), mostra como usar o displayFields para, no formulário, ter acesso ao modo de visualização, código do solicitante e número da atividade. Além de preencher alguns campos da solicitação com a data atual e o nome do solicitante:\n```\n\n## Origem: Eventos de Formulário - Exemplo de novo modelo" }, { "metadata": {}, "content": "```javascript\nPara que os dados sejam carregados e apresentados em tela, principalmente em dispositivos *mobile*, é necessário chamar as funções que irão carregá-los dentro de uma estrutura de *read*.\n\nA invocação dos métodos que irão popular o formulário deve estar contida dentro de uma chamada $(function(), garantindo assim o carregamento dos arquivos exigidos pelo formulário antes das funções.\n\nPor exemplo, deseja-se carregar dados de produtos em um formulário. Para que isto ocorra, foi criada uma função *loadProdutos()* que irá preencher um *grid* inserido no formulário HTML. Neste caso a chamada desta função dentro do *displayFields* ficaria:\n```\n\n## Origem: formController.getCardData()\n```javascript\nfunction displayFields(form, customHTML) {\n   var mapaForm = new java.util.HashMap();\n   mapaForm = form.getCardData();\n   log.info(\"### getCardData ###: \" + mapaForm);\n}\n```\n\n## Origem: Integração de aplicativos externos com o Fluig\n```javascript\nfunction displayFields(form,customHTML){ \n\t\n\tvar CURRENT_STATE = getValue(\"WKNumState\") ? getValue(\"WKNumState\") : 0;\t\n\tvar CURRENT_USER = getValue(\"WKUser\");\n\n\tcustomHTML.append('');\n}\n```\n\n## Origem: Básico - Integração Fluig x Protheus: Centro de custo" }, { "metadata": {}, "content": "```javascript\nfunction defineStructure() {}\n\nfunction onSync(lastSyncDate) {}\n\nfunction createDataset(fields, constraints, sortFields) {\n    var dataset = DatasetBuilder.newDataset();\n    \n    dataset.addColumn(\"InternalId\");\n    dataset.addColumn(\"CompanyInternalId\");\n    dataset.addColumn(\"CompanyId\");\n    dataset.addColumn(\"RegisterSituation\");\n    dataset.addColumn(\"Class\");\n    dataset.addColumn(\"Code\");\n    dataset.addColumn(\"Name\");\n\n    var sendData = {    \n        companyId: String(fluigAPI.getSecurityService().getCurrentTenantId()),\n        serviceCode: \"API_PROTHEUS_REST\",\n        endpoint: \"/api/ctb/v1/costcenters/\",\n        method: \"GET\"\n    };\n\n    // Fornece acesso aos serviços externos com autenticação oauth, documentação: http://127.0.0.1:8080/api/sdk/com/fluig/sdk/service/AuthorizeClientSdkService.html\n    var clientService = fluigAPI.getAuthorizeClientService(); \n    \n // Realizar a integração\n // Documentação da API: https://api.totvs.com.br/apidetails/CostCenter_v1_000.json\n    var vo = clientService.invokeService(JSON.stringify(sendData));\n // Armazenar o status HTTP da integração, esse passo é muito importante para idenficar se tudo ocorreu como deveria!\n // Fique atento!!! Cada API pode ter um retorno diferente, a melhor prática é consultar documentação oficial em api.totvs.com.br e checar \n // os seus respectivos métodos e retornos possíveis.\n // O método getHttpStatusResult é da classe AuthorizeClientSdkServiceVO (Variavel clientService do nosso código)\n // Documentação completa: http://127.0.0.1:8080/api/sdk/com/fluig/sdk/api/authorizeclient/AuthorizeClientSdkServiceVO.html\n    var status = String(vo.getHttpStatusResult());\n    if (status == \"200\") {\n        var jsonResponse = JSON.parse(vo.getResult());       \n        if (jsonResponse.items && jsonResponse.items.length > 0) {\n            for (var i = 0; i < jsonResponse.items.length; i++) {\n                var item = jsonResponse.items[i];                \n                dataset.addRow(new Array(\n                 item.InternalId,\n                 item.CompanyInternalId,\n                 item.CompanyId,\n                 item.RegisterSituation,\n                 item.Class,\n                 item.Code,\n                 item.Name\n                ));\n            }\n        }\n    } else {\n        var errorMsg = \"Erro desconhecido durante a integracao.\";\n        try {\n            var parseResult = JSON.parse(vo.getResult());\n            var parseError = JSON.parse(parseResult.errorMessage);\n            errorMsg = parseError.detailedMessage;\n        } catch (e) {\n            errorMsg = vo.getResult();\n        }\n        \n        dataset.addRow(new Array(\n            status,\n            errorMsg,\n            \"\", \"\", \"\", \"\", \"\"\n        ));\n    }\n  \n    return dataset;\n}\n\nfunction onMobileSync(user) {}\n```" }, { "metadata": {}, "content": "## Origem: Integração com Aplicativos Externos\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\t// Cria o dataset\n\tvar dataset = DatasetBuilder.newDataset();\n\tdataset.addColumn(\"Element Name\");\n\tdataset.addColumn(\"Symbol\");\n\tdataset.addColumn(\"Atomic Number\");\n\tdataset.addColumn(\"Atomic Weight\");\n\t// Conecta o servico e busca os livros\n\tvar periodicService = ServiceManager.getService('PeriodicTable');\n\tvar serviceHelper = periodicService.getBean();\n\tvar serviceLocator = periodicService.instantiate('net.webservicex.Periodictable');\n\tvar service = serviceLocator.getPeriodictableSoap();\n\t// Invoca o serviço\n\ttry {\n\t\tvar result = service.getAtomicNumber(\"sodium\"); // O termo \"sodium\" corresponde ao parâmetro do tipo String esperado na assinatura do método getAtomicNumber\n\t\tvar xml = new XML(result);\n\t\tfor ( var index in xml.Table) {\n\t\t\tvar element = xml.Table[index];\n\t\t\tdataset.addRow(new Array(element.ElementName.toString(), element.Symbol.toString(), element.AtomicNumber\n\t\t\t\t.toString(), element.AtomicWeight.toString()));\n\t\t}\n\t} catch (erro) {\n\t\tdataset.addRow(new Array(erro));\n\t}\n\treturn dataset;\n}\n```\n\n## Origem: Métodos de contorno de lentidão na plataforma" }, { "metadata": {}, "content": "```javascript\n2022-11-23 15:59:03,511 WARN [com.fluig.monitoring.jschronos.JSChronos] (JSChronos.CustomizationManagerImpl.invokeFunction.createDataset) CustomizationManagerImpl.invokeFunction.createDataset ja esta sendo executado por 2211 segundos params: [[[Ljava.lang.String;@268d1e17, null, null], Thread = default task-6727, datasetId = dsDatabase]\n2.211 segundos\n\n2022-11-24 08:51:22,088 WARN [com.fluig.monitoring.jschronos.JSChronos] (JSChronos.CustomizationManagerImpl.invokeFunction.createDataset) CustomizationManagerImpl.invokeFunction.createDataset ja esta sendo executado por 60 segundos params: [[[Ljava.lang.String;@7cec0760, [Lcom.totvs.technology.foundation.dataset.SearchConstraint;@64de871c, null], Thread = default task-35, datasetId = dsChecklistCRUD]\n\n2023-02-14 09:17:47,722 WARN [com.fluig.monitoring.jschronos.JSChronos] (JSChronos.CustomizationManagerImpl.invokeFunction.createDataset) CustomizationManagerImpl.invokeFunction.createDataset ja esta sendo executado por 300 segundos params: [[null, [Lcom.totvs.technology.foundation.dataset.SearchConstraint;@67eb8082, null], Thread = default task-389, datasetId = ds_sql_update]\n\n2023-02-14 09:17:56,587 WARN [com.fluig.monitoring.jschronos.JSChronos] (JSChronos.CustomizationManagerImpl.invokeFunction.servicetask64) CustomizationManagerImpl.invokeFunction.servicetask64 ja esta sendo executado por 120 segundos params: [[Process id = alteracao_de_preco, Process Version = 23, Process Current UserId = usuario.user], Thread = default task-413, datasetId = workflowColleagueRole]\n```\n\n## Origem: Métodos de contorno de lentidão na plataforma" }, { "metadata": {}, "content": "```javascript\n2023-05-29 09:30:53,414 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-39) CustomizationManagerImpl.invokeFunction.createDataset executou por 32 segundos\n2023-05-29 09:30:53,414 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-39) params: [[[Ljava.lang.String;@6c45e716, [Lcom.totvs.technology.foundation.dataset.SearchConstraint;@a1b6a73, null], Thread = default task-39, datasetId = ds_RMConsulta]\n2023-05-29 09:30:53,437 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-39) DatasetFactory.getDataset.ds_RMConsulta executou por 32 segundos\n2023-05-29 09:30:53,437 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-39) params: [[TBC012.05, 1, T], [FIELD_NAME=COLIGADA; INITIAL_VALUE=1; FINAL_VALUE=1; CONSTRAINT_TYPE=MUST; IS_LIKE_SEARCH=false; ], null]\n2023-05-29 09:31:24,672 INFO [com.datasul.technology.webdesk.dataset.business.DatasetBO] (default task-39) Executando Dataset com ID ds_RMConsulta do tipo Avançado.\n2023-05-29 09:31:24,672 INFO [com.datasul.technology.webdesk.dataset.business.DatasetBO] (default task-39) Builder rodando sem o mobile \n2023-05-29 09:31:24,719 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | Chamada do DataSet ds_RMConsulta\n2023-05-29 09:31:24,734 INFO [com.datasul.technology.webdesk.dataset.business.DatasetBO] (default task-39) Executando Dataset com ID ds_RMConecta do tipo Avançado.\n2023-05-29 09:31:24,735 INFO [com.datasul.technology.webdesk.dataset.business.DatasetBO] (default task-39) Builder rodando sem o mobile \n2023-05-29 09:31:24,786 INFO [org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean] (default task-39) Creating Service {http://www.totvs.com/}wsConsultaSQL from WSDL: http://peg54p-prd-ws.totvscloud.com.br:8083/wsConsultaSQL/MEX?wsdl\n2023-05-29 09:31:24,800 WARNING [org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean] (default task-39) No method was found for the WSDL operation {http://www.totvs.com/}RealizarConsultaSQLContexto.\n2023-05-29 09:31:24,805 INFO [org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean] (default task-39) Creating Service {http://www.totvs.com/}IwsConsultaSQLService from class com.totvs.IwsConsultaSQL\n2023-05-29 09:31:24,812 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | Dados da chamada ao serviço wsConsultaSQL:\n2023-05-29 09:31:24,812 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | CODSENTECA: TBC012.03\n2023-05-29 09:31:24,812 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | CODCOLIGADA: 1\n2023-05-29 09:31:24,812 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | APLICACAO: T\n2023-05-29 09:31:24,812 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | PARAMETRO: \n2023-05-29 09:31:24,922 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | Chamada realizada com sucesso.\n2023-05-29 09:31:24,923 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | Quantidade de registros retornados: 57\n```" }, { "metadata": {}, "content": "## Origem: Conversão TOTVS ECM para plataforma TOTVS Fluig\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar query = \"SELECT login,email FROM fdn_usertenant LIMIT 100\";\n\tvar dataSource = \"jdbc/FluigDSRO\"; \n\tvar newDataset = DatasetBuilder.newDataset();\n\tvar ic = new javax.naming.InitialContext();\n\tvar ds = ic.lookup(dataSource);\n\t\n\ttry {\n\t\tvar conn = ds.getConnection();\n\t\tvar stmt = conn.createStatement();\n\t\tvar rs = stmt.executeQuery(query);\n\t\t\n\t\tnewDataset.addColumn(\"Login\");\n\t\tnewDataset.addColumn(\"Email\");\n\t\t\n\t\twhile (rs.next()) {\n\t\t\tnewDataset.addRow([ rs.getString(\"login\"), rs.getString(\"email\") ]);\n\t\t}\n\t\t\n\t} catch(e) {\n\t\tnewDataset.addColumn(\"erro\");\n\t\tnewDataset.addRow([e.message]);\n\t} finally {\n\t\tif(rs != null) rs.close();\n\t\tif(stmt != null) stmt.close();\n\t\tif(conn != null) conn.close();\t\t\n\t}\n\t\n\treturn newDataset;\n}\n```\n\n## Origem: Personalização de formulários - Nova versão\n```javascript\nfunction displayFields(form,customHTML) {\n // Obtendo o usuario via dataset\n filter = new java.util.HashMap();\n filter.put(\"colleaguePK.colleagueId\",\"adm\");\n usuario = getDatasetValues('colleague',filter);\n form.setValue('RNC_colab_abertura',usuario.get(0).get(\"colleaguePK.colleagueId\"));\n}\n```\n\n## Origem: Personalização de formulários - Nova versão\n```javascript\nfunction displayFields(form,customHTML) {\n // Obtendo o usuario via dataset\n filter = new java.util.HashMap();\n filter.put(\"RNC_nr_solicitacao\",new java.lang.Integer(20));\n registrosform = DatasetFactory.getDatasetValues(Number(676),filter);\n\t log.info(\"Usuário de Abertura: \"+ registrosform.get(0).get(\"RNC_colab_abertura\"));\n}\n```\n\n## Origem: Personalização de formulários - Nova versão" }, { "metadata": {}, "content": "```javascript\nfunction displayFields(form,customHTML) {\n // Obtendo o usuario via dataset\n filter = new java.util.HashMap();\n filter.put(\"RNC_nr_solicitacao\",new java.lang.Integer(20));\n registrosform = getDatasetValues(Number(676),filter);\n\t log.info(\"Usuário de Abertura: \"+ registrosform.get(0).get(\"RNC_colab_abertura\"));\n}\n```" }, { "metadata": {}, "content": "# Biblioteca de Snippets: SQL\n\n## Origem: Configuração do banco de dados Oracle" }, { "metadata": {}, "content": "```sql\nDECLARE AUX_USERCONNECTED VARCHAR2(30); \nBEGIN\n SELECT USER\n INTO AUX_USERCONNECTED\n FROM DUAL;\n IF (AUX_USERCONNECTED <> 'SYS') AND (AUX_USERCONNECTED <> 'SYSTEM') THEN\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_OBJECTS AS' ||\n ' SELECT * FROM SYS.ALL_OBJECTS WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_SYNONYMS AS' ||\n ' SELECT * FROM SYS.ALL_SYNONYMS WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_SEQUENCES AS' ||\n ' SELECT * FROM SYS.ALL_SEQUENCES WHERE SEQUENCE_OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_CONSTRAINTS AS' ||\n ' SELECT * FROM SYS.ALL_CONSTRAINTS WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_CONS_COLUMNS AS' ||\n ' SELECT * FROM SYS.ALL_CONS_COLUMNS WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_INDEXES AS' ||\n ' SELECT * FROM SYS.ALL_INDEXES WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_IND_COLUMNS AS' ||\n ' SELECT * FROM SYS.ALL_IND_COLUMNS WHERE TABLE_OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_TABLES AS' ||\n ' SELECT * FROM SYS.ALL_TABLES WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_TAB_COLUMNS AS' ||\n ' SELECT * FROM SYS.ALL_TAB_COLUMNS WHERE OWNER IN (SELECT USER FROM DUAL)');\n END IF;\nEND;\n```" }, { "metadata": {}, "content": "## Origem: Configuração do banco de dados SQL Server\n```sql\nSELECT suser_sname(owner_sid) FROM sys.databases WHERE name = 'nome_do_banco';\n```\n\n## Origem: Configuração do banco de dados SQL Server\n```sql\nSELECT is_read_committed_snapshot_on FROM sys.databases WHERE name= 'nome_do_banco';\n```\n\n## Origem: Transparent Data Encryption (TDE)\n```sql\nSELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS\nFROM INFORMATION_SCHEMA.TABLES\nWHERE CREATE_OPTIONS = 'ENCRYPTION=\"Y\"';\n```\n\n## Origem: Métodos de contorno de lentidão na plataforma\n```sql\nselect COD_DATASET from serv_dataset where DSL_DATASET like '%FluigDS%'; \n\nselect nr_documento, COD_EVENT from event_ficha where DSL_EVENT like '%FluigDS%'; \n\nselect COD_EVENT from event_geral where DSL_EVENT like '%FluigDS%'; \n\nselect event_proces.COD_DEF_PROCES, COD_EVENT from event_proces where DSL_EVENT like '%FluigDS%';\n```\n\n## Origem: 10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n```sql\n/* Anexos de processos nunca acessados */\n\nSELECT nr_versao, nr_documento, nm_arquivo_fisico, num_tam_arq_fisic FROM documento d WHERE nr_acessos = 0 AND tp_documento=7 OR (tp_documento=2 AND EXISTS(SELECT ap.NR_DOCUMENTO FROM anexo_proces ap WHERE ap.NR_DOCUMENTO = d.NR_DOCUMENTO) ) ORDER BY num_tam_arq_fisic DESC, nr_documento DESC\n\n/* Documentos que não são anexos de processos, nunca acessados */\n\nSELECT nr_versao, nr_documento, nm_arquivo_fisico, num_tam_arq_fisic FROM documento d WHERE nr_acessos = 0 AND tp_documento=2 AND not EXISTS(SELECT ap.NR_DOCUMENTO FROM anexo_proces ap WHERE ap.NR_DOCUMENTO = d.NR_DOCUMENTO ) ORDER BY num_tam_arq_fisic DESC, nr_documento DESC\n```\n\n## Origem: 10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n```sql\n/* documentos com a data de expiração menor do que a data atual */\nSELECT distinct(nr_documento) FROM documento WHERE dt_expiracao < CURDATE()\n```\n\n## Origem: 10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade" }, { "metadata": {}, "content": "```sql\n/*\n log_type:\n0 - LOGIN, \n1 - LOGINERROR, \n2 - LOGOUT\n\naccess_date\nData no formato 'YYYY-MM-DD HH:mm:ss'\n*/\nSELECT * FROM fdn_accesslog\n```\n\n## Origem: 10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n```sql\n/* Anexos de processos nunca acessados */\n\nSELECT nr_versao, nr_documento, nm_arquivo_fisico, num_tam_arq_fisic FROM documento d WHERE nr_acessos = 0 AND tp_documento=7 OR (tp_documento=2 AND EXISTS(SELECT ap.NR_DOCUMENTO FROM anexo_proces ap WHERE ap.NR_DOCUMENTO = d.NR_DOCUMENTO) ) ORDER BY num_tam_arq_fisic DESC, nr_documento DESC\n\n/* Documentos que não são anexos de processos, nunca acessados */\n\nSELECT nr_versao, nr_documento, nm_arquivo_fisico, num_tam_arq_fisic FROM documento d WHERE nr_acessos = 0 AND tp_documento=2 AND not EXISTS(SELECT ap.NR_DOCUMENTO FROM anexo_proces ap WHERE ap.NR_DOCUMENTO = d.NR_DOCUMENTO ) ORDER BY num_tam_arq_fisic DESC, nr_documento DESC\n```\n\n## Origem: 10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n```sql\n/* documentos com a data de expiração menor do que a data atual */\nSELECT distinct(nr_documento) FROM documento WHERE dt_expiracao < CURDATE()\n```\n\n## Origem: 10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n```sql\n/*\n log_type:\n0 - LOGIN, \n1 - LOGINERROR, \n2 - LOGOUT\n\naccess_date\nData no formato 'YYYY-MM-DD HH:mm:ss'\n*/\nSELECT * FROM fdn_accesslog\n```\n\n## Origem: Desenvolvimento de relatórios\n```sql\nSELECT vol_fisic.CD_VOL_FISIC,\n vol_fisic.COD_EMPRESA,\n vol_fisic.NOM_DIR_FISIC,\n vol_fisic.ID_TIP_VOL_FISIC\nFROM vol_fisic\nWHERE vol_fisic.COD_EMPRESA = ${WKCompany}\n```\n\n## Origem: Desenvolvimento de relatórios" }, { "metadata": {}, "content": "```sql\nimportPackage(Packages.com.datasul.technology.webdesk.dataset.service);\nimportPackage(Packages.java.util);\n\n\nvar qd = null;\nvar rs = null;\nvar rowMap = null;\nvar sqlJpa = \"\";\nqd = new QueryDelegate();\n\nsqlJpa = \"SELECT count(d.documentPK.documentId), d.publisherId from Document d WHERE\nd.documentPK.companyId = ${WKCompany} GROUP BY d.publisherId\";\n\nrs = qd.getResultQuery(sqlJpa);\n\nvar rowMap = rs.get(0);\n\n//Busca o valor do Count\nrowMap.get(\"d.publisherId\");\n\n//Busca o Código do documento\nrowMap.get(\"count(d.documentPK.documentId)\");\n```\n\n## Origem: Como salvar Imagens e Vídeos locais em formulários usando o componente FLUIGC.richeditor\n```sql\nasync function saveFilesECM(files, type) {\n\tlet currentHTML = editor?.getData() || '';\n\tconst parser = new DOMParser();\n\tconst doc = parser.parseFromString(currentHTML, 'text/html');\n\tconst parentId = '37'; // Código da pasta do ECM\n\n\tfor (const file of files) {\n\t\ttry {\n\t\t\tconst fileUrl = file.url;\n\t\t\tconst fileName = file.alt;\n\t\t\tconst data = await uploadFileECM(fileName, parentId);\n\t\t\tconst newUrl = `/content-management/api/v2/documents/${data.documentId}/stream`;\n\t\t\tconst filesInDoc = doc.querySelectorAll(type);\n\n\t\t\tfilesInDoc.forEach(target => {\n\t\t\t\tconst idx = target.src.indexOf('/webdesk');\n\t\t\t\tconst normalizedFileUrl = encodeURI(fileUrl);\n\n\t\t\t\tif (idx >= 0 && target.src.substring(idx) === normalizedFileUrl) {\n\t\t\t\t\ttarget.src = newUrl;\n\t\t\t\t}\n\t\t\t});\n\n\t\t} catch (error) {\n\t\t\tconsole.error('Erro ao processar arquivo:', error);\n\t\t}\n\t}\n\n\treturn doc.body.innerHTML;\n}\n```" }, { "metadata": { "title": "Configuração", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=144409655", "path": "\\Plataforma Documentação técnica\\Configuração.md" }, "content": "Configuração\n\n\n---\n\nRecolher todos\n\n[Expandir todos](#)  \n[Recolher todos](#)" }, { "metadata": { "title": "Desenvolvimento sobre a plataforma", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+sobre+a+plataforma", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma.md" }, "content": "Desenvolvimento sobre a plataforma\n\n\n---\n\nAqui você encontra todas as documentações reunidas referentes à Desenvolvimento sobre a plataforma. Você também pode acessar as página relacionadas a este assunto no menu localizado no lado esquerdo.\n\n- [Primeiros passos](Desenvolvimento sobre a plataforma/Primeiros passos.md)\n- [Fluig Studio](Desenvolvimento sobre a plataforma/Fluig Studio.md)\n- [Guia de Estilos](Desenvolvimento sobre a plataforma/Guia de Estilos.md)\n- [Integrações](Desenvolvimento sobre a plataforma/Integrações.md)\n- [Fluig Serviços](Desenvolvimento sobre a plataforma/Fluig Serviços.md)\n- [Desenvolvimento de Eventos](Desenvolvimento sobre a plataforma/Desenvolvimento de Eventos.md)\n- [Desenvolvimento de Datasets](Desenvolvimento sobre a plataforma/Desenvolvimento de Datasets.md)\n- [Desenvolvimento de Páginas/Widgets (WCM)](Desenvolvimento sobre a plataforma/Desenvolvimento de PáginasWidgets (WCM).md).md)\n- [Utilização de Webservices](Desenvolvimento sobre a plataforma/Utilização de Webservices.md)\n- [Aceleradores de desenvolvimento Fluig](Desenvolvimento sobre a plataforma/Aceleradores de desenvolvimento Fluig.md)\n- [Guia de Propriedades dos Objetos](Desenvolvimento sobre a plataforma/Guia de Propriedades dos Objetos.md)\n- [Principais Mudanças de Front-end - Fluig Voyager 2.0.0](Desenvolvimento sobre a plataforma/Principais Mudanças de Front-end - Fluig Voyager 2.0.0.md)\n- [Documentação para desenvolvedores Fluig](Desenvolvimento sobre a plataforma/Documentação para desenvolvedores Fluig.md)" }, { "metadata": { "title": "Especificações Técnicas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=144409649", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas.md" }, "content": "Especificações Técnicas\n\n\n---\n\n- [Matriz de Portabilidade](Especificações Técnicas/Matriz de Portabilidade.md)\n- [Dimensionamento](Especificações Técnicas/Dimensionamento.md)\n- [Diferença entre Nuvem Pública e Nuvem Privada](Especificações Técnicas/Diferença entre Nuvem Pública e Nuvem Privada.md)\n- [Segurança do fluig](Especificações Técnicas/Segurança da plataforma.md)\n- [Consumo de Banda](Especificações Técnicas/Consumo de Banda.md)\n- [Portas e endereços](Especificações Técnicas/Portas e endereços.md)" }, { "metadata": { "title": "Instalação e Atualização", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=144409653", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização.md" }, "content": "Instalação e Atualização\n\n\n---\n\n- [Guia de instalação da plataforma](Instalação e Atualização/Guia de instalação da plataforma.md)\n- [Guia de atualização da plataforma](Instalação e Atualização/Guia de atualização da plataforma.md)\n- [Erros comuns ao instalar/atualizar a plataforma](Instalação e Atualização/Erros comuns ao instalaratualizar a plataforma.md)\n- [Guia de instalação Fluig Studio](Instalação e Atualização/Guia de instalação Fluig Studio.md)\n- [Guia de atualização Fluig Studio](Instalação e Atualização/Guia de atualização Fluig Studio.md)\n- [Visão geral qualidade da plataforma](Instalação e Atualização/Visão geral qualidade da plataforma.md)\n- [Avaliação de lentidão na plataforma](Instalação e Atualização/Avaliação de lentidão na plataforma.md)\n- [Modo demonstração](Instalação e Atualização/Modo demonstração.md)\n- [Checklist de instalação da plataforma](Instalação e Atualização/Checklist de instalação da plataforma.md)\n- [Criando um ambiente de homologação](Instalação e Atualização/Criando um ambiente de homologação.md)\n- [Guia de Instalação da plataforma em VMs](Instalação e Atualização/Guia de Instalação da plataforma em VMs.md)\n- [Conversão](Instalação e Atualização/Conversão.md)\n- [Migração de palavras chave do ECM para a plataforma](Instalação e Atualização/Migração de palavras chave do ECM para a plataforma.md)\n- [Backup da aplicação](Instalação e Atualização/Backup da aplicação.md)\n- [Recriar Serviços do Fluig](Instalação e Atualização/Recriar Serviços do Fluig.md)" }, { "metadata": { "title": "Palestras - Universo TOTVS", "source": "https://tdn.totvs.com/display/fluig/Palestras+-+Universo+TOTVS", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS.md" }, "content": "Palestras - Universo TOTVS\n\n\n---\n\n## Acesse as Palestras e material apresentado no Universo TOTVS:\n\n[Universo TOTVS 2024 - Palestras + Material de Apoio.](Palestras - Universo TOTVS/Universo TOTVS 2024.md)\n[Universo TOTVS 2025 - Palestras + Material de Apoio.](Palestras - Universo TOTVS/Universo TOTVS 2025.md)" }, { "metadata": { "title": "Personalização", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185732263", "path": "\\Plataforma Documentação técnica\\Personalização.md" }, "content": "Personalização\n\n\n---\n\nAqui você encontra todas as documentações reunidas referentes à Personalização.\n\n- [Personalização de e-mail](Personalização/Personalização de e-mail.md)\n- [Personalização da URL para redirecionamento mobile](Personalização/Personalização da URL para redirecionamento mobile.md)\n- [Personalização de favicon](Personalização/Personalização de favicon.md)\n- [Personalização de todas as páginas da plataforma](Personalização/Personalização de todas as páginas da plataforma.md)\n- [Personalização do logotipo da página de login](Personalização/Personalização do logotipo da página de login.md)\n- [Personalização do título na aba do navegador](Personalização/Personalização do título na aba do navegador.md)\n- [Personalização da página de login](Personalização/Personalização da página de login.md)\n- [Temas](Personalização/Temas.md)" }, { "metadata": { "title": "Recurso de Analytics", "source": "https://tdn.totvs.com/display/fluig/Recurso+de+Analytics", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics.md" }, "content": "Recurso de Analytics\n\n\n- 1 [Sobre o Analytics](#RecursodeAnalytics-SobreoAnalytics)\n - 1.1 [Mais acesso para respostas mais rápidas](#RecursodeAnalytics-Maisacessopararespostasmaisrápidas)\n - 1.2 [Self-service BI](#RecursodeAnalytics-Self-serviceBI)\n - 1.3 [Informações ricas à sua disposição](#RecursodeAnalytics-Informaçõesricasàsuadisposição)\n\n# Sobre o Analytics\n\nTudo o que acontece no TOTVS Fluig Plataforma gera conhecimento relevante para tomada de decisão do seu negócio. Quem possibilita a criação e o acesso facilitado a *dashboards* ricos de informação é o Analytics. Com ele, você tem total visão estratégica da produtividade da sua empresa.\n\n**![](..\\images\\an02.png)**\n\n## Mais acesso para respostas mais rápidas\n\nTer acesso a informações na empresa costumava ser algo restrito à alta gerência. Com a plataforma TOTVS Fluig, equipes do nível estratégico ao operacional, de acordo com o permissionamento, são empoderadas e estimuladas a utilizarem informações inteligentes de produtividade para melhor tomada de decisão, de onde estiverem.\n\n![](..\\images\\1.png)\n\n## Self-service BI\n\nExtrair informações sempre foi uma dor de cabeça e uma tarefa que sobrecarregava a área de TI. Além disso, quando esses indicadores eram finalmente compartilhados com as equipes, geralmente chegavam em relatórios desatualizados. A plataforma revoluciona o modo que a empresa trata as informações estratégicas. Com o Analytics, sua empresa tem uma poderosa ferramenta de BI que não necessita de conhecimento técnico para criar visões e *dashboards*, que analisam e também revelam tendências na hora que for preciso.\n\n![](..\\images\\2.jpg)\n\n## Informações ricas à sua disposição\n\nAo invés de procurar a informação, que tal tê-la sempre disponível? Na plataforma TOTVS Fluig, todos os *dashboards* criados são facilmente exibidos, não só na ferramenta de análise de dados, mas também em portais, comunidades e workflows.\n\n**![](..\\images\\3.png)**\n\n**Confira também:**" }, { "metadata": { "title": "Recurso de Comunidades (Social)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=145363841", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social).md" }, "content": "Recurso de Comunidades (Social)\n\n\n# Índice\n\n- 1 [Sobre Social](#RecursodeComunidades(Social)-SobreSocial)\n - 1.1 [Comunicação e colaboração à favor dos resultados](#RecursodeComunidades(Social)-Comunicaçãoecolaboraçãoàfavordosresultados)\n\n# Sobre Social\n\nA parte Social do TOTVS Fluig Plataforma funciona como uma rede social corporativa, ampliando o espaço de troca de ideias e colaboração entre funcionários e empresa. Otimiza o fluxo de informações internas, entre os diversos departamentos, une pessoas com habilidades e funções complementares, aumentando a produtividade.\n\n![](..\\images\\so04%5B1%5D.png)\n\n## Comunicação e colaboração à favor dos resultados\n\nRedes sociais são um jeito eficiente de reunir e engajar pessoas com interesses em comum, manter-se atualizado e trocar informações. Nada melhor do que trazer esses benefícios para o cotidiano corporativo. Com o Social, sua empresa cria comunidades com propósitos estratégicos para ampliar o espaço de troca de ideias e colaboração entre funcionários e empresa." }, { "metadata": { "title": "Recurso de Documentos (ECM)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=145363838", "path": "\\Plataforma Documentação técnica\\Recurso de Documentos (ECM).md" }, "content": "Recurso de Documentos (ECM)\n\n\n# - 1 [Sobre o ECM](#RecursodeDocumentos(ECM)-true.*ndicenoneSobreoECM) - 1.1 [Agilidade na busca por documentos](#RecursodeDocumentos(ECM)-Agilidadenabuscapordocumentos) - 1.2 [Controle e segurança para seus documentos](#RecursodeDocumentos(ECM)-Controleesegurançaparaseusdocumentos) - 1.3 [Edição e acesso a documentos de forma inteligente](#RecursodeDocumentos(ECM)-Ediçãoeacessoadocumentosdeformainteligente) - 1.4 [Digitalize documentos de forma organizada](#RecursodeDocumentos(ECM)-Digitalizedocumentosdeformaorganizada) Sobre o ECM\n\nO ECM – Enterprise Content Management – mantém vivo o conhecimento da sua empresa. Permite compartilhamento, controle e acesso à documentos a qualquer hora que você desejar e com a mobilidade que você precisa.\n\n![](..\\images\\ecm%20logo.png)\n\n## Agilidade na busca por documentos\n\nChega de perder tempo procurando documentos que estão espalhados em diversos setores de uma empresa e até mesmo em desktops. Utilize a poderosa busca da plataforma e encontre a informação que você precisa facilmente, através do nome do documento, ou pelo conteúdo interno.\n\n## Controle e segurança para seus documentos\n\nDocumentos carregam informações valiosas sobre sua empresa. Saber qual é a ultima versão, restringir acesso, manter histórico de atualizações é desafiador. Com a plataforma, a gestão eletrônica de documentos é garantida: o ECM permite o versionamento, rastreabilidade, permissionamento e histórico tudo isso em um repositório seguro.\n\n## Edição e acesso a documentos de forma inteligente\n\nSua caixa de e-mails talvez pode não ser o melhor lugar para guardar e compartilhar documentos. Com a plataforma, seus documentos ficam na nuvem em espaços colaborativos, onde você e sua equipe podem visualizar com o Fluig *Viewer*, acessar e editar o mesmo documento em conjunto, até mesmo quando estão sem conexão à internet.\n\n## Digitalize documentos de forma organizada" }, { "metadata": { "title": "Recurso de Documentos (ECM)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=145363838", "path": "\\Plataforma Documentação técnica\\Recurso de Documentos (ECM).md" }, "content": "Recurso de Documentos (ECM)\n\n\nDocumentos físicos podem atrasar sua operação e organizá-los digitalmente pode ser um desafio. TOTVS Fluig Plataforma é o destino digital dos documentos da sua empresa. Ele facilita a importação dos documentos digitais já existentes com recursos como *drag and drop*, API de publicação de documentos e plugin de integração com o Outlook, e também organiza os arquivos conforme a taxonomia desejada." }, { "metadata": { "title": "Recurso de Processos (BPM)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924916", "path": "\\Plataforma Documentação técnica\\Recurso de Processos (BPM).md" }, "content": "Recurso de Processos (BPM)\n\n\n- 1 [Sobre o BPM](#RecursodeProcessos(BPM)-SobreoBPM)\n - 1.1 [Mais eficiência e menos retrabalho](#RecursodeProcessos(BPM)-Maiseficiênciaemenosretrabalho)\n - 1.2 [Transparência e produtividade](#RecursodeProcessos(BPM)-Transparênciaeprodutividade)\n - 1.3 [Soluções digitais com formulários dinâmicos](#RecursodeProcessos(BPM)-Soluçõesdigitaiscomformuláriosdinâmicos)\n - 1.4 [Integre e modernize sistemas legados](#RecursodeProcessos(BPM)-Integreemodernizesistemaslegados)\n\n# Sobre o BPM\n\nO BPM - Business Process Management - modela, automatiza processos e coloca em prática workflows, alavancando a produtividade de sua operação. Fica muito mas fácil enxergar o andamento de todas as atividades, detectar falhas e garantir a precisão e agilidade que o mundo digital exige.\n\n![](..\\images\\bp04.png)\n\n## Mais eficiência e menos retrabalho\n\nMuitas das atividades da rotina de uma empresa e processos críticos ainda são feitos de forma manual, fragmentada e dependente do conhecimento de colaboradores detentores dessas informações. Fluig modela graficamente e automatiza todos esses processos, garantindo a eficiência e controle da sua operação.\n\n## Transparência e produtividade\n\nUm processo passa por muitas áreas e pessoas tornando o acompanhamento uma tarefa bem complexa. Além disso, pra quem precisa gerir esse processo, tudo fica ainda mais confuso! Com uma central de tarefas, seu colaboradores têm controle em tempo real do status de cada atividade.\n\n## Soluções digitais com formulários dinâmicos" }, { "metadata": { "title": "Recurso de Processos (BPM)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924916", "path": "\\Plataforma Documentação técnica\\Recurso de Processos (BPM).md" }, "content": "Recurso de Processos (BPM)\n\n\nLevar eficiência por toda empresa e promover experiências digitais não é uma tarefa fácil: é preciso agilidade, mobilidade e autonomia. Os formulários inteligentes do fluig são a base para a criação de soluções digitais como automação de força de vendas, centralização de processos de negócios (CSC), gestão de times de serviços (BPO), adequação de processos de sistemas de qualidade (ISO, SOX, ONA, etc) e qualquer outra atividade que necessitem de interações entre pessoas de diferentes áreas.\n\n## Integre e modernize sistemas legados\n\nPara inovar e criar novos projetos digitais não é preciso ignorar ou se desfazer dos sistemas já existentes. Pelo contrário: tire proveito do que você já tem! Integre seu sistema legado ao fluig e deixe que uma interface mais leve e digital orquestre sua operação. De fluxos de reembolso à checklists de manutenção remota: tudo fica mais ágil e fluído com essa integração." }, { "metadata": { "title": "Recurso de Páginas e Widgets (WCM)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=113803509", "path": "\\Plataforma Documentação técnica\\Recurso de Páginas e Widgets (WCM).md" }, "content": "Recurso de Páginas e Widgets (WCM)\n\n\n# Índice\n\n- 1 [Fluig WCM](#RecursodePáginaseWidgets(WCM)-FluigWCM)\n - 1.1 [Uma revolução nos portais da sua empresa](#RecursodePáginaseWidgets(WCM)-Umarevoluçãonosportaisdasuaempresa)\n - 1.2 [Autonomia garantida para criar e manter portais](#RecursodePáginaseWidgets(WCM)-Autonomiagarantidaparacriaremanterportais)\n - 1.3 [Digital Workplace na prática](#RecursodePáginaseWidgets(WCM)-DigitalWorkplacenaprática)\n\n# Fluig WCM\n\nFluig WCM - Web Content Management, fornece liberdade para criar portais corporativos e transformá-los em espaços colaborativos. Para cada departamento, área ou assunto relevante, o WCM permite desenvolver portais utilizando interfaces personalizadas, com controle dos diferentes níveis de acesso a documentos e processos. Por meio dele, amplia-se o relacionamento com outras equipes, clientes, parceiros e fornecedores. \n\n![](..\\images\\Po04%5B1%5D.png)\n\n## Uma revolução nos portais da sua empresa\n\nFalta de atualização, navegação confusa e dificuldade de acesso são motivos pelos quais portais corporativos ficam de lado na estratégia de uma empresa. Fluig oferece liberdade para criar intranet, extranet, portal de atendimento, portal de vendas, etc, com a flexibilidade que você precisa e oferecendo ao usuário final uma interface amigável e intuitiva.\n\n## Autonomia garantida para criar e manter portais\n\nMuitas das vezes, portais corporativos são criados e ficam perdidos no tempo sem manutenção pois exigem recursos técnicos que nem sempre estão disponíveis. Os portais da plataforma Fluig são criados com layouts prontos e widgets (blocos de conteúdo personalizáveis), isso oferece a autonomia necessária para que os portais da sua empresa sejam utilizados de forma estratégica.\n\n## Digital Workplace na prática" }, { "metadata": { "title": "Recurso de Páginas e Widgets (WCM)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=113803509", "path": "\\Plataforma Documentação técnica\\Recurso de Páginas e Widgets (WCM).md" }, "content": "Recurso de Páginas e Widgets (WCM)\n\n\nVivemos novos tempos, onde a experiência digital começa a ser exigida na vida profissional. Equipes remotas, home office, novos perfis profissionais demandam que as empresas se adaptem a essa realidade. A plataforma Fluig foi criada para colocar em prática os conceitos do Digital Workplace: interface web, acesso mobile, multi-idioma,colaboração e gestão de conteúdo se fundem em portais criados com o WCM." }, { "metadata": { "title": "Recurso de Treinamento (LMS)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=203752594", "path": "\\Plataforma Documentação técnica\\Recurso de Treinamento (LMS).md" }, "content": "Recurso de Treinamento (LMS)\n\n\nImportante!\n\nA partir de **Abril de 2025**, o [suporte](http://A partir de Abril de 2025, o suporte ofertado ao LMS será descontinuado. Não havendo mais evoluções após este período. O LMS não estará mais disponível para acesso nos ambientes a partir da próxima release do TOTVS Fluig Plataforma.) ofertado ao LMS será descontinuado. Não havendo mais evoluções após este período. O LMS não estará mais disponível para acesso nos ambientes a partir da **próxima release** do TOTVS Fluig Plataforma prevista para o primeiro semestre de 2025.\n\n- 1 [Sobre o LMS](#RecursodeTreinamento(LMS)-SobreoLMS)\n - 1.1 [Capacitação corporativa sem barreiras](#RecursodeTreinamento(LMS)-Capacitaçãocorporativasembarreiras)\n - 1.2 [Trilhas de conhecimento](#RecursodeTreinamento(LMS)-Trilhasdeconhecimento)\n - 1.3 [Avaliações e pesquisas](#RecursodeTreinamento(LMS)-Avaliaçõesepesquisas)\n - 1.4 [Sala de aula virtual colaborativa](#RecursodeTreinamento(LMS)-Saladeaulavirtualcolaborativa)\n\n# Sobre o LMS\n\nCom o LMS – *Learning Management System* ou Gestão de aprendizado à distância – coloque em prática a trilha de capacitação dos colaboradores da sua empresa. Compartilhe e gerencie o conhecimento por meio de um e-Learning colaborativo, que garante disponibilidade e uma experiência de aprendizado mais rica.\n\n![](..\\images\\lm04.png)\n\n## Capacitação corporativa sem barreiras\n\nManter o seu colaborador capacitado e atualizado é extremamente importante, porém, essa tarefa exige investimentos logísticos e de infra-estrutura. Além disso, às vezes é complicado conciliar a agenda de todos os envolvidos, tanto dos especialistas quanto dos colaboradores. O EAD corporativo permite a criação de um ambiente virtual para o acesso a treinamentos multi-formatos (SCORM, vídeos, documentos etc) e realização de avaliações com autonomia de horário.\n\n## Trilhas de conhecimento" }, { "metadata": { "title": "Recurso de Treinamento (LMS)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=203752594", "path": "\\Plataforma Documentação técnica\\Recurso de Treinamento (LMS).md" }, "content": "Recurso de Treinamento (LMS)\n\n\nCada profissional necessita de uma capacitação de acordo com sua função e estágio de carreira. Conciliar essas variáveis em uma trilha de capacitação eficaz para cada um é um grande desafio para área de Gestão de Pessoas. A plataforma de LMS proporciona a criação de trilhas de acordo com as necessidades de uma função, cargo ou equipe.\n\n## Avaliações e pesquisas\n\nCada capacitação exige métodos de avaliações diferentes de acordo com o tipo de conteúdo. Na plataforma de educação corporativa é possível criar e gerenciar avaliações com um banco de questões rico e inteligente, que contempla diversos formatos de questões, randomização, tempo de avaliação, entre outros recursos.\n\n## Sala de aula virtual colaborativa\n\nA troca de conhecimento não formal também é importante para o processo de aprendizagem. O LMS também proporciona um ambiente colaborativo e virtual, onde a troca de informações e documentos acontece, garantindo a retenção do conhecimento por meio de discussões em grupo." }, { "metadata": { "title": "Sobre a plataforma", "source": "https://tdn.totvs.com/display/fluig/Sobre+a+plataforma", "path": "\\Plataforma Documentação técnica\\Sobre a plataforma.md" }, "content": "Sobre a plataforma\n\n\n### Está interessado no TOTVS Fluig Plataforma? Utilize os nossos canais e descubra tudo o que a plataforma pode oferecer para o seu negócio:\n\n### SITE OFICIAL\n\n\n\n### SOLICITE CONTATO\n\n" }, { "metadata": { "title": "Apps e Mashups", "source": "https://tdn.totvs.com/display/fluig/Apps+e+Mashups", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups.md" }, "content": "Apps e Mashups" }, { "metadata": { "title": "Cadastro de Dados Adicionais - Chaves", "source": "https://tdn.totvs.com/display/fluig/Cadastro+de+Dados+Adicionais+-+Chaves", "path": "\\Plataforma Documentação técnica\\Configuração\\Cadastro de Dados Adicionais - Chaves.md" }, "content": "Cadastro de Dados Adicionais - Chaves" }, { "metadata": { "title": "Cadastro de Dados Adicionais - Chaves", "source": "https://tdn.totvs.com/display/fluig/Cadastro+de+Dados+Adicionais+-+Chaves", "path": "\\Plataforma Documentação técnica\\Configuração\\Cadastro de Dados Adicionais - Chaves.md" }, "content": "Cadastro de Dados Adicionais - Chaves\n\n\n# Índice\n\n- 1 [Objetivo](#CadastrodeDadosAdicionaisChaves-Objetivo)\n- 2 [Chaves](#CadastrodeDadosAdicionaisChaves-Chaves)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar em uma única página as chaves padrões e as que poderão ser configuradas ou cadastradas nos Dados Adicionais em uma Empresa do TOTVS Fluig Plataforma. Esta página contempla apenas as principais chaves usadas para configuração, personalização e integração dos cards. Chaves relaciona as integrações com outros produtos e experiências de uso, devem ser tratadas diretamente com as equipes de atendimento (framework) responsáveis.\n\n# Chaves\n\n---\n\n| Chave | Valor | Objetivo |\n| --- | --- | --- |\n| **dirDefault** | | Diretório onde fica salvo a pasta de Volume da plataforma. |\n| **defaultTheme** | themeecmdefault | Tema que a plataforma está utilizando. |\n| **dirUpload** | | Diretório onde está salvo a pasta de upload da plataforma. Os arquivos são salvos temporariamente até a finalização do upload, para posteriormente serem transferidos para a pasta public. |\n| **dirUploadConnect** | | Diretório onde está salvo a pasta de upload do fluig Connect. Os arquivos carregados através do fluig Connect são salvos temporariamente neste local até a finalização do upload, para posteriormente serem transferidos para a pasta public. |\n| **dirCustom** | | Pasta onde ficam salvos os templates de customização de formulários. |\n| **[oldViewer](https://tdn.totvs.com/pages/viewpage.action?pageId=200910842)** | true ou false | Habilita (true) e desabilita (false) o visualizador antigo da plataforma. Restrito a poucas extensões de arquivos. |\n| **[internalVisualizerServer](Apps e Mashups/Sobre o Fluig Viewer.md)** | [<](http://api.accusoft.com.br)IP ou URL de acesso> | Visualizador de documentos padrão da plataforma. [Fluig Viewer executado em Cloud Amazon](Apps e Mashups/Sobre o Fluig Viewer/Configuração do Fluig Viewer.md) (URL de Acesso: ). |\n| **social.accsses.control.default.group** | DefaultGroup-1 | Grupo padrão onde são incluídos os usuários sem grupo definido no momento do cadastro. |\n| **[analytics.gd.project.id](../Recurso de Analytics/Guia de Implantação do Analytics.md)** | | Integra o fluig Analytics com a GoodData. |\n| **[analytics.gd](http://analytics.gd)[.user](../Recurso de Analytics/Guia de Implantação do Analytics.md)** | | Integra o fluig Analytics com a GoodData. |\n| **[analytics.gd](http://analytics.gd)[.pass](../Recurso de Analytics/Guia de Implantação do Analytics.md)** | | Integra o fluig Analytics com a GoodData. |\n| **[analytics.gd](http://analytics.gd)[.active](../Recurso de Analytics/Guia de Implantação do Analytics.md)** | true ou false | Integra o fluig Analytics com a GoodData. |\n| **chat.enabled** | true ou false | Habilita (true) e desabilita (false) o chat da plataforma. |\n| **[portalTitle](../Personalização/Personalização do título na aba do navegador.md)** | | Personaliza o título das guias de navegação (abas) da plataforma. |\n| **[startScreen](Mobile/Personalização da tela inicial do My Fluig.md)** | PROCESS:  Se você deseja que a tela inicial seja a inicialização de processos. SOCIAL: Se você deseja que a tela inicial seja a timeline. DOCUMENT: Se você deseja que a tela inicial seja a navegação de documentos. TASKS: Se você deseja que a tela inicial seja a central de tarefas. COMMUNITY:ALIAS\\_DA\\_COMUNIDADE: Se você deseja que a tela inicial seja uma comunidade, o parâmetro ALIAS\\_DA\\_COMUNIDADE deve ser preenchido e válido para direcionar para comunidade correta. PAGE:IDENTIFICADOR\\_UNICO: Se você deseja que a tela inicial seja uma página, o parâmetro IDENTIFICADOR\\_UNICO deve ser preenchido e válido para direcionar para página correta. | Personaliza a tela inicial do fluig Mobile. |\n| **[realtime.enabled](Habilitar atualização automática da Timeline.md)** | true ou false | Habilitar/desabilita atualização automática da Timeline. |\n| **[PUSHAPPKEY](https://tdn.totvs.com/pages/viewpage.action?pageId=181141760)** | | Habilitar uma notificação Push utilizando a solução da Urban Airship. |" }, { "metadata": { "title": "Como configurar a plataforma para passar por um Proxy", "source": "https://tdn.totvs.com/display/fluig/Como+configurar+a+plataforma+para+passar+por+um+Proxy", "path": "\\Plataforma Documentação técnica\\Configuração\\Como configurar a plataforma para passar por um Proxy.md" }, "content": "Como configurar a plataforma para passar por um Proxy" }, { "metadata": { "title": "Como configurar a plataforma para passar por um Proxy", "source": "https://tdn.totvs.com/display/fluig/Como+configurar+a+plataforma+para+passar+por+um+Proxy", "path": "\\Plataforma Documentação técnica\\Configuração\\Como configurar a plataforma para passar por um Proxy.md" }, "content": "Como configurar a plataforma para passar por um Proxy\n\n\nFique atento!\n\nEsta página é válida para atualizações **1.6** e **superiores** do TOTVS Fluig.\n\n- [Objetivo](#ComoconfiguraraplataformaparapassarporumProxy-Objetivo)\n- [Configuração](#ComoconfiguraraplataformaparapassarporumProxy-Configuração)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é detalhar como configurar o serviço do Fluig para se autenticar em um servidor de *proxy*.\n\n# Configuração\n\n---\n\nÉ possível configurar a plataforma para se autenticar em um servidor de *proxy*. Essa configuração é necessária para utilização de algumas soluções, como por exemplo *Push* e SMS, que possuem requisições HTTP *e* HTTPS para aplicações externas.\n\nA seguir são apresentadas as configurações a serem executadas.\n\n**01**. Pare o serviço do Fluig.\n\n**02**. Acesse [diretório\\_instalação]\\appserver\\standalone\\configuration, localize o arquivo “standalone.xml” e faça um *backup.*\n\n**03**.Acesse [diretório\\_instalação]\\appserver\\standalone\\configuration e edite o arquivo “standalone.xml”.\n\n**04**.Na tag ****, adicione as seguintes linhas e substitua os valores dos parâmetros *value* pelos dados do *proxy* de seu ambiente.\n\n```\n\n\n\n\n\n\n```\n\n**05**.Caso seja necessário também utilizar conexões HTTPS através do *proxy*, no **** adicione as seguintes linhas e substitua o valor dos parâmetros *value* pelos dados do *proxy* de seu ambiente:\n\n```\n\n\n```\n\n**06**.Caso seja necessário que algum endereço não passe pelo *proxy*, no **** adicione a seguinte linha e substitua o valor do parâmetro *value* pelos endereços IPs que não devem passar pelo *proxy*:\n\n```\n\n```\n\n**07**. Inicie o serviço do Fluig novamente.\n\n**01**. Pare o serviço do Fluig.\n\n**02**. Acesse [diretório\\_instalação]\\appserver\\domain\\configuration, localize o arquivo “domain.xml” e faça um *backup.*\n\n**03**.Acesse [diretório\\_instalação]\\appserver\\domain\\configuration e edite o arquivo “domain.xml”.\n\n**04**.Na tag ****, adicione as seguintes linhas e substitua os valores dos parâmetros *value* pelos dados do *proxy* de seu ambiente.\n\n```\n\n\n\n\n\n\n```\n\n**05**.Caso seja necessário também utilizar conexões HTTPS através do *proxy*, no **** adicione as seguintes linhas e substitua o valor dos parâmetros *value* pelos dados do *proxy* de seu ambiente:\n\n```\n\n\n```\n\n**06**.Caso seja necessário que algum endereço não passe pelo *proxy*, no **** adicione a seguinte linha e substitua o valor do parâmetro *value* pelos endereços IPs que não devem passar pelo *proxy*:\n\n```\n\n```\n\n**07**. Inicie o serviço do Fluig novamente." }, { "metadata": { "title": "Configurando Integrações via EAI", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212894462", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurando Integrações via EAI.md" }, "content": "Configurando Integrações via EAI" }, { "metadata": { "title": "Configurando Integrações via EAI", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212894462", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurando Integrações via EAI.md" }, "content": "Configurando Integrações via EAI\n\n\n# Índice\n\n- 1 [Objetivo](#ConfigurandoIntegraçõesviaEAI-Objetivo)\n- 2 [Visão Geral](#ConfigurandoIntegraçõesviaEAI-VisãoGeral)\n- 3 [Definição de mensagem única TotvsMessage](#ConfigurandoIntegraçõesviaEAI-DefiniçãodemensagemúnicaTotvsMessage)\n- 4 [EAI vs Arquitetura multi-empresa](#ConfigurandoIntegraçõesviaEAI-EAIvsArquiteturamulti-empresa)\n- 5 [EAI Console](#ConfigurandoIntegraçõesviaEAI-EAIConsole)\n- 6 [Recebimento de mensagem](#ConfigurandoIntegraçõesviaEAI-Recebimentodemensagem)\n- 7 [Configuração do Console EAI](#ConfigurandoIntegraçõesviaEAI-ConfiguraçãodoConsoleEAI)\n- 8 [Carga inicial de treinamentos do TOTVS Fluig Plataforma ao TOTVS RH (Linha Datasul)](#ConfigurandoIntegraçõesviaEAI-CargainicialdetreinamentosdoTOTVSFluigPlataformaaoTOTVSRH(LinhaDatasul))\n- 9 [Integração na inclusão de dados](#ConfigurandoIntegraçõesviaEAI-Integraçãonainclusãodedados)\n\nAtenção\n\nOs ERPs **TOTVS Vitae,** **TOTVS Educacional** e **TOTVS RH** (Linha Datasul) estão em processo de **descontinuação da integração via EAI com o Fluig LMS,** porém, nesse momento a funcionalidade não será retirada do produto. Caso haja novas mudanças, os usuários serão comunicados previamente.\n\n# Objetivo\n\nO objetivo deste guia é habilitar e configurar o console EAI para a utilização nas integrações com TOTVS Vitae, TOTVS Educacional e TOTVS RH (Linha Datasul).\n\n# Visão Geral\n\nExiste um conjunto de técnicas e padrões para a integração de ERPs TOTVS, conhecida como “Mensagem Única TOTVS”. Este conjunto de definições estabelece como os produtos TOTVS devem se comunicar e engloba questões como:\n\n- Como definir uma mensagem de integração;\n- Como as mensagens são identificadas;\n- Como é feita a troca de mensagens;\n- Como as mensagens são rastreadas.\n\nO componente EAI 2.0 (Java), do produto Datasul encapsula estas definições e permite que os produtos possam se integrar no novo modelo com um esforço menor para a sua incorporação. Ele define um conjunto de interfaces que devem ser implementadas pelo produto hospedeiro (host application) que tratam, basicamente, da persistência das informações que circulam pelo EAI em banco de dados. Além disso, o EAI também espera que o aplicativo hospedeiro disponibilize um web service que será a porta de entrada para as mensagens enviadas pelos outros aplicativos.\n\nEm contrapartida, o EAI 2.0 fornece toda a lógica de identificação, processamento e rastreabilidade de mensagens além de uma interface web para o gerenciamento da instância.\n\n# Definição de mensagem única TotvsMessage\n\nDurante o processo de consolidação de marcas, iniciado pela TOTVS, várias empresas diferentes foram adquiridas e com elas vários produtos passaram a compor o portfólio de ofertas disponível aos clientes. Esta expansão de ofertas permitiu que clientes de uma marca, antes limitados pelas opções com aquela “etiqueta”, pudesse agora compor o seu ambiente de TI utilizando produtos de origens diferentes (Ex.: TOTVS Educacional + TOTVS Fluig Plataforma, TOTVS RH (Linha Datasul) + TOTVS Fluig Plataforma).\n\nEsta mesma iniciativa já era uma prática comum nos clientes, porém todo o custo envolvido na integração entre estes aplicativos era visto pelo cliente como parte da escolha de utilizar-se de produtos de diferentes fornecedores. Uma vez que estes produtos passam a fazer parte de uma mesma oferta, os clientes TOTVS passam a demandar que estes produtos sejam naturalmente integrados. Isto significa que se antes o cliente arcava com o custo e o risco envolvido em uma integração, ele agora entende que a TOTVS deve prover soluções já integradas, independente da origem dos produtos oferecidos.\n\nCom o objetivo de padronizar a integrações com os produtos TOTVS, foi definida uma nova diretriz para os projetos de integração: A de que todos os produtos TOTVS devam trabalhar com uma mensagem XML únicos evitando, desta forma, o processo de transformação de mensagens. Neste cenário, teríamos o seguinte quadro:\n\n![](..\\..\\images\\int1.png)\n\nNeste cenário, qualquer produto TOTVS trabalhará com o mesmo XML para uma mesma entidade, ou seja, supondo que tenhamos um XML correspondente à mensagem de CLIENTES, ela poderá ser enviada para qualquer um dos produtos que suporte o recebimento desta entidade.\n\nUma vez que os vários produtos TOTVS terão um “idioma” comum (o XML Único), as integrações entre estes produtos não exigirão mais que as mensagens sejam transformadas de um formato para outro. Com isto, será possível conectar diretamente dois produtos, como no diagrama abaixo:\n\n![](..\\..\\images\\int2.png)\n\nAlém de questões referentes ao formato das mensagens, a mensagem única também torna uniforme o tratamento destas mensagens XML pelos aplicativos, principalmente no que diz respeito à capacidade de rastreamento.\n\nTodos os processos devem respeitar o fluxo normal de troca de mensagens no padrão de Mensagem Única TOTVS. O fluxo de mensagens poderá ocorrer nos seguintes sentidos:\n\n- TOTVS Fluig Plataforma à Educacional: a plataforma TOTVS Fluig irá consumir o webservice da linha RM para recebimento de mensagens únicas. O mesmo também será responsável por encaminhar as mensagens para o EAI RM, que processará a mesma (englobando todas as especificidades requeridas) e encaminhará o retorno de acordo com o tipo de comunicação definida (síncrona ou assíncrona).\n- Educacional à TOTVS Fluig Plataforma: os dados serão trafegados pelo fluxo normal até a fila de Integração TBC, onde o mesmo irá consumir o webservice do EAI da plataforma TOTVS Fluig para envio da(s) mensagem(s). Após a resposta da plataforma, o RM atualizará o registro com o status de processamento e demais dados, no Monitor da Fila de Mensagem Única.\n- TOTVS Fluig Plataforma à TOTVS RH (Linha Datasul): a plataforma TOTVS Fluig irá consumir o webservice do TOTVS RH (Linha Datasul) para recebimento de mensagens únicas. Ele também será responsável por encaminhar as mensagens para o EAI TOTVS RH (Linha Datasul), que as processará (englobando todas as especificidades requeridas) e encaminhará o retorno de acordo com o tipo de comunicação definida (síncrona ou assíncrona).\n\nAssim como definido no protocolo de comunicação de mensagens únicas, a comunicação pode ser efetuada de duas formas:\n\n- Síncrona: O sistema de origem gera uma mensagem de integração na sua fila e envia ao webservice de destino. O processo na origem aguarda o processamento da mensagem no destino e ao receber o retorno atualiza o status do processamento na fila de integração. (Mensagens síncronas não podem ser processadas/reprocessadas no monitor da fila de integração.)\n\n- Assíncrona: O sistema de origem gera uma mensagem de integração na sua fila, envia ao webservice de destino e aguarda somente a confirmação de recebimento da mensagem. O processo na origem não fica parado aguardando o processamento da mensagem no destino.\n\nAo término do processamento da mensagem por parte do sistema de destino o mesmo envia outra mensagem de retorno ao sistema de origem com o status do processamento.\n\nAs mensagens assíncronas podem ser processadas (status pendente) ou reprocessadas (status erro) manualmente através do monitor da fila de integração.\n\nNota: Cada linha irá programar a fila de integração a sua maneira, respeitando o protocolo definido para mensagem padrão e guardando o log de processamento de todas as mensagens recebidas ou enviadas.\n\n# EAI vs Arquitetura multi-empresa\n\nUm ponto relevante para a incorporação do EAI 2.0 na plataforma TOTVS Fluig é a sua característica de multi-empresa. Esta arquitetura permite que várias empresas utilizem a mesma instalação do produto de forma independente e transparente, gerando a percepção de que cada um possui uma instância própria do produto.\n\nIsto significa que, do ponto de vista de integração, cada Empresa também deve ser independente e possuir um conjunto próprio de integrações, mensagens, etc. Do ponto de vista lógico, cada empresa teria a sua “instância” do EAI para integração mas, do ponto de vista físico, uma única instância do (componente EAI) deverá gerenciar as integrações de cada uma das empresas individualmente.\n\nSempre que uma mensagem é recebida na plataforma TOTVS Fluig, ela deve vir com a autenticação de um usuário da empresa e, a partir dessa autenticação, a plataforma realiza o *login* do usuário e sabe a qual empresa a mensagem foi direcionada.\n\n# EAI Console\n\nO EAI Console é a ferramenta, fornecida pelo EAI 2.0, que permite gerenciar todos os aspectos relativos à gestão da integração, desde a configuração da instância do EAI, a ativação de mensagens, o cadastro de aplicativos externos e a consulta de mensagens enviadas/recebidas.\n\nO acesso ao EAI Console é restrito ao administrador da empresa e pode ser feito a partir de **Aprendizado** → **Administrar** → **Console EAI**.\n\n# Recebimento de mensagem\n\nQuando um aplicativo externo envia uma mensagem a um aplicativo hospedeiro do EAI ele deverá informar um usuário e senha que deverá ser validado contra os usuários cadastrados na plataforma TOTVS Fluig. Para que o e-learning permita que este usuário receba esta mensagem ele deverá ter um papel específico configurado no produto (Recurso \"LMSEAI - Aprendizado - EAI\" permissão \"Acessar\"). Isto torna flexível o modelo de autenticação uma vez que o cliente poderá utilizar o usuário administrador (que possui todas as roles, inclusive para recebimento de mensagens), criar um usuário específico para integrações (usuário eai, por exemplo) ou, ainda, criar usuários específicos para cada produto integrado.\n\nVale lembrar que além da permissão específica para o recebimento de mensagens, o usuário utilizado também deverá ter permissões que o habilitam a efetuar a transação que a mensagem pretende fazer. Por exemplo, para que a mensagem de criação de matrícula na turma seja processada com sucesso, o usuário utilizado deverá ter permissão para realizar matrícula na turma, ou seja, permissão de execução na turma.\n\n# Configuração do Console EAI\n\n- Efetue o login na plataforma TOTVS Fluig utilizando o usuário **administrador da empresa**, e então acesse **Aprendizado → Administrar → Console EAI**.\n\n![](..\\..\\images\\cons-01.png)\n\n- A primeira tela se refere a tela de boas vindas, clique em **Next** para continuar.\n\n![](..\\..\\images\\console%201.JPG)\n\n- Na segunda tela informe o **host** da aplicação.\n\n![](..\\..\\images\\console%202.JPG)\n\n- Na terceira tela deve ser preenchido o nome da aplicação, o usuário e senha do usuário integrador (usuário da plataforma), uma descrição (opcional) e se o xml das mensagens devem ser validadas com os xmls do EAI. Essa validação não é para valores dos campos da mensagem e sim para o formato do XML.\n\n![](..\\..\\images\\console%203.JPG)\n\n- Nessa tela é possível buscar todas as mensagens recebidas e enviadas através do console EAI. É possível buscar através de um UUID específico da mensagem, pela aplicação (externa ou host), pelo status da mensagem, pelo tipo da transação ou informando um intervalo de datas.\n\n![](..\\..\\images\\console%204.JPG)\n\n- Nessa tela o usuário habilita quais as transações que estão disponíveis para as integrações. Deve ser selecionado se a transação esta habilitada para enviar (send), para receber (receive) ou para os dois (both).\n\n![](..\\..\\images\\console%205.JPG)\n\n- Nessa tela o usuário configura os aplicativos externos que farão a integração com o TOTVS Fluig Plataforma. Para adicionar um novo aplicativo externo clique em **Add new external application.** Caso já tenha algum aplicativo cadastrado é possível selecionar o registro e atualizá-lo clicando no botão **Connection information** ou visualizar as transações disponíveis no aplicativo externo clicando em **Transactions list.**\n\n![](..\\..\\images\\console%206.JPG)\n\n- Após clicar em **Add new external application** o usuário deve adicionar o endereço WSDL do aplicativo externo, a porta e o usuário e senha de um usuário integrador válido no aplicativo externo (Usuário do aplicativo externo. Ex Usuário do RM). Esse usuário deve estar cadastrado no aplicativo externo e não na plataforma TOTVS Fluig.\n\n![](..\\..\\images\\console%207.JPG)\n\n- Após preencher as informações do aplicativo externo e clicar em **Next,** serão exibidas todas as transações habilitadas do aplicativo externo. Caso esteja tudo correto, clique em **Finish** para finalizar o cadastro do aplicativo externo.\n\n![](..\\..\\images\\console%208.JPG)\n\n- Depois de concluída a inclusão de um aplicativo externo, clique em **Host application > Send routes**, selecione o **External application** cadastrado e serão listadas todas as mensagem que a plataforma envia. Selecione todas para habilitá-las e clique em **Save changes.**\n\n![](..\\..\\images\\console%209.JPG)\n\n# Carga inicial de treinamentos do TOTVS Fluig Plataforma ao TOTVS RH (Linha Datasul)\n\n- Efetue o login na plataforma TOTVS Fluig utilizando o usuário **administrador da empresa** e então acesse **Aprendizado → Administrar → Configuração de treinamentos e trilhas**.\n\n![](..\\..\\images\\01.png)\n\n- Nesta tela é possível exportar os treinamentos já cadastrados na plataforma utilizando o botão **Exportar**.\n\n- Também é possível configurar se os usuários poderão finalizar pela plataforma sua matrícula integrada com o TOTVS RH (Linha Datasul) (Sim / Não).\n\n![](..\\..\\images\\02.PNG)\n\n# Integração na inclusão de dados\n\nTodos os registros da plataforma TOTVS Fluig criados através da integração com sistemas externos ficam ligados aos registros externos.\n\nExemplo:\n\n- Quando o RM Vitae envia um usuário para o TOTVS Fluig Plataforma através da integração, esse usuário fica ligado ao registro no RM Vitae. Quando houver uma alteração nesse usuário no RM Vitae, essa alteração será replicada no TOTVS Fluig Plataforma. \n Se o usuário é inativado no RM Vitae ele será inativado no TOTVS Fluig Plataforma também.\n- Quando o RM Educacional envia uma turma para a plataforma TOTVS Fluig através da integração, essa turma fica ligada ao registro no RM Educacional. Quando houver uma alteração nessa turma no RM Educacional, essa alteração será replicada na plataforma TOTVS Fluig. \n Se a turma se chamava \"Matemática\" e passa a se chamar \"Matemática - Noturno\" no RM Educacional esta alteração também ocorrerá na plataforma.\n- Quando o RM Educacional envia uma matrícula em uma turma para a plataforma TOTVS Fluig através da integração, essa matrícula fica vinculada ao registro no RM Educacional. A matrícula só poderá ser finalizada no RM Educacional e quando isso acontecer, uma nova mensagem é enviada para a plataforma para que a matrícula seja finalizada nela também. \n Da mesma forma, se a matrícula for cancelada ou bloqueada no RM Educacional a matrícula da plataforma também será cancelada/bloqueada.\n- Quando o RM Vitae envia uma matrícula em uma trilha/treinamento para plataforma TOTVS Fluig através da integração, essa matrícula fica vinculada ao registro no RM Vitae. A matrícula só poderá ser finalizada no RM Vitae e quando isso acontecer, uma nova mensagem é enviada para a plataforma para que a matrícula seja finalizada nela também. Da mesma forma, se a matrícula for cancelada ou bloqueada no RM Vitae a matrícula da plataforma também será cancelada/bloqueada.\n- As requisições de matrículas nos treinamentos podem ser solicitadas pelos usuários na plataforma TOTVS Fluig desde que eles possuam permissão de Matricular em Treinamentos/Trilhas e de Executar no item trilha ou treinamento). Ao solicitar a matrícula de um treinamento na plataforma, a matrícula não é feita automaticamente, e sim enviada para o TOTVS RH (Linha Datasul) e então a plataforma aguarda uma mensagem de matrícula do usuário no TOTVS RH (Linha Datasul). A matrícula só poderá ser finalizada no TOTVS RH (Linha Datasul) e, quando isso acontecer, uma nova mensagem é enviada para a plataforma para que a matrícula seja finalizada nela também. Da mesma forma, se a matrícula for cancelada ou bloqueada no TOTVS RH (Linha Datasul), a matrícula da plataforma também será cancelada/bloqueada.\n- Quando o TOTVS Fluig Plataforma envia um treinamento para o TOTVS RH (Linha Datasul) através da integração, esse treinamento fica ligado ao registro TOTVS RH (Linha Datasul). Quando houver uma alteração nesse treinamento na plataforma, a alteração será replicada no TOTVS RH (Linha Datasul). Os treinamentos não podem ser cadastrados nem editados no TOTVS RH (Linha Datasul). As trilhas não são integradas.\n\nEssa condição acontece com todos os registros integrados.\n\nExemplo: Usuários, Disciplinas, Turmas, Complementos de Disciplina, Treinamentos, Requisição de Matrículas, Matrículas em Turmas, Matrículas em Treinamentos, etc.\n\nNa mensagem de integração de usuários é permitido o envio de uma lista de papéis e outra lista de grupos. Quando o usuário estiver sendo criado na plataforma TOTVS Fluig, esses papéis e grupos são listados e os papéis/grupos que não existem na plataforma são criados e associados ao usuário. Os papéis e grupos já existentes na plataforma serão apenas associados ao usuário não havendo nenhum tipo de atualização dos mesmo.\n\nCaso seja uma atualização de usuários e na mensagem conste papéis ou grupos não existentes na plataforma TOTVS Fluig, os mesmos serão ignorados, sendo associados ao usuário apenas os existentes na plataforma. O processo de atualização não cria nem grupos e nem papéis.\n\nImportante!\n\nA partir da atualização **[1.6.5-190219](http://tdn.totvs.com/pages/viewpage.action?pageId=442961412#Atualiza%C3%A7%C3%B5es(1.6.5)-190219)**, o **LMS** não faz mais parte da plataforma para **novas instalações**.\n\nMas, não se preocupe: se você adquiriu a plataforma com o **LMS incluso**, entre em contato com o [Suporte Fluig](https://suporte.fluig.com/) para que você consiga utiliza-lo normalmente – mesmo após a atualização **1.6.5-190219**. Se você não lembra se o LMS está incluso ou não no seu pacote, consulte sua proposta comercial ou entre em contato com o seu ESN." }, { "metadata": { "title": "Configurando Jetty para SSL (https)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185730415", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurando Jetty para SSL (https).md" }, "content": "Configurando Jetty para SSL (https)" }, { "metadata": { "title": "Configurando Jetty para SSL (https)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185730415", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurando Jetty para SSL (https).md" }, "content": "Configurando Jetty para SSL (https)\n\n\n# Índice\n\n- 1 [Objetivo](#ConfigurandoJettyparaSSL(https)-Objetivo)\n- 2 [Configurar SSL para Jetty](#ConfigurandoJettyparaSSL(https)-ConfigurarSSLparaJetty)\n- 3 [Gerando as chaves e os certificados auto-assinados](#ConfigurandoJettyparaSSL(https)-Gerandoaschaveseoscertificadosauto-assinados)\n - 3.1 [Gerando chaves e certificados com keytool do JDK](#ConfigurandoJettyparaSSL(https)-GerandochavesecertificadoscomkeytooldoJDK)\n- 4 [Carregando chaves e certificados](#ConfigurandoJettyparaSSL(https)-Carregandochavesecertificados)\n - 4.1 [Carregando Certificados com keytool](#ConfigurandoJettyparaSSL(https)-CarregandoCertificadoscomkeytool)\n - 4.2 [Utilizando certificados com extensão .crt](#ConfigurandoJettyparaSSL(https)-Utilizandocertificadoscomextensão.crt)\n - 4.3 [Utilizando certificados com extensão .p12](#ConfigurandoJettyparaSSL(https)-Utilizandocertificadoscomextensão.p12)\n- 5 [Configurando SslContextFactory](#ConfigurandoJettyparaSSL(https)-ConfigurandoSslContextFactory)\n - 5.1 [Configuração em sistemas Linux:](#ConfigurandoJettyparaSSL(https)-ConfiguraçãoemsistemasLinux:)\n- 6 [Configuração específica para Jetty no Windows](#ConfigurandoJettyparaSSL(https)-ConfiguraçãoespecíficaparaJettynoWindows)\n\n# Objetivo\n\n---\n\nServiços em HTTPS tem como objetivo garantir maior segurança no tráfego de arquivos entre cliente-servidor. Neste documento abordaremos a configuração SSL do servidor de aplicação **jetty,** utilizado na [Replicação de Documentos](http://tdn.totvs.com/pages/viewpage.action?pageId=172297964), que será utilizado juntamente com o Fluig quando o WildFly estiver com o certificado SSL também ativo.\n\nAtenção\n\nOs procedimentos descritos neste guia foram testados e homologados na versão 9.4.8.v20171121 do [Jetty](https://www.eclipse.org/jetty/documentation/)\n\n# Configurar SSL para Jetty\n\n---\n\nPara configurar o SSL no Jetty, é necessário:\n\n- Gerar as chaves e os certificados auto-assinados (caso não possua o certificado).\n- Carregar chaves e certificados.\n- Configurar *sslContextFactory*.\n\n# Gerando as chaves e os certificados auto-assinados\n\n---\n\nO caminho mais fácil para gerar as chaves e os certificados é usar a ferramenta *keytool*que vem na instalação da JDK.\n\nNota\n\nSe você já possui as chaves e os certificados vá direto para o passo,**Carregando as chaves e certificados**, afim de verificar como carregá-los para dentro do *keystore* JSSE. Esta seção também se aplica no caso de renovação de certificados onde você deseja substituir um certificado que está expirando.\n\nO exemplo abaixo gera somente chaves e certificados básicos. Você deve acessar a [documentação do Jetty](https://www.eclipse.org/jetty/documentation/) se precisar especificar o seguintes itens:\n\n- O tamanho da chave\n- A data de expiração do certificado\n- Alterar a segurança dos providers" }, { "metadata": { "title": "Configurando Jetty para SSL (https)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185730415", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurando Jetty para SSL (https).md" }, "content": "Configurando Jetty para SSL (https)\n\n### Gerando chaves e certificados com keytool do JDK\n\nO comando a seguir gera as chaves e o certificado diretamente no arquivo `keystore` :\n\n```\n$ keytool -keystore keystore -alias jetty -genkey -keyalg RSA\n```\n\n- Preencha todos as informações solicitadas e ao final digite **sim** e pressione **Enter** para confirmar.\n\nEstes certificados auto-assinados não são válidos externamente.\n\n# Carregando chaves e certificados\n\n---\n\nSe um certificado CA lhe foi enviado, ou se você gerou o seu próprio certificado sem `keytool` , você precisa carregá-lo em um keystore JSSE.\n\n  \n\n### Carregando Certificados com keytool\n\nVocê pode usar o `keytool` para carregar um certificado no formato PEM diretamente em um keystore. O formato PEM é uma codificação de texto de certificados; é produzido pela OpenSSL, e é devolvido por alguns CAs. Um exemplo de arquivo PEM é:\n\n```\n jetty.crt\n ----- BEGIN CERTIFICATE -----\n MIICSDCCAfKgAwIBAgIBADANBgkqhkiG9w0BAQQFADBUMSYwJAYDVQQKEx1Nb3J0\n IEJheSBDb25zdWx0aW5nIFB0eS4gTHRkLjEOMAwGA1UECxMFSmV0dHkxGjAYBgNV\n BAMTEWpldHR5Lm1vcnRiYXkub3JnMB4XDTAzMDQwNjEzMTk1MFoXDTAzMDUwNjEz\n MTk1MFowVDEmMCQGA1UEChMdTW9ydCBCYXkgQ29uc3VsdGluZyBQdHkuIEx0ZC4x\n DjAMBgNVBAsTBUpldHR5MRowGAYDVQQDExFqZXR0eS5tb3J0YmF5Lm9yZzBcMA0G\n CSqGSIb3DQEBAQUAA0sAMEgCQQC5V4oZeVdhdhHqa9L2 / ZnKySPWUqqy81riNfAJ\n 7uALW0kEv / LtlG34dOOcVVt / PK8 / bU4dlolnJx1SpiMZbKsFAgMBAAGjga4wgasw\n HQYDVR0OBBYEFFV1gbB1XRvUx1UofmifQJS / MCYwMHwGA1UdIwR1MHOAFFV1gbB1\n XRvUx1UofmifQJS / MCYwoVikVjBUMSYwJAYDVQQKEx1Nb3J0IEJheSBDb25zdWx0\n aW5nIFB0eS4gTHRkLjEOMAwGA1UECxMFSmV0dHkxGjAYBgNVBAMTEWpldHR5Lm1v\n cnRiYXkub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADQQA6NkaV\n OtXzP4ayzBcgK / qSCmF44jdcARmrXhiXUcXzjxsLjSJeYPJojhUdC2LQKy + p4ki8\n Rcz6oCRvCGCe5kDB\n ----- END CERTIFICATE -----\n```\n\n```\n\n```\n\n### Utilizando certificados com extensão .crt" }, { "metadata": { "title": "Configurando Jetty para SSL (https)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185730415", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurando Jetty para SSL (https).md" }, "content": "Configurando Jetty para SSL (https)\n\n\nSe você já possui um certificado com a extensão .crt e a senha para acessá-lo utilize o comando abaixo. Este comando a seguir carrega o conteúdo do arquivo .crt para dentro do arquivo keystore JSSE:\n\n```\n $ keytool -keystore keystore -import -alias jetty -file [nome_do_arquivo].crt -trustcacerts\n```\n\nAo executar o comando acima digite uma senha '**não pode ser deixado em branco'**. Esta é a senha de acesso ao arquivo keystore.\n\n### Utilizando certificados com extensão .p12\n\nSe você possui um certificado com a extensão .p12 utilize o comando abaixo. Este comando a seguir carrega o conteúdo do arquivo .crt para dentro do arquivo keystore JSSE:\n\n```\n\t$ keytool -importkeystore -srckeystore [nome_do_arquivo].p12 -srcstoretype PKCS12 -destkeystore keystore\n```\n\nAo executar o comando acima lhe será solicitado uma senha '**não pode ser deixado em branco'**. Esta é a senha de acesso ao arquivo keystore.\n\nSerá solicito uma segunda senha, esta é a de acesso ao certificado, guarde as duas senha.\n\nÉ necessário copiar o arquivo *keystore* do local onde foi gerado para dentro da pasta **[instalação do jetty]/etc**\n\n# Configurando SslContextFactory\n\n---\n\nO Jetty permite que seja criado um diretório específico para realizar as configurações, assim é possível manter uma separação entre os arquivos binários de instalação ($JETTY\\_HOME) e as configurações personalizadas ($JETTY\\_BASE). Veja mais detalhes em [Gerenciando Jetty Home e Jetty Base](https://www.eclipse.org/jetty/documentation/9.4.x/startup-base-and-home.html)\n\n## Configuração em sistemas Linux:" }, { "metadata": { "title": "Configurando Jetty para SSL (https)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185730415", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurando Jetty para SSL (https).md" }, "content": "Configurando Jetty para SSL (https)\n\n\n---\n\n\n\nPrimeiramente crie o diretório base:\n\n```\n$ JETTY_BASE=/opt/jetty_fluig\n$ mkdir $JETTY_BASE\n$ cd $JETTY_BASE\n```\n\nEm seguida, será preciso habilitar alguns módulos, execute os comandos:\n\n```\n$ java -jar $JETTY_HOME/start.jar --create-startd\n$ java -jar $JETTY_HOME/start.jar --add-to-start=http,deploy,ssl,https\n```\n\nCom isso, os diretórios etc, start.d e webapps devem ser criados.\n\nAgora faremos as configurações para o Jetty funcionar em HTTPS, abra o arquivo $JETTY\\_BASE/start.d/ssl.ini e edite as seguintes configurações:\n\n**jetty.ssl.host** - Endereço/IP de conexão\n\n**jetty.ssl.port** - porta de conexão\n\n**jetty.sslContext.keyStorePath** - Caminho e nome do arquivo keystore (relativo ao $JETTY\\_BASE)\n\n**jetty.sslContext.trustStorePath** - Caminho e nome do arquivo Truststore (relativo ao $JETTY\\_BASE)\n\n**jetty.sslContext.keyStorePassword** - Senha de acesso ao keystore\n\n**jetty.sslContext.keyManagerPassword** - Senha de acesso ao keymanager\n\n**jetty.sslContext.trustStorePassword** - Senha de acesso ao truststore\n\nOfuscar senhas de acesso\n\nPor questões de segurança, recomendamos que as senhas de acesso ao keystore, keymanager e truststore sejam ofuscadas.\n\nO Jetty possuí uma [biblioteca](https://www.eclipse.org/jetty/documentation/9.4.x/configuring-security-secure-passwords.html) que possibilita ofuscar senhas, basta executar os comandos:\n\n```\n$ export JETTY_VERSION=9.0.0-SNAPSHOT\n$ java -cp lib/jetty-util-$JETTY_VERSION.jar org.eclipse.jetty.util.security.Password [SENHA]\n\n\n# Exemplo de uso:\n$ java -cp lib/jetty-util-$JETTY_VERSION.jar org.eclipse.jetty.util.security.Password blah\nOBF:20771x1b206z\nMD5:639bae9ac6b3e1a84cebb7b403297b79\nCRYPT:me/ks90E221EY\n\n# Ao utilizar o método de ofuscação OBF, a configuração das senhas ficará à semelhante abaixo:\n# jetty.sslContext.keyStorePassword=OBF:20771x1b206z\n```\n\n# Configuração específica para Jetty no Windows\n\n---\n\nÉ necessário adicionar o parâmetro abaixo no momento em que o Jetty será iniciado:\n\n*-Dfile.encoding=UTF-8 -[Djavax.net](http://Djavax.net).ssl.trustStore=**[caminho do arquivo keystore gerado]***\n\nPara iniciar o Jetty basta digitar no terminal do Windows o seguinte comando:\n\n*java -Dfile.encoding=UTF-8 -[Djavax.net](http://Djavax.net).ssl.trustStore=**[caminho do arquivo keystore gerado]** -jar start.jar*" }, { "metadata": { "title": "Configurar aplicativo Datasul 11 na plataforma", "source": "https://tdn.totvs.com/display/fluig/Configurar+aplicativo+Datasul+11+na+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurar aplicativo Datasul 11 na plataforma.md" }, "content": "Configurar aplicativo Datasul 11 na plataforma\n\n\n# Índice\n\n- 1 [Configuração de Aplicativo Datasul 11 no TOTVS Fluig Plataforma](#ConfiguraraplicativoDatasul11naplataforma-ConfiguraçãodeAplicativoDatasul11noTOTVSFluigPlataforma)\n- 2 [Cadastrando o Adapter](#ConfiguraraplicativoDatasul11naplataforma-CadastrandooAdapter)\n- 3 [Cadastrando o aplicativo](#ConfiguraraplicativoDatasul11naplataforma-Cadastrandooaplicativo)\n- 4 [Publicando um Aplicativo](#ConfiguraraplicativoDatasul11naplataforma-PublicandoumAplicativo)\n- 5 [Configurando os parâmetros variáveis](#ConfiguraraplicativoDatasul11naplataforma-Configurandoosparâmetrosvariáveis)\n\nAtenção!\n\nDevido a necessidade de execução de applets, este recurso não tem seu funcionamento como esperado. Os applets são uma tecnologia depreciada e por este motivo foram descontinuados pelos navegadores no geral.\n\n### Configuração de Aplicativo Datasul 11 no TOTVS Fluig Plataforma\n\n---\n\nPara executar os programas do EMS é necessário configurar o Adapter e Aplicativo.\n\n![](..\\..\\images\\image2013-9-11%20134743.png)\n\n### Cadastrando o Adapter\n\n---\n\nPrimeiro é necessário cadastrar um adapter que utilize o arquivo **Dtsul11Adapter.jar**. Para isso é somente necessário adicionar um novo adapter e no campo **Arquivo JAR** informar:\n\n```\n{$WDKPROTOCOL}://{$WDKHOST}:{$WDKPORT}/{$WDKWEBHOME}/utils/Dtsul11Adapter.jar\n```\n\nA funcionalidade **Adapter** está disponível no menu **Painel de Controle**, agrupador **Desenvolvimento**.\n\n![](..\\..\\images\\2-datasul11.png)\n\n### Cadastrando o aplicativo" }, { "metadata": { "title": "Configurar aplicativo Datasul 11 na plataforma", "source": "https://tdn.totvs.com/display/fluig/Configurar+aplicativo+Datasul+11+na+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurar aplicativo Datasul 11 na plataforma.md" }, "content": "Configurar aplicativo Datasul 11 na plataforma\n\n\n---\n\nDepois do adapter cadastrado é necessário criar o aplicativo que vai executar o Datasul 11.\n\nClicar em **Adicionar** e informe o código do aplicativo e descrição, selecione o adapter do Datasul 11 e no campo linha de comando informe qualquer caractere (no caso do exemplo abaixo foi informado um ponto final “.”), pois a tela valida se tem informação no campo *Linha Comando* e caso não tenha nada informado, ela não deixa o usuário adicionar o aplicativo.\n\n![](..\\..\\images\\image2013-9-11%20151624.png)\n\nNo cadastro do aplicativo, também é necessário adicionar cinco parâmetros na tabela **Parâmetros**, para incluir um parâmetro basta clicar no botão **Adicionar**.\n\n![](..\\..\\images\\image2013-9-11%20152048.png)\n\nOs parâmetros cadastrados devem ser configurados conforme tabela a seguir:\n\n| | | | |\n| --- | --- | --- | --- |\n| **Parâmetro** | **Valor** | **Variável por Usuário** | **Formato Senha** |\n| **host** | Informar o nome do servidor ou IP | Não | Não |\n| **port** | Informar a porta de comunicação com o servidor | Não | Não |\n| **user** | Informar o código do usuário do Datasul 11. | Sim | Não |\n| **password** | Informar a senha do usuário do Datasul 11. | Sim | Sim |\n| **dialect** | Informar o dialeto para exibição das mensagens de erro. Valores possíveis: \"PT\" (Português), \"EN\" (Inglês), \"ES\" (Espanhol) | Opcional. Se não for informado, será assumido o dialeto padrão (PT) | Não |\n\nNota\n\nOs parâmetros devem estar com o código exatamente como descrito na coluna **Parâmetro** da tabela acima, respeitando maiúsculas e minúsculas.\n\n### Publicando um Aplicativo" }, { "metadata": { "title": "Configurar aplicativo Datasul 11 na plataforma", "source": "https://tdn.totvs.com/display/fluig/Configurar+aplicativo+Datasul+11+na+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurar aplicativo Datasul 11 na plataforma.md" }, "content": "Configurar aplicativo Datasul 11 na plataforma\n\n\n---\n\nPara configurar um programa do Datasul 11 será necessário publicar um novo aplicativo abaixo de uma pasta.\n\n![](..\\..\\images\\image2013-9-11%20141257.png)\n\n \n\nDeve ser selecionado o aplicativo EMS configurado anteriormente e no campo **Parâmetros** deve ser informado a constante **Program:** mais o caminho do programa Datasul que será executado.\n\n**Exemplo:**\n\n```\nProgram:cdp/cd0704.w\n```\n\n![](..\\..\\images\\image2013-9-11%20153026.png)\n\n Publicando o aplicativo será criado o link na pasta selecionada e ao clicar será aberto o programa informado nos parâmetros do aplicativo.\n\n### Configurando os parâmetros variáveis\n\n---\n\nComo alguns parâmetros são variáveis, cada usuário deve acessar as Preferências do Usuário e configurar estes parâmetros.\n\nPor exemplo o dialeto, caso o usuário seja argentino, provavelmente terá preferência pelo dialeto espanhol.\n\nAssim como ele também poderá ter como preferência um determinado usuário no Datasul 11, conforme abaixo:\n\n![](..\\..\\images\\image2013-9-11%20153326.png)" }, { "metadata": { "title": "Configurar aplicativos EMS na plataforma", "source": "https://tdn.totvs.com/display/fluig/Configurar+aplicativos+EMS+na+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurar aplicativos EMS na plataforma.md" }, "content": "Configurar aplicativos EMS na plataforma\n\n\n# Índice\n\n- 1 [Configuração de Aplicativo EMS no TOTVS Fluig Plataforma](#ConfiguraraplicativosEMSnaplataforma-ConfiguraçãodeAplicativoEMSnoTOTVSFluigPlataforma)\n- 2 [Cadastrando o Adapter](#ConfiguraraplicativosEMSnaplataforma-CadastrandooAdapter)\n- 3 [Cadastrando o aplicativo](#ConfiguraraplicativosEMSnaplataforma-Cadastrandooaplicativo)\n- 4 [Publicando um Aplicativo](#ConfiguraraplicativosEMSnaplataforma-PublicandoumAplicativo)\n- 5 [Configurando os parâmetros variáveis](#ConfiguraraplicativosEMSnaplataforma-Configurandoosparâmetrosvariáveis)\n- 6 [Third Party Trademarks](#ConfiguraraplicativosEMSnaplataforma-ThirdPartyTrademarks)\n\nAtenção!\n\nDevido a necessidade de execução de applets, este recurso não tem seu funcionamento como esperado. Os applets são uma tecnologia depreciada e por este motivo foram descontinuados pelos navegadores no geral.\n\n### Configuração de Aplicativo EMS no TOTVS Fluig Plataforma\n\n---\n\nPara executar os programas do EMS é necessário configurar o Adapter e Aplicativo.\n\n![](..\\..\\images\\image2013-9-11%20134743.png)\n\n### Cadastrando o Adapter\n\n---\n\nPrimeiro, é necessário cadastrar um adapter que utilize o arquivo emshradapter.jar. Para isso somente é necessário adicionar um novo adapter e no campo Arquivo JAR informar o trecho abaixo:\n\n```\n{$WDKPROTOCOL}://{$WDKHOST}:{$WDKPORT}/{$WDKWEBHOME}/utils/emshradapter.jar\n```\n\nA funcionalidade ***Adapter*** está disponível no menu **Painel de Controle**, no agrupador **Desenvolvimento**.\n\n![](..\\..\\images\\2-ems.png)\n\n### Cadastrando o aplicativo" }, { "metadata": { "title": "Configurar aplicativos EMS na plataforma", "source": "https://tdn.totvs.com/display/fluig/Configurar+aplicativos+EMS+na+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurar aplicativos EMS na plataforma.md" }, "content": "Configurar aplicativos EMS na plataforma\n\n\n---\n\nDepois do adapter cadastrado, é necessário criar o aplicativo que vai executar o EMS.\n\nClique em adicionar e informe o código do aplicativo e descrição, selecione o adapter do EMS e no campo linha de comando informe o trecho abaixo:\n\n```\n{$PARAM_path_PROGRESS}\\bin\\prowin32.exe -pf {$PARAM_pf} -basekey ini -ininame {$PARAM_ininame} -p men\\men906za.p\n```\n\n![](..\\..\\images\\image2013-9-11%20135528.png)\n\nNota\n\nPara bancos unificados deve-se criar um novo arquivo de alias, onde neste arquivo deverá ser alterado o comando RUN, informando o valor: **men/men906za.p**.\n\nE na linha de comando do aplicativo deve ser informado o parâmetro **–p** com o caminho do novo arquivo de alias. **Exemplo abaixo:**\n\n```\n{$PARAM_path_PROGRESS}\\bin\\prowin32.exe –pf {$PARAM_pf} -basekey ini -ininame {$PARAM_ininame} –p f:\\datasul\\ems\\alias.p\n```\n\nNo cadastro do aplicativo é necessário também adicionar sete parâmetros na tabela **Parâmetros**, para incluir um parâmetro basta clicar no botão **Adicionar**.\n\n![](..\\..\\images\\image2013-9-11%20152737.png)\n\nOs parâmetros cadastrados devem ser configurados conforme tabela a seguir:\n\n| | | | |\n| --- | --- | --- | --- |\n| **Parâmetro** | **Valor** | **Variável por Usuário** | **Formato Senha** |\n| **company** | 1 (Empresa do EMS, normalmente é 1) | Não | Não |\n| **ininame** | Informar o caminho do arquivo INI utilizado no atalho do EMS. Ex: \\\\servidor\\ems\\scripts\\progress.ini | Opcional. Se o caminho for o mesmo para todos os usuários não há necessidade de ser variável. | Não |\n| **password** | Informar a senha do usuário do EMS | Sim | Sim |\n| **path\\_PROGRESS** | Informar o caminho do diretório de instalação do Progress® na máquina do usuário. Exemplo: C:\\dlc101b | Sim | Não |\n| **pf** | Informar o caminho do arquivo PF utilizado no atalho do EMS. Ex: \\\\servidor\\ems\\scripts\\ems.pf | Opcional. Se o caminho for o mesmo para todos os usuários não há necessidade de ser variável. | Não |\n| **product** | Informar o produto que será executado (EMS2, EMS5 ou HR). Para o EMS2.04 usar EMS2. | Não | Não |\n| **user** | Informar o usuário de acesso ao EMS | Sim | Não |\n\nNota\n\nOs parâmetros devem estar com o código exatamente como descrito na coluna **Parâmetro** da tabela acima, respeitando **maiúsculas** e **minúsculas**.\n\nPara garantir que a linha de comando está corretamente configurada, pode-se fazer um teste simples no Executar do Windows®. Substitua os parâmetros da linha de comando pelos valores reais e execute-o.\n\n**Por exemplo, altere:**\n\n**De:**\n\n```\n{$PARAM_path_PROGRESS}\\bin\\prowin32.exe -pf {$PARAM_pf} -basekey ini -ininame {$PARAM_ininame} -p men\\men906za.p\n```\n\n**Para:**\n\n```\nc:\\dlc101b\\bin\\prowin32.exe -pf f:\\ems\\scripts\\ems.pf -basekey ini -ininame f:\\ems\\scripts\\progress.ini -p men\\men906za.p\n```" }, { "metadata": { "title": "Configurar aplicativos EMS na plataforma", "source": "https://tdn.totvs.com/display/fluig/Configurar+aplicativos+EMS+na+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurar aplicativos EMS na plataforma.md" }, "content": "Configurar aplicativos EMS na plataforma\n\n### Publicando um Aplicativo\n\n---\n\nPara configurar um programa do EMS será necessário publicar um novo aplicativo abaixo de uma pasta.\n\n![](..\\..\\images\\image2013-9-11%20141257.png)\n\n \n\nDeve ser selecionado o aplicativo EMS configurado anteriormente e no campo **Parâmetros** deve ser informado a constante **Program:** com o caminho do programa EMS que será executado.\n\n**Exemplo:**\n\n```\nProgram:btb/btb001aa.w\n```\n\n![](..\\..\\images\\image2013-9-11%20141434.png)\n\n Publicado o aplicativo, será criado o link na pasta selecionada e ao clicar no link será aberto o programa informado nos parâmetros do aplicativo.\n\n### Configurando os parâmetros variáveis\n\n---\n\nComo alguns parâmetros são variáveis, cada usuário deve acessar as **Preferências do Usuário** e configurar estes parâmetros. Por exemplo o caminho do Progress®, usuário e senha do EMS.\n\n![](..\\..\\images\\image2013-9-11%20141852.png)\n\n### Third Party Trademarks\n\n---\n\nJavaScript is a trademark of Oracle Corporation.\n\nMicrosoft and Windows are registered trademarks of Microsoft Corporation in the United States and/or other countries.\n\nJava is a trademark of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.\n\nProgress and OpenEdge are trademarks or registered trademarks of Progress Software Corporation or one of its subsidiaries or affiliates in the U.S. and other countries.\n\nAny other third party trademarks are the property of their respective owners." }, { "metadata": { "title": "Configurar e Habilitar Thumbnails", "source": "https://tdn.totvs.com/display/fluig/Configurar+e+Habilitar+Thumbnails", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurar e Habilitar Thumbnails.md" }, "content": "Configurar e Habilitar Thumbnails" }, { "metadata": { "title": "Configurar e Habilitar Thumbnails", "source": "https://tdn.totvs.com/display/fluig/Configurar+e+Habilitar+Thumbnails", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurar e Habilitar Thumbnails.md" }, "content": "Configurar e Habilitar Thumbnails\n\n\nAtenção\n\nEsta página é destinada para atualizações 1.6 e superiores do TOTVS Fluig Plataforma.\n\n# Índice\n\n- 1 [Índice](#ConfigurareHabilitarThumbnails-Índice)\n- 2 [Objetivo](#ConfigurareHabilitarThumbnails-Objetivo)\n- 3 [Visão Geral](#ConfigurareHabilitarThumbnails-VisãoGeral)\n- 4 [Configuração](#ConfigurareHabilitarThumbnails-Configuração)\n- 5 [Habilitando Thumbnails](#ConfigurareHabilitarThumbnails-HabilitandoThumbnails)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é habilitar a geração de *thumbnails* na plataforma utilizando o FFmpeg.\n\n# Visão Geral\n\n---\n\n*Thumbnails* (miniaturas) são versões reduzidas de imagens ou vídeos que são apresentadas para tornar mais fácil o processo de visualização ou reconhecimento de um conteúdo.\n\nFique atento!\n\nO recurso geração de *thumbnails* somente funcionará nas imagens e vídeos disponibilizados em **comunidades**.\n\n![](..\\..\\images\\thumb.png)\n\n# Configuração\n\n---\n\nA configuração de geração de *thumbnail* é necessária **apenas** para as atualizações **1.6.5** e **inferiores**. A partir da atualização 1.7.0 Lake apenas o item [Habilitando *thumbnails*](https://tdn.totvs.com/display/public/fluig/Configurar+e+Habilitar+Thumbnails#ConfigurareHabilitarThumbnails-HabilitandoThumbnails) é necessário.\n\nA plataforma gera *thumbnails* de alguns tipos de imagens e vídeos na exibição de documentos e galerias. Para configurar a geração de *thumbnails* siga o passo a passo a seguir:\n\n- É necessário que o FFmpeg esteja instalado no servidor para que a plataforma consiga gerar *thumbnails*.\n\n- O FFmpeg pode ser obtido no [site oficial](http://ffmpeg.org/) do projeto, em versões [Linux](http://ffmpeg.org/download.html#build-linux) e [Windows](http://ffmpeg.zeranoe.com/builds/).\n\n- Existem três tipos de builds diferentes do FFmpeg. A plataforma utiliza a *build* de tipo ***Shared***, com DLLs separadas por biblioteca para uso externo, sendo esta portanto que deve ser baixada.\n\nVersão do FFmpeg\n\nO fluig necessita da versão 2.1 *stable Shared* para gerar corretamente os *thumbnails*, compilado com as seguintes dependências:\n\n- Yasm\n- x264\n- libfdk\\_aac\n- libmp3lame\n- libopus\n- libogg\n- libvorbis\n- libvpx\n\n- Efetue o login utilizando o usuário **wcmadmin** e então acesse **Painel de Controle  →** aba **WCM → Configurações do Sistema**.\n\n![](..\\..\\images\\image2016-10-19%20164622.png)\n\n**Acessando a configuração de *thumbnail***\n\n- Na tela de configurações do sistema, acesse a aba ***Thumbnail****.*\n\n- No campo **Caminho para o executável do FFmpeg** informe o caminho completo para o executável do FFmpeg instalado anteriormente, seguindo o seguinte modelo:\n - Servidor Linux: [Diretório FFmepeg]/bin/ffmpeg\n - Servidor Windows: [Diretório FFmepeg]/bin/ffmpeg.exe\n\n![](..\\..\\images\\image2016-10-19%20164748.png)\n\n**Configuração de *thumbnail***\n\n- Clique no botão **Salvar** para aplicar as alterações e concluir a configuração.\n\n# Habilitando *Thumbnails*\n\n---\n\nA geração de *thumbnails* deve ser habilitada por empresa. Para habilitar a geração de *thumbnails* para uma determinada empresa siga o passo a passo abaixo:\n\n- Efetue o login utilizando o usuário **wcmadmin**, e então acesse **Painel de Controle  →** aba **WCM → Empresas**.\n\n![](..\\..\\images\\Painel%20de%20controle%20wcmadmin%20165.png)\n\n**Acessando o cadastro de empresas**\n\n- Selecione a empresa que deseja habilitar a geração de *thumbnail* e clique no *link* **Editar**.\n\n![](..\\..\\images\\empresa1.png)\n\n**Selecionando empresa para habilitar *thumbnail***\n\n- A tela de edição de empresa será apresentada. Assinale a opção **Habilitar geração de *thumbnails*.**\n\n**![](..\\..\\images\\image2016-10-19%20165054.png)**\n\n**Habilitando a geração de *thumbnails***\n\n- Clique no botão **Salvar** para salvar as alterações e habilitar a geração de *thumbnail* para esta empresa." }, { "metadata": { "title": "Configuração de Ambiente", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=75269059", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente.md" }, "content": "Configuração de Ambiente" }, { "metadata": { "title": "Configuração de Ambiente", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=75269059", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente.md" }, "content": "Configuração de Ambiente\n\n\n- [Alta disponibilidade e balanceamento de carga](Configuração de Ambiente/Alta disponibilidade e balanceamento de carga.md)\n - [Configurando o fluig Realtime para execução em Load Balance](Configuração de Ambiente/Alta disponibilidade e balanceamento de carga/Configurando o fluig Realtime para execução em Load Balance.md)\n - [Plataforma em load balance com Apache mod\\_proxy em Linux](Configuração de Ambiente/Alta disponibilidade e balanceamento de carga/Plataforma em load balance com Apache mod_proxy em Linux.md)\n - [Plataforma em load balance com Microsoft NLB](Configuração de Ambiente/Alta disponibilidade e balanceamento de carga/Plataforma em load balance com Microsoft NLB.md)\n - [Plataforma em load balance com Microsoft Windows](Configuração de Ambiente/Alta disponibilidade e balanceamento de carga/Plataforma em load balance com Microsoft Windows.md)\n - [Plataforma em load balance com NGINX em Linux](Configuração de Ambiente/Alta disponibilidade e balanceamento de carga/Plataforma em load balance com NGINX em Linux.md)\n- [Como alterar a porta de acesso à plataforma em HTTP e HTTPS](Configuração de Ambiente/Como alterar a porta de acesso à plataforma em HTTP e HTTPS.md)\n- [Como alterar o conjunto de portas padrão da plataforma](Configuração de Ambiente/Como alterar o conjunto de portas padrão da plataforma.md)\n- [Como alterar o timeout da plataforma](Configuração de Ambiente/Como alterar o timeout da plataforma.md)\n- [Como aumentar o limite de upload da plataforma](Configuração de Ambiente/Como aumentar o limite de upload da plataforma.md)\n- [Como configurar o arquivo robots.txt](Configuração de Ambiente/Como configurar o arquivo robots.txt.md)\n- [Configuração de autenticação utilizando LDAP](Configuração de Ambiente/Configuração de autenticação utilizando LDAP.md)\n - [Configurações para autenticação em múltiplos servidores AD com protocolo LDAP](Configuração de Ambiente/Configuração de autenticação utilizando LDAP/Configurações para autenticação em múltiplos servidores AD com protocolo LDAP.md)\n- [Configuração de serviços de componentes](Configuração de Ambiente/Configuração de serviços de componentes.md)\n- [Configuração do fluig cache com Redis](Configuração de Ambiente/Configuração do fluig cache com Redis.md)\n- [Configuração Redis para uso do Load balance Realtime](Configuração de Ambiente/Configuração Redis para uso do Load balance Realtime.md)\n- [Configurações de segurança para prevenção de ataques de força bruta: BFA (Brute Force Attack)](Configuração de Ambiente/Configurações de segurança para prevenção de ataques de força bruta BFA (Brute Force Attack).md).md)\n- [Configurando Autenticação Integrada](Configuração de Ambiente/Configurando Autenticação Integrada.md)\n- [Configurando Propriedades do Sistema via JAVA\\_OPTS](Configuração de Ambiente/Configurando Propriedades do Sistema via JAVA_OPTS.md)\n- [Configurar ambiente Linux para não utilizar o usuário root](Configuração de Ambiente/Configurar ambiente Linux para não utilizar o usuário root.md)\n- [Considerações de DNS para a plataforma](Configuração de Ambiente/Considerações de DNS para a plataforma.md)\n- [Considerações de Firewall para a plataforma](Configuração de Ambiente/Considerações de Firewall para a plataforma.md)\n- [CORS (Cross-origin Resource Sharing)](Configuração de Ambiente/CORS (Cross-origin Resource Sharing).md).md)\n- [Descoberta de serviços](Configuração de Ambiente/Descoberta de serviços.md)\n- [HTTPS](Configuração de Ambiente/HTTPS.md)\n - [Certificado HTTPS (SSL/TLS) Gratuito](Configuração de Ambiente/HTTPS/Certificado HTTPS (SSLTLS) Gratuito.md) Gratuito.md)\n - [Configuração de níveis de segurança no HTTPS](Configuração de Ambiente/HTTPS/Configuração de níveis de segurança no HTTPS.md)\n - [Configuração HTTPS da plataforma](Configuração de Ambiente/HTTPS/Configuração HTTPS da plataforma.md)\n - [Utilizando OpenSSL para configurar HTTPS](Configuração de Ambiente/HTTPS/Utilizando OpenSSL para configurar HTTPS.md)\n- [Logoff automático por inatividade](Configuração de Ambiente/Logoff automático por inatividade.md)\n- [Proxy reverso](Configuração de Ambiente/Proxy reverso.md)\n - [Configuração de proxy reverso Apache](Configuração de Ambiente/Proxy reverso/Configuração de proxy reverso Apache.md)\n - [Configuração de proxy reverso NGINX com HTTPS](Configuração de Ambiente/Proxy reverso/Configuração de proxy reverso NGINX com HTTPS.md)\n - [Ocultar informações no cabeçalho HTTP](Configuração de Ambiente/Proxy reverso/Ocultar informações no cabeçalho HTTP.md)\n- [Servidor de indexação dedicado](Configuração de Ambiente/Servidor de indexação dedicado.md)\n - [Servidor de indexação em alta disponibilidade](Configuração de Ambiente/Servidor de indexação dedicado/Servidor de indexação em alta disponibilidade.md)\n - [Servidor de indexação único](Configuração de Ambiente/Servidor de indexação dedicado/Servidor de indexação único.md)\n- [Servidor de Licenças (License Server)](Configuração de Ambiente/Servidor de Licenças (License Server).md).md)\n - [Arquivo de Emergência](Configuração de Ambiente/Servidor de Licenças (License Server).md)/Arquivo de Emergência.md)\n - [Contingência de Acesso sem License Server](Configuração de Ambiente/Servidor de Licenças (License Server).md)/Contingência de Acesso sem License Server.md)\n - [Fluig Identity Partner](Configuração de Ambiente/Servidor de Licenças (License Server).md)/Fluig Identity Partner.md)\n- [Topologia DMZ](Configuração de Ambiente/Topologia DMZ.md)" }, { "metadata": { "title": "Configuração de Banco de Dados", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=145359800", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados.md" }, "content": "Configuração de Banco de Dados\n\n\n- [Configuração de banco de dados MySQL](Configuração de Banco de Dados/Configuração de banco de dados MySQL.md)\n- [Configuração do banco de dados Oracle](Configuração de Banco de Dados/Configuração do banco de dados Oracle.md)\n- [Configuração do banco de dados SQL Server](Configuração de Banco de Dados/Configuração do banco de dados SQL Server.md)" }, { "metadata": { "title": "Configuração de envio de e-mail", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623560", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de envio de e-mail.md" }, "content": "Configuração de envio de e-mail\n\n\n![](..\\..\\images\\espanhol.png) ¿Habla Español? Haga [clic aquí](https://tdn.totvs.com/x/E7XDIQ) para ver el Configuración de envío de correo electrónico en Español.\n\n![](..\\..\\images\\ingles.png) Do you speak English? [Click here](https://tdn.totvs.com/x/L7XDIQ) to view the E-mail sending configuration in English.\n\nAtenção\n\nEsta página foi revisada para considerar as configurações de servidor para a atualização 1.7.\n\nCaso possua atualização anterior, acesse [Envio de e-mail](https://tdn.totvs.com/pages/viewpage.action?pageId=461911948).\n\n- [Configuração global](https://tdn.totvs.com/pages/viewpage.action?pageId=257623560#Configura%C3%A7%C3%A3odeenviodee-mail-Configura%C3%A7%C3%A3oglobal)\n- [Configuração por empresa](https://tdn.totvs.com/pages/viewpage.action?pageId=257623560#Configura%C3%A7%C3%A3odeenviodee-mail-Configura%C3%A7%C3%A3oporempresa)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é realizar a configuração de envio de *e-mail* no TOTVS Fluig Plataforma.\n\n# Falando de configuração de envio de e-mail...\n\n---\n\nExistem duas formas de configuração na plataforma: por empresa ou global. Por **[Empresa](https://tdn.totvs.com/pages/viewpage.action?pageId=257623560)** a configuração é feita individualmente e será aplicada apenas para a empresa em questão e a **[Global](https://tdn.totvs.com/pages/viewpage.action?pageId=257623560)** que será obedecida por todas as empresas cadastradas na plataforma. É importante lembrar que prevalecerá a configuração por empresa caso ambas forem realizadas.\n\n![](..\\..\\images\\Configura%C3%A7%C3%A3o%20de%20e-mail.JPG)\n\n![](..\\..\\images\\Configura%C3%A7%C3%A3o%20por%20empresa.JPG)\n\n![](..\\..\\images\\Instalador.png)\n\n## Configuração global" }, { "metadata": { "title": "Configuração de envio de e-mail", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623560", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de envio de e-mail.md" }, "content": "Configuração de envio de e-mail\n\n\n---\n\nA configuração global de envio de e-mail já ocorre durante a execução do instalador da release **![](..\\..\\images\\photos.png) [Veja a imagem](https://tdn.totvs.com/download/attachments/257623560/Instalador.png?version=1&modificationDate=1595266817713&api=v2)**, mas pode ser necessário alterar as informações cadastradas.\n\nPara isso, siga os passos abaixo:\n\nImportante!\n\nCaso sua plataforma tenha o envio de e-mail configurado anterior à atualização 1.6.1, será necessário limpar os dados antigos de conexão do Servidor de e-mail, pois a partir da atualização 1.6.1 essas configurações são feitas em tela.\n\n**01**. Autentique-se na plataforma com o usuário **wcmadmin.**\n\n**02**. Acesse o menu **Painel de Controle**, localize o agrupador **WCM** e acione **Configurações do Sistema****.**\n\n**03**. Acesse a aba **Parâmetros da Plataforma** e altere os campos necessários da seção **Configuração de e-mail.**\n\nOs campos disponíveis são:  **![](..\\..\\images\\photos.png) [Veja a imagem](https://tdn.totvs.com/download/attachments/257623560/Configura%C3%A7%C3%A3o%20de%20e-mail.JPG?version=1&modificationDate=1654524130413&api=v2)**\n\n**Segurança:**Permite o uso dos protocolos TLS ou SSL na conexão SMTP. Se o servidor de e-mail utilizar o protocolo **TLS** *(Transport Layer Security)* ou **SSL***(**Secure Socket Layer)*, será necessário selecioná-lo, caso contrário, deve-se selecionar a opção 'Não'.\n\n**Porta do Servidor:** Porta do servidor de envio de *e-mails* (SMTP). A porta padrão é 25.\n\n**Usuário:**Login do usuário utilizado na autenticação do servidor de e-mail.\n\n**Todas as notificações por *e-mail***: Quando habilitado, determina que todas as notificações por e-mail serão enviadas com o remetente informado no campo \"E-mail do remetente\", tanto as de produto (com interação do usuário) quanto as da plataforma. \n\n**E-mail do remetente**: E-mail que será considerado o remetente padrão para o envio das notificações, quando a opção \"Remetente padrão\" está habilitada.\n\n**Agrupar *e-mails* no envio**: Quando ativado, determina que os *e-mails* a serem enviados sejam agrupados e disparados a cada 2 segundos. Quando desabilitado, cada *e-mail* será disparado individualmente, o que em grandes quantidades pode causar o bloqueio das mensagens por serviços como o Gmail.\n\n**Host do Servidor:**Endereço do servidor de envio de *e-mails* (SMTP);\n\n**Autenticação:**Habilite se for necessário informar um usuário e senha para autenticação no servidor de *e-mail*. Se for habilitado, os campos de usuário e senha deverão ser preenchidos.Ao habilitar o recurso, é exibido o indicativo ***ON***, informando que o recurso está ativo. Quando esse recurso é desabilitado, é exibido o indicativo ***OFF***.\n\n**Senha:**Senha utilizada na autenticação do servidor de e-mail.\n\n**Remetente padrão**: Quando habilitado, determina que o e-mail das notificações será enviado por um remetente padrão. Quando não habilitado esse recurso, o remetente será o *e-mail* que foi definido para a empresa. \n\n**Nome do remetente**: Nome do remetente padrão para o envio de notificações por e-mail, quando a opção \"Remetente padrão\" está habilitada.\n\nSobre o remetente padrão\n\nMesmo que seja realizada a configuração de um remetente padrão, ele é utilizado apenas para atividades de sistema que não possuem usuário, como criação de usuários, recuperação de senha e teste de conexão. Os demais e-mails da plataforma (workflow e documentos) utilizam como remetente o usuário logado, quem movimentou a solicitação ou até mesmo seus remetentes personalizados.\n\n**Timeout do SMTP (em segundos):**Determina o tempo de expiração que levará para que a notificação seja comunicada por e-mail, este tempo poderá ser definido pelo usuário entre o valor padrão correspondente à 180 segundos ou o mínimo 10 segundos.\n\n**04**. Para realizar a validação do envio de e-mail, utilize o botão **Testar conexão**.\n\nApós acionar o botão Testar conexão, será apresentada uma nova página para o usuário informar um endereço de e-mail, para que seja realizado o envio de teste.\n\nAtenção!\n\nDevido a atualização dos protocolos de segurança da Google, a opção de apps menos seguros foi desabilitada pela empresa, por isso, para realizar o teste de e-mail, é necessário realizar antes as configurações na conta Google. [Acesse aqui](Configurações na conta Google.md) e saiba como realizar essas configurações.\n\n**05**. Acione **Salvar** para gravar as alterações." }, { "metadata": { "title": "Configuração de envio de e-mail", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623560", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de envio de e-mail.md" }, "content": "Configuração de envio de e-mail\n\n## Configuração por empresa" }, { "metadata": { "title": "Configuração de envio de e-mail", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623560", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de envio de e-mail.md" }, "content": "Configuração de envio de e-mail\n\n\n---\n\nNa configuração de envio de e-mail por empresa, o que for alterado será aplicado individualmente, apenas para a empresa em questão. \n\nÉ importante ressaltar que a plataforma sempre dará preferência para as configurações aplicadas por empresa, mesmo quando alguma alteração for realizada na configuração global.\n\nPara realizar a configuração, siga os passos abaixo:\n\n**01**. Autentique-se na plataforma com o usuário **wcmadmin.**\n\n**02**. Acesse o menu **Painel de Controle**, localize o agrupador **WCM** e acione **Empresas.**\n\n**03**. Selecione a empresa desejada e acione **Editar**.\n\n**04**. Acesse a aba **E-mail**.\n\n**05**. Preencha os campos disponíveis.\n\nOs campos disponíveis são: **![](..\\..\\images\\photos.png) [Veja a imagem](https://tdn.totvs.com/download/attachments/257623560/Configura%C3%A7%C3%A3o%20por%20empresa.JPG?version=1&modificationDate=1654524262830&api=v2)**\n\n**Deseja habilitar o envio de e-mail?**Habilita a configuração de e-mail específica para a empresa selecionada.\n\n**Deseja agrupar o envio de e-mails?** Agrupa e dispara a cada 2 segundos os e-mails que devem ser enviados. Quando desabilitado, cada e-mail será disparado individualmente, o que em grandes quantidades pode causar o bloqueio das mensagens por serviços como o Gmail.\n\n**Host:** Endereço do servidor de envio de e-mails (SMTP).\n\n**Porta:** Porta do servidor de envio de e-mails (SMTP).\n\n**Remetente:** Endereço de e-mail do remetente.\n\n**Segurança:** Permite o uso dos protocolos TLS ou SSL na conexão SMTP. Se o servidor de e-mail utilizar o protocolo **TLS** *(Transport Layer Security)* ou **SSL***(**Secure Socket Layer)*, será necessário selecioná-lo, caso contrário, deve-se selecionar a opção 'Não'.\n\n**Timeout do SMTP (em segundos):** Determina o tempo de expiração que levará para que a notificação seja comunicada por e-mail, este tempo poderá ser definido pelo usuário entre o valor padrão correspondente à 180 segundos ou o mínimo 10 segundos. \n\n**Deseja habilitar a autenticação?** Habilite se for necessário informar um usuário e senha para autenticação no servidor de e-mail. Se for habilitado, os campos de usuário e senha serão exibidos em tela.\n\n**06**. Para realizar a validação do envio de e-mail, utilize o botão **Testar conexão**.\n\nSerá necessário informar um endereço de e-mail para que seja realizado o envio de teste.\n\n**07**. Acione **Salvar** para gravar as alterações." }, { "metadata": { "title": "Configuração do tempo de transação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=258277613", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração do tempo de transação.md" }, "content": "Configuração do tempo de transação\n\n\nFique atento!\n\nEsta página é válida para atualizações **1.6** e **superiores** do TOTVS Fluig.\n\n- [Objetivo](#Configuraçãodotempodetransação-Objetivo)\n- [Transação](#Configuraçãodotempodetransação-Transação)\n - [Alterar o tempo de transação](#Configuraçãodotempodetransação-Alterarotempodetransação)\n\n# Objetivo\n\n---\n\nO objetivo deste artigo é descrever o procedimento para alterar o tempo de transação padrão da plataforma.\n\n# Transação\n\n---\n\nUma transação é uma unidade de trabalho contendo uma ou mais operações compartilhando recursos e que possui propriedades ACID.\n\nO acrônimo ACID corresponde em inglês à *atomicity*, *consistency*, *isolation* e *durability*. Cada propriedade corresponde:\n\n- Atomicidade: uma transação é atômica, ou seja, toda a operação realizada pela transação deve ser efetivada ou nenhuma parte da operação deve ser efetivada;\n\n- Consistência: quando uma transação é concluída, todo o sistema deve estar em uma condição estável e consistente;\n\n- Isolamento: transações diferentes devem ser isoladas;\n\n- Durabilidade: as operações realizadas por uma transação são persistentes após \"comitadas\". Depois de efetivada, as alterações realizadas pela transação não serão perdidas mesmo em caso de falha do servidor.\n\n### Alterar o tempo de transação" }, { "metadata": { "title": "Configuração do tempo de transação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=258277613", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração do tempo de transação.md" }, "content": "Configuração do tempo de transação\n\n\n---\n\nA alteração do tempo de transação da plataforma TOTVS Fluig é feita:\n\n- **a partir da atualização 2.0:**no arquivo **standalone.xml** ([diretório\\_instalação]/appserver/standalone/configuration/standalone.xml);\n\n- **da atualização 1.6 até a 1.8.2**:no arquivo **domain.xml** ([diretório\\_instalação]/appserver/domain/configuration/domain.xml).\n\n```\n\t\t\n \n \n \n \n \n \n \n \n```\n\nO tempo de transação padrão da plataforma é de 300 segundos. Para alterar o tempo de transação, basta substituir o valor padrão e reiniciar o serviço do Fluig.\n\nImportante!\n\nO tempo de transação padrão deveria ser suficiente para a realização de uma transação convencional. Antes de aumentar o tempo de transação, verifique o fato que o levou a esta decisão.\n\nPor exemplo, revise customizações ou integrações realizadas nos eventos de processos de *workflow*. Otimizações de customização podem reduzir o tempo necessário para realizar uma transação." }, { "metadata": { "title": "Configurações da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623022", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurações da plataforma.md" }, "content": "Configurações da plataforma" }, { "metadata": { "title": "Configurações da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623022", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurações da plataforma.md" }, "content": "Configurações da plataforma\n\n\nFique atento!\n\nEsta página é válida a partir da atualização **Voyager (2.0)** do TOTVS Fluig.\n\nSe você utiliza uma atualização anterior, acesse:\n\n- para atualizações **1.6.4 até 1.8.2**: [Como ajustar as configurações da plataforma da atualização 1.6.4 até 1.8.2](https://tdn.totvs.com/pages/viewpage.action?pageId=941246805);\n- para atualizações **1.6.0 até 1.6.3**: [Como ajustar as configurações da plataforma da atualização 1.6.0 até 1.6.3](https://tdn.totvs.com/pages/viewpage.action?pageId=351386044).\n\n- [Descrição](#Configuraçõesdaplataforma-Descrição)\n- [Arquivo de configuração](#Configuraçõesdaplataforma-Arquivodeconfiguração)\n- [Recuperação das configurações](#Configuraçõesdaplataforma-Recuperaçãodasconfigurações)\n- [Configurações do servidor disponíveis](#Configuraçõesdaplataforma-Configuraçõesdoservidordisponíveis)\n- [Configuração pela página Parâmetros da plataforma](#Configuraçõesdaplataforma-ConfiguraçãopelapáginaParâmetrosdaplataforma)\n- [Bloqueio de Clickjacking](#Configuraçõesdaplataforma-BloqueiodeClickjacking)\n\n# Descrição\n\n---\n\nA plataforma possibilita a configuração de parâmetros do servidor de forma visual, na aba Parâmetros da Plataforma, ou através da API *[System Configuration](https://api.fluig.com/old/resource_ConfigurationServiceRest.html)*.\n\n# Arquivo de configuração\n\n---\n\nO arquivo de configuração é gerado durante o processo de instalação ou atualização. As configurações possíveis são as mesmas que eram disponibilizadas anteriormente (via *bindings* ou propriedades globais no arquivo **standalone.xml**).\n\nO arquivo de configuração está localizado em**[diretório\\_instalação]/repository/wcmdir/config/configuration.properties** e utiliza o formato chave=valor.\n\nQuando a plataforma é inicializada e o **configuration.properties** está presente na pasta **config**, será feita a persistência dos dados. Ao final deste processo ele é removido.\n\nImportante!\n\nSe desejar alterar um arquivo gerado automaticamente, é recomendado fazer *backup* do arquivo original.\n\n# Recuperação das configurações\n\n---\n\nAlguma configuração feita foi perdida? Não se preocupe, a plataforma gera arquivos de *backup* das configurações!\n\nSempre que for realizada a configuração via tela ou API um arquivo de *backup* é gerado com as configurações suportadas.\n\nEste arquivo é gerado em **[diretório\\_instalação]/repository/wcmdir/config** e no nome do arquivo constará a data em que ele foi gerado, no formato **configuration.AAAAMMDD-HHmmss.properties**.\n\nEXEMPLO \nUm arquivo de *backup* gerado no dia 01/12/2016 às 13:20:43, terá o nome **configuration.20160201-132043.properties**.\n\nSe alguma alteração nos parâmetros impedir o acesso à plataforma, é possível recuperar a configuração anterior. Para efetuar este procedimento:\n\n**01.** Faça uma cópia do arquivo de *backup* na data desejada para a mesma pasta.\n\n**02.** Nomeie o arquivo como **configuration.properties**.\n\n**03.** Reinicie a plataforma.\n\n![](..\\..\\images\\properties.jpg)\n\n# Configurações do servidor disponíveis\n\n---\n\nAs configurações de servidor passíveis de alteração estão relacionadas em [Parâmetros de configuração da plataforma](http://tdn.totvs.com/pages/viewpage.action?pageId=257623031).\n\nVeja abaixo como é possível alterar propriedades pela *web* ou via API. \n\n# Configuração pela página Parâmetros da plataforma\n\n---\n\nPara alterar algumas configurações chave do servidor, foi criado o recurso [Parâmetros da plataforma](https://tdn.totvs.com/pages/viewpage.action?pageId=235597328) onde é possível visualizar as configurações atuais e alterar os parâmetros necessários.\n\nPara visualizar a aba, acesse a plataforma com o usuário **wcmadmin**, clique em **Painel de controle** → **WCM → Configurações do sistema** → aba **Parâmetros da plataforma**.\n\n![](..\\..\\images\\par%C3%A2metros-da-plataforma.png)\n\nDica!\n\nTambém é possível realizar alterações nas configurações via API Pública. Na documentação da API, acesse a página*[System Configuration](https://api.fluig.com/old/resource_ConfigurationServiceRest.html)* para mais detalhes.\n\n# Bloqueio de Clickjacking\n\n---\n\nA opção de **Bloqueio de *Clickjacking*** evita que ataques deste tipo sejam realizados na plataforma. Os ataques *Clickjacking* são executados inserindo uma página dentro de outra através de um elemento *iframe* em uma página HTML e interceptando eventos de *mouse* e teclado.\n\nA opção **Bloqueio de *clickjacking*** está disponível no recurso **Configurações do sistema → Parâmetros da plataforma** e vem habilitada por padrão.\n\nImportante!\n\nNão é recomendado desativar esta opção, portanto, altere esse parâmetro somente se tiver ciência dos riscos de vulnerabilidade.\n\n![](..\\..\\images\\bloqueio-clickjacking.png)" }, { "metadata": { "title": "Configurações na conta Google", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=696709080", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurações na conta Google.md" }, "content": "Configurações na conta Google\n\n\n- 1 [Falando de configurações na conta Google](#ConfiguraçõesnacontaGoogle-FalandodeconfiguraçõesnacontaGoogle)\n- 2 [Configuração da conta gmail no Google](#ConfiguraçõesnacontaGoogle-ConfiguraçãodacontagmailnoGoogle)\n - 2.1 [Ativar a verificação em duas etapas](#ConfiguraçõesnacontaGoogle-Ativaraverificaçãoemduasetapas)\n - 2.2 [Criar e usar senha de aplicativo](#ConfiguraçõesnacontaGoogle-Criareusarsenhadeaplicativo)\n\n# Falando de configurações na conta Google\n\n---\n\nO objetivo deste guia é orientar ao usuário a realização das configurações para **ativar a verificação em duas etapas** e como **criar e usar senhas de aplicativo**na conta Google. Esta configuração possibilitará testar o envio de *e-mails* através de uma conta gmail no TOTVS Fluig Plataforma, fazendo - se necessária devido a atualização dos protocolos de segurança do Google a qual desabilitou a opção de aplicativos menos seguros oficialmente a **partir de 30 de maio de 2022.**\n\n![](..\\..\\images\\Seguran%C3%A7a%20Google.JPG)\n\nPara mais informações sobre esta atualização, acesse o comunicado oficial e confira mais detalhes sobre os [aplicativos menos seguros e a Conta do Google.](https://support.google.com/accounts/answer/6010255)\n\n# Configuração da conta gmail no Google\n\n---\n\nPara que o usuário consiga testar o envio de e-mails no TOTVS Fluig Plataforma, é necessário primeiro \"*ativar a verificação em duas etapas\"* na conta que será usada para realizar tal testee, posteriormente, \"c*riar e usar senhas de app\"*a qual substituirá a senha original do aplicativo escolhido.\n\n### Ativar a verificação em duas etapas" }, { "metadata": { "title": "Configurações na conta Google", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=696709080", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurações na conta Google.md" }, "content": "Configurações na conta Google\n\n\n---\n\nA *[verificação em duas etapas](https://tdn.totvs.com/download/attachments/696709080/Verifica%C3%A7%C3%A3o%20em%20duas%20etapas.png?version=1&modificationDate=1656971462587&api=v2)*é um recurso que oferece uma proteção extra à conta gmail utilizada, contribuindo para potencializar a segurança entre os usuários.\n\n**[Clique aqui](https://support.google.com/accounts/answer/185839?hl=pt-BR&co=GENIE.Platform%3DDesktop)**e siga as instruções disponíveis na página oficial do Google e saiba como ativar a configuração em duas etapas.\n\n### Criar e usar senha de aplicativo\n\n---\n\nJá a*senha de aplicativo,* é um recurso que gera [senhas aleatórias](https://tdn.totvs.com/download/attachments/696709080/senhaappgerada.png?version=1&modificationDate=1656971351497&api=v2) contendo 16 caracteres e que serão exibidas apenas uma única vez em cada geração. Estas senhas tem como finalidade \"substituir\" a senha original da conta Google apenas no contexto de um único aplicativo, por exemplo, no caso do TOTVS Fluig Plataforma.\n\n[**Clique aqui**](https://support.google.com/accounts/answer/185833?hl=pt-BR#zippy=) e siga as instruções disponíveis na página oficial do Google e saiba como criar e usar senhas de aplicativo.\n\nAtenção\n\nApós realizar as configurações, basta retornar à página de [configuração de e-mail](https://tdn.totvs.com/pages/viewpage.action?pageId=257623560&preview=/257623560/691447289/Configura%C3%A7%C3%A3o%20de%20e-mail.JPG) na plataforma TOTVS Fluig, preencher os campos solicitados, inserir a senha gerada e realizar novo teste de *e-mails.* Para mais detalhes sobre o processo de configuração de *e-mail,* [acesse aqui](Configuração de envio de e-mail.md) e confira nossa documentação completa.\n\n**Fique atento!**Esta documentação é válida a partir da **atualização 1.8 - Mist**. Se você utiliza uma atualização anterior, ela pode conter informações diferentes das quais você vê na sua plataforma." }, { "metadata": { "title": "Configurações na conta Microsoft", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=718428933", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurações na conta Microsoft.md" }, "content": "Configurações na conta Microsoft\n\n\n- 1 [Falando de configurações na conta Microsoft](#ConfiguraçõesnacontaMicrosoft-FalandodeconfiguraçõesnacontaMicrosoft)\n- 2 [Configuração de segurança na conta Microsoft](#ConfiguraçõesnacontaMicrosoft-ConfiguraçãodesegurançanacontaMicrosoft)\n - 2.1 [Ativar a verificação em duas etapas](#ConfiguraçõesnacontaMicrosoft-Ativaraverificaçãoemduasetapas)\n - 2.2 [Criar e usar senha de aplicativo](#ConfiguraçõesnacontaMicrosoft-Criareusarsenhadeaplicativo)\n\n# Falando de configurações na conta Microsoft\n\n---\n\nO objetivo deste guia é orientar ao usuário a realização das configurações para **ativar a verificação em duas etapas** e como **criar e usar senhas de aplicativo**na conta Microsoft. Esta configuração possibilitará testar o envio de *e-mails* através de uma conta Microsoft no TOTVS Fluig Plataforma, fazendo - se necessária devido a atualização dos protocolos de segurança da Microsoft a qual irá desabilitar a opção de aplicativos menos seguros oficialmente a **partir de 01 de janeiro de 2023.**\n\n![](..\\..\\images\\seguran%C3%A7a%20microsoft.PNG)\n\nPara mais informações sobre esta atualização, acesse o comunicado e confira mais detalhes no [canal oficial da Microsoft](https://learn.microsoft.com/pt-br/exchange/clients-and-mobile-in-exchange-online/deprecation-of-basic-authentication-exchange-online).\n\n# Configuração de segurança na conta Microsoft\n\n---\n\nPara que o usuário consiga testar o envio de e-mails no TOTVS Fluig Plataforma, é necessário primeiro \"*ativar a verificação em duas etapas\"* na conta que será usada para realizar tal testee, posteriormente, \"c*riar e usar senhas de app\"*a qual substituirá a senha original do aplicativo escolhido.\n\n### Ativar a verificação em duas etapas" }, { "metadata": { "title": "Configurações na conta Microsoft", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=718428933", "path": "\\Plataforma Documentação técnica\\Configuração\\Configurações na conta Microsoft.md" }, "content": "Configurações na conta Microsoft\n\n\n---\n\nA verificação em duas etapasé um recurso que oferece uma proteção extra à conta Microsoft utilizada, contribuindo para potencializar a segurança entre os usuários.\n\n**[Clique aqui](https://support.microsoft.com/pt-br/account-billing/alterar-o-m%C3%A9todo-e-as-configura%C3%A7%C3%B5es-de-verifica%C3%A7%C3%A3o-em-duas-etapas-c801d5ad-e0fc-4711-94d5-33ad5d4630f7)**e siga as instruções disponíveis na página oficial da Microsoft e saiba como ativar a configuração em duas etapas.\n\n### Criar e usar senha de aplicativo\n\n---\n\nJá a senha de aplicativo, é um recurso que gera senhas aleatórias contendo 16 caracteres e que serão exibidas apenas uma única vez em cada geração. Estas senhas tem como finalidade \"substituir\" a senha original da conta Microsoft apenas no contexto de um único aplicativo, por exemplo, no caso do TOTVS Fluig Plataforma.\n\n[**Clique aqui**](https://support.microsoft.com/pt-br/account-billing/gerenciar-senhas-de-aplicativo-para-verifica%C3%A7%C3%A3o-em-duas-etapas-d6dc8c6d-4bf7-4851-ad95-6d07799387e9) e siga as instruções disponíveis na página oficial da Microsoft e saiba como criar e usar senhas de aplicativo.\n\nAtenção\n\nApós realizar as configurações, basta retornar à página de [configuração de e-mail](https://tdn.totvs.com/pages/viewpage.action?pageId=257623560&preview=/257623560/691447289/Configura%C3%A7%C3%A3o%20de%20e-mail.JPG) na plataforma TOTVS Fluig, preencher os campos solicitados, inserir a senha gerada e realizar novo teste de *e-mails.* Para mais detalhes sobre o processo de configuração de *e-mail,* [acesse aqui](Configuração de envio de e-mail.md) e confira nossa documentação completa.\n\n**Fique atento!**Esta documentação é válida a partir da **atualização 1.8 - Mist**. Se você utiliza uma atualização anterior, ela pode conter informações diferentes das quais você vê na sua plataforma." }, { "metadata": { "title": "Conversores de Documentos", "source": "https://tdn.totvs.com/display/fluig/Conversores+de+Documentos", "path": "\\Plataforma Documentação técnica\\Configuração\\Conversores de Documentos.md" }, "content": "Conversores de Documentos" }, { "metadata": { "title": "Conversores de Documentos", "source": "https://tdn.totvs.com/display/fluig/Conversores+de+Documentos", "path": "\\Plataforma Documentação técnica\\Configuração\\Conversores de Documentos.md" }, "content": "Conversores de Documentos\n\n\nAtenção\n\nEsta página é destinada para atualizações 1.6 e superiores do TOTVS Fluig Plataforma.\n\n# Índice\n\n- 1 [Visualização de Documentos](#ConversoresdeDocumentos-VisualizaçãodeDocumentos)\n- 2 [Conhecimentos Necessários](#ConversoresdeDocumentos-ConhecimentosNecessários)\n- 3 [Construção de um Conversor](#ConversoresdeDocumentos-ConstruçãodeumConversor)\n\n# Visualização de Documentos\n\n---\n\nPor padrão, o visualizador interno da plataforma TOTVS Fluig suporta os formatos de documentos imagens, textos e de extensão de PDF. Porém existem casos que é necessário que o visualizador seja suportado para outros formatos de documento como planilhas, arquivos DWG, etc.\n\nCom intuito de facilitar a integração com diferentes formatos, a plataforma possui pontos de customização que permite qualquer formato de arquivo ser suportado no visualizador interno desde que exista alguma ferramenta que realize a conversão do formato desejado para o formato PDF.\n\nOs documentos devem possuir uma cópia no formato PDF 1.4 para serem visualizados internamente na plataforma, cuja especificação está disponível [aqui](http://www.adobe.com/devnet/pdf/pdf_reference_archive.html).\n\nA plataforma faz a conversão automática para PDF com os documentos de texto suportados pelo Microsoft® Word ou [OpenOffice.org](http://OpenOffice.org)™. Para os demais tipos, caso seja desejado utilizar o visualizador interno, deve ser construído um plugin de conversão para PDF.\n\n# Conhecimentos Necessários\n\n---\n\nPara construir um conversor faz-se necessário possuir os seguintes conhecimentos:\n\n- Tecnologia Java™ EE\n- Linguagem JavaScript\n\n# Construção de um Conversor\n\n---\n\nO plugin de conversão é composto de duas partes:\n\n1. Um componente EJB Message-Driven, para receber a solicitação de conversão;\n2. Aplicativo/programa que irá fazer a conversão;\n3. Indicar que o documento utiliza o visualizador interno.\n\nEste capítulo irá apresentar um exemplo de conversor para arquivos texto (txt) em PDF, assim será possível utilizá-lo no visualizador interno da plataforma.\n\nImportante\n\nPara auxiliar, faça o *download* do conversor [external-document-conversion.jar](https://tdn.totvs.com/download/attachments/258277478/external-document-conversion.jar?version=1&modificationDate=1474481616000&api=v2)\n\nCaso já tenha utilizado outro conversor externo, é necessário removê-lo da pasta [diretório\\_instalação]/appserver/apps antes de incluir este novo JAR.\n\nTambém não é mais necessária a inclusão de DLL na pasta bin do App Server Wildfly como era anteriormente. Logo, caso tenha adicionado o arquivo jacob-1.18-M2-x64.dll em [diretório\\_instalação]\\appserver\\bin, o mesmo pode ser removido.\n\n**Passo 1: Contruindo o EJB Message-Driven**\n\nCriar um Message-Driven que escute o tópico **topic/wdkDocument**: Segue fonte exemplo:\n\n**TxtMessageBean.java**\n\n```\npackage com.fluig.conv;\n\nimport javax.ejb.ActivationConfigProperty;\nimport javax.ejb.MessageDriven;\nimport javax.jms.Message;\nimport javax.jms.MessageListener;\n\n@MessageDriven(name = \"test/TxtConverter\", activationConfig = {\n @ActivationConfigProperty(propertyName = \"destinationType\", propertyValue = \"javax.jms.Topic\"),\n @ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"topic/wdkDocument\")\n})\npublic class TxtMessageBean implements MessageListener {\n\n @Override\n public void onMessage(Message message) {\n try {\n String event = message.getStringProperty(\"event\");\n if (event != null && event.equals(\"EXTERNALCONVERTION\")) {\n String doc = message.getStringProperty(\"documentpath\");\n if (doc != null && doc.endsWith(\".txt\")) {\n ProcessBuilder pb = new ProcessBuilder(\"txt2pdf.exe\", doc, doc + \".pdf\", \"-lpp40\");\n pb.start();\n }\n }\n \n } catch (Exception e) {\n e.printStackTrace();\n }\n }\n \n}\n```\n\nO Message-Driven acima configura a propriedade *destinationType* para **\"javax.jms.Topic\"** para indicar que irá escutar um tópico JMS, e a propriedade *destination* para **\"topic/wdkDocument\"** para indicar qual tópico será ouvido. O tópico \"topic/wdkDocument\" se refere à onde os eventos de publicação de documentos são enviados.\n\nAo receber uma mensagem, deverá verificar o tipo de evento publicado através da StringProperty \"**event**\", se o valor dessa propriedade for **\"EXTERNALCONVERTION\"**, significa que a plataforma está indicando que é o momento da conversão customizada ser executada.\n\nPara conhecer o caminho do documento, verifique a StringProperty **\"documentpath\"**.\n\nApós isto, verifica-se a extensão do arquivo para validar se este é o conversor correto, pois pode haver mais de um para extensões diferentes.\n\nValidado os parâmetros, pode-se então chamar o programa conversor, que no caso do exemplo, foi usado o freeware [txt2pdf](http://www.verypdf.com/txt2pdf/) .\n\nO documento destino deverá possuir o mesmo nome acrescido da extensão .pdf e este deverá ficar no mesmo diretório. Ex: doc.txt convertido: doc.txt.pdf\n\nLembramos que o documento origem não poderá ser modificado, com a penalidade de a plataforma indicar que ele foi alterado externamente (validação de CRC).\n\nEste Message-Driven deverá ser empacotado e implantado no servidor de aplicações conforme as especificações do Java™ EE.\n\n**Passo 2: Message-Driven para criação de documentos de longo prazo**\n\nPode ser utilizado o Message-Driven apresentado no item anterior na criação de documentos de longo prazo, sendo necessário fazer algumas alterações. Para saber se o Message-Driven esta sendo utilizado para criação do arquivo de longo prazo, existe um novo parâmetro chamado \"isLongTerm\", esse parâmetro é uma String, e se ela for igual a \"true\" é por que o documento que se quer gerar é um PDF/A, considerado arquivo de longo prazo. A plataforma considera apenas o PDF/A como formato apto a gerar documentos de longo prazo via Message-Drive.\n\nPara identificar a criação de um arquivo de longo prazo, o nome físico do documento deve ser alterado, incluindo a string \"PDFA\" no final do nome do arquivo. Por exemplo, se o nome do arquivo for manual.txt, o nome desse arquivo após a conversão será manual.txtPDFA.pdf. Veja o exemplo abaixo ilustrando as alterações necessárias no Message-Driven para criar o documento de longo prazo:\n\n```\nString longTerm = message.getStringProperty(\"isLongTerm\");\n\nif (doc != null && doc.endsWith(\".txt\")) {\n\tif (longTerm != null && longTerm.equals(\"true\")) {\n\t\tString documentName = doc + \"PDFA.pdf\";\n\t\t//Chamar o método de conversão para PDF/A\n\t}\n}\n```\n\nNa primeira linha recupera-se o valor do parâmetro \"isLongTerm\" para identificar se esta sendo requerida a criação de um arquivo de longo prazo. Após feita a verificação da extensão do documento, é verificado o valor da variável *longTerm*, se ela não for nula e for igual a \"true\", então realizamos a criação chamando o método de conversão de documentos utilizando para isso o nome do arquivo com a string \"PDFA.pdf\".\n\n**Passo 3: Registrando o conversor no fluig**\n\nNo fluig Studio, clicar com o botão direito do mouse na pasta events, selecionar a opção New e em seguida a opção Evento Global Fluig:\n\n![](..\\..\\images\\evento-studio1.png)\n\nO assistente Novo Evento é aberto. Selecione o evento **addDocumentConvertionExt**e em seguida clique no botão Finish.\n\n![](..\\..\\images\\evento-studio2.png)\n\nO evento é adicionado ao projeto na pasta events e aberto para edição. O objetivo desse evento global é adicionar as extensões que possuem um conversor customizado. Neste exemplo é necessário adicionar a extensão txt, conforme fonte abaixo:\n\n**addDocumentConvertionExt.js**\n\n```\nfunction addDocumentConvertionExt(ext) {\next.add(\"txt\");\n// para demais arquivos adicionar as extensões correspondentes\n//ext.add(\"doc\");\n//ext.add(\"ppt\");\n//ext.add(\"xls\");\n }\n```\n\n**Atenção:** Para impressão de documentos publicados com a opção \"Atualiza Propriedades da Cópia Controlada?\" **NÃO** será utilizado o conversor externo. Como é necessário aplicar as propriedades da cópia controlada no documento original e efetuar uma nova conversão, este processo só pode ser realizado em tempo de execução com o conversor padrão do produto. Portanto, na impressão do documento, pode ocorrer a perda de formatação dependendo dos recursos visuais aplicados em seu conteúdo (bordas, cores, imagens, etc).\n\n**Passo 4: Adicionar o *listener* ao servidor fluig**\n\nEmpacote o *listener*JMS e o adicione em [diretório\\_instalação]/appserver/apps/.\n\n![](..\\..\\images\\image2014-2-18%2011-43-12.png)\n\n**Passo 5: Indicar que o documento utiliza o visualizador interno**\n\nAgora que a extensão .txt foi registrada como possuindo um conversor customizado, basta assinalar a opção \"Utiliza Visualizador Interno?\" na publicação do documento:\n\n![](..\\..\\images\\image2016-10-19%20163555.png)\n\n**Observações**\n\n- No exemplo disponibilizado, é apresentado um exemplo de integração de conversão de formatos TXT utilizando a ferramenta *txt2pdf*, para cada extensão é necessário utilizar uma ferramenta adequada.\n- Os códigos de conversão são apenas exemplos, seu desenvolvimento e configuração é de responsabilidade do desenvolvedor.\n- Pode ser utilizado o *plugin*empacotado disponível em anexo. Sendo necessário para integração com os produtos Microsoft as configurações detalhas no guia [Ambiente de execução do Java®](https://tdn.totvs.com/pages/viewpage.action?pageId=75271469), permitindo a comunicação entre o servidor fluig e os componentes do *Office* além de extensões *TXT* e *DWG*." }, { "metadata": { "title": "Eventos de auditoria", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+auditoria", "path": "\\Plataforma Documentação técnica\\Configuração\\Eventos de auditoria.md" }, "content": "Eventos de auditoria" }, { "metadata": { "title": "Eventos de auditoria", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+auditoria", "path": "\\Plataforma Documentação técnica\\Configuração\\Eventos de auditoria.md" }, "content": "Eventos de auditoria\n\n\nAtenção!\n\nEsse recurso está disponível a partir da **atualização 1.6.4 - Waterdrop**. Leia abaixo como obtê-lo.\n\n- 1 [Objetivo](#Eventosdeauditoria-Objetivo)\n- 2 [Visão geral](#Eventosdeauditoria-Visãogeral)\n- 3 [Como obter](#Eventosdeauditoria-Comoobter)\n- 4 [Como ativar os eventos de auditoria](#Eventosdeauditoria-Comoativaroseventosdeauditoria)\n- 5 [Como consultar os eventos e exportar os resultados](#Eventosdeauditoria-Comoconsultaroseventoseexportarosresultados)\n- 6 [Como saber os eventos que geram log](#Eventosdeauditoria-Comosaberoseventosquegeramlog)\n - 6.1 [Eventos gerais que registram log para auditoria](#Eventosdeauditoria-Eventosgeraisqueregistramlogparaauditoria)\n - 6.2 [Eventos de dados pessoais que registram log para auditoria](#Eventosdeauditoria-Eventosdedadospessoaisqueregistramlogparaauditoria)\n\n# Objetivo\n\nEsse guia tem o objetivo de apresentar uma visão geral do recurso Eventos de auditoria no TOTVS Fluig Plataforma. Será abordado como obtê-lo, como utilizá-lo e como funciona.\n\n# Visão geral\n\nO recurso **Eventos de Auditoria** permite registrar alterações realizadas na plataforma em recursos específicos como Papel, Usuários, Grupos, Processos, Documentos, entre outros.\n\n# Como obter\n\nPara obter as licenças para uso do recurso **Eventos de Auditoria**é necessário entrar em contato com o time comercial solicitando uma proposta, através do e-mail [fluig.prime@fluig.com](mailto:fluig.prime@fluig.com). Com isso, o time comercial irá passar as instruções sobre a ativação da licença no [Servidor de Licenças (License Server)](Configuração de Ambiente/Servidor de Licenças (License Server).md).md).\n\n# Como ativar os eventos de auditoria\n\nA ativação de registro dos eventos de auditoria é realizada para cada empresa *(tenant)* individualmente, acessando a plataforma com o usuário wcmadmin. Consulte a documentação de [Configuração de eventos de auditoria](https://tdn.totvs.com/pages/viewpage.action?pageId=544206930) para saber os passos detalhados sobre como configurar a gravação dos eventos de auditoria.\n\n# Como consultar os eventos e exportar os resultados\n\nO recurso de Eventos de auditoria permite ao administrador da plataforma consultar os dados registrados, filtrando por usuário, recurso e período da atividade.\n\nCom o objetivo de oferecer uma análise mais detalhada, é possível exportar os dados de auditoria no formato CSV (compatível com softwares de planilha eletrônica como o Microsoft₢ Excel).\n\nOs passos detalhados para consultar os eventos registrados e gerar o relatório podem ser consultados na documentação de [Plataforma ❙ Eventos de auditoria](https://tdn.totvs.com/pages/viewpage.action?pageId=286511885).\n\n# Como saber os eventos que geram log\n\nTodos os eventos em Papéis, Usuários, Grupos, Processos, Documentos geram log na plataforma. O registro dos eventos foi dividido em dois tipos específicos: **eventos gerais para auditoria** e **eventos de dados pessoais**. A estrutura dos dois tipos é semelhante, mas o objetivo é bem diferente. \n\nA diferença básica entre eles é que nos eventos gerais de auditoria foram previamente definidos os pontos de monitoramento. No caso dos dados pessoais, foram elencados os pontos que podem ter dados pessoais, monitorados a partir do mapeamento desses campos ([veja aqui](https://tdn.totvs.com/x/OfheI))." }, { "metadata": { "title": "Eventos de auditoria", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+auditoria", "path": "\\Plataforma Documentação técnica\\Configuração\\Eventos de auditoria.md" }, "content": "Eventos de auditoria\n\n## Eventos gerais que registram log para auditoria" }, { "metadata": { "title": "Eventos de auditoria", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+auditoria", "path": "\\Plataforma Documentação técnica\\Configuração\\Eventos de auditoria.md" }, "content": "Eventos de auditoria\n\n\nNos eventos gerais, o foco de realizar uma auditoria é saber quem criou ou editou um registro. Por isso, são auditadas as ações relacionadas abaixo:\n\n**Plataforma**\n\n[Dataset](https://tdn.totvs.com/pages/viewpage.action?pageId=235598394) - criação, edição, remoção, alteração em código-fonte, cache mobile, sincronização.\n\n[Usuário](https://tdn.totvs.com/pages/viewpage.action?pageId=234455411) - criação, edição, recuperação de senha pessoal.\n\n[Grupo](https://tdn.totvs.com/pages/viewpage.action?pageId=234455392) - inclusão, edição e remoção de grupo; inclusão e remoção de usuário no grupo.\n\n[Papel](https://tdn.totvs.com/pages/viewpage.action?pageId=234455398) - inclusão, edição e remoção de papel; inclusão e remoção de usuário no papel; inclusão e remoção de papel no grupo.\n\n**Processos**\n\n[Substituto](https://tdn.totvs.com/pages/viewpage.action?pageId=234455459) - criação, edição e remoção; criação, edição e remoção no processo.\n\n[Versão de processo](https://tdn.totvs.com/pages/viewpage.action?pageId=233763153) - criação, liberação, edição, remoção de versão de processo.\n\n[Configuração de processo](https://tdn.totvs.com/pages/viewpage.action?pageId=263784090) - criação, edição, remoção de processo.\n\n[Solicitação de processo](https://tdn.totvs.com/pages/viewpage.action?pageId=233763157) - criação, edição, conversão, remoção, transferência de atividade, assumir atividade.\n\n[Mecanismo de atribuição](https://tdn.totvs.com/pages/viewpage.action?pageId=265783517) - criação, edição, remoção.\n\n[Anexos do processo](https://tdn.totvs.com/pages/viewpage.action?pageId=233763191) - criação, edição, remoção de anexo do processo.\n\n**Documentos**\n\n[Plataforma ❙ Documento](https://tdn.totvs.com/pages/viewpage.action?pageId=233763101) - criação, edição, nova revisão, nova versão, restaurar revisão, restaurar versão, exclusão de documento da navegação, espelhar documento, marcar e desmarcar como favorito, *download*, mover de pasta, copiar.\n\n[Pasta](https://tdn.totvs.com/pages/viewpage.action?pageId=233763099) - criação, edição de pasta, mover, copiar.\n\n[Plataforma ❙ Aplicativo](https://tdn.totvs.com/pages/viewpage.action?pageId=233763116) - criação, edição de aplicativo.\n\n[Formulário](https://tdn.totvs.com/pages/viewpage.action?pageId=233763113) - criação, edição de formulário.\n\n[Registro de formulário](https://tdn.totvs.com/pages/viewpage.action?pageId=243645686) - criação, edição de registro de formulário.\n\n[Arquivo físico](https://tdn.totvs.com/pages/viewpage.action?pageId=233765728) - criação, edição de arquivo físico, remoção, mover.\n\n[Plataforma ❙ Artigo](https://tdn.totvs.com/pages/viewpage.action?pageId=233763104) - criação, edição de artigo.\n\n[Plataforma ❙ Documento externo](https://tdn.totvs.com/pages/viewpage.action?pageId=233763110) - criação, edição de documento externo, mover, copiar.\n\n[Relatório](https://tdn.totvs.com/pages/viewpage.action?pageId=242392150) - criação, edição de relatório, mover, copiar.\n\n[Lixeira](https://tdn.totvs.com/pages/viewpage.action?pageId=243636051) - limpeza da lixeira, exclusão de item da lixeira, restaurar item da lixeira, inclusão de tarefa de agendamento de limpeza da lixeira." }, { "metadata": { "title": "Eventos de auditoria", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+auditoria", "path": "\\Plataforma Documentação técnica\\Configuração\\Eventos de auditoria.md" }, "content": "Eventos de auditoria\n\n## Eventos de dados pessoais que registram log para auditoria\n\nNos eventos de dados pessoais, o foco é facilitar o atendimento à [LGPD](https://tdn.totvs.com/pages/releaseview.action?pageId=514427789), informando ao usuário quem teve acesso às informações dele. Por isso, a visualização de registros que contenham dados pessoais é controlada, o que envolve os recursos abaixo:\n\n[Usuário](https://tdn.totvs.com/pages/viewpage.action?pageId=234455411) - criação, edição, visualização de usuário (ação realizada por outro usuário).\n\nRegistro de formulários - criação, edição, visualização (via tela ou webservice).\n\nLembrando que, no caso dos dados de formulário, podem ser incluídos como dados pessoais :\n\n- Formulários criados com o Forms,\n- Formulários avançados, criados no fluig Studio,\n- Formulários de processos e\n- Formulários de comunidades." }, { "metadata": { "title": "Habilitar atualização automática da Timeline", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=258277622", "path": "\\Plataforma Documentação técnica\\Configuração\\Habilitar atualização automática da Timeline.md" }, "content": "Habilitar atualização automática da Timeline\n\n\nAtenção\n\nEsta página é destinada para atualizações 1.6 e superiores do TOTVS Fluig Plataforma.\n\n# Índice\n\n- 1 [Objetivo](#HabilitaratualizaçãoautomáticadaTimeline-Objetivo)\n- 2 [Configuração](#HabilitaratualizaçãoautomáticadaTimeline-Configuração)\n\n# Objetivo\n\n---\n\nA plataforma possui a opção de atualizar automaticamente a *timeline*, assim os novos *posts* aparecem na *timeline* sem a necessidade de recarregar a página.\n\n# Configuração\n\n---\n\nPara habilitar este recurso, é necessário:\n\n- Acesse a plataforma com o usuário **wcmadmin**:\n\n![](..\\..\\images\\image2016-10-19%20165840.png)\n\n- Acesse **Painel de controle** → **WCM** → **Empresas.**\n\n![](..\\..\\images\\image2016-10-19%20165948.png)\n\n- Selecione a empresa em que deseja habilitar a atualização automática da *timeline* e clique em **Editar**.\n\n![](..\\..\\images\\image2016-10-19%2017028.png)\n\n- Na empresa desejada, clique no botão **Cadastrar dados adicionais** e adicione:\n\n| | |\n| --- | --- |\n| **Chave** | **Valor** |\n| realtime.enabled | true |\n\nObservação\n\nPara desativar este recurso, altere o valor da chave realtime.enabled para \"false\".\n\n**![](..\\..\\images\\image2016-10-19%201723.png)**\n\n- Pronto. Após isso, os novos posts serão atualizados na Timeline sem recarregar a página.\n\nImportante\n\nPara utilizar este recurso, o serviço fluig\\_RealTime deve estar iniciado." }, { "metadata": { "title": "Identity", "source": "https://tdn.totvs.com/display/fluig/Identity", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity.md" }, "content": "Identity\n\n\n- 1 [O que é TOTVS Identity?](#Identity-OqueéTOTVSIdentity?)\n - 1.1 [Single Sign-On: uma senha para tudo](#Identity-SingleSign-On:umasenhaparatudo)\n - 1.2 [Gestão centralizada de acessos](#Identity-Gestãocentralizadadeacessos)\n - 1.3 [Reset de senhas simplificado](#Identity-Resetdesenhassimplificado)\n- 2 [Guia rápido](#Identity-Guiarápido)\n- 3 [Links úteis](#Identity-Linksúteis)\n\n# O que é TOTVS Identity?\n\nO TOTVS Identity é o gerenciador de identidades. Sua missão é centralizar os acessos a múltiplos sistemas por meio de um login único para cada usuário, garantindo o controle e segurança às aplicações da empresa.\n\n## Single Sign-On: uma senha para tudo\n\nMúltiplos sistemas requerem múltiplas senhas. No dia-a-dia, fica difícil lembrar e garantir a segurança de todas elas. Resolva esse problema com o Identity: ao realizar o login, todas as suas aplicações estão liberadas para acesso facilmente.\n\n## Gestão centralizada de acessos\n\nCada sistema da sua empresa tem um ambiente exclusivo para gerenciamento e permissionamento de usuários. Além disso, as movimentações de pessoas dentro da empresa podem transformar a manutenção da segurança e acessos às informações em uma dor de cabeça. O Identity permite o controle total, unificado e simplificado dessas atividades, garantindo tranquilidade à TI.\n\n## Reset de senhas simplificado" }, { "metadata": { "title": "Identity", "source": "https://tdn.totvs.com/display/fluig/Identity", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity.md" }, "content": "Identity\n\n\nUm dos maiores vilões da produtividade na gestão de sistemas é a [recuperação de senhas de usuários](http://tdn.totvs.com/pages/viewpage.action?pageId=224101578). Perdeu o acesso? Não tem problema! Com o Identity, o *reset* de senha é *self-service*, o que promove autonomia do usuário final e desafoga a equipe de TI.\n\n![](..\\..\\images\\Id04.png)\n\n# Guia rápido\n\n**Preciso de acesso à internet para usar o Identity?**\n\nSim. O Identity é uma ferramenta SAAS, portanto é essencial possuir acesso à internet para usá-lo.\n\n**Qual o primeiro passo para começar a utilizar o Identity?**\n\nAbrir um *ticket* para o Suporte TOTVS Fluig solicitando a criação dos ambientes de Produção e Homologação do Identity, conforme a documentação [Criação de conta no Identity](https://tdn.totvs.com/x/sAzMCg). Recomendamos que todas as configurações e testes sejam inicialmente realizados no ambiente de homologação e posteriormente replicados no ambiente de produção.\n\nFique ligado!\n\nOs termos \"empresa\" e \"contexto\" serão usados de forma intercambiável ao longo desta documentação para descrever o espaço da sua companhia dentro do Identity.\n\n**Após realizar o meu primeiro acesso como administrador do contexto, como faço a inclusão dos usuários?**\n\nA inclusão de usuários no contexto pode ser feita de duas formas: através da criação manual ou importação dos usuários de um Active Directory.\n\n**Quero importar meus usuários que já estão cadastrados no Active Directory (AD). Como faço isso?**\n\nO primeiro passo é [vincular o diretório LDAP](https://tdn.totvs.com/x/W55UE), neste caso um Active Directory, ao seu contexto no Identity para obter o token que será utilizado em seguida na configuração do SmartSync. Basta informar um nome para o diretório e pronto, o token será gerado automaticamente.\n\n**O que é SmartSync?**\n\n[SmartSync](https://tdn.totvs.com/x/VIs0DQ) é um aplicativo *desktop* responsável pela conexão entre a empresa no Identity e o Active Directory. Procedimentos como a autenticação de acessos no Identity utilizando a senha do AD, importação de usuários e sincronização de alterações são realizados através do SmartSync.\n\n**Já instalei o SmartSync. Preciso configurar alguma coisa nele?**\n\nSim, agora é a hora de informar os dados de conexão ao Active Directory e o token gerado anteriormente no seu contexto nas [configurações do SmartSync](http://tdn.totvs.com/pages/viewpage.action?pageId=286520624). Assim o aplicativo será capaz de obter os cadastros no AD e enviá-los para a sua empresa no Identity.\n\n**O SmartSync está configurado e no ar, mas os usuários não aparecem no meu contexto...**\n\nOs usuários não são imediatamente provisionados (ou seja, criados) no contexto do Identity após a importação do Active Directory. Para que seja realizado o provisionamento, os usuários importados precisam ser [aceitos pelo administrador do contexto](http://tdn.totvs.com/pages/viewpage.action?pageId=273989076). A partir do momento em que for aceito, o status do usuário é atualizado para Ativo na empresa.\n\n**Como é feito o acesso a serviços externos, como o TOTVS Fluig Plataforma, pelo Identity?**\n\nO acesso ao TOTVS Fluig Plataforma (ou qualquer outro serviço) pelo Identity ocorre através de [Identity | Aplicativos](https://tdn.totvs.com/pages/viewpage.action?pageId=330830553) (apps). O administrador pode utilizar os aplicativos disponibilizados por padrão pelo Identity ou criar novos apps de acordo com a sua necessidade. O TOTVS Fluig Plataforma, por exemplo, conta com um aplicativo específico.\n\n**Como faço a integração entre o TOTVS Fluig Plataforma e o contexto do Identity?**\n\n[Esta integração abrange dois passos](http://tdn.totvs.com/pages/viewpage.action?pageId=73080143): (1) configurar a URL de acesso ao TOTVS Fluig Plataforma no aplicativo do Identity e (2) configurar a URL do contexto no Identity no Painel de controle do wcmadmin no TOTVS Fluig Plataforma.\n\n**E de que forma os usuários acessam o aplicativo Fluig?**\n\nUma vez integrados, basta [associar os usuários no Identity ao aplicativo Fluig](http://tdn.totvs.com/pages/viewpage.action?pageId=203763890) para que eles possam acessá-lo diretamente do [Launchpad](https://tdn.totvs.com/x/8ppUE), ou seja, a página que reúne todos os apps disponíveis no contexto.\n\n# Links úteis\n\n- [Matriz de Portabilidade - TOTVS Identity](https://tdn.totvs.com/x/eDAxE)\n- [Arquitetura](https://tdn.totvs.com/x/gDwMEQ), [Backups](https://tdn.totvs.com/x/k6XjHQ) e [Horário de funcionamento](https://tdn.totvs.com/x/77WVI) dos ambientes\n- [Criação e desativação de conta no Identity](https://tdn.totvs.com/x/sAzMCg)\n- [Aplicativos disponíveis](https://tdn.totvs.com/x/2ozCC)\n- [Integração com o Active Directory](https://tdn.totvs.com/pages/viewpage.action?pageId=146969024)\n- [Recursos de segurança](https://tdn.totvs.com/pages/viewpage.action?pageId=235592795)\n- [Identity | Desenvolvedores](https://tdn.totvs.com/pages/viewpage.action?pageId=203766003)" }, { "metadata": { "title": "Mobile", "source": "https://tdn.totvs.com/display/fluig/Mobile", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile.md" }, "content": "Mobile\n\n\nCom o Fluig Mobile você tem acesso a todos os recursos da plataforma Fluig na palma da mão, mesmo longe do escritório:\n\n- Inicie e movimente solicitações de processos *workflow*, mesmo sem conexão à internet.\n- Publique, aprove e visualize documentos.\n- Acompanhe as novidades de suas comunidades de interesse.\n- Tenha acesso fácil aos seus favoritos - Processos, documentos e social.\n- Receba notificações em seu dispositivo móvel.\n\n| | | |\n| --- | --- | --- |\n| | | |\n\nBaixe agora, em seu *smartphone* ou *tablet*:\n\n| | |\n| --- | --- |\n| | |" }, { "metadata": { "title": "Monitoramento de serviços da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=284881802", "path": "\\Plataforma Documentação técnica\\Configuração\\Monitoramento de serviços da plataforma.md" }, "content": "Monitoramento de serviços da plataforma" }, { "metadata": { "title": "Monitoramento de serviços da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=284881802", "path": "\\Plataforma Documentação técnica\\Configuração\\Monitoramento de serviços da plataforma.md" }, "content": "Monitoramento de serviços da plataforma\n\n\nAtenção\n\nEsta página é destinada para atualizações 1.6.2 e superiores do TOTVS Fluig Plataforma.\n\n# Índice\n\n- 1 [Objetivo](#Monitoramentodeserviçosdaplataforma-Objetivo)\n- 2 [Pré-requisitos](#Monitoramentodeserviçosdaplataforma-Pré-requisitos)\n- 3 [Funcionamento](#Monitoramentodeserviçosdaplataforma-Funcionamento)\n - 3.1 [Balanceamento de carga e alta disponibilidade - Cluster](#Monitoramentodeserviçosdaplataforma-Balanceamentodecargaealtadisponibilidade-Cluster)\n- 4 [Serviços monitorados](#Monitoramentodeserviçosdaplataforma-Serviçosmonitorados)\n - 4.1 [API monitors](#Monitoramentodeserviçosdaplataforma-APImonitors)\n - 4.1.1 [Analytics](#Monitoramentodeserviçosdaplataforma-Analytics)\n - 4.1.2 [Cache](#Monitoramentodeserviçosdaplataforma-Cache)\n - 4.1.3 [Realtime](#Monitoramentodeserviçosdaplataforma-Realtime)\n - 4.2 [API statistics](#Monitoramentodeserviçosdaplataforma-APIstatistics)\n - 4.2.1 [Database](#Monitoramentodeserviçosdaplataforma-Database)\n - 4.2.2 [Filesystem](#Monitoramentodeserviçosdaplataforma-Filesystem)\n - 4.2.3 [JVM](#Monitoramentodeserviçosdaplataforma-JVM)\n - 4.2.4 [Memory](#Monitoramentodeserviçosdaplataforma-Memory)\n - 4.2.5 [Misc](#Monitoramentodeserviçosdaplataforma-Misc)\n - 4.2.6 [Users](#Monitoramentodeserviçosdaplataforma-Users)\n- 5 [Acesso REST](#Monitoramentodeserviçosdaplataforma-AcessoREST)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é explicar como obter informações de monitoramento de serviços da plataforma. Estas APIs permitem que clientes monitorem e realizem consultas de diversos relatórios referente a serviços consumidos pela plataforma.\n\n# Pré-requisitos\n\n---\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre a plataforma TOTVS Fluig\n\nAtenção\n\nPara acessar as APIs de **Monitoramento de Serviços**, deve-se realizar autenticação com um usuário administrador ou com o usuário \"wcmadmin\".\n\n# Funcionamento\n\n---\n\nO módulo de monitoramento permite a consulta de uma série de relatórios referente a serviços em uso pelo fluig. Estas informações são úteis para monitorar desenvolvimentos sobre a plataforma para evoluí-los. O acesso aos relatórios pode ser feito através de API REST (que retorna um JSON) e via JMX." }, { "metadata": { "title": "Monitoramento de serviços da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=284881802", "path": "\\Plataforma Documentação técnica\\Configuração\\Monitoramento de serviços da plataforma.md" }, "content": "Monitoramento de serviços da plataforma\n\n## Balanceamento de carga e alta disponibilidade - Cluster\n\n---\n\nEm um ambiente de alta disponibilidade com [autenticação integrada](Configuração de Ambiente/Configurando Autenticação Integrada.md), a autenticação do wcmadmin deve ser realizada através do endereço: [protocolo]://[endereço\\_ip]:[porta]/portal/home?dologin. Em seguida acessar a URL: http://[servidor\\_fluig]:[porta]/monitoring/api/v1/**monitors**/report.\n\nEm ambientes com balanceamento de carga, o monitoramento deverá ser realizado em cada nó. Isso significa que, não é possível consultar em um nó e obter o resultado dos demais no mesmo retorno.\n\n# Serviços monitorados\n\n---\n\nOs monitores podem ser observados através de duas consultas REST diferentes. Você pode consultar diretamente o monitoramento que desejar incluindo o parâmetro na URL. Abaixo são apresentados as APIs com a relação de nomes e parâmetros de todos os monitores e seus serviços monitorados.\n\n## API monitors" }, { "metadata": { "title": "Monitoramento de serviços da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=284881802", "path": "\\Plataforma Documentação técnica\\Configuração\\Monitoramento de serviços da plataforma.md" }, "content": "Monitoramento de serviços da plataforma\n\n\n---\n\nPara acompanhar os serviços listados abaixo, altere a URL da plataforma no navegador pela apresentada a seguir. Os resultados apresentam o status atual dos serviços.\n\n```\n[protocolo]://[host fluig]/monitoring/api/v1/monitors/report/\n```\n\n| | | |\n| --- | --- | --- |\n| **GRUPO** | **PARÂMETRO** | **DESCRIÇÃO** |\n| Analytics | ANALYTICS\\_AVAIABILITY | Indica a disponibilidade do fluig Analytics (). |\n| Cache | CACHE\\_AVAIABILITY | Indica a disponibilidade do servidor de *cache*. |\n| **Misc** | LICENSE\\_SERVER\\_AVAILABILITY | Indica se o servidor de licenças está disponível. |\n| MAIL\\_SERVER\\_AVAILABILITY | Envia um e-mail de teste para [test@fluig-monitor.com](mailto:para%C2%A0test@fluig-monitor.com), para indicar a disponibilidade do serviço de e-mails. |\n| OPEN\\_OFFICE\\_AVAILABILITY | Indica se o servidor do OpenOffice está ativo. |\n| SOLR\\_SERVER\\_AVAILABILITY | Indica se o servidor do Solr está ativo. |\n| MS\\_OFFICE\\_AVAILABILITY | Indica se o Office está instalado e ativo no servidor. |\n| VIEWER\\_AVAILABILITY | Indica se o Viewer está configurado. |\n| Realtime | REAL\\_TIME\\_AVAILABILITY | Retorna se o NodeJS encontra acessível. |\n\n## API statistics" }, { "metadata": { "title": "Monitoramento de serviços da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=284881802", "path": "\\Plataforma Documentação técnica\\Configuração\\Monitoramento de serviços da plataforma.md" }, "content": "Monitoramento de serviços da plataforma\n\n\n---\n\nPara acompanhar os serviços listados abaixo, altere a URL da plataforma no navegador pela apresentada a seguir. É importante mencionar que os resultados não são monitorados em tempo real e sim checados a cada 5 minutos.\n\n```\n[protocolo]://[host fluig]/monitoring/api/v1/statistics/report/\n```\n\n| | | |\n| --- | --- | --- |\n| **GRUPO** | **PARÂMETRO** | **DESCRIÇÃO** |\n| Database | DATA\\_SOURCE\\_FLUIGDS | Retorna o tamanho do *pool* de conexões para o *datasource* transacionado. |\n| DATA\\_SOURCE\\_FLUIGDSRO | Retorna o tamanho do *pool* de conexões para o *datasource* somente de leitura sem transação. |\n| DATABASE\\_SIZE | Indica o tamanho total da base de dados utilizada pela plataforma. |\n| DATABASE\\_TRAFFIC | Indica o tráfego de envio e de recebimento da base de dados utilizada pela plataforma. Só para MySQL. |\n| DATABASE\\_INFO | Retorna dados sobre o nome e versão do banco de dados e do driver de conexão e versão do drive. |\n| Filesystem | ARTIFACTS\\_APPS\\_DIR | Retorna a relação de arquivos implantados no [diretório\\_instalação]/appserver/apps com suas respectivas Hash MD5. |\n| LOG\\_DIR\\_SIZE\\_MONITOR | Indica o tamanho do diretório de logs do servidor. |\n| ROOT\\_FILE\\_SYSTEMS | Retorna as raízes de montagem do *filesystem* com seus respectivos tamanhos em bytes. |\n| TEMPLATE\\_DIR\\_SIZE | Indica o tamanho do diretório de templates. |\n| VOLUME\\_DIR\\_SIZE | Indica o tamanho do diretório de volume. |\n| TEMPORARY\\_DIR\\_SIZE | Indica o tamanho do diretório temporário do servidor. |\n| Atenção Os parâmetros LOG\\_DIR\\_SIZE\\_MONITOR,TEMPLATE\\_DIR\\_SIZE, VOLUME\\_DIR\\_SIZE e TEMPORARY\\_DIR\\_SIZE foram depreciados na **atualização 1.6.4**. | |\n| JVM | RUNTIME | Retorna a hora de início e o tempo que está em execução. |\n| THREADING | Retorna o número de threads em execução, pico e quantidade iniciadas. |\n| Memory | DETAILED\\_MEMORY | Retorna a relação de memórias da JVM, com tipo, total alocado, total comprometido e máximo. |\n| MEMORY | Retorna o total de memória *heap* e *non-heap* alocados. |\n| **Cache** | CACHE\\_CONFIGURATION | Indica se a configuração do endereço do servidor de cache está definida para algo diferente de \"LOCAL\\_MAP\". |\n| Misc | EXTERNAL\\_CONVERTER | Indica se conversor interno de documentos está ativo. |\n| Users | CONNECTED\\_USERS | Indica o número de **sessões** de usuários ativas no portal. Este número **não** corresponde necessariamente ao número de usuários autenticados na plataforma. |\n\nAtenção\n\nSempre que um monitor retornar ***FAILURE*** é possível acessar o arquivo server.log, armazenado em [diretório\\_instalação]\\appserver\\standalone\\log (a partir da **2.0**) ou [diretório\\_instalação]\\appserver\\domain\\servers\\fluig1\\log (**1.6 até 1.8.2**)*,* para obter informações detalhadas do erro ocorrido.\n\n# Acesso REST\n\n---\n\nPara acessar os serviços via interface REST existem duas formas:\n\n| Método | URL | Explicação |\n| --- | --- | --- |\n| GET | http:///monitoring/api/v1/**monitors**/report | Retorna o relatório consolidado de todos os monitores citado acima, sem uso de parâmetros. |\n| http:///monitoring/api/v1/**statistics**/report |\n| GET | http:///monitoring/api/v1/**monitors**/report/[PARÂMETRO] | Retorna o relatório para um recurso em específico. O parâmetro deve ser escrito em maiúsculo. |\n| http:///monitoring/api/v1/**statistics**/report/[PARÂMETRO] |\n\nOnde:\n\n- [PARÂMETRO] = Nome do monitoramento.\n- Os retornos sempre são *Strings*.\n\n![](..\\..\\images\\Image%2012.jpg)\n\n**Figura 1 - Exemplo de consulta consolidada**\n\nOnde:\n\n- **FAILURE**: Falha na resposta do serviço;\n- **NONE**: Não foi utilizado até o momento;\n- **OK**: Em funcionamento e/ou ativado.\n\n![](..\\..\\images\\Image%201.jpg)\n\n**Figura 2 - Exemplo de consulta parametrizada**" }, { "metadata": { "title": "Monitoramento memcached", "source": "https://tdn.totvs.com/display/fluig/Monitoramento+memcached", "path": "\\Plataforma Documentação técnica\\Configuração\\Monitoramento memcached.md" }, "content": "Monitoramento memcached" }, { "metadata": { "title": "Monitoramento memcached", "source": "https://tdn.totvs.com/display/fluig/Monitoramento+memcached", "path": "\\Plataforma Documentação técnica\\Configuração\\Monitoramento memcached.md" }, "content": "Monitoramento memcached\n\n\nImportante!\n\nEm novas instalações a partir da atualizações 1.6 não é mais utilizado por padrão o serviço de MemCached, pois o recurso de cache está sendo disponibilizado internamente na plataforma. Portanto esta documentação é direcionada para clientes que utilizam o serviço de MemCached nas atualizações 1.6.1, versões anteriores e ambientes de alta disponibilidade.\n\n# Índice\n\n- 1 [Ferramenta](#Monitoramentomemcached-Ferramenta)\n- 2 [Guia de instalação do phpMemcachedAdmin](#Monitoramentomemcached-GuiadeinstalaçãodophpMemcachedAdmin)\n- 3 [Como configurar](#Monitoramentomemcached-Comoconfigurar)\n- 4 [Pontos de atenção que devem ser monitorados e soluções](#Monitoramentomemcached-Pontosdeatençãoquedevemsermonitoradosesoluções)\n- 5 [Parametrização do memcached](#Monitoramentomemcached-Parametrizaçãodomemcached)\n\n# Ferramenta\n\n---\n\nExistem diversas ferramentas de monitoramento de memcached disponíveis no mercado, como o phpMemcachedAdmin, o memcache-top, o statsproxy, além do próprio console do memcahced acessado por telnet. Utilizaremos phpMemcachedAdmin como ferramenta de monitoração, ele possui uma interface web simples e fácil de utilizar também iremos enumerar alguns pontos o que devem ser monitorados e soluções de problemas.\n\n# Guia de instalação do phpMemcachedAdmin\n\n---\n\nO  phpMemcachedAdmin deve ser baixado no site   , ele é um script simples em php e como tal deve rodar em um servidor http que tenha suporte a php.\n\nA ultima versão até a data em que esse guia foi escrito é a 1.2.2-r262 que pode ser obtida no link: \n\nseguindo as instruções do site devemos descompactar o pacote, dar permissão de execução aos scripts e permissão de escrita no arquivo de configuração dos servidores e na pasta em que são gerados os relatórios na pasta raiz do seu servidor. Exemplo:\n\n```\n/var/www/\nmkdir phpMemcachedAdmin\ncd phpMemcachedAdmin\nwget http://phpmemcacheadmin.googlecode.com/files/phpMemcachedAdmin-1.2.2-r262.tar.gz\ntar -xvzf phpMemcachedAdmin-1.2.2-r262.tar.gz\nchmod +rx *\nchmod 0777 Config/Memcache.php\nchmod 0777 Temp/\n```\n\n# Como configurar\n\n---\n\n\n\n- Apontar o navegador para a instalação do phpMemcahedAdmin em seu servidor, no caso nossa instalação está em .\n\n![](..\\..\\images\\phpMemcachedAdmin-1.png)\n\n- Inicialmente o monitorador já vem configurado para se conectar a um memcached local na máquina em que foi instalado, caso o memcached esteja instalado em outro local devemos acessar o link \"Edit Configuration\" localizado no canto superior direito que irá direcionar a página abaixo.\n\n![](..\\..\\images\\phpMemcachedAdmin-2.png)\n\n- Nessa tela é possível monitorar varias instalações de memcached, para a nossa configuração apenas vamos editar o endereço do servidor e a porta, lembrando que a porta padrão é a 11211, após salva as alterações já podemos seguir as páginas de monitoração clicando em \"See Live Stats\" ou \"See Stats for\"  mais a seleção do servidor no combo ao lado .\n- Caso as configurações apresente algum problema você visualizará a página abaixo, caso isso ocorra verifique se o memcached está funcionando e alcançável do servidor que o phpMemcached foi instalado, uma maneira de verificar isso é fazendo um telnet no endereço do memcached na porta 11211.\n\n![](..\\..\\images\\phpMemcachedAdmin-3.png)\n\n# Pontos de atenção que devem ser monitorados e soluções\n\n---\n\n\n\n- No gráfico \"Cache Size Graphic\" temos uma clara indicação do tamanho da memoria alocada para ele versus o consumo e o desperdício de memoria. O TOTVS Fluig Plataforma foi desenhado de maneira a nunca expirar um registro que está no cache, porem um alto consumo de memoria pode fazer com que o memcached de forma voluntária expurgue os registros mais antigos fazendo com que os usuários percam certas permissões, esse comportamento é evidenciado na quantidade de \"Evictions\" que o sistema está fazendo.\n- O memcached foi desenhado para trabalhar com blocos de 1 mega por padrão, esses blocos recebem o nome de Slab e agrupam registros de tamanhos similares. Quando solicitamos ao memcached para guardar um registro, é realizado um cálculo para saber em Slab ele vai ser inserido, se o Slab estiver cheio, vai ser criado uma nova página.  No exemplo abaixo, o Slab 1 guarda informações do tamanho de 96 bytes, como o tamanho da página do Slab foi parametrizado para 5 megas em uma conta aproximada  (1024\\*1024\\*5) / 96 = 54613, chegamos a conclusão que esse Slab comporta 54613 registros, caso mais um registro seja inserido o memcached irá criar uma nova página para esse Slab.\n\n![](..\\..\\images\\phpMemcachedAdmin-4.png)\n\n- Existem situações, em que podemos ter grupos com mais de 100 mil usuários e que acaba gerando registros maiores que o suportado por padrão, para esses casos, devemos parametrizar o memcached para trabalhar com Slabs maiores alterando o parâmetro  -I ( I de Igreja).\n\n![](..\\..\\images\\phpMemcachedAdmin-5.png)\n\n- No exemplo abaixo a configuração do tamanho da página do slab foi de 5 megas, esse numero é relativamente elevado e acaba gerando um grande desperdício de memoria, podemos verificar no exemplo abaixo que o tamanho máximo de registro é de 1.8 megas, logo podemos ter uma configuração mais assertiva e com um menor desperdício se o parâmetro fosse próximo dos 2 megas\n- O desperdício acontece quando é criado uma página no slab, toda a memoria configurada é alocada, no caso 5 megas, se essa página não recebe mais nenhum ou poucos registros toda essa área vai ficar subutilizada.\n\n![](..\\..\\images\\phpMemcachedAdmin-6.png)\n\n# Parametrização do memcached\n\n---\n\nMaiores informações sobre as opções de parametrização podem ser obtidas nos sites do memcached e nesse site com a descrição dos parâmetros " }, { "metadata": { "title": "Parâmetros de configuração da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623031", "path": "\\Plataforma Documentação técnica\\Configuração\\Parâmetros de configuração da plataforma.md" }, "content": "Parâmetros de configuração da plataforma" }, { "metadata": { "title": "Parâmetros de configuração da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623031", "path": "\\Plataforma Documentação técnica\\Configuração\\Parâmetros de configuração da plataforma.md" }, "content": "Parâmetros de configuração da plataforma\n\n\nFique atento!\n\nEsta página é válida a partir da atualização **Voyager (2.0)** do TOTVS Fluig.\n\nSe você utiliza uma atualização anterior, acesse [Quais são os parâmetros de configuração da plataforma da atualização **1.6 até 1.8.2**](https://tdn.totvs.com/pages/viewpage.action?pageId=941259888).\n\n- [Parâmetros de configuração](#Parâmetrosdeconfiguraçãodaplataforma-Parâmetrosdeconfiguração)\n- [Configuração do JMS](#Parâmetrosdeconfiguraçãodaplataforma-ConfiguraçãodoJMS)\n\n# Parâmetros de configuração\n\n---\n\nVeja a seguir os parâmetros disponíveis para configuração no arquivo **configuration.properties** disponível em [diretório\\_instalação]\\repository\\wcmdir\\config.\n\n| | | | |\n| --- | --- | --- | --- |\n| **Parâmetro** | **Parâmetro API** | **Descrição** | **Valores aceitos** |\n| webdesk/FTPPort | FTP\\_PORT | Alterar a porta FTP para a publicação de documentos via FTP. A porta padrão é 21. | Inteiro de 1 à 65535. |\n| webdesk/FTPPrivateFolderPort | FTP\\_PRIVATEFOLDER\\_PORT | Alterar a porta FTP para a pasta particular. A porta padrão é 25. | Inteiro de 1 à 65535. |\n| webdesk/FTPPortRange | FTP\\_PORT\\_RANGE | Conjunto de portas usadas para conexão de FTP passivo, caso não seja informado é usada uma porta aleatória. | Conjunto de portas, e.g: 2000-3000,3005. |\n| ```webdesk/FTPPrivateFolderRange ``` | FTP\\_PRIVATEFOLDER\\_PORT\\_RANGE | Conjunto de portas usadas para conexão de FTP passivo das pastas privadas, caso não seja informado é usada uma porta aleatória. | Conjunto de portas, e.g: 2000-3000,3005. |\n| webdesk/LSHost | LS\\_HOST | Alterar o endereço do servidor de licenças (*License Server*). | IP ou *HOSTNAME*. |\n| webdesk/LSPort | LS\\_PORT | Alterar a porta de comunicação com o servidor de licenças (*License Server*). | Inteiro de 1 à 65535. |\n| webdesk/OOoDir | OO\\_DIRECTORY | Alterar o diretório de instalação do *OpenOffice* (para a conversão dos documentos em PDF). | Caminho para instalação do *OpenOffice.* |\n| webdesk/OOoPort | OO\\_PORT | Alterar as portas disponíveis para o *OpenOffice*. Para informar mais de uma porta deve-se utilizar o separador “,” (vírgula). | Inteiro de 1 à 65535. |\n| fluig/server.url | SERVER\\_URL | Alterar a URL de acesso à plataforma. O padrão inicial é http://[endereco\\_IP]:8080. | IP ou *HOSTNAME.* |\n| totvs/solrHome | SOLR\\_HOME | Alterar o diretório em que são armazenadas as configurações do Solr. | Caminho para configuração do Solr. |\n| totvs/solrURL | SOLR\\_URL | Alterar a URL do Solr. Por padrão a URL é [servidor\\_fluig]:8080/solr. | IP ou *HOSTNAME.* |\n| totvs/solrCloud | SOLR\\_CLOUD | Ative para configurar o Solr com servidor em *Cluster*. | *true/false* |\n| totvs/solrRemote | SOLR\\_REMOTE | Ative para configurar o Solr em servidor separado remoto. | *true/false* |\n| wcm/cacheServerAddress | CACHE\\_SERVER\\_ADRESS | Alterar [protocolo]:[endereco]:[porta] do servidor de cache de permissões. | LOCAL\\_MAP, memcached:[host]:[port], redis:[host]:[port], redisc:[host]:[port] |\n| node.chat.url | NODE\\_CHAT\\_URL | Alterar a URL utilizada para comunicar as notificações e publicações da plataforma em tempo real. Use o mesmo endereço (*host*) da plataforma, para evitar problemas de *Cross-Domain.* | IP ou *HOSTNAME*, com a porta. |\n| node.realtime.url | NODE\\_REALTIME\\_URL | Alterar a URL interna do servidor de comunicação com o node.js. Use o mesmo endereço (*host*) da plataforma, para evitar problemas de *Cross-Domain.* | IP ou HOSTNAME, com a porta. |\n| fluig.schedule.server.host | SCHEDULE\\_SERVER\\_HOST | Altera a URL do servidor de agendamentos. | IP ou HOSTNAME. |\n| fluig.schedule.server.port | SCHEDULE\\_SERVER\\_PORT | Alterar a porta do servidor de agendamentos. | Inteiro de 1 à 65535. |\n| analytics.resources.folder | ANALYTICS\\_RESOURCES\\_FOLDER | Alterar a pasta de recursos do Fluig Analytics. | Caminho onde fica os arquivos para envio do Analytics. |\n| fluig/mail.defaultSender | MAIL\\_DEFAULT\\_SENDER | Habilitar o envio de *e-mail* utilizando o *e-mail* cadastrado no parâmetro mail.from. | *true/false* |\n| fluig/mail.personal | MAIL\\_PERSONAL | Definir um nome junto ao *e-mail* de origem, para identificar a empresa por exemplo. Tipo: NOME\\_DA\\_EMPRESA [adm@fluig.com.](mailto:adm@fluig.com) | |\n| fluig/mail.allNotification | MAIL\\_ALL\\_NOTIFICATION | Caso definido como 'true' faz com que todos os e-mails da plataforma sejam enviados a partir do *e-mail* informado no campo mail.from e não apenas os *e-mails* de sistema. | *true/false* |\n| fluig/mail.from | MAIL\\_FROM | Alterar o endereço de *e-mail* utilizado para envio dos *e-mails* de sistema. | |\n| webdesk/OOoEnabled **\\*** | OO\\_ENABLED | Habilitar/Desabilitar o serviço do *OpenOffice*. | *true/false* |\n| webdesk/FTPEnabled **\\*** | FTP\\_ENABLED | Permite habilitar ou desabilitar o servidor FTP. | *true/false* |\n| webdesk/FTPExternalAddress **\\*** | FTP\\_EXTERNAL\\_ADDRESS | Endereço externo do servidor de FTP, necessário para expor o FTP em modo passivo se estiver usando NAT. | IP ou *HOSTNAME* do servidor externo. |\n| FDN\\_emailSmtpServer **\\*** | SMTP\\_SERVER | Alterar o *HOSTNAME* do servidor de SMTP. | IP ou *HOSTNAME.* |\n| FDN\\_emailSmtpPort **\\*** | SMTP\\_PORT | Alterar a porta SMTP para o envio de *e-mails*. A porta padrão é 25. | Inteiro de 1 à 65535. |\n| FDN\\_emailSecurity **\\*** | MAIL\\_SECURITY | Ativar/Desativar o uso de TLS na conexão SMTP. | *true/false* |\n| FDN\\_emailAuthentication **\\*** | MAIL\\_AUTHENTICATION | Ativar/Desativar autenticação no envio de *e-mail.* | *true/false* |\n| FDN\\_emailUser **\\*** | MAIL\\_USER | Login do usuário utilizado na autenticação do servidor de *e-mail.* | |\n| FDN\\_emailPasswd **\\*** | MAIL\\_PASSWORD | Senha utilizada na autenticação do servidor de *e-mail*. | |\n| FDN\\_emailSecurity **\\*\\*** | MAIL\\_SECURITY | Protocolo de segurança utilizado na conexão SMTP. | none/tls/ssl (os valores devem ser minúsculo). |\n\n**\\*** → Parâmetro existente a partir da atualização **1.6.1**.\n\n**\\*\\*** → Parâmetro existente a partir da atualização **1.6.2**.\n\n# Configuração do JMS\n\n---\n\nPara obter um melhor desempenho do servidor de aplicação utilizado pela plataforma, recomenda-se a alteração do parâmetro relacionado ao JMS para não persistir as mensagens em disco.\n\nImportante!\n\nA alteração deste parâmetro é **opcional**. Antes de alterá-lo, não esqueça de criar um ***backup*** do arquivo **standalone.xml**.\n\nNo arquivo **standalone.xml**, armazenado na pasta [diretório\\_instalação]\\appserver\\standalone\\configuration, altere:\n\n**standalone.xml**\n\n```\n\n```" }, { "metadata": { "title": "Utilizando o protocolo FTP na plataforma", "source": "https://tdn.totvs.com/display/fluig/Utilizando+o+protocolo+FTP+na+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Utilizando o protocolo FTP na plataforma.md" }, "content": "Utilizando o protocolo FTP na plataforma" }, { "metadata": { "title": "Utilizando o protocolo FTP na plataforma", "source": "https://tdn.totvs.com/display/fluig/Utilizando+o+protocolo+FTP+na+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Utilizando o protocolo FTP na plataforma.md" }, "content": "Utilizando o protocolo FTP na plataforma\n\n\nAtenção\n\nEsta página é destinada para atualizações 1.6 e superiores do TOTVS Fluig Plataforma.\n\n# Índice\n\n- 1 [Objetivo](#UtilizandooprotocoloFTPnaplataforma-Objetivo)\n- 2 [Procedimentos para utilização de protocolo FTP](#UtilizandooprotocoloFTPnaplataforma-ProcedimentosparautilizaçãodeprotocoloFTP)\n- 3 [Configurando portas passivas no FTP](#UtilizandooprotocoloFTPnaplataforma-ConfigurandoportaspassivasnoFTP)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é facilitar a compreensão quanto a utilização do protocolo FTP para publicação de documentos no TOTVS Fluig Plataforma.\n\n# Procedimentos para utilização de protocolo FTP\n\n---\n\nAcompanhe o passo a passo a seguir:\n\n- - Acessar a plataforma com o usuário wcmadmin → **Painel de Controle** → aba **WCM** → **Configurações do Sistema** → aba **Parâmetros da Plataforma**:\n - Clique em **OFF** para Habilitar servidor FTP:\n\n![](..\\..\\images\\Image%205.jpg)\n\n[Clique aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=257623022) e saiba mais sobre as configurações da plataforma\n\n- Altere o valor da **Porta do FTP** que será utilizado para o protocolo FTP. Por padrão a plataforma utiliza o valor 21.\n- Também pode ser configurado uma faixa de portas conforme descrito abaixo:\n - **Faixa de Portas do FTP:** Faixa de portas utilizadas pelo FTP para publicação e publicação em pastas privadas.\n - **Faixa de portas FTP para pastas privadas:** Definir a faixa de portas usadas para a comunicação de FTP passivo.\n - **Porta FTP para pastas privadas:** Porta utilizada pelo FTP para publicação em pastas privadas.\n\n![](..\\..\\images\\Image%207.jpg)\n\n- Clique em **Salvar**.\n- Será necessário reiniciar os serviços do fluig.\n\n- Acesse o protocolo FTP a partir da ferramenta de sua preferência. Neste exemplo foi utilizado o software FileZilla.\n\n1. 1. ***Host*:** informe o endereço do servidor, sem a porta de conexão HTTP. Exemplo: *localhost.*\n 2. ***Username*:** informe o *login* do usuário do fluig.\n 3. ***Password*:** informe a senha do usuário do fluig.\n 4. ***Port*:** informe a porta configurada no item 2.\n\n![](..\\..\\images\\image2014-2-5%20102543.png)\n\n- Utilizando o protocolo FTP, faça upload do arquivo desejado para o servidor.\n\n![](..\\..\\images\\image2014-2-5%20102611.png)\n\n- Após realizar o *upload* para o servidor, o arquivo estará disponível no servidor no diretório de *upload* do usuário, aguardando ser publicado.\n\n![](..\\..\\images\\image2016-10-19%20164434.png)\n\n# Configurando portas passivas no FTP\n\n---\n\nQuando existir a necessidade de restringir as portas para a transferência dos arquivos, basta logar com o usuário **wcmadmin** e alterar o campo **Faixa de portas FTP para pastas privadas** em **Painel de Controle** → aba **WCM** → **Configurações do Sistema** → aba **Parâmetros da Plataforma:**\n\n**![](..\\..\\images\\Image%208.jpg)**\n\nNo valor, é possível passar uma porta, um grupo de portas ou um intervalo de portas.\n\n**Exemplo:**\n\n| Valor | Descrição |\n| --- | --- |\n| 0 | Qualquer porta disponível é utilizada como a porta passiva. |\n| 123 | A porta 123 será usada como a porta passiva. |\n| 123,133 | As portas 123 e 133 serão utilizadas como a porta passiva. |\n| 123-125 | Qualquer porta de um intervalo de 123-125 será utilizada como a porta passiva. |\n| 123-125, 127, 129-130 | Qualquer porta de um intervalo de 123-125, a porta 127 ou no intervalo de 129-130 será utilizada como a porta passiva. |" }, { "metadata": { "title": "Como expor dados em ambientes públicos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=445656685", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Como expor dados em ambientes públicos.md" }, "content": "Como expor dados em ambientes públicos\n\n\nAtenção\n\nEsta página foi revisada para considerar as configurações do TOTVS Fluig Plataforma a partir da **atualização 1.6.5 - Liquid**.\n\n# Índice\n\n- 1 [Objetivo](#Comoexpordadosemambientespúblicos-Objetivo)\n - 1.1 [Introdução](#Comoexpordadosemambientespúblicos-Introdução)\n - 1.2 [Como utilizar](#Comoexpordadosemambientespúblicos-Comoutilizar)\n - 1.3 [Recursos criados](#Comoexpordadosemambientespúblicos-Recursoscriados)\n\n# Objetivo\n\n---\n\nExistem algumas situações em que as páginas públicas precisam acessar informações disponíveis na plataforma para interagir com o cliente.\n\nEste guia tem o objetivo de apresentar uma técnica segura para liberar o acesso às informações disponíveis no TOTVS Fluig Plataforma sem requisitar autenticação.\n\n## Introdução\n\nAlguns parceiros e clientes utilizam o OAuth para realizar as chamadas nas APIs, no entanto a chave fica localizada dentro da página. Essa técnica não é recomendada, pois um atacante pode se apossar da chave que está publicamente acessível e obter acesso irrestrito ao dados.\n\nPara evitar essa situação, foi criada uma técnica que se baseia em duas etapas:\n\n1. Na instalação de um componente ou aplicativo da Store serão criadas chaves através da classe *activator* configurada. Para a criação das chaves de autenticação deve ser definido um código que obedece ao padrão de 4 pares de 4 caracteres: XXXX-XXXX-XXXX-XXXX.\n2. Esse código será usado posteriormente para buscar os *tokens* que serão usados na autenticação. Essa etapa será realizada dentro da camada REST no servidor, desta forma somente os dados que forem necessários serão expostos, e fica a cargo da implementação gerenciar a segurança destes dados.\n\n## Como utilizar" }, { "metadata": { "title": "Como expor dados em ambientes públicos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=445656685", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Como expor dados em ambientes públicos.md" }, "content": "Como expor dados em ambientes públicos\n\n\nPara realizar essa implementação, siga os passos abaixo:\n\nInclua a dependência do projeto **fluig-sdk-keyring**, que existe a partir da **atualização 1.6.5 - Liquid**:\n\n```\n\n com.fluig\n fluig-sdk-keyring\n ${fluig.version}\n compile\n\n```\n\nDepois implemente o **activator** conforme a documentação técnica de[Eventos de Componentes](http://tdn.totvs.com/display/fluig/Eventos+de+Componentes) e no método **enable** inclua a chamada ao método Keyring.\n\n```\npublic class Activate implements ActivationListener {\n...\n public void enable(ActivationEvent evt) throws Exception {\n Keyring.provision(RestConstant.APP_KEY);\n }\n}\n```\n\nPara consultar um exemplo de implementação no GIT, [clique aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/sample-component/sample-component-service/src/main/java/com/samplecomponent/activate/oauth/Activate.java).\n\nNa classe que implementa o serviço REST, utilize **Keyring.getKeys(tenantId, )**. Este método vai retornar as chaves que serão utilizadas para fazer a autenticação via OAuth nas requisições.\n\nPara assinar a requisição recomendamos utilizar a biblioteca**signpost-core**, dependência e exemplo a seguir:\n\n```\n\n oauth.signpost\n signpost-core\n 1.2.1.1\n\n```\n\n**Exemplo**\n\n```\nKeyVO key = Keyring.getKeys(tenantId, RestConstant.APP_KEY);\nOAuthConsumer consumer = new DefaultOAuthConsumer(key.getConsumerKey(),key.getConsumerSecret());\nconsumer.setTokenWithSecret(key.getToken(), key.getTokenSecret());\n...\nHttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();\n...\nconfig.sign(urlConnection);\nurlConnection.connect();\n```\n\nPara consultar um exemplo de implementação no GIT, [clique aqui.](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/sample-component/sample-component-rest/src/main/java/com/samplecomponent/rest/SampleActivateRest.java)\n\nExemplos de desenvolvimento de componentes\n\nConsulte nosso repositório de [exemplos de desenvolvimentos de componentes](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/sample-component)para mais informações sobre o desenvolvimento, os projetos e componentes." }, { "metadata": { "title": "Como expor dados em ambientes públicos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=445656685", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Como expor dados em ambientes públicos.md" }, "content": "Como expor dados em ambientes públicos\n\n## Recursos criados\n\nPronto! Após realizar esses passos, deve ser possível o acesso às informações disponíveis no TOTVS Fluig Plataforma sem autenticação.\n\nAtenção!\n\nNo provisionamento das chaves são criados alguns recursos que não devem ser alterados ou excluídos.\n\n- OAuth Provider com o nome customapps- no tenant que o componente foi ativado.\n- OAuth Application com o código: -\n- Application User: integration--" }, { "metadata": { "title": "Edição colaborativa com Google Drive", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=219694266", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Edição colaborativa com Google Drive.md" }, "content": "Edição colaborativa com Google Drive" }, { "metadata": { "title": "Edição colaborativa com Google Drive", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=219694266", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Edição colaborativa com Google Drive.md" }, "content": "Edição colaborativa com Google Drive\n\n\n- [Objetivo](https://tdn.totvs.com/pages/viewpage.action?pageId=219694266#Edi%C3%A7%C3%A3ocolaborativacomGoogleDrive-Objetivo)\n- [Pré-requisitos](https://tdn.totvs.com/pages/viewpage.action?pageId=219694266#Edi%C3%A7%C3%A3ocolaborativacomGoogleDrive-Pr%C3%A9-requisitos)\n- [Edição colaborativa com Google Drive](https://tdn.totvs.com/pages/viewpage.action?pageId=219694266#Edi%C3%A7%C3%A3ocolaborativacomGoogleDrive-Edi%C3%A7%C3%A3ocolaborativacomGoogleDrive)\n - [Download do pacote](https://tdn.totvs.com/pages/viewpage.action?pageId=219694266#Edi%C3%A7%C3%A3ocolaborativacomGoogleDrive-Downloaddopacote)\n - [Instalação do componente](https://tdn.totvs.com/pages/viewpage.action?pageId=219694266#Edi%C3%A7%C3%A3ocolaborativacomGoogleDrive-Instala%C3%A7%C3%A3odocomponente)\n- [Configurando o seu Google Drive](https://tdn.totvs.com/pages/viewpage.action?pageId=219694266#Edi%C3%A7%C3%A3ocolaborativacomGoogleDrive-ConfigurandooseuGoogleDrive)\n- [Habilitar edição colaborativa na plataforma](https://tdn.totvs.com/pages/viewpage.action?pageId=219694266#Edi%C3%A7%C3%A3ocolaborativacomGoogleDrive-Habilitaredi%C3%A7%C3%A3ocolaborativanaplataforma)\n- [Edição de conteúdo após a conclusão da configuração](https://tdn.totvs.com/pages/viewpage.action?pageId=219694266#Edi%C3%A7%C3%A3ocolaborativacomGoogleDrive-Edi%C3%A7%C3%A3odeconte%C3%BAdoap%C3%B3saconclus%C3%A3odaconfigura%C3%A7%C3%A3o)\n\n# Objetivo\n\n---\n\nEste guia tem o objetivo de apresentar os passos necessários de configuração para uso da edição colaborativa no TOTVS Fluig Plataforma.\n\n# Pré-requisitos\n\n---\n\n- É necessário que a plataforma tenha acesso externo (a partir da internet) para utilizar esta funcionalidade\n\n Os endereços [https://www.google.com](https://www.google.com.br) e [https://www.googleapis.com](https://www.google.com/url?q=https://www.googleapis.com&sa=D&source=hangouts&ust=1562088363335000&usg=AFQjCNFpM2yt1vy3OeOd5Q-tIVpTXqA4nw) devem estar liberados na rede.\n- A edição em modo colaborativo depende da extensão do arquivo. Arquivos em PDF, por exemplo, não são editáveis, e devem ser convertidos para posterior edição.\n\n# Edição colaborativa com Google Drive\n\n---\n\nA plataforma disponibiliza o recurso de edição colaborativa de documentos, por meio do Google Drive. Para utilizar esse recurso, é necessário instalar e configurar um componente específico, conforme orientações abaixo." }, { "metadata": { "title": "Edição colaborativa com Google Drive", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=219694266", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Edição colaborativa com Google Drive.md" }, "content": "Edição colaborativa com Google Drive\n\n## Download do pacote\n\n- Para baixar o componente, acesse o [Portal do Cliente](http://suporte.totvs.com)[.](http://suporte.fluig.com/)\n- Clique em ***Download*** (essa é a mesma página onde está disponível a mais recente atualização da plataforma).\n- Selecione o produto **Fluig**, acesse o diretório **FLUIG STORE** e selecione**FLUIG**.\n- Faça o *download* do arquivo **FLUIG-COLLABORATION-GOOGLEDRIVE.**\n\n![](../../../images/Central_Downloads%20(2).png).png)\n\n## Instalação do componente" }, { "metadata": { "title": "Edição colaborativa com Google Drive", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=219694266", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Edição colaborativa com Google Drive.md" }, "content": "Edição colaborativa com Google Drive\n\n\nDescompacte o arquivo em uma pasta de sua preferência, que aqui chamaremos de **.**\n\n- Acesse a plataforma com o perfil de administrador e em seguida acesse : **Painel de Controle** → agrupador **Aplicativos** → **Central de componentes**.\n\n![](..\\..\\..\\images\\central%20de%20componentes.png)\n\n- Acione a opção **Escolher arquivo**, navegue até a pasta descompactada e selecione o arquivo **application-collaboration-googledrive-ear.ear**.\n\n![](..\\..\\..\\images\\print-selecionar-arquivo-editado_1.png)\n\n- Acione a opção **Enviar** e aguarde aproximadamente 1 minuto para a finalização do processo de publicação do componente;\n- Reinicie os serviços fluig\\_RealTime, fluig\\_Indexer e fluig.\n\n- Após reiniciar os serviços, faça uma busca na página de componentes por **collaboration.**\n- Selecione **ecm\\_collaboration\\_admin** e acione o botão **Ativar**.\n- Selecione **ecm\\_collaboration\\_edit** e acione o botão **Ativar.**\n\n**![](..\\..\\..\\images\\print-habilitar-componente-editado_1.png)**\n\n- Acesse **Painel de Controle →** agrupador **Aplicativos**. Uma nova opção de menu chamada **Edição Colaborativa** estará disponível .\n\n![](..\\..\\..\\images\\image2015-12-11%2014-30-32.png)\n\n- Ao clicar na opção **Edição Colaborativa** será apresentada a tela abaixo.\n\n![](..\\..\\..\\images\\edicaocolaborativa.png)\n\nA URL de redirecionamento será utilizada na configuração do **[Aplicativo WEB](http://tdn.totvs.com/pages/viewpage.action?pageId=219694266#GoogleDrive-8)** do Google no próximos passos.\n\n- Reiniciar os serviços da plataforma.\n\n# Configurando o seu Google Drive\n\n---\n\nPara que seja possível a integração entre o TOTVS Fluig Plataforma e o Google Drive será necessário realizar os passos abaixo.\n\n- Acesse a URL [https://console.developers.google.com.](https://console.developers.google.com) Caso não esteja logado no Google, realize o login e crie um projeto, seguindo um dos exemplos abaixo:\n - Credenciais > Criar [![](..\\..\\..\\images\\imagem.png)](http://tdn.totvs.com/download/attachments/309412432/p%C3%A1gina-inicial.PNG) **[Veja a imagem](https://tdn.totvs.com/download/attachments/219694266/selecione%20credenciais.png?version=1&modificationDate=1539103183723&api=v2)**\n - Criar projeto [![](..\\..\\..\\images\\imagem.png)](http://tdn.totvs.com/download/attachments/309412432/p%C3%A1gina-inicial.PNG) **[Veja a imagem](https://tdn.totvs.com/download/attachments/219694266/passo1.png?version=1&modificationDate=1496265660000&api=v2)**\n\n- Após avançar, escolha um nome para o seu projeto.\n- Em seguida, clique em **Criar**.\n\n**![](..\\..\\..\\images\\passo2.png)**\n\n- Agora você pode aguardar a criação do projeto e acompanhar pela notificação.\n\n ![](..\\..\\..\\images\\passo3.png)\n\n- Após a criação, selecionar o projeto e em sequência clicar em **Ir para visão geral de APIs**, conforme a imagem:\n\n![](..\\..\\..\\images\\passo4.png)\n\n- Ou você pode acessar diretamente a URL [https://console.developers.google.com.](https://console.developers.google.com/)\n\n- Após criar o projeto, você será direcionado para a página abaixo.\n- Selecione a opção **Biblioteca** no menu lateral esquerdo.\n\n![](..\\..\\..\\images\\04.PNG)\n\n- Na página exibida, selecione a opção **Drive API**, na categoria G Suite APIs.\n\n![](..\\..\\..\\images\\passo5.png)\n\n- Acione o botão **Ativar**, caso essa tela apareça. Se não pule para o passo 7.\n\n![](..\\..\\..\\images\\google%20drive1.PNG)\n\n- Com a API ativada, clique no botão **Criar credenciais**.\n\n![](..\\..\\..\\images\\passo7.png)\n\n- Precisamos de credenciais do tipo **ID do cliente OAuth** para realizar a integração, portanto este passo pode ser ignorado clicando no botão **Cancelar**.\n\n![](..\\..\\..\\images\\08.PNG)\n\n- Agora clique no botão **Criar credenciais** e selecione a opção **ID do cliente OAuth**.\n\n![](..\\..\\..\\images\\09.PNG)\n\n- Clique em **Configurar a tela de consentimento**.\n\n![](..\\..\\..\\images\\10.PNG)\n\n- Informe um nome de sua preferência e acione **Salvar**.\n\n![](..\\..\\..\\images\\11.PNG)\n\n- Aqui você terá que adicionar o **Nome** do cliente e a **URL de redirecionamento.**\n\nA URL de redirecionamento autorizada deve ser cadastrada com a **URL de redirecionamento** recuperada no [Passo 6](http://tdn.totvs.com/pages/viewpage.action?pageId=219694266#Componente-6) da instalação do componente.\n\n![](..\\..\\..\\images\\13.PNG)\n\n- Após criar o **Aplicativo WEB** serão apresentadas as chaves OAuth para serem cadastradas no TOTVS Fluig Plataforma.\n\n![](..\\..\\..\\images\\chavesoauth.png)\n\n- Você também pode personalizar seu app de edição colaborativa acessando a opção de menu **Credenciais** na aba **Tela de consentimento OAuth.**\n\n- Aproveite para adicionar o logo da plataforma.\n\n![](..\\..\\..\\images\\consentimento.png)\n\nAs telas acima podem apresentar diferenças em relação ao que está demonstrado, devido a constantes atualizações da Google.\n\n# Habilitar edição colaborativa na plataforma\n\n---\n\nApós realizar as configurações necessárias no Google Drive, é necessário fazer as configurações no TOTVS Fluig Plataforma para completar a integração entre a plataforma e o Google Drive.\n\n- Acesse **Painel de Controle >** agrupador **Aplicativos > Edição Colaborativa** e adicione as chaves OAuth adquiridas no [Passo 13](http://tdn.totvs.com/pages/viewpage.action?pageId=219694266#GoogleDrive-13) da configuração do Google Drive.\n\n![](..\\..\\..\\images\\edicaocolaborativa.png)\n\n- Após cadastrar as chaves e habilitar o Google Drive, acesse os Documentos e selecione um documento que deseja editar.\n\n**![](..\\..\\..\\images\\editar%20conteudo.png)**\n\n- Selecione a opção **Google Drive**.\n\n![](..\\..\\..\\images\\ediatargoole.png)\n\n- Será apresentada a tela abaixo onde será necessário acionar a opção **Permitir**.\n\n![](..\\..\\..\\images\\permitir.png)\n\n- Com isso, o documento estará disponível para ser editado no **Google Drive** colaborativamente por usuários que tenham permissão de edição no documento.\n\n# Edição de conteúdo após a conclusão da configuração\n\n---\n\nApós realizar as configurações necessárias no Google Drive e no TOTVS Fluig Plataforma, o passo a passo para editar o conteúdo desejado pode ser consultado na documentação [Editar conteúdo de documento](https://tdn.totvs.com/pages/viewpage.action?pageId=233765735).\n\nÉ possível editar pelo Google Drive apenas documentos que possuem uma das seguintes extensões suportadas pelo recurso:\n\n- Documentos: doc, docx, odt;\n\n- Planilhas: xls, xlsx, ods;\n\n- Apresentações: ppt, pptx, odp." }, { "metadata": { "title": "Kit Intranet", "source": "https://tdn.totvs.com/display/fluig/Kit+Intranet", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Kit Intranet.md" }, "content": "Kit Intranet" }, { "metadata": { "title": "Kit Intranet", "source": "https://tdn.totvs.com/display/fluig/Kit+Intranet", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Kit Intranet.md" }, "content": "Kit Intranet\n\n\n# Índice\n\n- 1 [Objetivo do Componente](#KitIntranet-ObjetivodoComponente)\n- 2 [Widgets](#KitIntranet-Widgets)\n - 2.1 [Widget Aniversariantes](#KitIntranet-WidgetAniversariantes)\n - 2.2 [Widget Organograma Corporativo](#KitIntranet-WidgetOrganogramaCorporativo)\n - 2.3 [Widget Notícias](#KitIntranet-WidgetNotícias)\n - 2.4 [Widget Convênios](#KitIntranet-WidgetConvênios)\n - 2.5 [Widget Slideshow](#KitIntranet-WidgetSlideshow)\n - 2.6 [Widget Cardápio](#KitIntranet-WidgetCardápio)\n- 3 [Instalação e atualização do Kit Intranet](#KitIntranet-InstalaçãoeatualizaçãodoKitIntranet)\n - 3.1 [Conexão aos serviços RM](#KitIntranet-ConexãoaosserviçosRM)\n - 3.2 [Suporte a aplicativos Mobile](#KitIntranet-SuporteaaplicativosMobile)\n - 3.2.1 [Webservices RM](#KitIntranet-WebservicesRM)\n - 3.2.1.1 [Widget Aniversariantes](#KitIntranet-WidgetAniversariantes.1)\n - 3.2.1.2 [Widget Organograma](#KitIntranet-WidgetOrganogramaorganogramaRM)\n- 4 [Desenvolvimento sobre a plataforma](#KitIntranet-Desenvolvimentosobreaplataforma)\n\n# Objetivo do Componente\n\n---\n\nO Kit Intranet oferece widgets, técnicas e código de referência para desenvolvedores na plataforma fluig nas tarefas mais comuns, como:\n\n- Desenvolvimento de Widgets utilizando a SuperWidget;\n- Utilização do fluig Style Guide;\n- Salvar e recuperar preferências de Widgets;\n- Controle de instâncias de Widgets;\n- Exibir dados de Documentos do ECM;\n- Consultar e exibir dados de formulários;\n- Obter dados a partir de um ERP;\n- Receber e enviar dados utilizando REST\n\n![](..\\..\\..\\images\\kit.jpg)\n\nImportante\n\nO Kit Intranet deixou de ser oferecido pela Fluig Store e agora pode ser obtido diretamente através do diretório Git do Fluig. Faça o *download* do pacote **[neste *link*](https://git.fluig.com/projects/SAMPLES/repos/kit-intranet/browse)** para a atualização Fluig 1.8.1.\n\nJá para as atualizações inferiores e até a 1.8.0 faça o download **[neste *link*](https://git.fluig.com/projects/SAMPLES/repos/kit-intranet/browse?at=refs%2Ftags%2F1.5.13_A_1.8.0)**. E confira mais informações sobre a instalação na seção de [Instalação/Atualização](http://tdn.totvs.com/display/fluig/Kit+Intranet#KitIntranet-Instala%C3%A7%C3%A3o/Atualiza%C3%A7%C3%A3o) abaixo.\n\n# Widgets\n\n---\n\nVeja o exemplo em nosso repositório [aqui](https://git.fluig.com/projects/SAMPLES/repos/kit-intranet/browse/kitintranet.zip)." }, { "metadata": { "title": "Kit Intranet", "source": "https://tdn.totvs.com/display/fluig/Kit+Intranet", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Kit Intranet.md" }, "content": "Kit Intranet\n\n## Widget Aniversariantes\n\nNão deixe passar em branco o aniversário de ninguém: veja os aniversariantes do mês, com destaque para os aniversariantes do dia.\n\nAtualmente podemos listar os aniversariantes utilizando duas formas de consulta, uma é através da criação de registros de formulários diretamente no fluig e a outra é pela integração com o ERP RM.\n\n**Registro de Aniversariantes diretamente no fluig**\n\n- Adicione a widget de aniversariantes na página de sua preferência.\n\n![](..\\..\\..\\images\\ani.PNG)\n\n- Clique em \"Link do formulário\" para acessar os registros de aniversariantes.\n\n![](..\\..\\..\\images\\Image%20008.png)\n\n- Clique em **Novo** e depois em **Registro de formulário** para inserir um novo registro.\n\n![](..\\..\\..\\images\\Image%20009.png)\n\n- Preencha o formulário com as informações do aniversariante.\n\n![](..\\..\\..\\images\\p2.PNG)\n\n**[Aqui](https://git.fluig.com/projects/SAMPLES/repos/datasets/browse/dataset-cardservice-create)** temos um exemplo (**dataset-cardservice-create**) que lê a tabela de funcionários do ERP e cria registros de formulário no formulário de aniversariantes do Kit Intranet.\n\n**Integração com o RM**\n\nNa widget de aniversariantes, selecione RM e preencha as informações de acesso ao serviço de consulta do ERP.\n\n![](..\\..\\..\\images\\p11.PNG)\n\nAtenção!\n\nA *widget* precisa ser configurada com o usuário mestre do RM ou outro usuário com as mesmas permissões.\n\n## Widget Organograma Corporativo\n\nVeja a estrutura organizacional da sua empresa, buscando as informações de seu ERP.\n\nEste widget irá acessar os serviços do TOTVS RM, [veja como configurar](https://tdn.totvs.com/pages/viewpage.action?pageId=189313181).\n\n## Widget Notícias" }, { "metadata": { "title": "Kit Intranet", "source": "https://tdn.totvs.com/display/fluig/Kit+Intranet", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Kit Intranet.md" }, "content": "Kit Intranet\n\n\nAposente murais de notícias e comunicados por e-mail: publique notícias e faça comunicados para toda sua empresa de forma moderna, de forma online.\n\nApós a instalação do Kit Intranet, siga os procedimentos abaixo para criar novas notícias.\n\n- Edite a página qual a widget de Notícias foi adicionada, e conforme mostra a imagem abaixo clique no link do formulário.\n\n![](..\\..\\..\\images\\Image%20001.png)\n\n- Clique em **Novo** e depois em **Registro de formulário** para inserir uma nova notícia.\n\n![](..\\..\\..\\images\\Image%20004.png)\n\n- Preencha o formulário com o conteúdo da notícia.\n\n![](..\\..\\..\\images\\foto_registro.PNG)\n\nObservação\n\nAs imagens contidas nas *widgets* não possuem um tamanho padrão fixo pois elas são responsivas, ou seja, se adaptam ao tamanho do monitor em que a *widget* está sendo visualizada.\n\nQuando as notícias são pré-visualizadas na lista da widget, a imagem de cada notícia é redimensionada para ser exibida em uma prévia. Sua largura em miniatura possui 120 px.\n\n![](..\\..\\..\\images\\Widget%20noticias.png)\n\nAo clicar em uma determinada notícia, a mesma é aberta em uma nova tela, neste caso a imagem é redimensionada de maneira responsiva de acordo com o tamanho do monitor.\n\n![](..\\..\\..\\images\\---------.png)\n\n## Widget Convênios\n\nFacilite a consulta e visualização do catálogo de convênios que os funcionários de sua empresa tem acesso, evitando que convênios desatualizados continuem sendo divulgados.\n\n## Widget Slideshow" }, { "metadata": { "title": "Kit Intranet", "source": "https://tdn.totvs.com/display/fluig/Kit+Intranet", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Kit Intranet.md" }, "content": "Kit Intranet\n\n\nAdicione um slideshow de imagens em suas páginas ou comunidades, possibilitando exibir imagens a partir de uma pasta publicada no ECM ou então de uma conta do Instagram.\n\nFique atento!\n\nA resolução ideal é para as imagens no widget Slideshow é de **1024 x 576 pixels**. Porém, dependendo da resolução do monitor, a resolução da imagem pode mudar. Caso precise de um tamanho maior, basta redimensioná-la mantendo a mesma proporção.\n\n**Opções da widget Slideshow:**\n\nPara ter acesso as opções da widget a pagina deve estar em modo de edição. Uma vez em edição  a widget de slideshow apresenta as opções:\n\n- **Integração via Instagram:** Integre a widget com o Instagram para exibir imagens deste serviço no Slideshow.\n\n![](..\\..\\..\\images\\instagram.png)\n\n- **Gerar Novo Token de Acesso**: Exibido apenas quando a integração com o Instagram está ativada. Redireciona o usuário para o portal do desenvolvedor do Instagram, onde o procedimento de geração de token deve ser realizado.\n\nAcesse a documentação [Configurar Instagram no widget Slideshow](Kit Intranet/Configurar Instagram no widget Slideshow.md) para obter informações sobre como realizar a integração.\n\n- **Integração via pasta do sistemas:** Neste caso o usuário deverá informa a pasta no sistema que contem as imagens a serem exibidas, esta opção também possibilita mostrar a legenda das imagens através da opção \"Mostrar título nas imagens\" conforme figura.\n\n![](..\\..\\..\\images\\da%20pasta.png)\n\n- **Estender Imagens:**Em ambas opções de integração da widget, existe a opção de \"Estender as imagens\". Habilitando este item as imagens irão ocupar toda a área da widget. Dependendo da resolução da imagem, esta opção pode deixar a imagem distorcida. A altura máxima suportada é de 400px, a largura irá depender da tela do monitor do usuário.\n\n- **Redimensionar:** Enquadra imagens com tamanho maior que o disponível no Slideshow para evitar que sejam exibidas apenas parcialmente no widget.\n\n## Widget Cardápio" }, { "metadata": { "title": "Kit Intranet", "source": "https://tdn.totvs.com/display/fluig/Kit+Intranet", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Kit Intranet.md" }, "content": "Kit Intranet\n\n\nDivulgue qual serão as opções disponíveis para umas das melhores horas do dia: comer! Para cada opção, inclua o nome, descrição e, se quiser, adicione uma foto.\n\nApós a instalação do Kit Intranet, siga os procedimentos abaixo para adicionar novos registros no cardápio.\n\n- Edite a página qual a widget de Cardápio foi adicionada, e conforme mostra a imagem abaixo clique no link do formulário.\n\n![](..\\..\\..\\images\\cardapio_1.PNG)\n\n- Clique em **Novo** e depois em **Registro de formulário** para inserir um novo item no cardápio.\n\n![](..\\..\\..\\images\\Image%20007.png)\n\n- Preencha as informações do formulário com o conteúdo do cardápio.\n\n![](..\\..\\..\\images\\foto6.PNG)\n\n# Instalação e atualização do Kit Intranet\n\n---\n\nSiga os passos descritos abaixo para instalar e configurar propriamente o componente.\n\n**Download**\n\n- Faça o *download* do Kit Intranet gratuitamente através [deste link](https://git.fluig.com/projects/SAMPLES/repos/kit-intranet/browse/kitintranet.zip).\n\n**Instalação/Atualização**\n\n- Faça login no fluig como usuário administrador\n\n- Clique em **Painel de Controle** → agrupador **Personalização** → **Importar e Exportar Páginas**\n\n- Importe o artefato \"kit-intranet.zip\" obtido na etapa anterior\n\n- Verifique se a página \"Intranet\" foi criada na barra de menu lateral.\n\n- Verifique [aqui](http://tdn.totvs.com/display/fluig/Widgets) como desenvolver seus próprios *widgets* a partir dos exemplos dessa página.\n\n## Conexão aos serviços RM\n\nAlgumas widgets podem obter dados a partir de serviços SOAP de uma instancia do ERP RM versão 11.40 ou superior.\n\nPara conhecer e saber como utilizar estes serviços, utilize a [Documentação de Integração](http://wikihelp.totvs.com.br/WikiHelp/CON3/INT.Integracao.aspx).\n\n## Suporte a aplicativos Mobile" }, { "metadata": { "title": "Kit Intranet", "source": "https://tdn.totvs.com/display/fluig/Kit+Intranet", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Kit Intranet.md" }, "content": "Kit Intranet\n\n\nAgora as widgets de Aniversariantes, Notícias, Cardápio, Convênios e Organogramas podem ser visualizadas também nos aplicativos mobile, basta seguir as etapas abaixo.\n\nCom usuário administrador acessa a opção **Editar página**.\n\n![](..\\..\\..\\images\\editar.jpg)\n\nNa parte superior direita da widget que deseja habilitar a visualização em aplicativos móveis, clique no ícone ao lado do cadeado.\n\n![](..\\..\\..\\images\\habiltar.png)\n\nPublique as alterações e acesse a página a partir do aplicativo móvel.\n\n![](..\\..\\..\\images\\Screenshot_2016-05-04-17-39-28.png)\n\n### Webservices RM\n\nOs widgets Aniversariantes e Organograma fazem acesso a serviços do ERP RM utilizando o protocolo SOAP, conforme os detalhes abaixo:\n\n#### Widget Aniversariantes\n\nMount Point: /wsDataServer/IwsDataServer\n\nDataServerName: RhuPessoaData\n\n| Campo | Descrição |\n| --- | --- |\n| birthDay | Dia do nascimento |\n| birthMonth | Mês do nascimento |\n| fullName | Nome completo |\n\n[Aqui](https://git.fluig.com/projects/SAMPLES/repos/datasets/browse/dataset-cardservice-create) temos um exemplo que lê a tabela de funcionários do ERP e cria registros de formulário no formulário de aniversariantes do Kit Intranet\n\n#### Widget Organograma\n\nMount Point: /wsDataServer/IwsDataServer\n\nDataServerName: FopSubordinadosData\n\n| Campo | Descrição |\n| --- | --- |\n| userCode | Código do usuário no RM |\n| email | Email do usuário |\n| name | Nome do usuário |\n\n# Desenvolvimento sobre a plataforma\n\n---\n\nPara modificar o comportamento dos *widgets* do Kit Intranet de modo que se adequem melhor a sua situação, pode-se tomar como base o guia para [criar um widget que busque conteúdo](http://tdn.totvs.com/pages/viewpage.action?pageId=185735401)." }, { "metadata": { "title": "Plugin do fluig para Microsoft Outlook", "source": "https://tdn.totvs.com/display/fluig/Plugin+do+fluig+para+Microsoft+Outlook", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Plugin do fluig para Microsoft Outlook.md" }, "content": "Plugin do fluig para Microsoft Outlook" }, { "metadata": { "title": "Plugin do fluig para Microsoft Outlook", "source": "https://tdn.totvs.com/display/fluig/Plugin+do+fluig+para+Microsoft+Outlook", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Plugin do fluig para Microsoft Outlook.md" }, "content": "Plugin do fluig para Microsoft Outlook\n\n\n# índice\n\n- 1 [Introdução](#PlugindofluigparaMicrosoftOutlook-Introdução)\n- 2 [Instalação - Pré-requisitos](#PlugindofluigparaMicrosoftOutlook-Instalação-Pré-requisitos)\n- 3 [Instalação do Plugin](#PlugindofluigparaMicrosoftOutlook-InstalaçãodoPlugin)\n- 4 [Configuração do Plugin](#PlugindofluigparaMicrosoftOutlook-ConfiguraçãodoPlugin)\n- 5 [Utilização](#PlugindofluigparaMicrosoftOutlook-Utilização)\n - 5.1 [Publicação de Arquivos e E-mails no fluig](#PlugindofluigparaMicrosoftOutlook-PublicaçãodeArquivoseE-mailsnofluig)\n - 5.2 [Central de tarefas](#PlugindofluigparaMicrosoftOutlook-Centraldetarefas)\n\n# Introdução\n\n---\n\nO fluig integrado ao Microsoft® Outlook® permite ao usuário publicar os e-mails na sua pasta particular ou em pastas em que o mesmo possui privilégios de gravação, além de ter a visão da sua Central de Tarefas e Favoritos do fluig dentro de um painel do Outlook®. É possível publicar mais de um e-mail por vez, arrastando-os para o painel com a listagem de pastas, porém para cada e-mail publicado, um novo documento no fluig será criado. O e-mail publicado será salvo no fluig no formato “.msg”, sendo assim, qualquer visualizador que suporte o formato poderá renderizá-lo, além disso anexos do e-mail também são publicados. Além de e-mails, é permitido também publicar arquivos e pastas do computador, bastando arrastá-los para o painel no Outlook®. Também é possível, através do painel do fluig, abrir itens da Central de Tarefas e dos Favoritos para que possam ser visualizados ou movimentados no fluig.\n\nImportante\n\nA integração com o Outlook® funciona somente para as versões Microsoft® Office **2007**, **2010** e **2013**, as versões anteriores não são suportadas. E a integração com o Outlook® está disponível somente no idioma do sistema operacional.\n\n# Instalação - Pré-requisitos\n\n---\n\nComo a solução de integração do Outlook® com o fluig é um plugin, a sua instalação é fácil, bastando apenas atender dois pré-requisitos:\n\n- Microsoft® .NET Framework 4.0 ([Clique aqui](https://www.microsoft.com/pt-br/download/details.aspx?id=42642))\n\n Normalmente este pacote já vem pré-instalado no Windows®, verifique nos Programas e Recursos do Windows® se ele está ativo.\n- VisualStudio Tools ([Clique aqui](https://www.microsoft.com/pt-br/download/confirmation.aspx?id=48217))\n\n Após atender este requisito é necessário executar o instalador do plugin de integração gerado pelo fluig.\n\nImportante\n\n**1)** Antes de iniciar a instalação do plugin, certifique-se que não tenha nenhum aplicativo do pacote Microsoft® Office sendo executado. Caso o plugin tenha sido instalado com algum aplicativo Office em execução, e a opção de integração com o fluig não esteja disponível no menu do Outlook®, o plugin deverá ser desinstalado e instalado novamente **sem nenhum aplicativo Office em execução**.\n\n**2)**Para utilizar o novo plugin do Outlook® é necessário ter a versão “1.5.4” ou superior do fluig instalada.\n\n# Instalação do Plugin\n\n---\n\nPara realizarmos a instalação do Plugin do fluig no Outlook® é necessário realizar o download, a partir do [Portal do Cliente](https://suporte.totvs.com/portal/p/10098/download#000035).\n\nSelecione a linha de produto \"fluig\" e a versão \"fluig 1.6\". O arquivo para download está disponível no item \"PLUGIN\\_DO\\_FLUIG\\_PARA\\_MS\\_OUTLOOK\".\n\n- Após realizar o download, descompacte o arquivo .zip em um diretório do seu computador.\n\nVerifique se todos os usuários tem permissão total sobre o documento compactado, caso contrário é possível que ocorram erros durante a instalação do plugin.\n\nPara dar permissão total ao documento, edite suas propriedades e na aba Segurança dê permissão total para o grupo de usuários Everyone ou Todos.\n\n- O processo de instalação poder ser iniciado ao clicar duas vezes no item PLUGIN\\_DO\\_FLUIG\\_PARA\\_MS\\_OUTLOOK.msi que encontra-se na pasta salva em seu ambiente.\n\nNota\n\nAlgumas telas de solicitação de instalação de componentes adicionais poderão aparecer, caso isto aconteça, instale-os e a instalação do Plugin prosseguirá normalmente.\n\n- Uma tela de confirmação para instalação deverá aparecer, clique na opção **Seguinte**para iniciar a instalação.\n\n![](..\\..\\..\\images\\1.png)\n\n- Em seguida uma tela de confirmação para aceitar a licença deverá aparecer, clicando em **Seguinte** a instalação estará concluída.\n- Clique em **Concluir** para finalizar.\n\n![](..\\..\\..\\images\\2.png)\n\nImportante\n\nPara instalar o plugin do **Outlook via GPO** será necessário que o próprio usuário da plataforma instale o plugin **[utilizando a documentação oficial da Microsoft®](https://support.microsoft.com/en-us/help/816102/how-to-use-group-policy-to-remotely-install-software-in-windows-server)**.\n\n# Configuração do Plugin\n\n---\n\nA próxima etapa é a configuração do plugin do fluig para realizarmos a publicação de e-mail na navegação de documentos ou visualizar as pendências da central de tarefas do fluig.\n\nInicie o Outlook® clique no **menu fluig**, em seguida, clique em **Conta** e depois em **Configurações de Acesso**. A tela de login será exibida em seguida.\n\nDefina o endereço do servidor e clique em **Começar***,*após isso defina seu usuário e senha*.*Para mais detalhes consulte o administrador do fluig.\n\n**![](..\\..\\..\\images\\Captura_sem_t%C3%ADtulo_031116_020717_PM.jpg)**\n\n# Utilização\n\n---\n\nApós a configuração do Plugin para realizar o acesso ao fluig as demais funcionalidades estarão liberadas. Clique no **Menu fluig > Mostrar/Fechar Painel**." }, { "metadata": { "title": "Plugin do fluig para Microsoft Outlook", "source": "https://tdn.totvs.com/display/fluig/Plugin+do+fluig+para+Microsoft+Outlook", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Plugin do fluig para Microsoft Outlook.md" }, "content": "Plugin do fluig para Microsoft Outlook\n\n### Publicação de Arquivos e E-mails no fluig\n\nPara realizar a publicação o usuário deverá arrastar os seus arquivos ou pastas do computador ou e-mails para dentro da árvore de diretórios, para isso clique em **Publicar arquivos no fluig** e arraste e solte os emails/arquivos sobre a pasta desejada, porém cada arquivo não pode exceder o limite de 100 MB. Para cada e-mail enviado, será criado um documento no fluig e no caso de envio de pastas, a mesma estrutura de pastas e arquivos enviada será criada dentro da navegação de documentos do fluig.\n\n![](..\\..\\..\\images\\Captura_de_tela_031116_020120_PM.jpg)\n\n- Ao final da publicação, será exibido um alerta de confirmação da publicação dos itens ou então uma mensagem indicando os arquivos que, por algum motivo (falha na conexão, limite excedido, etc.) não foram enviados.\n- Para confirmar a publicação basta acessar o fluig pelo navegador e verificar se o arquivo ou e-mail foi publicado na pasta desejada.\n\n![](..\\..\\..\\images\\5.png)\n\n### Central de tarefas\n\n- Para visualizar as tarefas pendentes clique em **Central de tarefas**.\n\n![](..\\..\\..\\images\\Captura_de_tela_031116_024839_PM.jpg)\n\n- Ao clicar em qualquer um dos links disponíveis, abrirá um novo painel no mesmo lugar, com a listagem das respectivas tarefas e suas principais informações.\n- Ao dar um duplo clique em qualquer item da listagem, abrirá o fluig com a respectiva tarefa.\n\n- Para visualizar seus processos e documentos favoritos, clique em **Favoritos**.\n\n![](..\\..\\..\\images\\Captura_de_tela_031116_021638_PM.jpg)\n\n- Ao clicar em um dos itens da lista de documentos e processos favoritos, abrirá o fluig para visualização do documento ou inicialização da solicitação." }, { "metadata": { "title": "Sobre o Fluig Viewer", "source": "https://tdn.totvs.com/display/fluig/Sobre+o+Fluig+Viewer", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Sobre o Fluig Viewer.md" }, "content": "Sobre o Fluig Viewer\n\n\n- [Objetivo](#SobreoFluigViewer-Objetivo)\n- [Sobre o Fluig Viewer](#SobreoFluigViewer-SobreoFluigViewer)\n - [Requisitos da Estação](#SobreoFluigViewer-RequisitosdaEstação)\n - [Tipos de documentos suportados](#SobreoFluigViewer-Tiposdedocumentossuportados)\n - [Recursos](#SobreoFluigViewer-Recursos)\n - [Busca](#SobreoFluigViewer-Busca)\n - [Selecionar](#SobreoFluigViewer-Selecionar)\n - [Panorâmica](#SobreoFluigViewer-Panorâmica)\n - [Ajustar à largura](#SobreoFluigViewer-Ajustaràlargura)\n - [Girar página ou página](#SobreoFluigViewer-Girarpáginaoupágina)\n - [Zoom](#SobreoFluigViewer-Zoom)\n - [Paginação](#SobreoFluigViewer-Paginação)\n - [Thumbnail](#SobreoFluigViewer-Thumbnail)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é descrever as formas de utilização do Fluig Viewer e como fazer a sua configuração. \n\n# Sobre o Fluig Viewer\n\n---\n\nNo dia-a-dia, interagimos com diversos documentos, dos mais variados formatos. Com o TOTVS Fluig Plataforma, isso não é um problema, pois você consegue visualizá-los na própria plataforma sem a necessidade de aplicativos específicos nas estações para diversos formatos de documentos. Isso tudo graças ao Fluig Viewer.\n\nO Fluig Viewer é um serviço na nuvem para visualização e conversão de documentos e está incluído na licença do TOTVS Fluig Plataforma. A partir da **atualização 1.5.13** esse serviço já vem configurado automaticamente. Para instalações mais antigas que foram atualizadas ao longo do tempo é necessário fazer a configuração manual do serviço. O procedimento é rápido e fácil. Saiba mais em [Configuração do fluig Viewer](Sobre o Fluig Viewer/Configuração do Fluig Viewer.md).\n\n## Requisitos da Estação" }, { "metadata": { "title": "Sobre o Fluig Viewer", "source": "https://tdn.totvs.com/display/fluig/Sobre+o+Fluig+Viewer", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Sobre o Fluig Viewer.md" }, "content": "Sobre o Fluig Viewer\n\n\n---\n\n| Sistema Operacional (Cliente) | Versões | Navegador |\n| --- | --- | --- |\n| Windows | 8/8.1 | Internet Explorer 11 |\n| Chrome e Firefox (últimas versões) |\n| 7 | Internet Explorer 11 |\n| Chrome e Firefox (últimas versões) |\n| Mac OS X | 10.7 e superior | Safari 5 e 6 |\n| Chrome e Firefox (últimas versões) |\n| iOS | Em homologação | Safari 6, 7 e 8 |\n| Chrome e Firefox (últimas versões) |\n| Android | Em homologação | Chrome (últimas versões) |\n\n## Tipos de documentos suportados\n\n---\n\nO fluig Viewer permite que você visualize uma série de documentos de forma rápida e nativa.\n\n| Tipo | Extensão |\n| --- | --- |\n| Microsoft Office Document | DOC, DOCX XLS, XLSX PPT, PPTX, ODT, ODS, ODP, PDF CSV RTF, HTML, TXT, EML, MSG VSD, VSDX - fluxogramas criados com o MS Visio |\n| Open Office Document | ODT, ODS, ODP |\n| Documento | PDF CSV RTF |\n| Web | HTML |\n| Imagens | TIFF, JPG, JPEG, JP2, GIF, PNG RAS, CAL, DIB, BMP PSD, PCT, PCX, DCX, PCD WMF, EMF, TGA |\n| Formatos CAD | DGN (V7 e V8) DWG (2.5 a 2014) DXF (2.5 a 2014) |\n| Formato de e-mail | EML, MSG |\n| Outros formatos | TXT DCM - Imagens médicas |\n\n**oculto**\n\nA lista de extensões atualizadas pode ser conferida em: \n\n## Recursos\n\n---\n\n##### Busca\n\nPermite efetuar uma busca por palavras contidas no documento.\n\n*Formatos suportados: DOC, DOCX, XLS, XLSX, PPT, PPTX, ODT, ODS, ODP, PDF, CSV, RTF, HTML, TXT, EML, MSG.*\n\n##### Selecionar\n\nPermite selecionar o texto que deseja, a fim de copiar para a área de transferência do seu sistema operacional.\n\n*Formatos suportados: DOC, DOCX, XLS, XLSX, PPT, PPTX, ODT, ODS, ODP, PDF, CSV, RTF, HTML, TXT, EML, MSG.*\n\n##### Panorâmica\n\nCom este recurso é possível mover o documento quando ele estiver com Zoom.\n\n##### Ajustar à largura\n\nCom este recurso é possível voltar ao tamanho original do documento ajustando à largura da janela.\n\n##### Girar página ou página" }, { "metadata": { "title": "Sobre o Fluig Viewer", "source": "https://tdn.totvs.com/display/fluig/Sobre+o+Fluig+Viewer", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Sobre o Fluig Viewer.md" }, "content": "Sobre o Fluig Viewer\n\n\nCom este recurso é possível girar uma página específica ou o documento completo que estiver visualizando.\n\n##### Zoom\n\nÉ possível ampliar, reduzir ou visualizar o documento em tela cheia.\n\n##### Paginação\n\nÉ possível navegar entre as páginas do documento através da paginação ou digitar a página diretamente.\n\n##### Thumbnail\n\nHabilita a exibição de uma seção com as miniaturas das páginas do documento, na parte esquerda da área de visualização do documento." }, { "metadata": { "title": "TOTVS Store", "source": "https://tdn.totvs.com/display/fluig/TOTVS+Store", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\TOTVS Store.md" }, "content": "TOTVS Store\n\n\nAcesse o espaço da TOTVS Store e confira as documentações exclusivas do [TOTVS Fluig](https://totvs.store/br/categoria/gestao-empresarial/gestao-empresarial-totvs-fluig.html):\n\n# Sobre a TOTVS Store\n\nUm dos pilares estratégicos da TOTVS é a [TOTVS Store](https://totvs.store/), uma loja online que permite aos assinantes das soluções TOTVS terem acesso a componentes, processos de negócio já criados, aplicativos, tudo isso para acelerar ainda mais o retorno sobre investimento das empresas.\n\nNa loja, os clientes podem adquirir soluções e serviços de acordo com a sua necessidade. Tudo isso com facilidade, rapidez e segurança, tornando-se um repositório de soluções concreto e abrangente.\n\n![](..\\..\\..\\images\\totvs%20store.png)" }, { "metadata": { "title": "Widget Adicionar ao calendário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=219694281", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Widget Adicionar ao calendário.md" }, "content": "Widget Adicionar ao calendário" }, { "metadata": { "title": "Widget Adicionar ao calendário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=219694281", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Widget Adicionar ao calendário.md" }, "content": "Widget Adicionar ao calendário\n\n\n# Índice\n\n- 1 [Objetivo do componente](#WidgetAdicionaraocalendário-Objetivodocomponente)\n- 2 [Instalação do componente Adicionar ao calendário](#WidgetAdicionaraocalendário-InstalaçãodocomponenteAdicionaraocalendário)\n- 3 [Adicionando o widget em uma página](#WidgetAdicionaraocalendário-Adicionandoowidgetemumapágina)\n- 4 [Alterações para o widget Adicionar ao calendário](#WidgetAdicionaraocalendário-AlteraçõesparaowidgetAdicionaraocalendário)\n\n# Objetivo do componente\n\n---\n\nO *widget* Adicionar ao calendário permite a criação de eventos que, posteriormente, os interessados podem adicionar como um compromisso em seu calendário do Outlook, do Google, da Apple ou Yahoo.\n\n# Instalação do componente Adicionar ao calendário\n\n---\n\n- Para que esse *widget* seja exibido na lista de *widgets* disponíveis para páginas, primeiramente é necessário fazer o *download* do código-fonte do componente (**Add-to-calendar**) no [diretório público do fluig](https://git.fluig.com/projects/SAMPLES/repos/add-to-calendar/browse) no Git.\n- Após acessar o repositório da *widget*, siga as instruções do [README.md](https://git.fluig.com/projects/SAMPLES/repos/add-to-calendar/browse/README.md) para compilar e dar *deploy* no componente.\n\n# Adicionando o widget em uma página\n\n---\n\nO passo a passo abaixo demonstra como incluir o *widget* Adicionar ao calendário em uma página da plataforma.\n\n- Acesse a página em que deseja adicionar o *widget* de calendário, acione o menu de configuração no canto superior direito e selecione a opção **Editar página.**\n\n**![](..\\..\\..\\images\\Image%2011.png)**\n\n- Selecione algum ****slot**** da página em edição e acione **Adicionar uma nova widget****.**\n\n**![](..\\..\\..\\images\\Image%2012.png)**\n\n- No painel de seleção de *widgets*, navegue até a opção **Adicionar ao calendário**, localizada em **Personalizado → Fluig Store → Adicionar ao Calendário**, e acione **Adicionar**.\n\n**![](..\\..\\..\\images\\Image%2014.png)**\n\n- Após a inclusão do *widget* no *slot**,*** preencha os dados do evento e acione **Salvar**. Os campos **Nome do evento**, **Início** e **Término** são obrigatórios.\n\n**![](..\\..\\..\\images\\Screenshot%20from%202015-12-16%20073623.png)**\n\n- Após salvar as alterações no *widget*, acesse o menu de configuração no canto superior direito e selecione a opção **Publicar página**.\n\n**![](..\\..\\..\\images\\Image%2015.png)**\n\n- Após a publicação da página, será possível visualizar o *widget* e se desejado ,escolher um dos tipos de calendário para incluir o evento.\n\n**![](..\\..\\..\\images\\Screenshot%20from%202015-12-16%20081709.png)**\n\n# Alterações para o widget Adicionar ao calendário\n\n---\n\nPara ter acesso ao código fonte do componente e efetuar alterações no *widget* padrão conforme as necessidades da sua empresa, siga os passos descritos abaixo**.**\n\nAtenção\n\nCaso deseje utilizar o componente padrão e não tenha interesse em personalizá-lo, o procedimento abaixo não é necessário.\n\n- Acesse o [repositório de exemplos do fluig](http://git.fluig.com/projects/SAMPLES), e selecione a opção **sample-fluigaddtocalendar**.\n\n**![](..\\..\\..\\images\\impor00.png)**\n\n- No repositório do **sample-fluigaddtocalendar**, selecione a opção **Download** no menu lateral esquerdo e efetue o *download* na pasta de sua preferência.\n\n**![](..\\..\\..\\images\\import0.png)**\n\n- Efetuado o download do **sample-fluigaddtocalendar,** acesse o fluig Studio, acione a opção **File → Import,** no menu superior esquerdo.\n\n![](..\\..\\..\\images\\Import1.png)\n\n- Selecione a opção **General → Existing Projects into Workspace**.\n\n![](..\\..\\..\\images\\Import2.png)\n\n- Selecione a opção **Select archive file** acione a opção **Browse...** e em seguida navegue até o local onde está localizado o arquivo: **sample-fluigaddtocalendar-master.zip** baixado no Passo 2, em seguida acione o botão **Abrir**.\n\n![](..\\..\\..\\images\\Import3.png)\n\n- Para finalizar a importação acione o botão **Finish**.\n\n![](..\\..\\..\\images\\Import4.png)\n\n- Após a finalização da importação do Projeto para o **fluig Studio** navegue até a raiz do Widget, **fluigStudio > wcm > widget > AddThisEvent** e selecione a raiz com o botão direito e acione a opção **Export**.\n\n![](..\\..\\..\\images\\Import5.png)\n\n- - Selecione a opção **Fluig > Exportar para o servidor Fluig**.\n\n![](..\\..\\..\\images\\Import6.png)\n\n- - Selecione o Servidor desejado e acione a opção **Finish**, após a finalização o widget estará disponível para ser adicionados nas páginas do WCM.\n - \\* Caso não tenha um servidor cadastrado no seu **fluig Studio,** siga esse tutorial: [Cadastrando servidor fluig no Studio](http://tdn.totvs.com/display/fluig/Cadastrando+servidor+fluig+no+Studio).\n\n![](..\\..\\..\\images\\Import7.png)" }, { "metadata": { "title": "Configurar Instagram no widget Slideshow", "source": "https://tdn.totvs.com/display/fluig/Configurar+Instagram+no+widget+Slideshow", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Kit Intranet\\Configurar Instagram no widget Slideshow.md" }, "content": "Configurar Instagram no widget Slideshow" }, { "metadata": { "title": "Configurar Instagram no widget Slideshow", "source": "https://tdn.totvs.com/display/fluig/Configurar+Instagram+no+widget+Slideshow", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Kit Intranet\\Configurar Instagram no widget Slideshow.md" }, "content": "Configurar Instagram no widget Slideshow\n\n\n# Índice\n\n- 1 [Objetivo](#ConfigurarInstagramnowidgetSlideshow-Objetivo)\n- 2 [Widget Slideshow](#ConfigurarInstagramnowidgetSlideshow-WidgetSlideshow)\n- 3 [Serviço REST](#ConfigurarInstagramnowidgetSlideshow-ServiçoRESTservico)\n- 4 [Obter dados do Instagram](#ConfigurarInstagramnowidgetSlideshow-ObterdadosdoInstagram)\n - 4.1 [Criar aplicativo do Facebook](#ConfigurarInstagramnowidgetSlideshow-CriaraplicativodoFacebook)\n - 4.2 [Client ID e Client Secret](#ConfigurarInstagramnowidgetSlideshow-ClientIDeClientSecretclient_id)\n - 4.3 [Token de Acesso](#ConfigurarInstagramnowidgetSlideshow-TokendeAcessotoken)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é orientar os desenvolvedores sobre como realizar a integração de uma conta do Instagram com o *widget Slideshow* do Kit Intranet. Lembrando que não há suporte para a configuração de múltiplas contas no *widget* *Slideshow* padrão.\n\n# Widget Slideshow\n\n---\n\nPara exibir imagens de uma conta do Instagram, é necessário selecionar a opção **Instagram** no campo **Este *Widget* Integra com** nas propriedades do *widget* *Slideshow* e publicar a página para salvar a configuração.\n\n![](..\\..\\..\\..\\images\\widget_slideshow.png)\n\n**Propriedades do widget Slideshow do Kit Intranet**\n\n# Serviço REST\n\n---\n\nAo importar o Kit Intranet com o *widget* *Slideshow*, é criado automaticamente um serviço de demonstração do Instagram (instagram.demo) na página [Serviços REST](https://tdn.totvs.com/pages/viewpage.action?pageId=243660796) do Painel de Controle do Fluig. Embora seja apenas um exemplo, este serviço pode ser adaptado por um desenvolvedor para exibir as fotos de outra conta desta rede social.\n\nPara isso, é necessário obter os seguintes dados da conta desejada e substituí-los nas propriedades do serviço instagram.demo:\n\n- [*Client* ID (ID cliente)](https://tdn.totvs.com/pages/viewpage.action?pageId=273310668)\n- *[Client Secret](https://tdn.totvs.com/pages/viewpage.action?pageId=273310668)*\n- [Token de acesso (*Access token*)](https://tdn.totvs.com/pages/viewpage.action?pageId=273310668)\n\n![](..\\..\\..\\..\\images\\configura%C3%A7%C3%A3o_instagram.jpg)\n\n**Propriedades do serviço REST instagram.demo**\n\n# Obter dados do Instagram\n\n---\n\nImportante\n\nOs procedimentos abaixo são de responsabilidade do fornecedor (Instagram), não da plataforma Fluig, e portanto estão sujeitos à alteração sem aviso prévio.\n\nO *widget* *Slideshow* realiza a autenticação com o Instagram através do protocolo OAuth 2.0, portanto é necessário possuir uma conta no portal do desenvolvedor deste serviço ([developers.facebook.com](https://developers.facebook.com/)) para obtenção dos dados de integração*: Client* ID, *Client Secret* e *Access Token*.\n\nNa documentação abaixo, será apresentado uma das formas de obtenção destes dados como exemplo para os desenvolvedores que desejam utilizar essa integração." }, { "metadata": { "title": "Configurar Instagram no widget Slideshow", "source": "https://tdn.totvs.com/display/fluig/Configurar+Instagram+no+widget+Slideshow", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Kit Intranet\\Configurar Instagram no widget Slideshow.md" }, "content": "Configurar Instagram no widget Slideshow\n\n### Criar aplicativo do Facebook\n\nAntes de configurar seu Client ID e Client Secret é necessário criar um aplicativo do Facebook e a partir dele, ir adicionando os produtos como o **Exibição básica do Instagram**. O material para consulta pode ser encontrado em: . \n\nAntes de prosseguir para os próximos passos é necessário criar um usuário teste e autenticar, para isso siga a [etapa 3 e etapa 4](https://developers.facebook.com/docs/instagram-basic-display-api/getting-started#etapa-3--adicionar-um-usu-rio-de-teste-do-instagram) da documentação do fornecedor\n\n### Client ID e Client Secret\n\nApós o cadastro no portal de desenvolvedor do Facebook, o desenvolvedor poderá registrar um novo produto, para o qual serão fornecidos o ***Client* ID** e ***Client Secret***.\n\n![](..\\..\\..\\..\\images\\Captura%20de%20tela%20de%202022-01-14%2015-53-57.png)\n\n**Tela de registro de novo produto no aplicativo**\n\nCaso o único objetivo deste cliente seja obter os dados para integração do Instagram com o *widget* *Slideshow*, a URL do servidor Fluig pode ser informada no campo ***Configurações de OAuth do cliente***. O endereço preenchido nesse campo será utilizado mais adiante para gerar o token de acesso (*access token*).\n\n![](..\\..\\..\\..\\images\\Captura%20de%20tela%20de%202022-01-14%2016-06-14.png)\n\n**O Client ID e Client Secret estarão o disponíveis após o registro do cliente**\n\nAntes de prosseguir para os próximos passos é necessário criar um usuário teste e autenticar, para isso siga a [etapa 3 e etapa 4](https://developers.facebook.com/docs/instagram-basic-display-api/getting-started#etapa-3--adicionar-um-usu-rio-de-teste-do-instagram) da documentação do fornecedor.\n\n### Token de Acesso" }, { "metadata": { "title": "Configurar Instagram no widget Slideshow", "source": "https://tdn.totvs.com/display/fluig/Configurar+Instagram+no+widget+Slideshow", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Kit Intranet\\Configurar Instagram no widget Slideshow.md" }, "content": "Configurar Instagram no widget Slideshow\n\n\nSiga os passos abaixo para obter o *token* de acesso.\n\n- Abra uma nova aba do navegador e informe a URL abaixo, substituindo CLIENT-ID pelo Client ID obtido anteriormente e REDIRECT-URI pela URL de redirecionamento informada no cadastro do cliente.\n\n```\nhttps://api.instagram.com/oauth/authorize?client_id={CLIENT-ID}&redirect_uri={REDIRECT-URL}&scope=user_profile,user_media&response_type=code\n```\n\n- Ao acessar esta URL, o navegador será redirecionado para o endereço abaixo, de onde poderá ser copiado o **Code**, disponível no final da URL (CODE):\n\n```\nhttp://your-redirect-uri.com?code=AQDp3TtBQQ...#_\n```\n\n- Exemplo de URL com o code gerado.\n\n![](..\\..\\..\\..\\images\\Captura%20de%20tela%20de%202022-01-14%2016-33-51.png)\n\nAo capturar o code os caracteres **#\\_** no final devem ser retirados.\n\n- Com o code em mãos é hora de obter o access code, para isso utilize algum aplicativo que aceita solicitações de cURL e realize a seguinte requisição POST. Na URL fazer a troca dos respectivos parâmetros **Client-id, Cliente-Secret, Code e Redirect-Url**\n\n```\nhttps://api.instagram.com/oauth/access_token?client_id={client-id}&client_secret={client-secret}&code={code}&grant_type=authorization_code&redirect_uri={redirect-url}\n```\n\n- O retorno deve ser um JSON semelhante a esse:\n\n```\n{\n \"access_token\": \"IGQVJ...\",\n \"user_id\": 17841405793187218\n}\n```\n\nCaso utilize o Postman passe os parâmetros no **body**, e não em params. Certifique-se de que a x-www-form-urlencoded esteja habilitada\n\nUma vez de posse do ID Cliente, *Client Secret* e Token de acesso, basta substituí-los no serviço **instagram.demo** na página de [Serviços REST](https://tdn.totvs.com/pages/viewpage.action?pageId=273310668) do Painel de Controle para que as imagens da conta do Instagram sejam exibidas no *widget* *Slideshow*.\n\nDúvidas?\n\nCaso tenha dúvidas ou problemas relacionados à obtenção dos dados de autenticação do Instagram, consulte a [documentação completa](https://www.instagram.com/developer/authentication/) do fornecedor." }, { "metadata": { "title": "Configuração do Fluig Viewer", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=235327464", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Sobre o Fluig Viewer\\Configuração do Fluig Viewer.md" }, "content": "Configuração do Fluig Viewer" }, { "metadata": { "title": "Configuração do Fluig Viewer", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=235327464", "path": "\\Plataforma Documentação técnica\\Configuração\\Apps e Mashups\\Sobre o Fluig Viewer\\Configuração do Fluig Viewer.md" }, "content": "Configuração do Fluig Viewer\n\n\n# Índice\n\n- [Índice](#ConfiguraçãodoFluigViewer-Índice)\n- [Objetivo](#ConfiguraçãodoFluigViewer-Objetivo)\n- [Precondição](#ConfiguraçãodoFluigViewer-Precondição)\n- [Habilitando o Fluig Viewer no TOTVS Fluig Plataforma](#ConfiguraçãodoFluigViewer-HabilitandooFluigViewernoTOTVSFluigPlataforma)\n- [Por que configurar o proxy reverso?](#ConfiguraçãodoFluigViewer-Porqueconfiguraroproxyreverso?)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é demonstrar a configuração do TOTVS Fluig Plataforma para utilização do Fluig Viewer como visualizador interno.\n\n# Precondição\n\n---\n\nO servidor onde está instalado o TOTVS Fluig Plataforma deve ter acesso externo liberado, pois o visualizador deve acessar a URL [https://api.accusoft.com.br](http://api.accusoft.com.br). Portanto, devem ser feitos os devidos ajustes de rede para que seja possível que a plataforma acesse esse endereço.\n\nEm casos onde existe um DNS na plataforma, recomendamos que a configuração seja feita seguindo a documentação [Considerações de DNS para a plataforma](http://tdn.totvs.com/pages/viewpage.action?pageId=213980466). Também é necessário configurar o proxy reverso de acordo com a documentação [Configuração de Proxy Reverso](http://tdn.totvs.com/pages/viewpage.action?pageId=257623455).\n\nImportante\n\nAs URLs **[https://api.accusoft.com](https://api.accusoft.com/)** e **[http://api.accusoft.com.br](http://api.accusoft.com.br/)** foram descontinuadas.\n\nEm versões anteriores a 1.6.0, o TOTVS Fluig Plataforma utiliza uma JDK anterior ao JDK 8 e por conta disso, não utiliza o TLSv1.2. Onde o Fluig Viewer não funcionará corretamente, para esses casos será necessário atualizar o TOTVS Fluig Plataforma para a versão mais recente.\n\n**oculto**\n\nEssas configurações estão duplicadas no artigo  (Mensagem Connection failed and the session will be stopped)\n\nCaso houver alteração aqui, lembrar de alterar esse artigo.\n\n# Habilitando o Fluig Viewer no TOTVS Fluig Plataforma\n\n---\n\n\n\n- Acesse a plataforma com o usuário **wcmadmin**.\n\n![](..\\..\\..\\..\\images\\Passo%201.png)\n\n- Acesse o **Painel de Controle** > **WCM** > **Empresas**.\n\n![](..\\..\\..\\..\\images\\empresas%20wcm.png)\n\n- Edite o cadastro da sua empresa.\n\n![](..\\..\\..\\..\\images\\Passo%203.png)\n\n- Clique em **Cadastrar dados adicionais**.\n\n![](..\\..\\..\\..\\images\\Passo%204.png)\n\n- Procure pelo parâmetro **internalVisualizerServer**.\n - Se ele existir, remova-o e cadastre-o novamente informando [https://api.accusoft.com.br](http://api.accusoft.com.br) no campo Valor.\n - Se ele não existir, cadastre-o com o valor citado.\n\n- Procure pelo parâmetro **oldViewer**.\n - Se ele não existir não é necessário cadastrá-lo.\n - Se ele existir, remova-o.\n\n- Salve as alterações na tela Dados adicionais.\n\n- Salve as alterações na tela de cadastro da empresa.\n\n![](..\\..\\..\\..\\images\\habilitar%20viewer%20no%20fluig.png)\n\n# Por que configurar o proxy reverso?\n\n---\n\nO proxy reverso é um procedimento que padroniza as configurações de direcionamento da URL do TOTVS Fluig Plataforma. Para saber como configurá-lo acesse [Configuração de Proxy Reverso](http://tdn.totvs.com/pages/viewpage.action?pageId=257623455).\n\nGeralmente quando o TOTVS Fluig Plataforma é instalado o endereço IP do servidor é utilizado (por exemplo, 172.188.95:8080). Porém, depois de algum tempo é muito comum que seja feito o redirecionamento desse endereço para um endereço nominal, como por exemplo, [fluig.totvs.com.br](http://fluig.totvs.com.br).\n\nComo esse redirecionamento pode ser feito de várias formas - via switch, host do servidor, proxy - a configuração de proxy reverso padroniza a forma de redirecionamento da URL, pois nele é configurado o nome do servidor e o endereço externo.\n\nA configuração de proxy reverso é indicada nos casos onde a plataforma não reconhece o endereço externo como se fosse seu endereço.\n\nUm caso muito comum é quando os documentos não são visualizados pela plataforma, apresentando a mensagem \"Erro ao gerar a visualização do arquivo. Caso possua permissão, utilize a opção de download do documento\" em tela (figura 1). Além dessa mensagem, o arquivo de log também registra a seguinte informação:\n\n```\nERROR [com.totvs.technology.ecm.viewer.DocumentViewerUrlServlet] (default task-1) Connection failed and the session will be stopped: Connection timed out (Connection timed out): java.net.ConnectException: Connection timed out (Connection timed out)\n```\n\n```\nERROR [com.totvs.technology.ecm.accusoft.viewer.DocumentViewerUrlServlet] (default task-451) Connection failed and the session will be stopped: Connection refused: connect: java.net.ConnectException: Connection refused: connect\n```\n\n![](..\\..\\..\\..\\images\\msgViewer1.PNG)\n\n**Figura 1 - Mensagem de erro ao visualizar documento**\n\nO que acontece nesse caso é que o visualizador monta uma URL de stream do documento. O endereço dessa URL é o endereço de acesso - no caso, fluig.totvs.com.br:8080/stream/document...\". O servidor recebe esse endereço e não o reconhece, pois para ele o endereço correto é 172.188.95. A configuração de proxy reverso faz com que o servidor entenda aquele prefixo na URL de stream como se fosse seu próprio endereço e permite a visualização dos documentos." }, { "metadata": { "title": "Alta disponibilidade e balanceamento de carga", "source": "https://tdn.totvs.com/display/fluig/Alta+disponibilidade+e+balanceamento+de+carga", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga.md" }, "content": "Alta disponibilidade e balanceamento de carga" }, { "metadata": { "title": "Alta disponibilidade e balanceamento de carga", "source": "https://tdn.totvs.com/display/fluig/Alta+disponibilidade+e+balanceamento+de+carga", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga.md" }, "content": "Alta disponibilidade e balanceamento de carga\n\n\nFique atento!\n\nEsta página foi revisada para considerar as configurações de server para a atualização **1.6.3** ou **superior**.\n\nCaso possua uma atualização entre **1.6.0** à **1.6.2**, acesse: [Como configurar load balance, alta disponibilidade e tolerância a falha na atualização 1.6 a 1.6.2?](https://tdn.totvs.com/pages/viewpage.action?pageId=337349115)\n\n- [Objetivo](#Altadisponibilidadeebalanceamentodecarga-Objetivo)\n- [Considerações iniciais](#Altadisponibilidadeebalanceamentodecarga-Consideraçõesiniciais)\n- [Preparando ambiente](#Altadisponibilidadeebalanceamentodecarga-Preparandoambiente)\n- [Configuração](#Altadisponibilidadeebalanceamentodecarga-Configuração)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar os procedimentos necessários para a criação de um ambiente TOTVS Fluig com balanceamento de carga, afim de ter uma alta disponibilidade.\n\n# Considerações iniciais\n\n---\n\nAtenção!\n\nEm ambientes com servidores **Windows**, o uso de pastas compartilhadas ou unidades mapeadas está apresentando inconsistências na rotina de *deploy* de alguns componentes. Já estamos avaliando essa situação para que seja corrigida o mais breve possível. No momento, como forma paliativa, é necessário realizar a atualização individualmente de cada servidor e reiniciá-los.\n\nLembrando que a nossa **recomendação** é utilizar servidores **Linux** em ambientes configurados com ***Load balance*** para um melhor desempenho.\n\n- O [serviço de indexação](Servidor de indexação dedicado.md) (Solr) é compartilhado por todas as instâncias, podendo ser único ou [em cluster](Servidor de indexação dedicado/Servidor de indexação em alta disponibilidade.md);\n\n- O repositório de arquivos da plataforma ([Volume](http://tdn.totvs.com/pages/viewpage.action?pageId=233766796)) deve estar em uma pasta compartilhada por todas as instâncias;\n\n- A pasta de aplicativos \"[diretório\\_instalação]/appserver/apps\" deve estar em um diretório compartilhado por todas as instâncias;\n\n- O banco de dados dever ser único para todas as instâncias;\n\n- Todas as instâncias devem estar atualizadas com a mesma versão do TOTVS Fluig.\n\n- Ao utilizar balanceamento de carga em ambientes com HTTPS, a [configuração de HTTPS](https://tdn.totvs.com/pages/viewpage.action?pageId=354472893#Configura%C3%A7%C3%A3oHTTPSdaplataforma-Configura%C3%A7%C3%A3odeHTTPSmanual) deve ser replicada manualmente para todos os servidores do Fluig.\n\nImportante!\n\n- A partir da atualização Snowflake (1.6.3), o controle e sincronização do cache da plataforma é realizado através do banco de dados e é compartilhado entre todos os nós de um cluster.\n\n- É necessário reiniciar todos os servidores depois de finalizar as configurações.\n\n# Preparando ambiente\n\n---\n\nAntes de começar a instalação, é preciso estar com o ambiente preparado.\n\n- Instale o banco de dados e crie uma instância.\n\n- Escolha uma pasta em um servidor (chamaremos de GLOBAL\\_DATA\\_DIR) e torne-a acessível para todas as máquinas. Dentro dessa pasta compartilhada, crie uma nova pasta:  \"apps\".\n\nAtenção!\n\nNas versões anteriores a 1.6.0, deverá também ser criada a pasta \"wcmdir\" dentro da GLOBAL\\_DATA\\_DIR.\n\n- Escolha uma pasta em um servidor (chamaremos aqui de VOLUME\\_DIR) e torne-a acessível para todas as máquinas. Será usada para salvar os volumes das empresas.\n\n# Configuração\n\n---\n\n- [Fluig em Load Balance com Apache mod\\_cluster em Linux](Alta disponibilidade e balanceamento de carga/Plataforma em load balance com Apache mod_proxy em Linux.md)\n\n- [Plataforma em load balance com NGINX em Linux](Alta disponibilidade e balanceamento de carga/Plataforma em load balance com NGINX em Linux.md)\n\n- [Plataforma em load balance com Microsoft NLB](Alta disponibilidade e balanceamento de carga/Plataforma em load balance com Microsoft NLB.md)\n\nNota:\n\nSe tiver dificuldades na [Configuração do Fluig Realtime para execução em Load Balance](Alta disponibilidade e balanceamento de carga/Configurando o fluig Realtime para execução em Load Balance.md), clique no *link* para acessar a documentação." }, { "metadata": { "title": "Como alterar a porta de acesso à plataforma em HTTP e HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=507971056", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como alterar a porta de acesso à plataforma em HTTP e HTTPS.md" }, "content": "Como alterar a porta de acesso à plataforma em HTTP e HTTPS\n\n\nFique atento!\n\nEsta página foi revisada para considerar as configurações do TOTVS Fluig **a partir** da atualização **1.6**.\n\n- [Objetivo](#ComoalteraraportadeacessoàplataformaemHTTPeHTTPS-Objetivo)\n- [Alterando a porta de acesso](#ComoalteraraportadeacessoàplataformaemHTTPeHTTPS-Alterandoaportadeacesso)\n - [Alterar porta com protocolo HTTP](#ComoalteraraportadeacessoàplataformaemHTTPeHTTPS-AlterarportacomprotocoloHTTP)\n - [Alterar porta com protocolo HTTPS](#ComoalteraraportadeacessoàplataformaemHTTPeHTTPS-AlterarportacomprotocoloHTTPS)\n - [Alterar porta com TOTVS Identity integrado](#ComoalteraraportadeacessoàplataformaemHTTPeHTTPS-AlterarportacomTOTVSIdentityintegrado)\n\n# Objetivo\n\n---\n\nEste guia visa mostrar o procedimento para alterar a porta de acesso à plataforma em HTTP e HTTPS. Se desejar trocar o conjunto de portas padrão, acesse [Como alterar o conjunto de portas padrão da plataforma](Como alterar o conjunto de portas padrão da plataforma.md).\n\n**oculto**\n\nA informação dessa página foi replicada para o artigo: \n\nSe fizer qualquer alteração aqui, é importante lembrar de atualizar esse artigo!\n\n# Alterando a porta de acesso\n\n---\n\nPara alterar a porta de acesso da URL da plataforma, verifique os passos conforme a configuração do seu ambiente: HTTP, HTTPS ou integrado ao TOTVS Identity.\n\n## Alterar porta com protocolo HTTP" }, { "metadata": { "title": "Como alterar a porta de acesso à plataforma em HTTP e HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=507971056", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como alterar a porta de acesso à plataforma em HTTP e HTTPS.md" }, "content": "Como alterar a porta de acesso à plataforma em HTTP e HTTPS\n\n\n---\n\nSiga os passos abaixo:\n\n- Logar com o usuário **wcmadmin** e acessar **Painel de Controle →** **WCM** **→** **Configurações do Sistema**.\n\n![](..\\..\\..\\images\\Image%2018.jpg)\n\n- Em **Configuração do Sistema** **→ Aba Portal,** no campo **URL do Portal,** altere para a nova porta.\n\n- Ao finalizar a alteração clique em **Salvar.**\n\n![](..\\..\\..\\images\\Image%2019.jpg)\n\n- Pare os serviços do Fluig em sua ordem correta (fluig, fluig\\_Indexer e fluig\\_RealTime).\n\n- **A partir da atualização 2.0**: \n Acesse [diretório\\_instalação]/appserver/standalone/configuration e edite o arquivo **standalone.xml**.\n\n- **Para atualizações 1.6 até 1.8.2**: \n Acesse [diretório\\_instalação]/appserver/domain/configuration e edite o arquivo **domain.xml**.\n\n- No arquivo editado (standalone.xml ou domain.xml, de acordo com a atualização do Fluig que você utiliza), localize o trecho abaixo e altere para a mesma porta informada no passo 2.\n\n```\n\n```\n\n- Localize o trecho abaixo. A variável deve conter o IP interno do servidor do Fluig com a porta interna. Altere para a **mesma porta** informada no **passo 2**.\n\n```\n\n```\n\n- Localize o trecho abaixo e verifique se o endereço IP configurado na variável FLUIG\\_URL consta na variável NETWORK\\_IP\\_ADDRESSES. Inclua-o se necessário.\n\n```\n\n```\n\n- Ao finalizar **salve** o arquivo.\n\nPronto! Agora é só iniciar os serviços do Fluig na ordem correta (fluig\\_RealTime, fluig\\_Indexer e fluig), e então acessá-lo pela nova porta.\n\n## Alterar porta com protocolo HTTPS" }, { "metadata": { "title": "Como alterar a porta de acesso à plataforma em HTTP e HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=507971056", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como alterar a porta de acesso à plataforma em HTTP e HTTPS.md" }, "content": "Como alterar a porta de acesso à plataforma em HTTP e HTTPS\n\n\n---\n\nSiga os passos abaixo:\n\nPara saber mais informações sobre configuração HTTPS, acesse [essa documentação](HTTPS/Configuração HTTPS da plataforma.md).\n\n- Logar com o usuário **wcmadmin** e acessar **Painel de Controle →** **WCM** **→** **Configurações do Sistema**.\n\n![](..\\..\\..\\images\\Image%2018.jpg)\n\n- Em **Configuração do Sistema** **→ Aba Portal,** no campo **URL do Portal,** altere para a nova URL.É importante mencionar que as portas padrões deste protocolo são a **443** e **8443** sendo que, a porta 8443 vem por *default* na instalação da plataforma. Se desejar alterar para a porta **443**, informe a URL conforme o exemplo: **https:///portal**, sem informar a porta.\n\n- Ao finalizar a alteração clique em **Salvar.**\n\n![](..\\..\\..\\images\\Image%202.jpg)\n\n- Pare os serviços do Fluig em sua ordem correta (fluig, fluig\\_Indexer e fluig\\_RealTime).\n\n- **A partir da atualização 2.0**: \n Acesse [diretório\\_instalação]/appserver/standalone/configuration e edite o arquivo **standalone.xml**.\n\n- **Para atualizações 1.6 até 1.8.2**: \n Acesse [diretório\\_instalação]/appserver/domain/configuration e edite o arquivo **domain.xml**.\n\n- No arquivo editado (standalone.xml ou domain.xml, de acordo com a atualização do Fluig que você utiliza), localize o trecho abaixo e altere para a porta **443**.\n\n```\n\n```\n\n- Ao finalizar salve o arquivo.\n\n**Pronto!** **Agora é só iniciar os serviços do Fluig e acessá-lo pela nova URL**.\n\n- Inicie os serviços do **Fluig** na ordem recomendada: **fluig\\_RealTime, fluig\\_Indexer e fluig**.\n\n## Alterar porta com TOTVS Identity integrado" }, { "metadata": { "title": "Como alterar a porta de acesso à plataforma em HTTP e HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=507971056", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como alterar a porta de acesso à plataforma em HTTP e HTTPS.md" }, "content": "Como alterar a porta de acesso à plataforma em HTTP e HTTPS\n\n\n---\n\nCaso seu ambiente tenha integração com o **TOTVS Identity** é necessário seguir os procedimentos abaixo:\n\n- Acessar o contexto criado no Identity, por exemplo, https://[suaempresa].fluigidentity.com, com as credenciais do administrador.\n\n- Acionar o menu **Aplicativos**.\n\n- Acionar **Fluig** na lista de aplicativos. É possível localizá-lo utilizando o campo Pesquisar no canto superior esquerdo.\n\n- Selecionar a aba **Entrar**.\n\n- Acionar **Editar** localizado no canto superior direito.\n\n![](..\\..\\..\\images\\editar_fluig_app.gif)\n\n- Informar o novo endereço de acesso à plataforma no campo **Domínio**.\n\n- Ao final da URL de acesso deve ser sempre incluído o caminho **/portal/idp.**\n\n**Exemplos:**\n\nhttp://meufluig.com:8080/portal/idp (Protocolo HTTP)\n\nhttps://meufluig.com:8443/portal/idp (Protocolo HTTPS com a porta *default*)\n\nhttps://meufluig.com/portal/idp (Protocolo HTTPS com a porta for 443)\n\n- Acionar **Salvar** no final da página.\n\n![](..\\..\\..\\images\\dom%C3%ADnio.png)\n\nClique no link e acesse a documentação completa referente a [Integração da plataforma com o Identity](../Identity/Integração da plataforma com o Identity.md).\n\nA partir de agora, a configuração será realizada na plataforma.\n\n- Acessar a plataforma com o usuário '**wcmadmin**'.\n\n- Acessar o **Painel de Controle** → **WCM** → **Empresas**.\n\n- Assinalar a empresa desejada e acionar **Editar**.\n\n![](..\\..\\..\\images\\editar_empresa2.gif)\n\n- Acessar a aba **Autenticação**.\n\n- Para garantir que os dados informados serão atualizados no Identity, acionar **Ações**→ **Testar conexão**.\n\n- Se a mensagem \"Conexão com o servidor do Identity realizada com sucesso\" for apresentada, a configuração está correta e pode ser concluída.\n\n- Acionar **Salvar**.\n\n![](..\\..\\..\\images\\testar_conexao.gif)" }, { "metadata": { "title": "Como alterar o conjunto de portas padrão da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=507972900", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como alterar o conjunto de portas padrão da plataforma.md" }, "content": "Como alterar o conjunto de portas padrão da plataforma" }, { "metadata": { "title": "Como alterar o conjunto de portas padrão da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=507972900", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como alterar o conjunto de portas padrão da plataforma.md" }, "content": "Como alterar o conjunto de portas padrão da plataforma\n\n\nAtenção!\n\nEsta página foi revisada para considerar as configurações do TOTVS Fluig Plataforma a partir da atualização 1.6.\n\n# Índice\n\n- 1 [Objetivo](#Comoalteraroconjuntodeportaspadrãodaplataforma-Objetivo)\n- 2 [Alterar o conjunto de portas padrão](#Comoalteraroconjuntodeportaspadrãodaplataforma-Alteraroconjuntodeportaspadrão)\n\n# Objetivo\n\n---\n\nEste guia visa mostrar o procedimento para alterar o conjunto de portas padrão da plataforma TOTVS Fluig.\n\n# Alterar o conjunto de portas padrão\n\n---\n\nPara alterar todo o conjunto de portas da plataforma siga o procedimento abaixo.\n\nPare os serviços do fluig em sua ordem correta (fluig, fluig\\_Indexer e fluig\\_RealTime).\n\nAltere as portas da instalação:\n\n- Para isso, acesse **[diretório\\_instalação]\\appserver\\domain\\configuration** e localize o arquivo “**host.xml**” para editá-lo.\n- Localize o código abaixo e adicione a linha **** no lugar indicado.\n- É necessário definir um valor para a port-offset (Exemplo: 100) e alterá-la no código quando incluída. Este valor será somado a diversas portas definidas nos arquivos de configuração da plataforma alterando-as para valores diferentes automaticamente.\n\nAviso\n\nA instalação de Múltiplas Instâncias em um único servidor **não é homologado** **para atualização 1.6 e superiores** do TOTVS Fluig Plataforma, pois gera concorrência pelos recursos e portas do servidor entre as instâncias provocando comportamentos inesperados. A partir desta release não será fornecido suporte quando identificado este cenário. Para mais detalhes, consulte a documentação [Modelo de Dimensionamento](../../Especificações Técnicas/Dimensionamento/Modelo de dimensionamento.md).\n\nExpandir origem\n\n```\n\n \n \n \n \n \n \n\t\t\t\n \n\t\t\n```\n\nImportante!\n\nEste passo é válido para instalações realizadas a partir da atualização 1.6.1. Na versão 1.6.0 as linhas de código abaixo deverão ser incluídas e alteradas para o valor da port-offset salva no passo 2.\n\nAltere o valor da port-offset do gerenciamento interno do serviço fluig.\n\n- Para isso, acesse **[diretório\\_instalação]/appserver/domain/configuration** e localize o arquivo **\"host.xml\"** para editá-lo.\n- Localize o código abaixo e altere o valor destacado **somando** o valor do offset declarado no passo 2 desta documentação.\n\n![](..\\..\\..\\images\\3.1.png)\n\n- Ao finalizar as alterações, salve o arquivo.\n\nRepita o mesmo procedimento para o arquivo **\"**jboss-cli.xml**\".**\n\n- Para isso, acesse **[diretório\\_instalação]/appserver/bin** e localize o arquivo **\"jboss-cli.xml\"** para editá-lo.\n- Localize o código abaixo e altere o valor destacado **somando** o valor do offset declarado no passo 2 desta documentação.\n\n![](..\\..\\..\\images\\3.2.png)\n\n- Ao finalizar as alterações, salve o arquivo.\n\nAltere as portas registradas em banco de dados:\n\n- Acesse **[diretório\\_instalação****]****\\repository\\wcmdir\\config**e edite ou crie o arquivo “**configuration.properties**”. Todas as portas listadas nas linhas abaixo terão de ser alteradas:\n\nImportante!\n\nAo criar um novo arquivo \"**configuration.properties**\" copiando o código informado neste passo, é muito importante que os comentários sejam apagados, pois eles podem corromper as configurações contidas.\n\n**configuration.properties**\n\n```\ntotvs/serverIPPort=8080 \nfluig/server.url=http://10.80.80.23:8080 \nwebdesk/FTPPort=21\nwebdesk/FTPPrivateFolderPort=8021\nwebdesk/OOoPort=15001,15002\n```\n\nAcesse o diretório **[diretório\\_instalação]/repository/wcmdir** e crie um arquivo vazio (sem conteúdo) chamado \"**database.update**\". Este arquivo é necessário para que a atualização do passo 4 ocorra corretamente no banco de dados.\n\nPronto! Agora é só iniciar os serviços do fluig na ordem correta (fluig\\_RealTime, fluig\\_Indexer e fluig).\n\n**oculto**\n\nA informação acima foi duplicada no artigo  (Conflitos de porta ao iniciar o serviço)\n\nCaso seja feita alguma alteração, lembrar de atualizar esse artigo!\n\nImportante!\n\nImportante mencionar que nas alterações acima não estão incluídas as portas do serviço RealTime e Servidor de Indexação. A partir da atualização 1.6.1, a instalação destes serviços pode ser realizada por módulos, em [modo caracteres](../../Instalação e Atualização/Guia de instalação da plataforma.md), e neste cenários você deve procurar os arquivos abaixo no diretório onde o módulo foi instalado. No entanto, por padrão ele é instalado no mesmo diretório do servidor de aplicação da plataforma.\n\nSe deseja alterar as portas dos serviços, siga os passos abaixo:\n\n**Servidor de Indexação (Solr)**\n\n- **Windows**\n\n1. Acesse **[diretório\\_instalação]\\solr\\bin** e localize o arquivo \"**solr.in.cmd**\" para editá-lo.\n2. Localize a linha abaixo e apague o termo \"REM\" do início. Altere para a nova porta.\n\n**solr.in.cmd**\n\n```\nREM set SOLR_PORT=8983\n```\n\n- **Linux**\n\n1. Acesse **/etc/default/** e localize o arquivo \"**fluig\\_Indexer.in.sh**\" para editá-lo.\n2. Localize a linha abaixo e altere para a nova porta.\n\n**fluig\\_Indexer.in.sh**\n\n```\nSOLR_PORT=\"8983\"\n```\n\n3. Ao finalizar, salve o arquivo.\n\n4. Acesse o arquivo **[diretório\\_instalação****]****\\repository\\wcmdir\\config**e edite ou crie o arquivo “**configuration.properties**”.\n\n**configuration.properties**\n\n```\ntotvs/solrURL=http://10.80.80.23:8983/solr\n```\n\n5. Para que o servidor de aplicação reconheça a nova porta do Servidor de Indexação (solr), será necessário alterar a porta também em [Configurações do Sistema](https://tdn.totvs.com/pages/viewpage.action?pageId=235597328) nos Parâmetros da Plataforma.\n\n**RealTime (nodejs)**\n\n1. Acesse **[diretório\\_instalação]node\\fluig.rt** e localize o arquivo \"**package.json**\" para editá-lo.\n2. Localize as linhas abaixo e altere para as mesmas portas de RealTime Chat e RealTime para as novas portas:\n\n```\n\"chatPort\": 7777, \n\"realtimePort\": 8888,\n```\n\n3. Ao finalizar, salve o arquivo.\n\n4. Acesse o arquivo **[diretório\\_instalação****]****\\repository\\wcmdir\\config**e edite ou crie o arquivo “**configuration.properties**”.\n\n```\nnode.chat.url=10.80.80.23:7777 \nnode.realtime.url=10.80.80.23:8888\n```\n\n5. Para que o servidor de aplicação reconheça a nova porta do RealTime (nodejs), será necessário alterar a porta também em [Configurações do Sistema](https://tdn.totvs.com/pages/viewpage.action?pageId=235597328) nos Parâmetros da Plataforma." }, { "metadata": { "title": "Como alterar o timeout da plataforma", "source": "https://tdn.totvs.com/display/fluig/Como+alterar+o+timeout+da+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como alterar o timeout da plataforma.md" }, "content": "Como alterar o timeout da plataforma" }, { "metadata": { "title": "Como alterar o timeout da plataforma", "source": "https://tdn.totvs.com/display/fluig/Como+alterar+o+timeout+da+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como alterar o timeout da plataforma.md" }, "content": "Como alterar o timeout da plataforma\n\n\nFique atento!\n\nEsta página foi revisada para considerar as configurações do TOTVS Fluig **a partir** da atualização **1.6**.\n\n- [Objetivo](#Comoalterarotimeoutdaplataforma-Objetivo)\n- [Como alterar o timeout](#Comoalterarotimeoutdaplataforma-Comoalterarotimeout)\n\n# Objetivo\n\n---\n\nEste guia visa mostrar o procedimento para aumentar o *timeout* na execução de processos que contenham formulários com *datasets*, atividades de serviço, entre outros.\n\n# Como alterar o *timeout*\n\n---\n\nPara aumentar o *timeout* da plataforma, siga os passos descritos abaixo.\n\nAtenção!\n\nA realização deste procedimento pode causar problemas de performance na plataforma. Recomendamos que seja realizado em ambiente de homologação antes de configurar em produção.\n\n**01.** Pare os serviços do Fluig.\n\n**02.** Edite o arquivo **standalone.xml**, que está disponível em [diretório\\_instalação]/appserver/standalone/configuration, alterando o parâmetro **** dentro do subsystem **jboss:domain:transactions:5.0** para o valor que desejar. Se não houver o parâmetro, basta adicionar.\n\n**standalone.xml**\n\n```\n\n\n\n\n    \n \n \n \n \n\n```\n\n**03.** Salve as alterações.\n\n**04.** Inicie os serviços do Fluig na ordem correta.\n\n**01.** Pare os serviços do Fluig.\n\n**02.** Edite o arquivo **domain.xml**, que está disponível em [diretório\\_instalação]/appserver/domain/configuration, alterando o parâmetro **** dentro do subsystem **jboss:domain:transactions:5.0** para o valor que desejar. Se não houver o parâmetro, basta adicionar.\n\n**domain.xml**\n\n```\n\n\n\n\n    \n \n \n \n \n\n```\n\n**03.** Salve as alterações.\n\n**04.** Inicie os serviços do Fluig na ordem correta.\n\n**01.** Pare os serviços do Fluig.\n\n**02.** Edite o arquivo **domain.xml**, que está disponível em [diretório\\_instalação]/appserver/domain/configuration, alterando o parâmetro **** dentro do subsystem **jboss:domain:transactions:3.0** para o valor que desejar. Se não houver o parâmetro, basta adicionar.\n\n**domain.xml**\n\n```\n\n\t\n\t\t\n\t\t\t\n\t\t\n\t\n\t \n \n\n```\n\n**03.** Salve as alterações.\n\n**04.** Inicie os serviços do Fluig na ordem correta.\n\nApós realizar esse procedimento, o *timeout* da plataforma será alterado conforme o parâmetro definido." }, { "metadata": { "title": "Como aumentar o limite de upload da plataforma", "source": "https://tdn.totvs.com/display/fluig/Como+aumentar+o+limite+de+upload+da+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como aumentar o limite de upload da plataforma.md" }, "content": "Como aumentar o limite de upload da plataforma" }, { "metadata": { "title": "Como aumentar o limite de upload da plataforma", "source": "https://tdn.totvs.com/display/fluig/Como+aumentar+o+limite+de+upload+da+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como aumentar o limite de upload da plataforma.md" }, "content": "Como aumentar o limite de upload da plataforma\n\n\n- [Objetivo](#Comoaumentarolimitedeuploaddaplataforma-Objetivo)\n- [Como aumentar o limite de upload da plataforma](#Comoaumentarolimitedeuploaddaplataforma-Comoaumentarolimitedeuploaddaplataforma)\n- [Escolhendo o valor correto](#Comoaumentarolimitedeuploaddaplataforma-Escolhendoovalorcorreto)\n - [Unidade de medida](#Comoaumentarolimitedeuploaddaplataforma-Unidadedemedida)\n - [Fórmula](#Comoaumentarolimitedeuploaddaplataforma-Fórmula)\n - [Exemplos](#Comoaumentarolimitedeuploaddaplataforma-Exemplos)\n- [Artigos relacionados](#Comoaumentarolimitedeuploaddaplataforma-Artigosrelacionados)\n\n# Objetivo\n\n---\n\nEste guia mostra como aumentar o limite máximo de *upload* no TOTVS Fluig Plataforma.\n\n# Como aumentar o limite de *upload* da plataforma\n\n---\n\nPara aumentar o limite de *upload*, siga os passos abaixo:\n\nAtenção!\n\nA realização deste procedimento pode causar problemas de performance na plataforma. Recomendamos que seja realizado em ambiente de **homologação antes de configurar em produção**.\n\n- Pare os serviços do Fluig.\n\n- **A partir da atualização 2.0**: \n Localize o arquivo **standalone.xml**, que está disponível em **[diretório\\_instalação]/appserver/standalone/configuration**, e abra em um editor de texto utilizando um usuário com permissões de administrador.\n\n- **Para atualizações 1.6.5 até 1.8.2**: \n Localize o arquivo **domain.xml**, que está disponível em **[diretório\\_instalação]/appserver/domain/configuration**, e abra em um editor de texto utilizando um usuário com permissões de administrador.\n\n- No arquivo correspondente à atualização do Fluig que você utiliza (standalone.xml ou domain.xml), procure pela tag **http-listener** e o seu atributo **max-post-size**. Altere o valor para \"2147483648\" para permitir até 2GB de *upload*.\n\n```\n \n \n \n \n```\n\n- Se você possuir HTTPS na plataforma, precisará editar também o valor do parâmetro **https-listener max-post-size**. Se você não tiver HTTPS na plataforma, só existirá o primeiro parâmetro.\n\n**Exemplo:**\n\n```\n\n\n```\n\n- Salve e inicie os serviços do Fluig na ordem correta.\n\n- Tente publicar o arquivo em seguida.\n\nImportante!\n\nAo alterar o limite padrão de *upload* na configuração do serviço Fluig acima do valor padrão, a performance para todos os usuários da plataforma poderá ser afetada durante o *upload* de arquivos com tamanho superior ao limite padrão.\n\n# Escolhendo o valor correto\n\n---" }, { "metadata": { "title": "Como aumentar o limite de upload da plataforma", "source": "https://tdn.totvs.com/display/fluig/Como+aumentar+o+limite+de+upload+da+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como aumentar o limite de upload da plataforma.md" }, "content": "Como aumentar o limite de upload da plataforma\n\n## Unidade de medida" }, { "metadata": { "title": "Como aumentar o limite de upload da plataforma", "source": "https://tdn.totvs.com/display/fluig/Como+aumentar+o+limite+de+upload+da+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como aumentar o limite de upload da plataforma.md" }, "content": "Como aumentar o limite de upload da plataforma\n\n\nUma boa prática para determinar o novo valor da propriedade **max-post-size** em bytes, é utilizar um a potência de base 2 (Ex.: 210, 220, 230, ...), **conforme norma IEC 80000-13 : 2008**. Isto se deve ao fato de que todos os dispositivos de armazenamento são projetados para guardar um volume de dados, sendo este um número múltiplo de dois, justamente por causa da natureza binária do bit, embora comercialmente seja utilizado o sistema internacional (Ex.: 101, 102, 103, ...).\n\nSegue abaixo alguns exemplos de valores baseados nesta lógica:\n\n| **Tabela 1 - Valores de armazenamento conforme norma IEC 80000-13 : 2008** | | | | | |\n| --- | --- | --- | --- | --- | --- |\n| Potência de base 2 | gibibyte (GiB) | mebibyte (MiB) | quibibyte (KiB) | Bytes | bits |\n| ​20 | 0 | ​0 | 0 | **​0** | ​1 |\n| 21 | 0 | 0 | 0 | **0** | 2 |\n| 23 | 0 | 0 | 0 | **1** | 8 |\n| 210 | 0 | 0 | 1 | **1024** | 8192 |\n| 220 | 0 | 0 | 1024 | **1048576** | 8388608 |\n| 230 | **1** | **1024** | **1048576** | **1073741824** | **8589934592** |\n| 231 | ***2*** | ***2048*** | ***2097152*** | ***2147483648*** | ***17179869184*** |\n\n| Tabela 2 - Múltiplos do Byte |\n| --- |\n| ​ | [Prefixo binário](https://pt.wikipedia.org/wiki/Prefixo_bin%C3%A1rio \"Prefixo binário\") ([IEC](https://pt.wikipedia.org/wiki/Comiss%C3%A3o_Eletrot%C3%A9cnica_Internacional \"Comissão Eletrotécnica Internacional\")) | | | | [Prefixo do SI](https://pt.wikipedia.org/wiki/Sistema_Internacional_de_Unidades \"Sistema Internacional de Unidades\") | | | | --- | --- | --- | --- | --- | --- | --- | | Nome | Símbolo | Múltiplo | | Nome | Símbolo | Múltiplo | | [byte](https://pt.wikipedia.org/wiki/Byte \"Byte\") | B | 20 | | [byte](https://pt.wikipedia.org/wiki/Byte \"Byte\") | B | 100 | | [kibibyte](https://pt.wikipedia.org/wiki/Kibibyte \"Kibibyte\") | KiB | 210 | | [kilobyte](https://pt.wikipedia.org/wiki/Kilobyte \"Kilobyte\") | kB | 103 | | [mebibyte](https://pt.wikipedia.org/wiki/MebiByte \"MebiByte\") | MiB | 220 | | [megabyte](https://pt.wikipedia.org/wiki/Megabyte \"Megabyte\") | MB | 106 | | [gibibyte](https://pt.wikipedia.org/wiki/Gibibyte \"Gibibyte\") | GiB | 230 | | [gigabyte](https://pt.wikipedia.org/wiki/Gigabyte \"Gigabyte\") | GB | 109 | | [tebibyte](https://pt.wikipedia.org/wiki/Tebibyte \"Tebibyte\") | TiB | 240 | | [terabyte](https://pt.wikipedia.org/wiki/Terabyte \"Terabyte\") | TB | 1012 | | [pebibyte](https://pt.wikipedia.org/wiki/Pebibyte \"Pebibyte\") | PiB | 250 | | [petabyte](https://pt.wikipedia.org/wiki/Petabyte \"Petabyte\") | PB | 1015 | | [exbibyte](https://pt.wikipedia.org/wiki/Exbibyte \"Exbibyte\") | EiB | 260 | | [exabyte](https://pt.wikipedia.org/wiki/Exabyte \"Exabyte\") | EB | 1018 | | [zebibyte](https://pt.wikipedia.org/wiki/Zebibyte \"Zebibyte\") | ZiB | 270 | | [zettabyte](https://pt.wikipedia.org/wiki/Zettabyte \"Zettabyte\") | ZB | 1021 | | [yobibyte](https://pt.wikipedia.org/wiki/Yobibyte \"Yobibyte\") | YiB | 280 | | [yottabyte](https://pt.wikipedia.org/wiki/Yottabyte \"Yottabyte\") | YB | 1024 | | |" }, { "metadata": { "title": "Como aumentar o limite de upload da plataforma", "source": "https://tdn.totvs.com/display/fluig/Como+aumentar+o+limite+de+upload+da+plataforma", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como aumentar o limite de upload da plataforma.md" }, "content": "Como aumentar o limite de upload da plataforma\n\n## Fórmula\n\nSabendo que o valor padrão de um 1 GigaBytes é 1073741824 bytes, então pode-se utilizar este valor como constante para multiplicarmos a capacidade.\n\nA fórmula abaixo permite o cálculo rápido e simples do novo valor para o limite de upload desejado para o ambiente da plataforma.\n\n**Vbytes = vGB \\* 1073741824**\n\nOnde:\n\n**Vbytes** → o novo valor a ser definido no arquivo de configuração standalone.xml (a partir da 2.0) ou domain.xml (1.6 até 1.8.2), no campo max-post-size.\n\n**vGB** → valor em GigaBytes ao qual pretende-se aumentar a capacidade de upload do ambiente.\n\n**1073741824** → valor de 1GB em bytes, utilizado como constante ou referência.\n\n### Exemplos\n\nPreciso aumentar de 1GB para 2GB a capacidade de upload;\n\nVbytes = 2 \\* 1073741824\n\nVbytes = 2147483648\n\nlogo ***max-post-size=\"2147483648\"***\n\nPreciso aumentar de 1GB para 5GB a capacidade de upload;\n\nVbytes = 5 \\* 1073741824\n\nVbytes = 5368709120\n\nlogo ***max-post-size=\"5368709120\"***\n\nFique atento!\n\nEsta documentação é válida a partir da **atualização 1.6.5 - Liquid**. Se você utiliza uma atualização anterior, ela pode conter informações diferentes das quais você vê na sua plataforma.\n\n# Artigos relacionados\n\n---\n\n- [Parâmetros](https://tdn.totvs.com/pages/viewpage.action?pageId=234455426)" }, { "metadata": { "title": "Como configurar o arquivo robots.txt", "source": "https://tdn.totvs.com/display/fluig/Como+configurar+o+arquivo+robots.txt", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Como configurar o arquivo robots.txt.md" }, "content": "Como configurar o arquivo robots.txt\n\n\n- 1 [Objetivo](#Comoconfiguraroarquivorobots.txt-Objetivo)\n- 2 [Detalhes técnicos](#Comoconfiguraroarquivorobots.txt-Detalhestécnicos)\n- 3 [Permitir o rastreamento dos arquivos](#Comoconfiguraroarquivorobots.txt-Permitirorastreamentodosarquivos)\n\n# Objetivo\n\n---\n\nEste guia visa mostrar como configurar o arquivo robots.txt.\n\n# Detalhes técnicos\n\n---\n\nConforme informado no guia de [boas práticas de segurança](../../Especificações Técnicas/Boas práticas de segurança para o seu ambiente.md), é importante configurar o arquivo robots.txt. Esse arquivo é constituído por regras que controlam quais arquivos os rastreadores podem acessar em um site.\n\nA partir da atualização **1.7.1-211207** o arquivo robots.txt é instalado por padrão na plataforma, no diretório [instalação\\_fluig]/repository/wcmdir, o qual já encontra-se configurado para bloquear todos os agentes de rastreamento de arquivos. É recomendável alterar esse arquivo, incluindo todas as configurações necessárias para ser indexado.\n\nCaso a utilização do arquivo robots.txt seja via configuração de proxy, o usuário poderá continuar usando via proxy ou mover a configuração ou o arquivo existente para o diretório [instalação\\_fluig]/repository/wcmdir robots.txt.\n\nPor questões de segurança é recomendável que a configuração permita liberar somente as páginas que realmente devem ser indexadas.\n\n# Permitir o rastreamento dos arquivos\n\n---\n\nCaso queira permitir o rastreamento dos arquivos no seu site por todos os agentes, deve-se alterar o arquivo robots.txt para:\n\nUser-agent: \\* Allow: /\n\nLembrando que o procedimento acima não é recomendado, pois torna de conhecimento público a existência do seu site, expondo algumas informações de acesso. Para mais informações de como configurar o arquivo robots.txt, [acesse aqui](https://developers.google.com/search/docs/advanced/robots/create-robots-txt?hl=pt-br)." }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada" }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n\n# Índice\n\n- 1 [Objetivo](#ConfigurandoAutenticaçãoIntegrada-Objetivo)\n- 2 [Visão Geral](#ConfigurandoAutenticaçãoIntegrada-VisãoGeral)\n- 3 [NTLM](#ConfigurandoAutenticaçãoIntegrada-NTLM)\n- 4 [Configuração da Autenticação Integrada](#ConfigurandoAutenticaçãoIntegrada-ConfiguraçãodaAutenticaçãoIntegrada)\n - 4.1 [Habilitando e Configurando na plataforma](#ConfigurandoAutenticaçãoIntegrada-HabilitandoeConfigurandonaplataforma)\n - 4.2 [Configuração IIS](#ConfigurandoAutenticaçãoIntegrada-ConfiguraçãoIIS)\n - 4.3 [Configuração do Navegador](#ConfigurandoAutenticaçãoIntegrada-ConfiguraçãodoNavegador)\n - 4.4 [Group Policies](#ConfigurandoAutenticaçãoIntegrada-GroupPolicies)\n- 5 [Opções de Arquitetura para Alta Disponibilidade](#ConfigurandoAutenticaçãoIntegrada-OpçõesdeArquiteturaparaAltaDisponibilidade)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é habilitar e configurar a autenticação integrada com Windows no TOTVS Fluig Plataforma.\n\n# Visão Geral\n\n---\n\nA autenticação integrada com o Windows possibilita que os usuários que estejam registrados no Active Directory possam acessar a plataforma sem precisar informar manualmente seus dados de acesso através da tela de login, desde que já esteja autenticado no Windows.\n\nBasicamente o processo de autenticação integrada com o Windows funciona da seguinte maneira:\n\n1. O usuário acessa a plataforma através do seu navegador;\n2. A plataforma inicia o processo de autenticação integrada, redirecionando para o servidor IIS;\n3. O script de autenticação remota no IIS sabe como autenticar o usuário pelas credenciais de domínio do Windows;\n4. O usuário é consultado e validado no Active Directory pelo IIS;\n5. IIS redireciona novamente à plataforma com as informações de identidade do usuário retornadas pelo Active Directory;\n6. A plataforma valida a integridade das informações recebidas do servidor IIS;\n7. Caso as informações do usuário forem válidas, autentica o usuário na plataforma, caso contrário redireciona para a tela de login.\n\nAtenção!\n\nCom essa configuração de autenticação integrada os usuários não são criados automaticamente na plataforma. Eles somente são criados automaticamente quando é utilizado o TOTVS Identity.\n\n# NTLM\n\n---\n\nO NTLM é um protocolo de autenticação utilizado em uma rede Windows. Como veremos nos tópicos a seguir, existem uma série de configurações que devemos realizar nos navegadores para que utilizem este protocolo, e também no script de autenticação remota para que utilize a chamada Autenticação Windows.\n\nAlém disso, é importante lembrar que existem limitações com relação a sistemas operacionais que não Windows. Linux e Mac, por exemplo, não podem utilizar o protocolo NTLM. O efeito nestes sistemas operacionais é que se tentarem o acesso via autenticação integrada, uma caixa de diálogo proveniente do navegador pedirá para que o usuário informe suas credenciais.\n\n# Configuração da Autenticação Integrada\n\n---\n\nPara usufruir da autenticação integrada com o Windows, é necessário habilitar este recurso na plataforma e realizar algumas configurações, como a criação do serviço de autenticação remota. As configurações necessárias para o correto funcionamento da autenticação integrada são apresentadas nos tópicos abaixo." }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n### Habilitando e Configurando na plataforma" }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n\nO primeiro passo para a configuração da autenticação integrada é habilitá-la na plataforma:\n\n- Efetue o login na plataforma utilizando o usuário **wcmadmin**, e então acesse **Painel de Controle  ► WCM ► Configurações do Sistema**.\n\n![](..\\..\\..\\images\\int01_.png)\n\n- Na tela de configurações do sistema, acesse a aba **Autenticação**. Para habilitar a autenticação integrada assinale a opção **Habilitar autenticação integrada.**\n\n![](..\\..\\..\\images\\int02_.png)\n\n- Insira a URL do servidor IIS onde será executado o script de autenticação remota no campo **URL script de autenticação**. A URL deve apontar por padrão para **http(s):///remote\\_auth.asp** (A configuração do servidor IIS e da URL para acesso será descrito no tópico Configuração IIS).\n\n Fique atento!\n\n As máquinas dos usuários devem conseguir acessar a URL configurada em **URL script de autenticação** da forma como ela foi informada nesse campo.\n\n![](..\\..\\..\\images\\int03_.png)\n\n- Clique no botão **Gerar Novo Token** para gerar um token de autenticação. O token é utilizado para validar a integridade e segurança das requisições de autenticação integrada recebidas pela plataforma.\n\n![](..\\..\\..\\images\\int04_.png)\n\n- Informe o endereço do servidor Active Directory no campo **Endereço do servidor AD** no seguinte formato **:** e o DN (Distinguished Name) base para a pesquisa de usuários no campo **Base DN**. O DN base é utilizado para informar abaixo de qual entrada no Active Directory será pesquisado e validado os usuários para a autenticação integrada.\n\n![](..\\..\\..\\images\\int05_.png)\n\n- Informe um login e senha do Active Directory que possua privilégios suficientes para ler informações dos usuários no Active Directory informado no passo anterior. O login deve ser informando no campo **Usuário de domínio** e a senha no campo **Senha.**\n\n![](..\\..\\..\\images\\int06_.png)\n\n- Clique no botão **Salvar** para salvar as configurações de autenticação. Em seguida clique no botão **Exportar** para gerar e salvar o script de autenticação remota que deverá ser publicado no servidor IIS.\n\n![](..\\..\\..\\images\\int07_.png)\n\nÉ importante lembrar que existem diversas configurações à serem executadas antes que possamos utilizar a Autenticação Integrada, estas serão detalhadas nos tópicos a seguir. Se estas configurações não forem finalizadas antes que a autenticação integrada seja habilitada, os usuários poderão ter dificuldades para autenticar na plataforma, ou até mesmo poderão ser impedidos de ter acesso." }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n### Configuração IIS" }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n\nPara disponibilizar o serviço de autenticação remota é necessário ter um servidor Windows com o Internet Information Services (IIS) habilitado. Siga o passo-a-passo abaixo para habilitar o IIS:\n\nCaso a função Servidor Web (IIS) já tenha sido adicionada ao servidor este passo-a-passo pode ser ignorado. Importante apenas garantir que os serviços de função **ASP** e **Autenticação do Windows** tenham sidos instalados para o Servidor Web (para mais detalhes confira o **passo 4**).\n\n- Para habilitar o IIS (caso não esta habilitado ainda), devemos utilizar o **Gerenciador de Servidores** e adicionar uma nova função. Para adicionar uma nova função, clique na opção **Funções** e em seguida em **Adicionar funções**.\n\n![](..\\..\\..\\images\\image2014-10-1%2011381.png)\n\n- A tela de **Assistente para Adicionar Funções** é aberta. Assinale a opção **Servidor Web (IIS)** e clique no botão **Próximo**.\n\n![](..\\..\\..\\images\\image2014-10-1%20114621.png)\n\n- Uma tela com uma introdução ao Servidor Web (IIS) é apresentada. Clique no botão **Próximo** para continuar com a instalação.\n\n![](..\\..\\..\\images\\image2014-10-1%2011482.png)\n\n- Para que seja possível configurar e disponibilizar o serviço de **autenticação remota** é necessário a instalação dos seguintes serviços de função: **ASP**, **Extensões ISAPI** e **Autenticação do Windows**. Assinale estes serviços de funções e clique em **Próximo**.\n\n![](..\\..\\..\\images\\image2014-10-1%2011504.png)\n\n- Os serviços de funções **ASP** e **Extenções ISAPI** são necessários para a execução do script ASP responsável pela autenticação remota e o serviço de função **Autenticação do Windows** é necessário para que o navegador possa enviar as credenciais para a aplicação efetuar as validações necessárias no Active Directory.\n\n- A tela de confirmação de instalação é apresentada. Clique em **Instalar** para finalizar a instalação do Servidor Web (IIS).\n\n![](..\\..\\..\\images\\image2014-10-1%20131140.png)\n\n- Após finalizar a instalação é apresentada a tela de **Resultados da Instalação** com o resumo dos itens instalados. Clique em **Fechar.**\n\n![](..\\..\\..\\images\\image2014-10-1%20133555.png)" }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n##### Configuração e Disponibilização do Serviço" }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n\nApós possuir o IIS instalado e com as funções de serviços necessárias é possível configurar o serviço de **autenticação remota**. Lembrando que o apoio da equipe de infraestrutura é fundamental, siga o passo-a-passo abaixo para configurar e disponibilizar o serviço de **autenticação remota**:\n\n- Primeiramente devemos criar um arquivo chamado **redirect.html** com o seguinte conteúdo (lembre-se que a chave FLUIG-HOST deve ser substituída pelo endereço do servidor fluig).\n\nLembrando que no campo **URL script de autenticação**, deve ser informado o mesmo nome do domínio utilizado na plataforma, por exemplo, URL='[http://suaempresa.com.br/portal/home?dssoError=invalidUser'](http://suaempresa.com.br/portal/home?dssoError=invalidUser%27)).\n\n**redirect.html**\n\n```\n\n \n \n \n \n\n```\n\n- Seguindo, devemos **criar um diretório** de conteúdo para o site que iremos criar nos próximos passos. Neste diretório colocamos o script ASP baixado da plataforma (ver item [Habilitando e Configurando na plataforma](https://tdn.totvs.com/pages/viewpage.action?pageId=162170863)) e o arquivo **redirect.html**.\n\n![](..\\..\\..\\images\\Image%2014.jpg)\n\n- No IIS agora precisamos **criar um novo site,** que será a aplicação responsável em fornecer o serviço de autenticação remota. Para criar um novo site clique na ação **Adicionar Site**. A tela **Adicionar Site** será apresentada, informe o **nome do site** (por exemplo fluigsso), o **tipo**, **endereço IP** e **porta**, que devem ser definidos pelo administrador do servidor.\n\n![](..\\..\\..\\images\\image2014-10-1%20143618.png)\n\nO endereço informado nas configurações do site é o valor que deve ser informado no campo **URL script de autenticação** na configuração da autenticação integrada na plataforma (ver passo 3 do item [Habilitando e Configurando na plataforma](https://tdn.totvs.com/pages/viewpage.action?pageId=162170863)).\n\n- Outro ponto a ser configurado é autenticação deste site. Realizamos isto através do item **Autenticação**.\n\n![](..\\..\\..\\images\\image2014-10-1%2014551.png)\n\n- Devemos habilitar a forma de autenticação do **Autenticação do Windows** e desabilitar todas as outras opções de autenticação.\n\n![](..\\..\\..\\images\\image2014-10-1%20145939.png)\n\n- Existe um detalhe que deve ser tratado na autenticação, que são os provedores utilizados pela Autenticação do Windows. Clique com o botão direito na opção **Autenticação do Windows** e em seguida clicar na opção **Provedores**.\n\n![](..\\..\\..\\images\\provedores-site.png)\n\n- Devemos deixar apenas a opção **NTLM**. Todas as outras devem ser excluídas. Se isso não for feito, pode ser exigido do usuário a entrada de credenciais via caixa de diálogo do navegador. Não esquecer que existe outra configuração a ser feita diretamente no navegador para evitar este problema (veremos em tópicos posteriores).\n\n![](..\\..\\..\\images\\image2014-10-1%2015951.png)\n\n- Em alguns casos, não será possível negociar as credenciais do usuário via **NTML** e então o IIS redirecionará o usuário para uma página de erro (HTTP 401.2 - Não autorizado). Para evitar este comportamento é possível definir uma página de erro personalizada onde o usuário é redirecionado para a página de login da plataforma ao invés de uma página de erro do IIS.\n- Realizamos isto através do botão **Páginas de Erro**.\n\n![](..\\..\\..\\images\\image2014-10-1%20152213.png)\n\n- Para adicionar uma nova página de erro clique na opção **Adicionar.**\n\n![](..\\..\\..\\images\\image2014-10-1%2015-27-49.png)\n\n- A tela **Adicionar Página de Erro Personalizado** é apresentada. Informe o código de status **401.2**, selecione a ação de resposta **Inserir conteúdo do arquivo estático na resposta de erro** e no campo **Caminho do Arquivo** informe o caminho relativo (ou seja, apenas o **nome.extensão**, conforme a imagem abaixo) da raiz do site direcionando para o arquivo **redirect.html**.\n\n![](..\\..\\..\\images\\image2014-10-1%20152718.png)\n\n- Para finalizar e adicionar a página de erro clique no botão **OK**.\n\n- Finalizadas as configurações, é possível realizar um **teste** diretamente no script. Para isto basta executar o script no navegador com o parâmetro de consulta debug=1, que neste exemplo foi \n- Quando acrescentado o parâmetro de consulta debug=1, o script é informado para executar em modo debug, no qual ele retorna diversos valores que nos ajudam a depurar o serviço de autenticação remota. No exemplo executado, podemos ver que foi retornado o usuário 'João da Silva' e que a autenticação está funcionando corretamente.\n\n![](..\\..\\..\\images\\image2014-10-1%20153144.png)\n\n- **Uma vez concluída estas configurações é possível efetuar a autenticação integrada.**\n- Como teste final, autentique no Windows utilizando as credenciais de um usuário válido do Active Directory. Em seguida acesse a plataforma. O acesso à plataforma não exigirá login e senha e já autenticará o usuário no Windows." }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n### Configuração do Navegador\n\n---\n\nAtenção\n\n**A configuração do navegador deverá ser realizada em cada terminal cliente.**\n\nÉ necessário configurar o navegador do usuário para que ele utilize autenticação Windows (NTLM) com o script de autenticação remota (remote\\_auth.asp).\n\nMesmo que o serviço de autenticação remota tenha sido configurado para utilizar autenticação Windows no IIS, o navegador do cliente precisa enviar as credenciais para que o script possa fazer as validações necessárias no Active Directory.\n\n##### Internet Explorer e outros navegadores derivados do Chromium (Microsoft Edge e Google Chrome)" }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n\nNo caso dos navegadores **Internet Explorer** e **Google Chrome**, as configurações de segurança e autenticação devem ser realizadas através das **Opções da Internet,** localizada no painel de controle do Windows, pois assim, estes navegadores irão assumir as configurações realizadas. Observe e siga os passos a seguir:\n\n- Para começar, devemos acessar o menu **Opções da Internet**, pelo painel de controle. Para isso, basta segurar a tecla Windows do teclado, pressionar a tecla \"R\", digitar \"control\" no campo correspondente e em seguida clicar no botão OK.\n\n![](..\\..\\..\\images\\Painel%20de%20controle.JPG)\n\n- Na sequência, alterar a exibição para **Ícones** para facilitar a visualização e clicar na opção **Opções da Internet**.\n\n![](..\\..\\..\\images\\Op%C3%A7%C3%B5es%20da%20Internet.JPG)\n\n- Em seguida clicar na aba **Segurança**, selecionar **Intranet** **local** e posteriormente, clicar em **Sites.**\n\n![](..\\..\\..\\images\\Passo%203.JPG)\n\n- Para adicionar o endereço do servidor de autenticação remota precisamos clicar no botão **Avançadas**:\n\n![](..\\..\\..\\images\\image2014-9-24%20151136.png)\n\n- Informamos a URL do servidor de autenticação remota no campo **Adicionar este site à zona** e então clicamos no botão **Adicionar**. Podemos fechar a tela clicando no botão **Fechar**:\n\n![](..\\..\\..\\images\\image2014-9-24%20151149.png)\n\n- É importante garantir que as configurações de **Autenticação do Usuário** estejam definidas para **Login automático** com o nome de usuário e senha atuais, para a **Intranet Local.** Para consultar esta tela, basta selecionar **Intranet Local** e clicar no botão **Nível personalizado:**\n\n![](..\\..\\..\\images\\image2014-9-24%20151257.png)\n\n##### Mozilla Firefox" }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n\nO Firefox deve ser configurado de uma maneira um pouco diferente:\n\n- Em primeiro lugar, precisamos digitar [about:config](http://aboutconfig/) na barra de endereços, para poder acessar as configurações do Firefox:\n\n**![](..\\..\\..\\images\\image2014-9-24%20142615.png)**\n\n- Uma mensagem de alerta normalmente é exibida. Para continuar, basta clicar no botão de confirmação. No nosso exemplo, o botão **Serei cuidadoso, prometo!**\n\n- As configurações de NTLM podem ser facilmente encontradas se digitarmos no campo **Localizar**, a palavra “ntlm”. Devemos manter as configurações como exibidas abaixo. A mais importante é **network.automatic-ntlm-auth.trusted-urls**, onde devemos informar a URL do servidor de autenticação remota:\n\n![](..\\..\\..\\images\\image2014-9-24%20143736.png)\n\n- **Feito isso, temos também o Firefox configurado para utilização da autenticação integrada com o Windows do fluig.**\n\n### Group Policies\n\n---\n\nConfigurar o navegador de alguns poucos usuários é uma tarefa simples, porém, o cliente terá problemas quando possui milhares de usuários a serem configurados.\n\nPara estes casos, podemos utilizar a estratégia de distribuição das configurações, baseadas na utilização de **Group Policies (GPO)**. Durante o procedimento de autenticação no domínio, pode ser executada uma série de tarefas automáticas, como por exemplo, configurar o navegador do usuário.\n\n##### Internet Explorer e Google Chrome" }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n\nO administrador deverá definir a seguinte configuração de GPO:\n\nConfiguração do Computador ► Modelos Administrativos ► Componentes do Windows ► Internet Explorer ► Painel de Controle da Internet ► Página Segurança:\n\n![](..\\..\\..\\images\\group%20policies%20ie1.png)\n\nApós habilitar a **Lista de Atribuições de Sites a Zonas**, o cliente deverá definir a URL do servidor de autenticação remota como **membro da Zona da Intranet**.\n\n![](..\\..\\..\\images\\group%20policies%20ie2.png)\n\nDesta forma, toda vez que um usuário membro do domínio efetuar o login, as configurações necessárias serão realizadas. Se executada todos os dias, a GPO também deve evitar que um usuário mais avançado desfaça as configurações necessárias para a autenticação remota.\n\n##### Mozilla Firefox" }, { "metadata": { "title": "Configurando Autenticação Integrada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=162170863", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Autenticação Integrada.md" }, "content": "Configurando Autenticação Integrada\n\n\nNo caso do navegador **Mozilla Firefox**, não existe maneira direta de configurar o navegador a partir da GPO, porém, existem scripts que realizam esta configuração, e estes scripts podem ser executados a partir de uma GPO.\n\nO administrador que desejar realizar as configurações no Firefox, poderá seguir a seguinte configuração:\n\nPara este procedimento será necessário desenvolver uma personalização que aplica as configurações no Firefox (script).\n\nConfiguração do Usuário ► Configurações do Windows ► Scripts (Logon/Logoff) ► Logon\n\n![](..\\..\\..\\images\\group%20policies%20firefox.png)\n\n# Opções de Arquitetura para Alta Disponibilidade\n\n---\n\nA autenticação remota pode utilizar uma arquitetura baseada em um único servidor. O problema é que neste cenário, se o script estiver off-line, o usuário não conseguirá autenticar na plataforma. O administrador deverá desabilitar a autenticação integrada na plataforma ou corrigir o que for necessário para que o script fique online.\n\nExiste uma opção onde podemos criar dois servidores de autenticação remota, o que fornece uma boa redundância do componente. Se um servidor estiver fora do ar, ou se uma aplicação estiver fora, o outro servidor assume a responsabilidade de manter online o serviço de autenticação remota.\n\nPara isso é necessário disponibilizar um *Load Balancer*que terá a responsabilidade de fazer o redirecionamento, caso um dos dois servidores de autenticação remota esteja off-line." }, { "metadata": { "title": "Configurando Propriedades do Sistema via JAVA_OPTS", "source": "https://tdn.totvs.com/display/fluig/Configurando+Propriedades+do+Sistema+via+JAVA_OPTS", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Propriedades do Sistema via JAVA_OPTS.md" }, "content": "Configurando Propriedades do Sistema via JAVA_OPTS" }, { "metadata": { "title": "Configurando Propriedades do Sistema via JAVA_OPTS", "source": "https://tdn.totvs.com/display/fluig/Configurando+Propriedades+do+Sistema+via+JAVA_OPTS", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurando Propriedades do Sistema via JAVA_OPTS.md" }, "content": "Configurando Propriedades do Sistema via JAVA_OPTS\n\n\n- [Objetivo](#ConfigurandoPropriedadesdoSistemaviaJAVA_OPTS-Objetivo)\n- [Introdução](#ConfigurandoPropriedadesdoSistemaviaJAVA_OPTS-Introdução)\n- [Localização](#ConfigurandoPropriedadesdoSistemaviaJAVA_OPTS-Localização)\n- [Configurando Propriedades do Sistema via JAVA\\_OPTS](#ConfigurandoPropriedadesdoSistemaviaJAVA_OPTS-ConfigurandoPropriedadesdoSistemaviaJAVA_OPTS)\n- [Observações](#ConfigurandoPropriedadesdoSistemaviaJAVA_OPTS-Observações)\n\n# Objetivo\n\n---\n\nEste guia visa mostrar ajustar o comportamento do servidor, utilizamos os arquivos de script que preparam o ambiente antes da execução do Java.\n\n# Introdução\n\n---\n\nO comportamento e a performance do Fluig são gerenciados através de scripts de configuração que preparam o ambiente da **Java Virtual Machine (JVM)** antes do servidor subir.\n\nEmbora o Fluig compartilhe a mesma lógica de negócio em diferentes plataformas, a forma como ele interage com o Sistema Operacional muda. Por isso, utilizamos os arquivos localizados em `/appserver/bin/` para definir as **Propriedades do Sistema** e parâmetros de memória. Estes arquivos garantem que as personalizações necessárias (como fuso horário, codificação de caracteres e limites de memória) sejam injetadas corretamente na variável `JAVA_OPTS` no momento da inicialização, garantindo a consistência do sistema tanto em ambientes **Windows** quanto **Linux**.\n\n# Localização\n\n---\n\nO arquivo de configuração reside no diretório de binários do servidor (/appserver/bin/). Em ambientes Linux, deve ser utilizado o arquivo standalone.conf. Já em windows, o arquivo standalone.conf.bat.\n\n| **Arquivo** | **Sistema Operacional** | **Formato** |\n| --- | --- | --- |\n| **`standalone.conf`** | Linux / Unix | Shell Script |\n| **`standalone.conf.bat`** | Windows | Batch Script |\n\n# Configurando Propriedades do Sistema via JAVA\\_OPTS\n\n---\n\nA variável **`JAVA_OPTS`** é um agrupador de parâmetros. Através dela, definimos as **Propriedades do Sistema** que o Java utilizará globalmente na aplicação. Sempre anexe sua configuração à variável existente para preservar as definições originais do Fluig.\n\n**No Linux (standalone.conf)**\n\n```\n# Exemplo: Definindo encoding como Propriedades do Sistema\nJAVA_OPTS=\"$JAVA_OPTS -Dfile.encoding=utf8\"\n```\n\n**No Windows (standalone.conf.bat)**\n\n```\n@rem Exemplo: Definindo encoding como Propriedades do Sistema\nset \"JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=utf8\"\n```\n\n# Observações\n\n---\n\n- **Sintaxe:** Toda Propriedade do Sistema deve ser precedida pelo prefixo `-D`.\n- **Memória:** Parâmetros como `-Xms` (mínimo) e `-Xmx` (máximo) também são inseridos no `JAVA_OPTS`, embora tecnicamente sejam flags de memória da JVM e não propriedades customizadas.\n- **Reinicialização:** Qualquer alteração nestes arquivos exige a **reinicialização** do Fluig para entrar em vigor." }, { "metadata": { "title": "Configurar ambiente Linux para não utilizar o usuário root", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=454453183", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurar ambiente Linux para não utilizar o usuário root.md" }, "content": "Configurar ambiente Linux para não utilizar o usuário root\n\n\n- [Objetivo](#ConfigurarambienteLinuxparanãoutilizarousuárioroot-Objetivo)\n- [Instalação/atualização da plataforma](#ConfigurarambienteLinuxparanãoutilizarousuárioroot-Instalação/atualizaçãodaplataforma)\n - [Usuário](#ConfigurarambienteLinuxparanãoutilizarousuárioroot-Usuário)\n - [Limites do usuário](#ConfigurarambienteLinuxparanãoutilizarousuárioroot-Limitesdousuário)\n - [Scripts](#ConfigurarambienteLinuxparanãoutilizarousuárioroot-Scripts)\n - [Inicialização da plataforma](#ConfigurarambienteLinuxparanãoutilizarousuárioroot-Inicializaçãodaplataforma)\n - [Inicialização do serviço de indexação](#ConfigurarambienteLinuxparanãoutilizarousuárioroot-Inicializaçãodoserviçodeindexação)\n - [Inicialização do serviço de Notificação em tempo Real](#ConfigurarambienteLinuxparanãoutilizarousuárioroot-InicializaçãodoserviçodeNotificaçãoemtempoReal)\n- [Permissões](#ConfigurarambienteLinuxparanãoutilizarousuárioroot-Permissões)\n- [Executando serviços em portas protegidas](#ConfigurarambienteLinuxparanãoutilizarousuárioroot-Executandoserviçosemportasprotegidas)\n\n# Objetivo\n\n---\n\nAbaixo é apresentado um guia sobre como alterar as permissões e scripts para executar a plataforma e os serviços com um **usuário fluig**.\n\nNota:\n\nPor conta da instalação dos serviços, o **processo de instalação** do TOTVS Fluig **deve ser** feito utilizando o **usuário root** e deve ser feito um **primeiro start** também utilizando o **usuário root**.\n\nNota:\n\nEstas alterações serão desfeitas após o processo de atualização.\n\n# Instalação/atualização da plataforma\n\n---\n\nProceda a instalação ou atualização conforme o processo padrão que exige o usuário **root**. Para conferir os passos necessários, acesse [Instalação da plataforma no Linux - Instalador](../../Instalação e Atualização/Guia de instalação da plataforma/Instalação da plataforma no Linux - Instalador.md).\n\n## Usuário" }, { "metadata": { "title": "Configurar ambiente Linux para não utilizar o usuário root", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=454453183", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurar ambiente Linux para não utilizar o usuário root.md" }, "content": "Configurar ambiente Linux para não utilizar o usuário root\n\n\n---\n\nSiga o procedimento abaixo para criar o usuário fluig. Utilize o comando abaixo:\n\n```\n$ sudo useradd --system --shell /bin/false fluig\n```\n\nEsse é um usuário de sistema, portanto não possuí senha ou interpretador de comando, logo não é possível realizar o login através dele. Porém se precisar realizar alguma atividade com o login fluig utilize o comando **sudo** no formato abaixo:\n\n```\n$ sudo -u fluig \n```\n\n## Limites do usuário\n\n---\n\nComo o usuário criado não é mais o administrador, são definidos automaticamente alguns limites de recursos, que precisam ser expandidos, para tal edite o arquivo **/etc/security/limits.conf** e insira as linhas abaixo:\n\n```\nfluig hard nofile 500000\nfluig soft nofile 500000\n```\n\nLembrando que esse é um valor sugerido, em alguns casos o valor precisa ser aumentado, pois uma mensagem no *log* **\"too many open files\"** irá indicar que o valor limite de arquivos aberto não é suficiente.\n\n## Scripts\n\n---\n\nPara a utilização do usuário adequado é necessário modificar os scripts de inicialização:\n\n### Inicialização da plataforma" }, { "metadata": { "title": "Configurar ambiente Linux para não utilizar o usuário root", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=454453183", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurar ambiente Linux para não utilizar o usuário root.md" }, "content": "Configurar ambiente Linux para não utilizar o usuário root\n\n\n- Altere o arquivo **[diretório\\_instalação]/appserver/bin/service/wildfly.conf**, substitua o valor da variável **JBOSS\\_USER** por **fluig**, e.g:\n\n```\nJBOSS_USER=fluig\n```\n\nSomente para a atualização Voyager (2.0) ou superiores:\n\n- Se você utiliza a atualização **Voyager (2.0)** ou **superior** e o seu ambiente utiliza **systemd**, faça também o passo abaixo:\n - Altere o arquivo **/etc/systemd/system/fluig.service**  (ou dependendo **/etc/init.d/fluig**), substituindo o valor das variáveis **User** com valor **fluig**, e.g.:\n\n ```\n User=fluig\n ```\n - Caso for instaldo o serviço fluig na porta abaixo de 1024 e sem proxy reverso, por exemplo na porta 80, precisa adicionar a variável **AmbientCapabilities** com o valor **CAP\\_NET\\_BIND\\_SERVICE** abaixo da variável **User:**\n\n ```\n User=fluig\n AmbientCapabilities=CAP_NET_BIND_SERVICE\n ```\n - Em seguida, execute este comando no terminal:\n\n ```\n sudo systemctl daemon-reload\n ```\n\n### Inicialização do serviço de indexação\n\n- Altere o arquivo **/etc/init.d/fluig\\_Indexer**, substitua o valor da variável RUNAS para **fluig**, e.g:\n\n```\nRUNAS=\"fluig\"\n```\n\n- No final do arquivo, substitua o bloco abaixo:\n\n```\nif [ -n \"$RUNAS\" ]; then\n su -c \"SOLR_INCLUDE=\\\"$SOLR_ENV\\\" \\\"$SOLR_INSTALL_DIR/bin/solr\\\" $SOLR_CMD\" - \"$RUNAS\"\nelse\n SOLR_INCLUDE=\"$SOLR_ENV\" \"$SOLR_INSTALL_DIR/bin/solr\" $SOLR_CMD\nfi\n```\n\n- pela linha a seguir:\n\n```\nsudo -u \"$RUNAS\" SOLR_INCLUDE=\"$SOLR_ENV\" \"$SOLR_INSTALL_DIR/bin/solr\" $SOLR_CMD\n```\n\n- Altere o arquivo **[diretório\\_instalação]/solr/bin/solr**, substituindo a linha abaixo:\n\n```\nrunning=$(lsof -t -PniTCP:$SOLR_PORT -sTCP:LISTEN || :)\nif [ -z \"${running:-}\" ]; then\n```\n\n- pela linha a seguir:\n\n```\nrunning=$(get_info | grep \"\\\"solr_home\\\":\\\"$SOLR_HOME\\\"\" > /dev/null)\nif [ \"${running:-}\" ]; then\n```\n\n### Inicialização do serviço de Notificação em tempo Real" }, { "metadata": { "title": "Configurar ambiente Linux para não utilizar o usuário root", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=454453183", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurar ambiente Linux para não utilizar o usuário root.md" }, "content": "Configurar ambiente Linux para não utilizar o usuário root\n\n\n- Altere o arquivo **/etc/systemd/system/fluig\\_RealTime.service** (ou dependendo **/etc/init.d/fluig\\_RealTime**):\n\n- Substitua o valor da variável **User** por **fluig**, e.g.:\n\n ```\n User=fluig\n ```\n- Caso for instalado o serviço fluig\\_RealTime na porta abaixo de 1024 e sem proxy reverso, por exemplo na porta 77, precisa adicionar a variável **AmbientCapabilities** com o valor **CAP\\_NET\\_BIND\\_SERVICE** abaixo da variável **User:**\n\n ```\n User=fluig\n AmbientCapabilities=CAP_NET_BIND_SERVICE\n ```\n- Em seguida, execute este comando no terminal:\n\n ```\n sudo systemctl daemon-reload\n ```\n\n- Substitua a linha:\n\n```\nCNT=`ps -p $PID -o comm= | wc -l`\n```\n\n- pela linha abaixo:\n\n```\nCNT=`sudo -u fluig ps -p $PID -o comm= | wc -l`\n```\n\n- e substitua a linha:\n\n```\nnohup $NODE_HOME/bin/node /fluig/dev/node/bin/fluig.rt >> $LOG 2>&1 &\n```\n\n- pela linha abaixo:\n\n```\nsudo -u fluig nohup $NODE_HOME/bin/node /fluig/dev/node/bin/fluig.rt >> $LOG 2>&1 &\n```\n\n# Permissões\n\n---\n\nPara que os serviços consigam acessar os arquivos é necessário que o usuário fluig tenha acesso nos seguintes locais:\n\n- Instalação da plataforma (ex: **/opt/fluig/\\***)\n - Mude o dono de forma recursiva (-R) para o usuário **fluig**\n\n ```\n sudo chown -R fluig:fluig /opt/fluig\n sudo chmod -R 755 /opt/fluig\n ```\n\n- Volume de dados (ex: **/opt/volume/\\***)\n - Mude o dono de forma recursiva (-R) para o usuário **fluig**\n\n ```\n sudo chown -R fluig:fluig /opt/fluig\n sudo chmod -R 755 /opt/fluig\n ```\n\n# Executando serviços em portas protegidas\n\n---\n\nAlguns sistemas operacionais Linux impedem que um usuário sem permissões administrativas utilize portas abaixo de 1024, isso impede por exemplo que o **fluig** aceite conexões na porta 80 e 443.\n\nIsso pode ser mitigado de 2 formas:\n\n- Usar uma ferramenta para realizar a tarefa de redirecionar as requisições para o fluig, como um **[proxy reverso](Proxy reverso.md)** **(recomendado)**.\n- Utilizar ferramentas de acordo com a distribuição, como por exemplo: **ufw** ou **firewall-cmd** ou **iptables**.\n - **Ubuntu Server 16.04 a 24.04**\n - Execute os comandos abaixo para liberar a porta 80 (fluig) e 7777 (fluig\\_RealTime):\n\n ```\n sudo ufw allow 80/tcp\n sudo ufw allow 7777/tcp\n ```\n - **Oracle Linux 7.x a 8.7 e 9.5 / CentOS 7.0 a 7.5 / Red Hat Enterprise Linux 9.5**\n - Execute os comandos abaixo para liberar a porta 80 (fluig) e 7777 (fluig\\_RealTime):\n\n ```\n sudo firewall-cmd --permanent --add-port=80/tcp\n sudo firewall-cmd --permanent --add-port=7777/tcp\n sudo firewall-cmd --reload\n\n # Caso o serviço do firewalld esteja parado, execute:\n sudo systemctl enable firewalld\n sudo systemctl start firewalld\n ```\n - **Oracle Linux 6.4 a 8.7 / CentOS 6.4 a 6.10 / Red Hat Enterprise Linux 6.4 a 8.7** \n - Execute os comandos abaixo para liberar a porta 80 (fluig) e 7777 (fluig\\_RealTime):\n\n ```\n sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT\n sudo iptables -I INPUT -p tcp --dport 7777 -j ACCEPT\n sudo service iptables save\n ```" }, { "metadata": { "title": "Configuração de autenticação utilizando LDAP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623389", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração de autenticação utilizando LDAP.md" }, "content": "Configuração de autenticação utilizando LDAP" }, { "metadata": { "title": "Configuração de autenticação utilizando LDAP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623389", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração de autenticação utilizando LDAP.md" }, "content": "Configuração de autenticação utilizando LDAP\n\n\nFique atento!\n\nEsta página é válida a partir da atualização **Voyager (2.0)** do TOTVS Fluig.\n\nSe você utiliza uma atualização anterior, acesse [Como configurar autenticação utilizando LDAP da atualização **1.6 até 1.8.2**](https://tdn.totvs.com/pages/viewpage.action?pageId=940288430).\n\n- [Objetivo](#ConfiguraçãodeautenticaçãoutilizandoLDAP-Objetivo)\n- [Configuração](#ConfiguraçãodeautenticaçãoutilizandoLDAP-Configuração)\n - [Autenticação do usuário wcmadmin após a configuração de autenticação LDAP](#ConfiguraçãodeautenticaçãoutilizandoLDAP-AutenticaçãodousuáriowcmadminapósaconfiguraçãodeautenticaçãoLDAP)\n - [Cadastro dos usuários](#ConfiguraçãodeautenticaçãoutilizandoLDAP-Cadastrodosusuários)\n- [Propriedades de busca LDAP](#ConfiguraçãodeautenticaçãoutilizandoLDAP-PropriedadesdebuscaLDAP)\n - [Definindo pesquisa por papel (Defining Role Search)](#ConfiguraçãodeautenticaçãoutilizandoLDAP-Definindopesquisaporpapel(DefiningRoleSearch))\n - [Definindo pesquisa DN (Defining DN Search)](#ConfiguraçãodeautenticaçãoutilizandoLDAP-DefinindopesquisaDN(DefiningDNSearch))\n\n# Objetivo\n\n---\n\nO objetivo deste guia é orientar o administrador sobre como configurar a plataforma para permitir acesso dos usuários através das credenciais existentes em um diretório, como o Active Directory, via protocolo LDAP (*Lightweight Directory Access Protocol*).\n\nUma vez realizada a configuração, os usuários deverão informar os dados de acesso do LDAP (usuário/senha) na tela de *login* para acessar a plataforma.\n\n# Configuração\n\n---\n\n**01.** Edite o arquivo **standalone.xml** localizado na pasta [diretório\\_instalação]\\appserver\\standalone\\configuration.\n\n**02.** Localize e substitua o trecho abaixo:\n\n**standalone.xml**\n\n```\n\n\t\n\t\n\t\n\n\n\t\n\t\n\n```\n\n**03.** Informe os dados de acesso à fonte de dados LDAP, conforme o tipo de validação utilizado em seu Active Diretory:\n\n- Caso seja utilizado o LDAP com necessidade de credencial, deve-se possuir as credenciais de um usuário válido e com permissão de consulta no diretório LDAP (Active Directory).\n\n- Os dados de acesso devem ser informados nas propriedades **java.naming,security.principal** (*login*) e **bindCredential** (senha encriptada - veja abaixo como gerar a senha encriptada), após substituir pelo trecho abaixo.\n\n**standalone.xml**\n\n```\n\n\t\n\t\n\n\n\t\n :/\"/> \n \n \n @\"/> \n   \" />\n \n \n \n \"/> \n \"/> \n \n \n \n\n```\n\nImportante!\n\nO TOTVS Fluig precisa estar atualizado com os pacotes [1.8.1-230718](https://tdn.totvs.com/x/VohjLQ), [1.8.0-230718](https://tdn.totvs.com/x/3QR2KQ) ou superior para o funcionamento da senha criptografada.\n\n**Utilização do LDAPS**\n\n---\n\nSe for utilizado o LDAPS – que é uma extensão do protocolo LDAP – é necessário ajustar os parâmetros **java.naming.provider.url** para **ldaps** com a porta **SSL** e o **java.naming.security.protocol** para o valor **ssl**, conforme o exemplo abaixo:\n\n**standalone.xml**\n\n```\n\n\t\n\t\n\n\n\t\n   :/\"/> \n \n     \n @\"/> \n   \" />\n \n \n \n \"/> \n \"/> \n \n \n \n\n```\n\nImportante!\n\nPode ser que seja necessário importar o certificado utilizado no LDAPS para o Cacerts.\n\n**Encriptação da senha LDAP**\n\n---\n\nNessa etapa, a senha LDAP é encriptada usando o método principal da classe **SecureIdentityLoginModule**, passando como parâmetro a senha em texto plano do LDAP utilizado. Para fazer a configuração, siga os passos abaixo:\n\n- Navegue até a pasta raiz de instalação, e acesse a pasta **appserver.**\n\n**Linux**              ==> /opt/fluig/appserver\n\n**Windows**        ==> c:\\fluig\\appserver\n\n- Gere a senha encriptada.\n\n**Linux**\n\n```\n../jdk-64/bin/java -cp modules/system/layers/base/org/jboss/logging/main/jboss-logging-3.3.0.Final.jar:modules/system/layers/base/org/picketbox/main/picketbox-5.0.3.Final.jar org.picketbox.datasource.security.SecureIdentityLoginModule senha#do#LDAP@123!\n```\n\n**Windows**\n\n```\njava -cp modules/system/layers/base/org/picketbox/main/picketbox-5.0.3.Final.jar org.picketbox.datasource.security.SecureIdentityLoginModule senha#do#LDAP@123!\n```\n\nImportante!\n\nNeste caso, **senha#do#LDAP@123!** será a senha de acesso ao LDAP e o resultado será:\n\n**Encoded password: -73d03118655333edd11db66184fee4f35a6d08d87b9a0393**\n\n- Caso seja utilizado o LDAP com necessidade de credencial, deve-se possuir as credenciais de um usuário válido e com permissão de consulta no diretório LDAP (Active Directory).\n\n- Os dados de acesso devem ser informados nas propriedades **java.naming,security.principal** (*login*) e **java.naming,security.credentials** (senha), após substituir pelo trecho abaixo.\n\n**standalone.xml**\n\n```\n\n\t\n\t\n\n\n\t\n :/\"/> \n \n \n @\"/> \n \"/> \n \n \n \n \"/> \n \"/> \n \n \n \n\n```\n\n- Caso seja utilizado a forma de validação direta, sem necessidade credencial, substitua pelo trecho abaixo:\n\n**standalone.xml**\n\n```\n\n\t\n\t\n\n\n \n :/\"/>\n \n \n \n \"/>\n \"/>\n \n \n \n \n\n```\n\nDica!\n\nCaso opte por utilizar o login combinado, ou seja, deseja permitir tanto o acesso através do login/senha do Active Directory quanto da plataforma, **altere o valor da propriedade** ***loginCombinedWithDatabase para \"true\"**.* Assim o usuário poderá utilizar ambos os tipos de credenciais para autenticar-se na plataforma." }, { "metadata": { "title": "Configuração de autenticação utilizando LDAP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623389", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração de autenticação utilizando LDAP.md" }, "content": "Configuração de autenticação utilizando LDAP\n\n## Autenticação do usuário wcmadmin após a configuração de autenticação LDAP\n\n---\n\nNo arquivo **standalone****.xml**, quando configurada a autenticação via LDAP é informado o parâmetro:\n\n```\n\n```\n\nQuando definido como *false*, este parâmetro indica que o login funciona apenas com a senha do *Active Directory* e não funcionará com a senha que há na base. Como o **wcmadmin** é um usuário apenas da plataforma, ele não existe no AD.\n\nHá duas formas para corrigir a situação:\n\n**01**. Criar um usuário com o campo login do AD igual a 'wcmadmin' e senha de sua preferência, assim a plataforma irá logar o usuário wcmadmin igual aos demais usuários, através do AD.\n\n**02**. Alterar o parâmetro *\"loginCombinedWithDatabase\"* no arquivo **standalone.xml** (que fica no diretório **\\appserver\\standalone\\configuration**) para '*true*'. Com isso, a plataforma irá permitir o login tanto com a senha da base de dados quanto com a senha do AD. Nesse caso o usuário wcmadmin irá se logar com a senha da base de dados normalmente. Demais usuários que tentarem se logar com a senha da base de dados também conseguirão.\n\n## Cadastro dos usuários\n\n---\n\nPara que o usuário consiga acessar a plataforma utilizando LDAP, seu *login* deverá ser criado na plataforma utilizando o padrão do Active Directory (AD) configurado. Por exemplo, considere o login e e-mail abaixo:\n\n- ***Login***: nome.sobrenome\n\n- ***E-mail***: [nome.sobrenome@suaempresa.com](mailto:nome.sobrenome@fluig.com)\n\nO *login* e o *e-mail* do usuário no AD deverão ser **iguais** ao *login* e *e-mail* deste usuário cadastrados na plataforma. Não há necessidade da senha do usuário na plataforma ser igual à cadastrada no AD.\n\n# Propriedades de busca LDAP\n\n---" }, { "metadata": { "title": "Configuração de serviços de componentes", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=267788666", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração de serviços de componentes.md" }, "content": "Configuração de serviços de componentes" }, { "metadata": { "title": "Configuração de serviços de componentes", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=267788666", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração de serviços de componentes.md" }, "content": "Configuração de serviços de componentes\n\n\n- 1 [Objetivo](#Configuraçãodeserviçosdecomponentes-Objetivo)\n- 2 [Configuração dos serviços](#Configuraçãodeserviçosdecomponentes-Configuraçãodosserviços)\n- 3 [Configurar os componentes do pacote Microsoft® Office](#Configuraçãodeserviçosdecomponentes-ConfiguraroscomponentesdopacoteMicrosoft®Office)\n- 4 [Configuração dos componentes 32 bits](#Configuraçãodeserviçosdecomponentes-Configuraçãodoscomponentes32bits)\n- 5 [Forçando a configuração do usuário através da GPO (Group Policy).](#Configuraçãodeserviçosdecomponentes-ForçandoaconfiguraçãodousuárioatravésdaGPO(GroupPolicy).)\n- 6 [Possíveis problemas](#Configuraçãodeserviçosdecomponentes-Possíveisproblemas)\n\n \n\n# Objetivo\n\n---\n\nO objetivo desse guia é apresentar os procedimentos necessários para a configuração dos serviços de componentes, neste caso os softwares do pacote Microsoft® Office, assim como o Word®, PowerPoint® e Excel®, na utilização de forma integrada com o TOTVS Fluig Plataforma.\n\nEste recurso é utilizado em algumas situações como:\n\n1. [Conversores de Documentos](../Conversores de Documentos.md)\n2. [Impressão de Cópia Controlada](../../Recurso de Documentos (ECM).md)/Impressão de cópia controlada.md)\n\nEssa configuração deve ser feita no servidor da plataforma. O sistema operacional deve ser Microsoft Windows. Para verificar as versões homologadas, acesse a [Matriz de Portabilidade](http://tdn.totvs.com/x/_ApbB).\n\n# Configuração dos serviços\n\n---\n\nNeste caso algumas configurações devem ser feitas no serviço do Fluig:\n\n- Na tela de Serviços do Windows® é necessário acessar as propriedades do serviço FLUIG, conforme imagem abaixo:\n\n![](..\\..\\..\\images\\image2013-9-24%2018038.png)\n\n- É preciso configurar um usuário administrador para execução do serviço. Certifique-se que este usuário tenha **controle total** sobre os diretórios do volume.\n\n![](..\\..\\..\\images\\cali%20image1.png)\n\n- Na tela de Serviços do Windows® também é necessário que o serviço *Spooler* de Impressão esteja iniciado nas máquinas onde será realizada a impressão:\n\n![](..\\..\\..\\images\\image2013-9-25%20142552.png)\n\n# Configurar os componentes do pacote Microsoft® Office\n\n---\n\nTambém será preciso executar o programa de Serviços de Componente do Windows®. Este programa é responsável pela gestão de componentes de integração COM dentro do Windows®.\n\nAcesse o Executar (Win + R) ou *prompt* do sistema operacional e digite: **dcomcnfg**.\n\nNeste programa execute os seguintes passos para configurar arquivos Microsoft® Excel, Microsoft® Word e Microsoft® PowerPoint:\n\n- Expanda a opção **Serviços de Componente**\n- Expanda a opção **Computadores**\n- Expanda a opção **Meu Computador**\n- Clique no item **Config DCOM**.\n\n![](..\\..\\..\\images\\cali%20image2.png)\n\nNa listagem de componentes exibida no painel central, procure pelos componentes:\n\n1. Microsoft Excel Application;\n2. Documento do Microsoft Word 97 - 2003;\n3. Aplicativo do Microsoft PowerPoint.\n\nClique sobre o componente em questão com o botão direito do *mouse* e selecione **Propriedades**:\n\nImportante!\n\nRepetir as mesmas permissões de acesso para os três componentes (Word®, Excel® e PowerPoint®).\n\n![](..\\..\\..\\images\\4.png)\n\nSelecione a aba Identidade e escolha a opção **O usuário interativo.**\n\nEm alguns casos esta opção não atende o problema, sendo recomendado portanto selecionar **Este usuário** e definir o mesmo usuário responsável por iniciar o serviço do Fluig.\n\n![](..\\..\\..\\images\\cali%20image3.png)\n\nNa aba Segurança selecione a opção **Personalizar** para todos os tipos de segurança.\n\nClique também em **Editar** e adicione o grupo **Todos** em cada uma das permissões:\n\n![](..\\..\\..\\images\\cali%20image4.png)\n\nApós adicionar o grupo **Todos**, atribuir a opção **Permitir** para todas as permissões possíveis, conforme imagens abaixo:\n\n1. Permissão de Acesso:\n 1. Acesso Local e Acesso remoto\n2. Permissão de Início e Ativação\n 1. Início Local e Início Remoto\n 2. Ativação Local e Ativação Remota\n3. Alterar Permissão de Configuração\n 1. Controle total\n 2. Ler\n\n![](..\\..\\..\\images\\config%20servicos.PNG)\n\nNa aba Local desmarque todas as opções da tela.\n\n![](..\\..\\..\\images\\image2017-10-16_14-31-28.png)\n\nApós realizar os passos anteriores, efetuar um teste de impressão.\n\nCaso a impressão não funcione corretamente com todas as opções desmarcadas, marque a opção **Executar o aplicativo neste computador** e faça um novo teste.\n\n![](..\\..\\..\\images\\Captura%20de%20tela%20de%202020-07-20%2013-51-41.png)\n\nDica\n\nCaso tenha interesse que o Serviço de Componentes sempre seja exibido no Console, é necessário salvar estas configurações utilizando a opção Salvar e informando um diretório para armazenar o arquivo **console.msc**. Ao executar o Console de Gerenciamento novamente, abra este arquivo.\n\n# Configuração dos componentes 32 bits\n\n---\n\nImportante!\n\nEm algumas máquinas com sistemas operacionais 64 bits, os componentes do Microsoft® Office não são criados no Serviços de Componente para 64 bits, e sim no de 32 bits. Siga os próximos passos para realizar esta configuração.\n\n- Para visualizar os Serviços de Componente de 32 bits, execute o Console de Gerenciamento para 32 bits:\n\n![](..\\..\\..\\images\\1.png)\n\n- Adicionar o Serviços de Componente ao Console de Gerenciamento, conforme imagens abaixo:\n\n![](..\\..\\..\\images\\Captura_sem_t%C3%ADtulo_082715_111700_AM.jpg)\n\n1. Selecione na lista de Snap-ins disponíveis, o Serviços de Componente;\n2. Adicione o Snap-in selecionado;\n3. Clique em OK;\n4. Volte para o tópico anterior e efetue os passos para configuração do pacote Microsoft® Office.\n\n![](..\\..\\..\\images\\cali%20box%204.png)\n\n# Forçando a configuração do usuário através da GPO (Group Policy).\n\n---\n\nEm caso de instalação do pacote Microsoft® Office através de GPO (*Grupo Policy*) no servidor de aplicação, deve-se observar a necessidade de inclusão do usuário neste procedimento.\n\nPara isto, é preciso seguir os passos abaixo para que o usuário não seja mais removido na instalação.\n\n- Após configurar o usuário e senha na DCOM (Serviços de Componentes), conforme imagem abaixo:\n\n![](..\\..\\..\\images\\user%20dcom.png)\n\n- O Windows® salva o usuário em uma regra nas Diretivas de Segurança Local, que podem ser acessadas conforme imagem abaixo:\n\n![](..\\..\\..\\images\\acessar%20diretivas%20locais.png)\n\n- O Windows® salva o usuário em uma regra nas Diretivas de Segurança Local, que podem ser acessadas conforme imagem abaixo:\n\n![](..\\..\\..\\images\\local%20antes%20da%20gpo.png)\n\n- Após aplicação forçada da GPOs, atualizando as permissões do servidor de aplicação, conforme imagem abaixo.\n\n![](..\\..\\..\\images\\aplica%C3%A7%C3%A3o%20da%20GPO.png)\n\n- Após este processo, pode-se perder o usuário nesta regra, conforme é exibido na imagem abaixo, automaticamente afetando a utilização dos pacotes do Microsoft® Office\n\n![](..\\..\\..\\images\\local%20depois%20da%20gpo.png)\n\nImportante!\n\nPara solução deste problema, basta incluir na GPO o usuário responsável por subir os componentes, que no caso foi informado, conforme a imagem do Passo 1 deste tutorial.\n\n# Possíveis problemas\n\n---\n\n\n\n- É importante conferir qual usuário está iniciando o software do pacote Microsoft® Office, neste caso deve ser o mesmo que está configurado para iniciar o serviço do Fluig.\n\n- Para isto, é utilizado o gerenciador de tarefas, na aba de \"Processos\", conforme imagem abaixo:\n\nImportante!\n\nO processo normalmente deve subir e descer de forma rápida, em torno de 4 segundos, conforme é feito a requisição pelo Fluig.\n\nEm caso do processo ficar preso muito mais tempo que isso pode ocasionar outros problemas no Fluig, como calculo do CRC do documento, gerando o erro \"Documento modificado externamente\" ao visualizar o mesmo.\n\n![](..\\..\\..\\images\\processo%20word.png)\n\n- Observar se não há outros usuários logados no servidor de aplicação que podem estar causando conflitos no momento que o Fluig utilizar os componentes do Microsoft® Office, isto pode ser visto através do gerenciador de tarefas, na aba \"Usuários\" conforme imagem abaixo:\n\nImportante!\n\nNo caso do servidor possuir outros usuários logados e principalmente com algum software do pacote Microsoft® Office aberto, deverá ser finalizado a respectiva sessão.\n\n![](..\\..\\..\\images\\usu%C3%A1rios%20logados%20no%20servidor.png)" }, { "metadata": { "title": "Configuração do fluig cache com Redis", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=205917413", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração do fluig cache com Redis.md" }, "content": "Configuração do fluig cache com Redis" }, { "metadata": { "title": "Configuração do fluig cache com Redis", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=205917413", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração do fluig cache com Redis.md" }, "content": "Configuração do fluig cache com Redis\n\n\nAtenção!\n\nAs informações desta página são válidas para as atualizações 1.6.2 e inferiores.\n\n**Mantenha sua plataforma atualizada!** À partir da atualização Snowflake (1.6.3), o controle e sincronização do cache do fluig é realizado através do banco de dados que, além de já ter uma conexão direta com o fluig em casos de instalações simples, também é compartilhado entre todos os nós (cluster) em casos de balanceamento de carga e alta disponibilidade.\n\nCaso possua uma atualização 1.5.5 ou inferior do fluig acesse: [Como configuro o fluig Cache com Redis?](https://tdn.totvs.com/pages/viewpage.action?pageId=224124188)\n\n# Índice\n\n- 1 [Sobre o Redis](#ConfiguraçãodofluigcachecomRedis-SobreoRedis)\n- 2 [Pré requisito](#ConfiguraçãodofluigcachecomRedis-Prérequisito)\n- 3 [Download do Redis](#ConfiguraçãodofluigcachecomRedis-DownloaddoRedis)\n- 4 [Instalação do Redis em Modo Single-Server](#ConfiguraçãodofluigcachecomRedis-InstalaçãodoRedisemModoSingle-Server)\n - 4.1 [Instalação do Redis como Serviço em Linux](#ConfiguraçãodofluigcachecomRedis-InstalaçãodoRediscomoServiçoemLinux)\n - 4.2 [Instalação do Redis como Serviço em Windows](#ConfiguraçãodofluigcachecomRedis-InstalaçãodoRediscomoServiçoemWindows)\n- 5 [Configurando o Redis para uso com o fluig](#ConfiguraçãodofluigcachecomRedis-ConfigurandooRedisparausocomofluig)\n - 5.1 [Memória](#ConfiguraçãodofluigcachecomRedis-Memória)\n - 5.2 [Persistência](#ConfiguraçãodofluigcachecomRedis-Persistência)\n - 5.3 [Arquivo PID](#ConfiguraçãodofluigcachecomRedis-ArquivoPID)\n- 6 [Configurando o fluig para usar o Redis como Cache](#ConfiguraçãodofluigcachecomRedis-ConfigurandoofluigparausaroRediscomoCache)\n- 7 [Configurando o Redis em Ambientes de Alta Disponibilidade com Tolerância a Falhas](#ConfiguraçãodofluigcachecomRedis-ConfigurandooRedisemAmbientesdeAltaDisponibilidadecomTolerânciaaFalhas)\n - 7.1 [Master](#ConfiguraçãodofluigcachecomRedis-Master)\n - 7.2 [Slaves](#ConfiguraçãodofluigcachecomRedis-Slaves)\n - 7.3 [Sentinel](#ConfiguraçãodofluigcachecomRedis-Sentinel)\n- 8 [Instalando o Sentinel como serviço no Windows](#ConfiguraçãodofluigcachecomRedis-InstalandooSentinelcomoserviçonoWindows)\n- 9 [Executar o Redis Sentinel em Servidor Linux](#ConfiguraçãodofluigcachecomRedis-ExecutaroRedisSentinelemServidorLinux)\n- 10 [Configurando o fluig para usar o Redis Cluster com Sentinel como cache](#ConfiguraçãodofluigcachecomRedis-ConfigurandoofluigparausaroRedisClustercomSentinelcomocache)\n\n# Sobre o Redis\n\n---\n\nO Redis é um banco de dados NoSQL *open source* do modelo chave-valor em memória, que possui [licenciamento BSD](http://redis.io/topics/license) e pode ser utilizado como *cache* para o fluig. Ele possui funcionalidades extras como a possibilidade de ser utilizado em *cluster* com tolerância a falhas (*failover*).\n\nSite oficial: \n\n© Redis, *and the* Redis *logo are the trademarks of Salvatore Sanfilippo in the U.S. and other countries*.\n\n# Pré requisito\n\n---\n\n- Ter o Redis instalado na máquina ou realizar o download do instalador nos links abaixo conforme o sistema operacional da máquina.\n\n# Download do Redis\n\n---\n\n- O *download* do instalador do Redis para Linux pode ser realizado [neste link](http://redis.io/download).\n\n- O *download* do instalador do Redis para Windows pode ser realizado [neste link](https://github.com/MSOpenTech/redis/releases).\n\n# Instalação do Redis em Modo Single-Server\n\n---\n\nO modo *single-server* significa que apenas um processo do Redis está no ar. Mesmo neste modo ele pode atender mais de um servidor fluig, porém será considerado um ponto de falha." }, { "metadata": { "title": "Configuração do fluig cache com Redis", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=205917413", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração do fluig cache com Redis.md" }, "content": "Configuração do fluig cache com Redis\n\n## Instalação do Redis como Serviço em Linux\n\n---\n\nVerifique também a [documentação oficial](https://redis.io/topics/quickstart).\n\nA forma sugerida de instalar o Redis em Linux é compilá-lo a partir dos fontes, pois não há outras dependências além do compilador GCC e da biblioteca libc.\n\n```\nwget http://download.redis.io/redis-stable.tar.gz\ntar xvzf redis-stable.tar.gz\ncd redis-stable\nmake\nmake install\n```\n\nVamos supor que você já copiou os executáveis *redis-server* e *redis-cli* em /usr/local/bin ou executou o comando *make install.*\n\nCrie os seguintes diretórios:\n\n```\nsudo mkdir /etc/redis\nsudo mkdir /var/redis\n```\n\nCopie o script de inicialização disponibilizado no diretório utils para /etc/init.d. Sugerimos renomeá-lo com o nome da porta onde você está executando esta instância do Redis.\n\n```\nsudo cp utils/redis_init_script /etc/init.d/redis_6379\n```\n\nEdite o *script* de inicialização. Certifique-se de modificar o REDISPORT de acordo com a porta que você está usando. Tanto o caminho do arquivo pid quanto o nome do arquivo de configuração dependem do número da porta.\n\n```\nsudo vi /etc/init.d/redis_6379\n```\n\nCopie o arquivo de configuração modelo encontrado no diretório raiz da distribuição Redis em /etc/redis/ utilizando o número da porta como nome:\n\n```\nsudo cp redis.conf /etc/redis/6379.conf\n```\n\nCrie um diretório dentro de /var/redis que funcionará como os dados e diretório de trabalho para esta instância Redis:\n\n```\nsudo mkdir /var/redis/6379\n```\n\nEdite o arquivo de configuração:\n\n- Defina o pidfile para /var/run/redis\\_6379.pid (modificar a porta se necessário).\n\n- Altere a porta em conformidade. No nosso exemplo não é necessário, pois a porta padrão já é 6379.\n\n- Defina o seu loglevel preferido.\n\n- Defina o arquivo de log para /var/log/redis\\_6379.log\n\n- Definir o dir para /var/redis/6379 (passo muito importante!)\n\n## Instalação do Redis como Serviço em Windows" }, { "metadata": { "title": "Configuração do fluig cache com Redis", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=205917413", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração do fluig cache com Redis.md" }, "content": "Configuração do fluig cache com Redis\n\n\n---\n\nVerifique também a [documentação oficial](https://raw.githubusercontent.com/MSOpenTech/redis/3.0/Windows%20Service%20Documentation.md).\n\nExecute o seguinte comando:\n\n```\nredis-server.exe --service-install --service-name fluigcache redis.windows.conf\n```\n\n# Configurando o Redis para uso com o fluig\n\n---\n\n### Memória\n\nProcure no arquivo de configuração, o parâmetro *maxmemory* e certifique-se de configurar para o tamanho máximo desejado, caso contrário, podem ocorrer problemas de falta de memória.\n\n```\nmaxmemory 1g\n```\n\nObservação\n\nSe estiver sendo utilizada a versão 2.8 do Redis com o Windows, configure também o parâmetro *maxheap*.\n\n### Persistência\n\nPara que o Redis não salve um *snapshot* da memória periodicamente, procure as linhas iniciadas com a palavra *\"save\"* no arquivo de configuração...\n\n**Exemplo do config padrão para windows**\n\n```\nsave 900 1\nsave 300 10\nsave 60 10000\n```\n\n...e altere-as para:\n\n```\n# save 900 1\n# save 300 10\n# save 60 10000\nsave \"\"\n```\n\n### Arquivo PID" }, { "metadata": { "title": "Configuração do fluig cache com Redis", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=205917413", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração do fluig cache com Redis.md" }, "content": "Configuração do fluig cache com Redis\n\n\nPara que o Redis grave um arquivo com o PID, defina o seguinte parâmetro:\n\n```\ndaemonize yes\n```\n\n# Configurando o fluig para usar o Redis como Cache\n\n---\n\nA configuração do servidor Redis no fluig pode ser realizada das seguintes formas:\n\n- Arquivo configuration.properties, localizado em [Instalação fluig]\\repository\\wcmdir\\config. Deve ser alterada a propriedade cacheServerAddress para \"redis:[endereço IP]:[porta]\" e o serviço precisa ser reiniciado para que a mudança seja aplicada;\n\n- Alterar o [parâmetro](http://tdn.totvs.com/pages/viewpage.action?pageId=77299889) CACHE\\_SERVER\\_ADDRESS [via API](https://api.fluig.com/resource_ConfigurationServiceRest.html);\n\n```\nwcm/cacheServerAddress=redis:127.0.0.1\n```\n\n- Configuração via wcmadmin, caso o fluig já esteja no ar, através do Painel de controle → aba WCM → Configurações do Sistema → aba Parâmetros da Plataforma.\n\nObservação\n\nEssa configuração também pode ser realizada durante a execução do instalador do fluig.\n\n# Configurando o Redis em Ambientes de Alta Disponibilidade com Tolerância a Falhas\n\n---\n\nO Redis usa o modelo Master-Slave com um processo monitor chamado Sentinel. Os passos indicados anteriormente continuam valendo para cada nó do *cluster* Redis.\n\n![](..\\..\\..\\images\\RedisSentinel.png)\n\n### Master\n\nO nó Master não necessita de nenhuma configuração adicional além das configurações dos passos anteriores.\n\n### Slaves\n\nAdicione a seguinte configuração (**redis.conf**) em cada nó Slave*:*\n\n```\nslaveof \n```\n\n**Exemplo:**\n\n```\nslaveof 127.0.0.1 6379\n```\n\n### Sentinel" }, { "metadata": { "title": "Configuração do fluig cache com Redis", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=205917413", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração do fluig cache com Redis.md" }, "content": "Configuração do fluig cache com Redis\n\n\nO Sentinel oferece um modelo simples e automático de alta disponibilidade (HA) para Redis usando a estratégia de eleição caso o Master venha a falhar. Inicialmente, tem-se uma replicação do Master para um número indeterminado de Slaves.\n\nUm processo Sentinel deve ser adicionado em cada um dos servidores que terão uma ou mais instâncias do Redis para monitorar a execução dos processos e iniciar uma eleição para promover um Slave para Master caso o Master falhe.\n\nPara isso:\n\n- Crie um arquivo redis.sentinel.conf.\n\n- Defina a propriedade daemonize para *\"yes\"*.\n\n- Defina a propriedade *sentinel monitor* com o nome do *cluster* Redis, informe o IP e porta do Master e o quórum de sentinelas. O quórum é o número mínimo de sentinelas que avaliam que o Master falhou para iniciar uma eleição. É importante usar o valor correto, pois um número inadequado vai impedir a eleição do novo Master.\n\nTemplate:\n\n```\ndaemonize yes\nsentinel monitor NOME_DO_CLUSTER IP_MASTER PORTA_MASTER QUORUM\nsentinel down-after-milliseconds NOME_DO_CLUSTER 10000\n```\n\n**Exemplo:**\n\n```\ndaemonize yes\nsentinel monitor fluigcache 127.0.0.1 6379 1\nsentinel down-after-milliseconds fluigcache 10000\n```\n\nObservação\n\nDurante uma execução em *cluster, o*Sentinel modifica os arquivos de configuração, portanto eles devem ter permissão de escrita.\n\n# Instalando o Sentinel como serviço no Windows\n\n---\n\nO executável do Sentinel é o mesmo do servidor do Redis, exceto pelo parâmetro \"--sentinel\".\n\n```\nredis-server.exe --service-install --service-name redissentinel redis.sentinel.conf --sentinel\n```\n\n# Executar o Redis Sentinel em Servidor Linux\n\n---\n\nA partir da versão 3 o redis-sentinel é instalado por padrão junto do Redis. Para executar o Sentinel:\n\n```\nredis-sentinel /etc/redis/sentinel.conf\n```\n\nSendo que **/etc/redis/sentinel.conf** é o arquivo de configuração padrão.\n\n# Configurando o fluig para usar o Redis Cluster com Sentinel como cache\n\n---\n\nAtenção!\n\nA configuração do Redis com o fluig foi depreciada a partir da versão 1.6.2 da plataforma. Caso possua uma atualização superior à essa acesse: [Configurações da plataforma](http://tdn.totvs.com/x/7gNbDw). Ou se possuir uma atualização inferior à essas acesse: [Como posso ajustar as configurações da plataforma nas releases 1.5.13 e inferiores?](http://tdn.totvs.com/x/JppbDQ)\n\nAbra o arquivo configuration.properties, localizado em [Instalação fluig]\\repository\\wcmdir\\config e modifique a propriedade cacheServerAddress, ou [use a propriedade via API CACHE\\_SERVER\\_ADDRESS](http://tdn.totvs.com/pages/viewpage.action?pageId=224107046). O formato da configuração é \"redisc:[nome\\_cluster]:[IP\\_Sentinel]:[Porta\\_Sentinel],[IP\\_Sentinel\\_2]:[Porta\\_Sentinel\\_2], etc.\".\n\n```\nwcm/cacheServerAddress=redisc:NOME_DO_CLUSTER:IP_SENTINEL:PORTAL_SENTINEL\n```\n\n**Exemplo:**\n\n```\nwcm/cacheServerAddress=redisc:fluigcache:127.0.0.1:26379\n```\n\nTambém é possível realizar esta configuração via wcmadmin, caso o fluig já esteja no ar, através do Painel de controle → aba WCM → Configurações do Sistema → aba [Parâmetros da Plataforma](http://tdn.totvs.com/x/vLnxF).\n\nObservação\n\nEssa configuração também pode ser realizada durante a execução do instalador do fluig." }, { "metadata": { "title": "Configuração Redis para uso do Load balance Realtime", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=555277701", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração Redis para uso do Load balance Realtime.md" }, "content": "Configuração Redis para uso do Load balance Realtime\n\n\n- 1 [Sobre o Redis](#ConfiguraçãoRedisparausodoLoadbalanceRealtime-SobreoRedis)\n- 2 [Pré requisito](#ConfiguraçãoRedisparausodoLoadbalanceRealtime-Prérequisito)\n- 3 [Download do Redis](#ConfiguraçãoRedisparausodoLoadbalanceRealtime-DownloaddoRedis)\n- 4 [Instalação do Redis em Modo Single-Server](#ConfiguraçãoRedisparausodoLoadbalanceRealtime-InstalaçãodoRedisemModoSingle-Server)\n - 4.1 [Instalação do Redis como Serviço em Linux](#ConfiguraçãoRedisparausodoLoadbalanceRealtime-InstalaçãodoRediscomoServiçoemLinux)\n - 4.2 [Instalação do Redis como Serviço em Windows](#ConfiguraçãoRedisparausodoLoadbalanceRealtime-InstalaçãodoRediscomoServiçoemWindows)\n- 5 [Configurando o Redis para uso com o Fluig](#ConfiguraçãoRedisparausodoLoadbalanceRealtime-ConfigurandooRedisparausocomoFluig)\n\n# Sobre o Redis\n\n---\n\nO Redis é um banco de dados NoSQL *open source* do modelo chave-valor em memória, que possui [licenciamento BSD](http://redis.io/topics/license) e pode ser utilizado como *cache* para o TOTVS Fluig Plataforma. Ele possui funcionalidades extras como a possibilidade de ser utilizado em *cluster* com tolerância a falhas (*failover*).\n\nSite oficial: \n\n© Redis, *and the* Redis *logo are the trademarks of Salvatore Sanfilippo in the U.S. and other countries*.\n\n# Pré requisito\n\n---\n\n- Ter o Redis instalado na máquina ou realizar o download do instalador nos links abaixo conforme o sistema operacional da máquina.\n\n# Download do Redis\n\n---\n\n- O *download* do instalador do Redis para Linux pode ser realizado [neste link](http://redis.io/download).\n\n- O *download* do instalador do Redis para Windows pode ser realizado [neste link](https://github.com/MSOpenTech/redis/releases).\n\n# Instalação do Redis em Modo Single-Server\n\n---\n\nO modo *single-server* significa que apenas um processo do Redis está no ar. Mesmo neste modo ele pode atender mais de um servidor Fluig, porém será considerado um ponto de falha." }, { "metadata": { "title": "Configuração Redis para uso do Load balance Realtime", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=555277701", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração Redis para uso do Load balance Realtime.md" }, "content": "Configuração Redis para uso do Load balance Realtime\n\n## Instalação do Redis como Serviço em Linux" }, { "metadata": { "title": "Configuração Redis para uso do Load balance Realtime", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=555277701", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração Redis para uso do Load balance Realtime.md" }, "content": "Configuração Redis para uso do Load balance Realtime\n\n\n---\n\nVerifique também a [documentação oficial](https://redis.io/topics/quickstart).\n\nA forma sugerida de instalar o Redis em Linux é compilá-lo a partir dos fontes, pois não há outras dependências além do compilador GCC e da biblioteca libc.\n\n```\nwget http://download.redis.io/redis-stable.tar.gz\ntar xvzf redis-stable.tar.gz\ncd redis-stable\nmake\nmake install\n```\n\nVamos supor que você já copiou os executáveis *redis-server* e *redis-cli* em /usr/local/bin ou executou o comando *make install.*\n\nCrie os seguintes diretórios:\n\n```\nsudo mkdir /etc/redis\nsudo mkdir /var/redis\n```\n\nCopie o script de inicialização disponibilizado no diretório utils para /etc/init.d. Sugerimos renomeá-lo com o nome da porta onde você está executando esta instância do Redis.\n\n```\nsudo cp utils/redis_init_script /etc/init.d/redis_6379\n```\n\nEdite o *script* de inicialização. Certifique-se de modificar o REDISPORT de acordo com a porta que você está usando. Tanto o caminho do arquivo pid quanto o nome do arquivo de configuração dependem do número da porta.\n\n```\nsudo vi /etc/init.d/redis_6379\n```\n\nCopie o arquivo de configuração modelo encontrado no diretório raiz da distribuição Redis em /etc/redis/ utilizando o número da porta como nome:\n\n```\nsudo cp redis.conf /etc/redis/6379.conf\n```\n\nCrie um diretório dentro de /var/redis que funcionará como os dados e diretório de trabalho para esta instância Redis:\n\n```\nsudo mkdir /var/redis/6379\n```\n\nEdite o arquivo de configuração:\n\n- Defina o pidfile para /var/run/redis\\_6379.pid (modificar a porta se necessário).\n\n- Altere a porta em conformidade. No nosso exemplo não é necessário, pois a porta padrão já é 6379.\n- Defina o seu loglevel preferido.\n- Defina o arquivo de log para /var/log/redis\\_6379.log\n- Definir o dir para /var/redis/6379 (passo muito importante!)\n- Procurar pelo parâmetro **bind** onde deve estar: bind 127.0.0.1\n\nAltere esta linha para o IP externo de acesso para as instâncias do RealTime, exemplo :\n\nCaso o IP da máquina seja 192.168.0.19 fica:\n\nbind 192.168.0.19 127.0.0.1\n\nConfiguração\n\nCaso não seja feito o bind para acesso dos servidor externo (máquinas que possuem a instalação do RealTime) as instâncias do Realtime não irão funcionar.\n\nImportante\n\nNo arquivo de configuração por padrão a proteção de acesso está ativa, como configuramos o bind direto para o IP, este parâmetro deve ser setado para no:\n\nprotected-mode no\n\nApós feitas as alterações:\n\nPara subir o Redis no Linux execute o comando abaixo:\n\n```\nsudo /etc/init.d/redis_6379 start\n```\n\nApós subir, verifique no arquivo de log se não ocorreu nenhum erro: /var/log/redis\\_6379.log\n\nPara parar o serviço, execute o comando:\n\n```\nsudo /etc/init.d/redis_6379 stop\n```" }, { "metadata": { "title": "Configuração Redis para uso do Load balance Realtime", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=555277701", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração Redis para uso do Load balance Realtime.md" }, "content": "Configuração Redis para uso do Load balance Realtime\n\n## Instalação do Redis como Serviço em Windows\n\n---\n\nVerifique também a [documentação oficial](https://raw.githubusercontent.com/MSOpenTech/redis/3.0/Windows%20Service%20Documentation.md).\n\nExecute o seguinte comando:\n\n```\nredis-server.exe --service-install --service-name fluigcache redis.windows.conf\n```\n\n# Configurando o Redis para uso com o Fluig\n\n---\n\n\n\nProcure no arquivo de configuração, o parâmetro *maxmemory* e certifique-se de configurar para o tamanho máximo desejado, caso contrário, podem ocorrer problemas de falta de memória.\n\n```\nmaxmemory 1g\n```\n\nObservação\n\nSe estiver sendo utilizada a versão 2.8 do Redis com o Windows, configure também o parâmetro *maxheap*.\n\nPara que o Redis não salve um *snapshot* da memória periodicamente, procure as linhas iniciadas com a palavra *\"save\"* no arquivo de configuração:\n\n**Exemplo do config padrão para Windows**\n\n```\nsave 900 1\nsave 300 10\nsave 60 10000\n```\n\nAltere-as para:\n\n```\n# save 900 1\n# save 300 10\n# save 60 10000\nsave \"\"\n```\n\nPara que o Redis grave um arquivo com o PID, defina o seguinte parâmetro:\n\n```\ndaemonize yes\n```\n\nApós efetuar as configurações para uso no servidor Fluig, é necessário parar e subir o serviço do Redis, para que sejam aplicadas as configurações." }, { "metadata": { "title": "Configurações de segurança para prevenção de ataques de força bruta: BFA (Brute Force Attack)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1050304989", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurações de segurança para prevenção de ataques de força bruta BFA (Brute Force Attack).md" }, "content": "Configurações de segurança para prevenção de ataques de força bruta: BFA (Brute Force Attack)\n\n\n- [Camada de Firewall e WAF (Web Application Firewall)](#Configuraçõesdesegurançaparaprevençãodeataquesdeforçabruta:BFA(BruteForceAttack)-CamadadeFirewalleWAF(WebApplicationFirewall))\n- [Camada de Proxy Reverso](#Configuraçõesdesegurançaparaprevençãodeataquesdeforçabruta:BFA(BruteForceAttack)-CamadadeProxyReverso)\n- [Camada de aplicação](#Configuraçõesdesegurançaparaprevençãodeataquesdeforçabruta:BFA(BruteForceAttack)-Camadadeaplicação)\n\n---\n\nEm ambientes corporativos publicados na web, é essencial implementar medidas de proteção contra ataques de força bruta, incluindo variantes sofisticadas como o uso de endereços IP rotativos, ataques do tipo *low and slow* e tentativas de preenchimento de credenciais. Para mitigar esses riscos, recomenda-se a adoção da estratégia de defesa em profundidade, que combina múltiplas camadas de segurança e aumenta a resiliência da aplicação frente a diferentes vetores de ataque.\n\nNesse contexto, torna-se necessário fortalecer a segurança em todas as camadas envolvidas: Firewall/WAF, proxy reverso e a própria aplicação, essa utilizando o TOTVS Identity, que disponibiliza recursos de autenticação multifator (MFA), ampliando a proteção contra acessos não autorizados.\n\n## Camada de Firewall e WAF (Web Application Firewall)" }, { "metadata": { "title": "Configurações de segurança para prevenção de ataques de força bruta: BFA (Brute Force Attack)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1050304989", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurações de segurança para prevenção de ataques de força bruta BFA (Brute Force Attack).md" }, "content": "Configurações de segurança para prevenção de ataques de força bruta: BFA (Brute Force Attack)\n\n\n---\n\nRecomenda-se que a aplicação seja publicada sob de uma camada de **Firewall e/ou Web Application Firewall (WAF)**. Essa camada atua como o primeiro nível de proteção entre a internet e a infraestrutura da aplicação, sendo responsável por filtrar e monitorar o tráfego antes que ele alcance o proxy reverso ou o servidor de aplicação.\n\nO uso dessa camada é uma prática amplamente adotada em aplicações corporativas, pois permite reduzir significativamente a exposição direta da aplicação a tráfego malicioso ou automatizado.\n\nEntre os principais objetivos dessa camada estão:\n\n- **Bloqueio de tráfego malicioso conhecido**, utilizando listas de reputação de IP ou regras de segurança previamente definidas;\n- **Mitigação de ataques automatizados**, como tentativas de autenticação em massa *(brute force)* ou varreduras automatizadas;\n- **Filtragem de requisições suspeitas**, incluindo padrões de ataque comuns a aplicações web;\n- **Limitação de taxa de requisições (rate limiting)** em determinados cenários, reduzindo o impacto de ataques de alta frequência;\n- **Registro e monitoramento de eventos de segurança**, permitindo auditoria e identificação de comportamentos anômalos.\n\nIndependentemente da tecnologia adotada, recomenda-se que essa camada seja posicionada **antes do proxy reverso e/ou do servidor de aplicação**, de forma a atuar como a primeira barreira de proteção da arquitetura.\n\n## Camada de Proxy Reverso" }, { "metadata": { "title": "Configurações de segurança para prevenção de ataques de força bruta: BFA (Brute Force Attack)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1050304989", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configurações de segurança para prevenção de ataques de força bruta BFA (Brute Force Attack).md" }, "content": "Configurações de segurança para prevenção de ataques de força bruta: BFA (Brute Force Attack)\n\n\n---\n\nRecomenda-se que a aplicação seja publicada por meio de um [**proxy reverso**](Proxy reverso.md), responsável por intermediar a comunicação entre os clientes externos e o servidor de aplicação. Essa camada atua como um ponto adicional de controle e proteção, permitindo aplicar políticas de segurança antes que as requisições sejam encaminhadas ao servidor de aplicação.\n\nA configuração de medidas contra ataques de força bruta dependerá do proxy adotado. Abaixo estão as documentações do NGINX e do Apache HTTP Server, que fornecem orientações e parametrizações para mitigar possíveis ataques.\n\n- [**NGINX – Brute Force Attack Policies**](https://docs.nginx.com/waf/policies/brute-force-attacks)\n\n- [**Apache – Security Tips**](https://httpd.apache.org/docs/2.4/misc/security_tips.html)\n\n## Camada de aplicação\n\n---\n\nJá na camada de aplicação **é recomendada** a utilização do [**TOTVS Identity**](https://tdn.totvs.com/display/fluig/TOTVS+IDENTITY) que possui integração nativa com o **TOTVS Fluig**. Além de centralizar e simplificar a gestão de credenciais, o TOTVS Identity disponibiliza o [**recurso de autenticação multifator (MFA)**](https://tdn.totvs.com/display/fluig/Identity+%7C+Login#Identity%7CLogin-Fazerlogincomautentica%C3%A7%C3%A3omultifator(MFA)), ampliando significativamente a segurança no acesso à plataforma e reduzindo o risco de comprometimento por ataques de força bruta ou uso indevido de credenciais." }, { "metadata": { "title": "Considerações de DNS para a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=213980466", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Considerações de DNS para a plataforma.md" }, "content": "Considerações de DNS para a plataforma\n\n\n# Índice\n\n- 1 [Objetivo](#ConsideraçõesdeDNSparaaplataforma-Objetivo)\n- 2 [DNS](#ConsideraçõesdeDNSparaaplataforma-DNS)\n - 2.1 [Definições](#ConsideraçõesdeDNSparaaplataforma-Definições)\n - 2.2 [DNS Interno](#ConsideraçõesdeDNSparaaplataforma-DNSInterno)\n - 2.3 [DNS Externo](#ConsideraçõesdeDNSparaaplataforma-DNSExterno)\n - 2.4 [Funcionamento do DNS Interno e Externo](#ConsideraçõesdeDNSparaaplataforma-FuncionamentodoDNSInternoeExterno)\n\n# Objetivo\n\n---\n\nO objetivo deste artigo é descrever as considerações que devem ser respeitadas para o correto funcionamento da plataforma TOTVS Fluig com DNS.\n\nDica\n\nApós a configuração do DNS interno ou externo, você deve alterar a URL de acesso ao portal nas Configurações do Sistema da plataforma. Confira como fazer acessando [Configurações do sistema](http://tdn.totvs.com/x/EO4KDg).\n\n# DNS\n\n---\n\nO acrônimo DNS é o termo em inglês para Domain Name System e consiste de um sistema de gerenciamento de nomes para redes de computadores.\n\n## Definições" }, { "metadata": { "title": "Considerações de DNS para a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=213980466", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Considerações de DNS para a plataforma.md" }, "content": "Considerações de DNS para a plataforma\n\n\n---\n\nUm **domínio de DNS** é definido pelo nome cuja finalidade se refere a localizar e identificar computadores dentro de uma rede, seja ela interna ou externa (internet). Por exemplo, *fluig.com* e *suaempresa.com.br*.\n\nUm **serviço gerenciador de DNS** é definido pelo sistema que faz a gestão das configurações e mantém o domínio disponível para consultas. Por exemplo, ISC BIND, Microsoft DNS Server e Amazon Route 53.\n\nUma **zona de DNS** é definida como a configuração responsável por um domínio dentro de um serviço gerenciador de DNS.\n\nUm **host de DNS** é definido como um registro dentro de uma zona de DNS que armazena um nome e um endereçamento IP. Por exemplo, registro *www* do *tipo A* aponta para o IP 54.86.205.229 dentro da zona fluig.com.\n\nUm **servidor de DNS** é um servidor responsável por traduzir nomes de computadores para endereços IP e endereços IP para nomes de computadores, permitindo a localização de computadores em um determinado domínio.\n\nCom a utilização de DNS, é possível acessar um site tanto pelo seu domínio ([www.fluig.com)](http://www.fluig.com%29/) quanto pelo seu IP (54.86.205.229).\n\n## DNS Interno\n\n---\n\nO servidor de DNS Interno é o servidor na rede interna que irá possuir autoridade sobre o domínio na qual a plataforma estará publicada.\n\nEste servidor tem como objetivo atender toda resolução de nomes que originam-se da rede interna ou rede privada.\n\nPara utilização da plataforma internamente através de um host de DNS, será necessário criar no servidor de DNS interno um registro do *tipo A (registro responsável pelo mapeamento de um nome para IPv4)* apontando para o IP do servidor do fluig internamente.\n\nObservação\n\nÉ mandatória a configuração da plataforma através de um host de DNS (*tipo A ou CNAME*) caso deseje disponibilizar o mesmo internamente (rede interna) e externamente (internet).\n\n## DNS Externo" }, { "metadata": { "title": "Considerações de DNS para a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=213980466", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Considerações de DNS para a plataforma.md" }, "content": "Considerações de DNS para a plataforma\n\n\n---\n\nO servidor de DNS Externo é o servidor na rede externa ou DMZ que irá possuir autoridade sobre o domínio na qual a plataforma estará publicada.\n\nEste servidor tem como objetivo atender toda resolução de nomes que originam-se da rede externa, ou internet.\n\nPara utilização da plataforma externamente através de um host de DNS, será necessário criar no servidor de DNS externo um registro do *tipo A (registro responsável pelo mapeamento de um nome para IPv4)* apontando para o IP que identifica o servidor do fluig na internet, geralmente representado pelo IP de uma interface externa do firewall da rede, que faz o redirecionamento do pacote para o IP do fluig internamente.\n\nObservação\n\nÉ mandatória a configuração da plataforma através de um host de DNS (*tipo A ou CNAME*) caso deseje disponibilizar o mesmo internamente (rede interna) e externamente (internet).\n\n## Funcionamento do DNS Interno e Externo\n\n---\n\nAbaixo temos uma exemplificação do funcionamento do DNS interno e do DNS externo quando requisitamos acesso a plataforma internamente ou externamente.\n\n![](..\\..\\..\\images\\dns-local-sem-moldura.png)\n\n![](..\\..\\..\\images\\dns-internet-sem-moldura.png)" }, { "metadata": { "title": "Considerações de Firewall para a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=219684365", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Considerações de Firewall para a plataforma.md" }, "content": "Considerações de Firewall para a plataforma\n\n\n# Índice\n\n- 1 [Objetivo](#ConsideraçõesdeFirewallparaaplataforma-Objetivo)\n- 2 [Firewall](#ConsideraçõesdeFirewallparaaplataforma-Firewall)\n - 2.1 [Liberações de Portas no Firewall](#ConsideraçõesdeFirewallparaaplataforma-LiberaçõesdePortasnoFirewall)\n - 2.2 [Regras de NAT no Firewall](#ConsideraçõesdeFirewallparaaplataforma-RegrasdeNATnoFirewall)\n\n# Objetivo\n\n---\n\nO objetivo deste artigo é descrever quais são as considerações que devem ser respeitadas para disponibilização da plataforma em uma rede com firewall.\n\n# Firewall\n\n---\n\nFirewall é uma solução de segurança de rede, que determina a entrada ou saída do tráfego de rede com base em um conjunto de regras.\n\n### Liberações de Portas no Firewall\n\n---\n\nÉ comum a necessidade de disponibilizar a plataforma para acesso de uma rede externa, por exemplo a internet.\n\nComo uma boa prática de segurança, devemos sempre publicar a plataforma externamente através de uma solução de firewall, evitando assim que todas as portas da plataforma fiquem apresentadas diretamente para acesso via internet.\n\nPara disponibilização do TOTVS Fluig Plataforma externamente, as portas abaixo devem ser liberadas na solução de firewall utilizada.\n\n| Origem | Destino | Porta | Camada de Transporte | Camada de Aplicação |\n| --- | --- | --- | --- | --- |\n| 0.0.0.0/0 (Internet) | IP da plataforma (Externo) | 8080 | TCP | HTTP |\n| 0.0.0.0/0 (Internet) | IP da plataforma (Externo) | 8443 | TCP | HTTPS |\n| 0.0.0.0/0 (Internet) | IP da plataforma (Externo) | 7777 | TCP | HTTP & WebSocket |\n\n### Regras de NAT no Firewall" }, { "metadata": { "title": "Considerações de Firewall para a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=219684365", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Considerações de Firewall para a plataforma.md" }, "content": "Considerações de Firewall para a plataforma\n\n\n---\n\nUma técnica utilizada para disponibilizar a plataforma externamente através de firewall, é o NAT (*Network Address Translation*).\n\nO NAT permite que possamos traduzir endereços IPs e portas da rede interna para a internet. Com isso, podemos mapear as portas de rede de um IP público (roteável pela internet), que pode estar vinculado ao firewall da rede, para um servidor que esteja na rede interna, no caso o servidor da plataforma.\n\nPor exemplo, considerando o cenário na qual o IP público 54.54.54.1 seja responsável por representar um ambiente externamente, e o IP 192.168.1.25 seja responsável por representar um ambiente internamente, ao acessarmos externamente a plataforma pelo IP 54.54.54.1 nas portas 8080 ou 8443, o firewall que tem em suas interfaces externas o IP 54.54.54.1, aplicará uma regra de NAT encaminhando os pacotes externos para as portas 8080 ou 8443 do servidor interno de IP 192.168.1.25.\n\nAbaixo temos uma representação das regras de NAT necessárias para disponibilização da plataforma externamente.\n\n| Origem | Destino Externo | Porta Externa | Camada de Transporte | Destino Interno | Porta Interna |\n| --- | --- | --- | --- | --- | --- |\n| 0.0.0.0/0 (Internet) | IP da plataforma (Externo) | 8080 | TCP | IP da plataforma (Interno) | 8080 |\n| 0.0.0.0/0 (Internet) | IP da plataforma (Externo) | 8443 | TCP | IP da plataforma (Interno) | 8443 |\n| 0.0.0.0/0 (Internet) | IP da plataforma (Externo) | 7777 | TCP | IP da plataforma (Interno) | 7777 |" }, { "metadata": { "title": "CORS (Cross-origin Resource Sharing)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=621778238", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\CORS (Cross-origin Resource Sharing).md" }, "content": "CORS (Cross-origin Resource Sharing)\n\n\n- [Objetivo](#CORS(CrossoriginResourceSharing)-Objetivo)\n- [Considerações iniciais](#CORS(CrossoriginResourceSharing)-Consideraçõesiniciais)\n- [CORS no TOTVS Fluig Plataforma](#CORS(CrossoriginResourceSharing)-CORSnoTOTVSFluigPlataforma)\n - [Bloqueando conexão de qualquer origem](#CORS(CrossoriginResourceSharing)-Bloqueandoconexãodequalquerorigem)\n - [Permitindo a conexão de uma única origem](#CORS(CrossoriginResourceSharing)-Permitindoaconexãodeumaúnicaorigem)\n - [Permitindo a conexão de múltiplas origens](#CORS(CrossoriginResourceSharing)-Permitindoaconexãodemúltiplasorigens)\n - [Utilizando NGINX para configurar CORS](#CORS(CrossoriginResourceSharing)-UtilizandoNGINXparaconfigurarCORS)\n - [Utilizando Apache para configurar CORS](#CORS(CrossoriginResourceSharing)-UtilizandoApacheparaconfigurarCORS)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar os procedimentos necessários para a configuração de CORS (Compartilhamento de Recursos de Origem Cruzada).\n\n# Considerações iniciais\n\n---\n\nO CORS (Cross-origin Resource Sharing) é um mecanismo utilizado pelos navegadores para compartilhar recursos entre diferentes origens. O CORS é uma especificação do [W3C](https://fetch.spec.whatwg.org/) e faz uso de headers do HTTP para informar aos navegadores se determinado recurso pode ser ou não acessado.\n\n# CORS no TOTVS Fluig Plataforma\n\n---\n\nO TOTVS Fluig Plataforma já contém as configurações necessárias para tratar o CORS. Porém, por padrão aceita conexões de qualquer origem.\n\n## Bloqueando conexão de qualquer origem" }, { "metadata": { "title": "CORS (Cross-origin Resource Sharing)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=621778238", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\CORS (Cross-origin Resource Sharing).md" }, "content": "CORS (Cross-origin Resource Sharing)\n\n\n---\n\nPara impedir o acesso ao TOTVS Fluig Plataforma de qualquer origem que não seja o próprio produto, faça a seguinte configuração:\n\n- **A partir da atualização 2.0:**Abra o arquivo **standalone.xml** que está disponível em **[diretório\\_instalação]/appserver/standalone/configuration** em um editor de texto.\n\n- **Para atualizações 1.6 até 1.8.2**: \n Abra o arquivo **domain.xml** que está disponível em **[diretório\\_instalação]/appserver/domain/configuration** em um editor de texto.\n\n- No arquivo correspondente à atualização do Fluig que você utiliza (**standalone.xml** ou **domain.xml**), procure pela seguinte linha:\n\n```\n\n```\n\n- Substitua o \"\\*\" pela URL de acesso ao TOTVS Fluig Plataforma. Por exemplo, se a URL de acesso ao Fluig for \"\", ficaria assim:\n\n```\n\n```\n\n- Reinicie os serviços da plataforma.\n\n## Permitindo a conexão de uma única origem" }, { "metadata": { "title": "CORS (Cross-origin Resource Sharing)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=621778238", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\CORS (Cross-origin Resource Sharing).md" }, "content": "CORS (Cross-origin Resource Sharing)\n\n\n---\n\nPara permitir o acesso ao TOTVS Fluig Plataforma de uma origem confiável que não seja o próprio produto, faça a seguinte configuração:\n\n- **A partir da atualização 2.0:**Abra o arquivo **standalone.xml** que está disponível em **[diretório\\_instalação]/appserver/standalone/configuration** em um editor de texto.\n\n- **Para atualizações 1.6 até 1.8.2**: \n Abra o arquivo **domain.xml** que está disponível em **[diretório\\_instalação]/appserver/domain/configuration** em um editor de texto.\n\n- No arquivo correspondente à atualização do Fluig que você utiliza (**standalone.xml** ou **domain.xml**), procure pela seguinte linha:\n\n```\n\n```\n\n- Substitua o \"\\*\" pela URL origem que terá permissão de acessar o TOTVS Fluig Plataforma. Por exemplo, se a URL de acesso ao fluig for \"\" e deseja-se liberar acesso a um site cuja URL de acesso seja \"[https://www.outrosite.com.br](https://www.minhaempresa.com.br)\", ficaria assim:\n\n```\n\n```\n\n- Reinicie os serviços da plataforma\n\n## Permitindo a conexão de múltiplas origens" }, { "metadata": { "title": "CORS (Cross-origin Resource Sharing)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=621778238", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\CORS (Cross-origin Resource Sharing).md" }, "content": "CORS (Cross-origin Resource Sharing)\n\n\n---\n\nO TOTVS Fluig Plataforma não possui uma forma interna de permitir a conexão de múltiplas origens diferentes.\n\nMas há uma solução: usar ferramentas de terceiros (como NGINX ou Apache), construindo uma rede DMZ. Inclusive a maneira mais segura de utilizar o TOTVS Fluig Plataforma é não expô-lo diretamente na internet, mas sim através de uma DMZ (Veja mais informações [aqui](Proxy reverso.md)).\n\nAtenção!\n\nNesse caso, é necessário também **REMOVER** as seguintes linhas do arquivo **standalone.xml** (**a partir da 2.0**) ou **domain.xml** (**1.6 até 1.8.2**):\n\n```\n\n\n\n\n\n\n\n\n\n\n```\n\n### Utilizando NGINX para configurar CORS" }, { "metadata": { "title": "CORS (Cross-origin Resource Sharing)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=621778238", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\CORS (Cross-origin Resource Sharing).md" }, "content": "CORS (Cross-origin Resource Sharing)\n\n\n---\n\nImportante!\n\nSomente é possível utilizar o NGINX **até a versão** **1.22** por conta da compatibilidade com o módulo nginx-stick-module-ng.\n\nA seguir um exemplo de configuração para o NGINX que pode ser usado como base para configurá-lo para fazer a validação de CORS:\n\n**fluig.conf**\n\n```\nupstream fluig-http {\n server 192.168.2.100:8080;\n}\n\nserver {\n listen 443 ssl;\n server_name *.minhaempresa.com;\n server_tokens off;\n ssl_certificate fullchain.pem;\n ssl_certificate_key privkey.pem;\n\tssl_protocols TLSv1.3;\n\tssl_ciphers               ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK; # Se necessário complemente com outras chaves Ciphers suportadas;\n\tssl_prefer_server_ciphers on;\n\tssl_session_cache shared:SSL:10m;\n\n location / {\n set $CORS \"\";\n # Lista de origens permitidas\n if ($http_origin ~* \"^https://(www.minhaempresa.com|empresa1.com|api.empresa2.com)$\") {\n set $CORS \"O\";\n }\n if ($request_method = 'OPTIONS') {\n set $CORS \"${CORS}O\";\n }\n\n if ($CORS = \"OO\") {\n add_header Access-Control-Allow-Origin $http_origin;\n add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS, PUT';\n add_header Access-Control-Allow-Headers 'Accept,Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';\n add_header Access-Control-Allow-Credentials 'true';\n add_header Access-Control-Max-Age 3600;\n add_header Content-Type 'text/plain charset=UTF-8';\n add_header Content-Length 0;\n\n return 204;\n }\n\n if ($CORS = \"O\") {\n add_header Access-Control-Allow-Origin $http_origin;\n add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS, PUT';\n add_header Access-Control-Allow-Headers 'Accept,Authorization,Content-Type,X-Requested-With,User-Agent,If-Modified-Since,Cache-Control';\n add_header Access-Control-Allow-Credentials 'true';\n add_header Access-Control-Max-Age 3600;\n }\n\n proxy_pass http://fluig-http;\n proxy_ssl_verify off;\n proxy_ssl_ciphers HIGH:!aNULL:!MD5;\n\n proxy_set_header X-Forwarded-Host $host:443;\n proxy_set_header X-Forwarded-Server $host;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto https;\n proxy_set_header X-Real-IP $remote_addr;\n\t\t\n client_max_body_size 880m;\n client_body_buffer_size 256k;\n\n proxy_connect_timeout 800;\n proxy_send_timeout 800;\n proxy_read_timeout 800;\n\n proxy_buffer_size 8k;\n proxy_buffers 8 32k;\n proxy_busy_buffers_size 64k;\n proxy_temp_file_write_size 64k;\n }\n}\n```\n\nImportante!\n\nRecomendamos o uso de chaves e protocolos mais modernos e seguros como os indicados no exemplo.\n\nPorém, outras chaves também são suportadas:\n\nDHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA\n\nPreencha a diretiva **ssl\\_ciphers** do fluig.conf substituindo pelos valores suportados acima que estejam de acordo com sua política de segurança. As chaves podem ser validadas em .\n\nE também os protocolos: TLSv1, TLSv1.1 e TLSv1.2\n\nPreencha a diretiva **ssl\\_protocols** do fluig.conf substituindo pelos valores suportados acima que estejam de acordo com sua política de segurança." }, { "metadata": { "title": "CORS (Cross-origin Resource Sharing)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=621778238", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\CORS (Cross-origin Resource Sharing).md" }, "content": "CORS (Cross-origin Resource Sharing)\n\n### Utilizando Apache para configurar CORS\n\n---\n\nA seguir um exemplo de configuração para o Apache que pode ser usado como base para configurá-lo para fazer a validação de CORS. Essa configuração é um aprimoramento da configuração descrita em [Proxy reverso](Proxy reverso.md) - Configuração do Apache (SSL) + Fluig (HTTP)\n\n**fluig.conf**\n\n```\nSetEnvIf Origin \"http(s)?://(www.minhaempresa.com|empresa1.com|api.empresa2.com)$\" AccessControlAllowOrigin=$0\nHeader add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin\n\nHeader set Access-Control-Allow-Headers: \"Accept,Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type\"\nHeader set Access-Control-Allow-Methods: \"GET, PUT, POST, OPTIONS, DELETE\"\nHeader Set Access-Control-Request-Method: \"GET, PUT, POST, OPTIONS, DELETE\"\nHeader Set Access-Control-Allow-Credentials: \"true\"\nHeader Set Access-Control-Max-Age \"3600\"\n\n\n RewriteEngine On\n RewriteCond %{HTTPS} off\n RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}\n\n\n\n ServerName minhaempresa.com\n RequestHeader set X-Forwarded-Host 192.168.2.100:443\n RequestHeader set X-Forwarded-Proto https\n SSLProxyEngine On\n SSLEngine On\n SSLCertificateFile \"conf/cert1.pem\"\n SSLCertificateKeyFile \"conf/privkey1.pem\"\n SSLCertificateChainFile \"conf/fullchain1.pem\"\n ProxyPreserveHost On\n ProxyPass / http://192.168.2.100:8080/\n ProxyPassReverse / https://minhaempresa.com/\n\n \n\n ServerName minhaempresa.com\n ProxyPreserveHost On\n ProxyPass / ftp://192.168.2.100/\n ProxyPassReverse / ftp://192.168.2.100:21/\n\n```" }, { "metadata": { "title": "Descoberta de serviços", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=437265941", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Descoberta de serviços.md" }, "content": "Descoberta de serviços" }, { "metadata": { "title": "Descoberta de serviços", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=437265941", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Descoberta de serviços.md" }, "content": "Descoberta de serviços\n\n\nAtenção\n\nEsta página foi revisada para considerar as configurações do TOTVS Fluig Plataforma a partir da **atualização Liquid - **1.6.5****.\n\n# Índice\n\n- 1 [Objetivo](#Descobertadeserviços-Objetivo)\n- 2 [Introdução](#Descobertadeserviços-Introdução)\n- 3 [Serviços](#Descobertadeserviços-Serviços)\n- 4 [Registro](#Descobertadeserviços-Registro)\n\n# Objetivo\n\n---\n\nEste guia tem o objetivo de apresentar o procedimento de liberação de acesso ao registro de serviços, para que eles possam ser localizados pelo serviço de descoberta de serviços.\n\n# Introdução\n\n---\n\nA partir da **atualização Liquid - 1.6.5**, a plataforma dispõe de um modelo de serviços independentes para dar suporte à próxima geração de aplicativos. Para que estes serviços se comuniquem entre si, é necessário um serviço de descoberta. Este serviço conhece todos os demais serviços, desde que cada um dos serviços seja registrado no serviço de descoberta. Para que este processo seja possível, cada serviço dispõe de um cliente de descoberta de serviço e no momento de inicialização da plataforma, o mesmo se registra e fica disponível para os demais serviços.\n\n# Serviços\n\n---\n\nOs serviços disponibilizam e se comunicam com outros serviços através de [APIs REST](https://api.fluig.com/) pelas requisições do protocolo HTTP. Seguindo a premissa de independência entre os serviços, um serviço não tem conhecimento / relacionamento com os outros serviços.\n\nUm exemplo de novos serviços disponibilizados neste modelo, estão disponíveis no menu **Soluções**.\n\n![](..\\..\\..\\images\\image2018-11-19_11-2-10.png)\n\nEstas soluções podem se comunicar entre si, entre as APIs da plataforma e a própria infraestrutura para suportar os serviços.\n\n# Registro\n\n---\n\nUm dos serviços da infraestrutura é o Discovery. Ele é o responsável por registrar e fornecer informações sobre os serviços registrados. Para que o registro ocorra com sucesso, é necessário que a plataforma disponibilize acesso a este serviço de registro. Então o cliente de registro irá estabelecer a comunicação através da URL da plataforma configurada no painel de controle.\n\n![](..\\..\\..\\images\\image2018-11-19_11-30-55.png)\n\nCaso esta URL não esteja disponível para conexão interna, o cliente do Discovery ainda vai tentar pelo endereço IP configurado no arquivo **domain.xml**localizado no diretório**[diretório\\_instalação]/appserver/domain/configuration**.\n\n```\n\n \n \n \n \n \n \n \n \n\n```\n\nCaso ainda não seja possível a comunicação, poderá aparecer no log do servidor uma mensagem como:\n\nServer:fluig1] 11:19:51,485 WARN [com.fluig.core.discovery.client.ServiceDiscoveryClient] (Timer-12) Discovery not available yet for storage. Cause: FLUIG\\_REST\\_CLIENT\\_500. Help: Make sure that the server where fluig is installed has access to the address: http://127.0.1.1:8080. Verifique se o servidor onde está instalada a plataforma tem acesso ao endereço: http://127.0.1.1:8080\n\nNo caso de aparecer frequentemente a mensagem acima no log, será necessário tomar a ação abaixo:\n\n1. Configurar o endereço externo no host do servidor" }, { "metadata": { "title": "HTTPS", "source": "https://tdn.totvs.com/display/fluig/HTTPS", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS.md" }, "content": "HTTPS\n\n\n- [Certificado HTTPS (SSL/TLS) Gratuito](HTTPS/Certificado HTTPS (SSLTLS) Gratuito.md) Gratuito.md)\n- [Configuração de níveis de segurança no HTTPS](HTTPS/Configuração de níveis de segurança no HTTPS.md)\n- [Configuração HTTPS da plataforma](HTTPS/Configuração HTTPS da plataforma.md)\n- [Utilizando OpenSSL para configurar HTTPS](HTTPS/Utilizando OpenSSL para configurar HTTPS.md)" }, { "metadata": { "title": "Logoff automático por inatividade", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=626639952", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Logoff automático por inatividade.md" }, "content": "Logoff automático por inatividade\n\n\n# Índice\n\n- 1 [Objetivo](#Logoffautomáticoporinatividade-Objetivo)\n- 2 [Considerações iniciais](#Logoffautomáticoporinatividade-Consideraçõesiniciais)\n- 3 [Implementando Logoff automático](#Logoffautomáticoporinatividade-ImplementandoLogoffautomático)\n\n# Objetivo\n\nO objetivo deste guia é apresentar os procedimentos necessários para a configuração de um Logoff automático por inatividade no TOTVS Fluig Plataforma.\n\n# Considerações iniciais\n\nNativamente, o TOTVS Fluig Plataforma não possui logoff automático, pelo contrário, uma sessão permanece válida enquanto uma página do produto estiver aberta no navegador.\n\nPorém é simples de implementar, utilizando uma customização.\n\n# Implementando Logoff automático\n\nO  logoff automático demonstrado aqui utiliza a técnica de [Personalização de todas as páginas da plataforma](../../Personalização/Personalização de todas as páginas da plataforma.md).\n\nBaixe o arquivo [custompagehead.ftl](https://tdn.totvs.com/download/attachments/626639952/custompagehead.ftl?version=3&modificationDate=1690292714787&api=v2) e procure a seguinte linha:\n\nvar TEMPO\\_EM\\_MINUTOS = 30;\n\nAltere o valor para o tempo (em minutos) desejado. Por padrão, o tempo de vida da sessão vem configurado como 30 minutos.\n\nPor padrão também, quando o usuário estiver visualizando um documento, o logoff nunca será feito. Se desejar mudar esse comportamento também para efetuar o logoff mesmo quando visualizando documento, procure pela seguinte linha:\n\nvar NAO\\_EXPIRAR\\_VISUALIZANDO\\_DOCUMENTO = true;\n\ne altere o valor de true para false:\n\nvar NAO\\_EXPIRAR\\_VISUALIZANDO\\_DOCUMENTO = false;\n\nCopie o arquivo para a pasta **[diretório\\_instalação]/repository/wcmdir/custompage,** mantendo o nome custompagehead.ftl.\n\n**Obs:** Não é necessário reiniciar a plataforma. A alteração entra em vigor imediatamente." }, { "metadata": { "title": "Proxy reverso", "source": "https://tdn.totvs.com/display/fluig/Proxy+reverso", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso.md" }, "content": "Proxy reverso" }, { "metadata": { "title": "Proxy reverso", "source": "https://tdn.totvs.com/display/fluig/Proxy+reverso", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso.md" }, "content": "Proxy reverso\n\n\nNota:\n\nEsta página foi revisada para considerar as configurações de *server* do TOTVS Fluig Plataforma a partir da atualização 1.6.\n\n- [Objetivo](#Proxyreverso-Objetivo)\n- [Visão geral](#Proxyreverso-Visãogeral)\n- [Funcionamento](#Proxyreverso-Funcionamento)\n- [Por que utilizar um proxy reverso?](#Proxyreverso-Porqueutilizarumproxyreverso?)\n- [Configuração de proxy reverso / DMZ](#Proxyreverso-Configuraçãodeproxyreverso/DMZ)\n - [Proxy reverso com Apache](#Proxyreverso-ProxyreversocomApache)\n - [Proxy reverso com NGINX](#Proxyreverso-ProxyreversocomNGINX)\n - [Proxy reverso com NLB ou Big IP](#Proxyreverso-ProxyreversocomNLBouBigIP)\n - [Gerenciamento de vazão e restrição de acessos (Rate Limit)](#Proxyreverso-Gerenciamentodevazãoerestriçãodeacessos(RateLimit))\n\n# Objetivo\n\n---\n\nO objetivo deste guia é descrever os procedimentos para a configuração de um servidor de *proxy* reverso em uma instalação da plataforma.\n\nDicas\n\nApós a configuração do *proxy* reverso, não esqueça de alterar a URL de acesso ao portal nas Configurações do sistema da plataforma. [Clique aqui](http://tdn.totvs.com/x/EO4KDg) e saiba como fazer.\n\nImportante!\n\nSalientamos que, ao utilizar um *proxy* reverso, uma prática de segurança recomendada para a plataforma é não expor o servidor de aplicação diretamente na Internet.\n\n[Clique aqui](../../Especificações Técnicas/Boas práticas de segurança para o seu ambiente.md) e veja outras boas práticas de segurança recomendadas para o seu ambiente.\n\n# Visão geral\n\n---\n\nUm *proxy* reverso é um servidor que repassa o tráfego de rede recebido para um ou mais servidores. Ele fica na frente dos servidores Web e encaminha as solicitações do cliente – o navegador Web, por exemplo – para esses servidores Web, agindo como uma camada de controle, ajudando a aumentar a segurança, a confiabilidade e o desempenho.\n\nEm uma instalação da plataforma, este tipo de servidor é usado para habilitar uma topologia de arquitetura chamada [DMZ](http://tdn.totvs.com/display/fluig/Topologia+DMZ).\n\n# Funcionamento\n\n---\n\nO *proxy* reverso intercepta as solicitações dos clientes antes que elas cheguem aos servidores Web. Isso permite aplicar balanceamento de carga – um dos seus usos mais comuns – como também cache de conteúdo, criptografia SSL, compressão de dados, além de permitir aumentar a segurança das aplicações Web e a proteção contra ataques.\n\nDessa forma, o *proxy* reverso garante que nenhum cliente se comunique diretamente com os servidores Web.\n\n# Por que utilizar um *proxy* reverso?\n\n---\n\nAlguns dos benefícios obtidos ao utilizar um *proxy* reverso são:\n\n- melhora no desempenho de aplicações Web, diminuindo o tempo de resposta e otimizando o processamento, pois ele facilita o balanceamento de carga e o cache de conteúdo;\n\n- aumento da confiabilidade e da segurança contra ataques, visto que ele permite proteger os servidores implementando várias medidas de segurança e proteção;\n\n- facilidade na aplicação de políticas de segurança, de autenticação e de autorização, por permitir centralizar o controle de tráfego;\n\n- redução da carga de trabalho dos servidores *back-end*, pois ele gerencia a criptografia e a descriptografia do tráfego SSL.\n\n# Configuração de *proxy* reverso / DMZ\n\n---\n\nNo exemplo abaixo, a implementação da DMZ na plataforma foi realizada com o uso do Apache™ HTTP *Server*, que é um servidor *Web* de código livre, desenvolvido e mantido pela Apache *Software Foundation*.\n\nA figura a seguir apresenta as topologias DMZ + SSL suportadas pela plataforma TOTVS Fluig.\n\nNota:\n\nDestacamos que a topologia considerada ideal e recomendada é a número **2**: **(DMZ + SSL) → Fluig**.\n\n**![](..\\..\\..\\images\\Fluig%20com%20DMZ.png)**\n\nImportante!\n\nNão é possível utilizar as notificações em tempo real quando utilizado *proxy* reverso com HTTPS.\n\nSe o seu ambiente utiliza HTTPS e [balanceamento de carga](Alta disponibilidade e balanceamento de carga.md), a [configuração de HTTPS](https://tdn.totvs.com/pages/viewpage.action?pageId=354472893#Configura%C3%A7%C3%A3oHTTPSdaplataforma-Configura%C3%A7%C3%A3odeHTTPSmanual) deve ser replicada manualmente para todos os servidores do Fluig." }, { "metadata": { "title": "Proxy reverso", "source": "https://tdn.totvs.com/display/fluig/Proxy+reverso", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso.md" }, "content": "Proxy reverso\n\n## *Proxy* reverso com Apache\n\n---\n\nConsulte os procedimentos para a configuração e alguns exemplos em [Configuração de *proxy* reverso Apache](Proxy reverso/Configuração de proxy reverso Apache.md).\n\n## *Proxy* reverso com NGINX\n\n---\n\nConsulte os procedimentos para a configuração e alguns exemplos em [Configuração de *proxy* reverso NGINX com HTTPS](Proxy reverso/Configuração de proxy reverso NGINX com HTTPS.md).\n\nImportante!\n\nSomente é possível utilizar o NGINX **até a versão** **1.22** por conta da compatibilidade com o módulo nginx-stick-module-ng.\n\n## *Proxy* reverso com NLB ou Big IP\n\n---\n\nPara configurar *proxy* reverso utilizando o NLB, Big IP ou outros servidores homologados na nossa [matriz de portabilidade](../../Especificações Técnicas/Matriz de Portabilidade.md), consulte a documentação dos próprios fornecedores ou fabricantes.\n\nMas, é importante se atentar à prevenção de vulnerabilidades, para que informações não fiquem expostas no cabeçalho HTTP. [Clique aqui](Proxy reverso/Ocultar informações no cabeçalho HTTP.md) e saiba como ocultá-las no NLB.\n\n## Gerenciamento de vazão e restrição de acessos (Rate Limit)" }, { "metadata": { "title": "Proxy reverso", "source": "https://tdn.totvs.com/display/fluig/Proxy+reverso", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso.md" }, "content": "Proxy reverso\n\n\n---\n\nImplementação de controles de admissão para assegurar a estabilidade da infraestrutura, prevenindo a exaustão de recursos por requisições automatizadas ou volumétricas de uma mesma origem.\n\n**Proteção de Camada de Aplicação no Apache (mod\\_evasive)**\n\nConfiguração de limites de frequência por objeto e por site, utilizando tabelas de hash em memória para detecção e bloqueio temporário (HTTP 403) de IPs com comportamento anômalo.\n\nSaiba mais\n\nConfira as instruções detalhadas para configurar o **Rate Limit** de requisições no Apache **[aqui](https://tdn.totvs.com/pages/viewpage.action?pageId=877162376#Configura%C3%A7%C3%A3odeproxyreversoApache-ConfigurarRateLimitderequisi%C3%A7%C3%B5es)**.\n\n**Controle de Fluxo e Escalonamento no NGINX (limit\\_req)**\n\nUtilização do algoritmo *leaky bucket* para padronizar a taxa de processamento de requisições, permitindo a gestão de picos de tráfego (burst) e respostas semânticas personalizadas (HTTP 429).\n\nSaiba mais\n\nConfira as instruções detalhadas para configurar o **Rate Limit** de requisições no NGINX **[aqui](https://tdn.totvs.com/pages/viewpage.action?pageId=736971727#Configura%C3%A7%C3%A3odeproxyreversoNGINXcomHTTPS-Funcionamentodocontroledetaxa(RateLimit))**." }, { "metadata": { "title": "Servidor de indexação dedicado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=269425760", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de indexação dedicado.md" }, "content": "Servidor de indexação dedicado" }, { "metadata": { "title": "Servidor de indexação dedicado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=269425760", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de indexação dedicado.md" }, "content": "Servidor de indexação dedicado\n\n\n# Índice\n\n- 1 [Introdução](#Servidordeindexaçãodedicado-Introdução)\n- 2 [Considerações iniciais](#Servidordeindexaçãodedicado-Consideraçõesiniciais)\n- 3 [Preparando o ambiente](#Servidordeindexaçãodedicado-Preparandooambiente)\n- 4 [Configurações do Servidor de indexação](#Servidordeindexaçãodedicado-ConfiguraçõesdoServidordeindexação)\n- 5 [Alta disponibilidade](#Servidordeindexaçãodedicado-Altadisponibilidade)\n- 6 [Atualizando o Servidor de indexação](#Servidordeindexaçãodedicado-AtualizandooServidordeindexação)\n\n# Introdução\n\n---\n\nEm ambientes onde a quantidade de documentos é consideravelmente grande, é aconselhado a utilização de um servidor dedicado para indexação, podendo inclusive ser configurado um *cluster* com dois ou mais servidores para garantir a disponibilidade do serviço.\n\n# Considerações iniciais\n\n---\n\nO acesso ao repositório de documentos do Fluig ([Volume](http://tdn.totvs.com/x/jP-uDQ)) pelo Servidor de indexação executando em servidor separado, é opcional. Porém, é importante notar que a performance de extração é superior quando o servidor de indexação tem acesso ao repositório. Se este for o caso, todas as instâncias do servidor de indexação deverão ter acesso compartilhado ao repositório.\n\nTambém é fundamental que esta pasta compartilhada esteja localizada no endereço informado nas configurações da empresa do Fluig.\n\n# Preparando o ambiente\n\n---\n\nAntes de começar a configuração, siga os passos da atualização correspondente:\n\n- Realize a instalação somente do módulo do Servidor de indexação seguindo a documentação conforme seu sistema operacional.\n - [Instalação Windows - Modo Caractere](../../Instalação e Atualização/Guia de instalação da plataforma/Instalação da plataforma em Windows - Instalador/Instalação Windows - Modo Caractere.md)\n - [Instalação Linux - Modo Caractere](../../Instalação e Atualização/Guia de instalação da plataforma/Instalação da plataforma no Linux - Instalador/Instalação Linux - Modo Caractere.md)\n\n- Realize uma [instalação padrão](../../Instalação e Atualização/Guia de instalação da plataforma.md) do Fluig no servidor dedicado.\n\n# Configurações do Servidor de indexação\n\n---\n\nO arquivo onde as configurações do Servidor de indexação devem ser realizadas dependem da forma como é feita a inicialização do serviço de indexação.\n\nPor padrão, estes valores já vem preenchidos na instalação. Porém, dependendo do dimensionamento do ambiente, será necessário alterar estas configurações.\n\n| Sistema operacional | Arquivo de configuração | Localização |\n| --- | --- | --- |\n| Linux | fluig\\_Indexer.in.sh | /etc/default/ |\n| Windows | solr.in.cmd | [Instalação fluig Indexer]/solr/bin/ |\n\nNo arquivo de configuração do Solr devem ser efetuados os seguintes ajustes:\n\n**Definindo a quantidade de memória disponível para o Solr**\n\nA configuração padrão do Solr reserva 512 MB de memória, o que pode ser pouco para a maioria dos casos. Para aumentar a memória disponível, remova a marcação de comentário (#) e altere os valores das propriedades **SOLR\\_HEAP** (Linux) e/ou **SOLR\\_JAVA\\_MEM** (Linux / Windows).\n\n**No Linux**\n\n```\nSOLR_HEAP=\"512m\"\n#SOLR_JAVA_MEM=\"-Xms512m -Xmx1024m\"\n```\n\n**No Windows**\n\n```\nset SOLR_JAVA_MEM=-Xms512m -Xmx1024m\n```\n\nImportante!\n\nO estouro na memória do Solr pode ocasionar inconsistências no TOTVS Fluig Plataforma, como erros na busca ou em algumas APIs de documento. No entanto, não é possível estabelecer previamente o valor de memória a ser reservado, pois o uso de memória no ambiente muda devido ao número de documentos, extensão dos arquivos e utilização. Por exemplo um arquivo XLS e um CSV serão processados de forma diferente, e o mesmo ocorre com um PDF e um DOC.\n\nPor esse motivo, recomendamos acompanhar o consumo de memória durante os horários de maior utilização da plataforma e realizar o dimensionamento adicionando entre 25 a 50% acima. É uma boa prática reanalisar periodicamente os *logs* ou monitorar com relatórios de métricas para ver se o uso de memória mudou e a memória deve ser aumentada. Para mais detalhes, consulte a documentação do [Solr](https://solr.apache.org/guide/8_8/jvm-settings.html).\n\n**Definindo o caminho do Java**\n\nSe o executável Java não estiver configurado na variável de ambiente *Path* do sistema operacional, configure o caminho do executável através do arquivo de configuração, removendo a marcação de comentário (#) e alterando a variável **SOLR\\_JAVA\\_HOME**. Exemplo: \"C:\\[fluig Indexer]\\jdk-64\\bin\\java.exe\".\n\n**No Linux**\n\n```\n#SOLR_JAVA_HOME=\"\"\n```\n\n**No Windows**\n\n```\nREM set SOLR_JAVA_HOME=\n```\n\n**Definindo o IP do Servidor de indexação - (Opcional)**\n\nCaso queira fixar o IP do servidor no qual o Solr ouve as conexões, remova a marcação de comentário (# ou REM) e altere a variável **SOLR\\_HOST**.\n\n**No Linux**\n\n```\n#SOLR_HOST=\"192.168.1.1\"\n```\n\n**No Windows**\n\n```\nREM set SOLR_HOST=192.168.1.1\n```\n\n**Alteração da porta [Default: 8983] - (Opcional)**\n\nCaso queira alterar a porta na qual o Solr ouve as conexões, remova a marcação de comentário (# ou REM) e altere a variável **SOLR\\_PORT**.\n\n**No Linux**\n\n```\n#SOLR_PORT=8983\n```\n\n**No Windows**\n\n```\nREM set SOLR_PORT=8983\n```\n\n# Alta disponibilidade\n\n---\n\nSe desejar implementar servidores para o serviço de indexação na configuração Master/Slave, continue a instalação conforme os procedimentos descritos na documentação [Servidor de indexação em alta disponibilidade](Servidor de indexação dedicado/Servidor de indexação em alta disponibilidade.md).\n\n# Atualizando o Servidor de indexação\n\n---\n\nA atualização do Servidor de indexação deve ser realizada conforme o [Guia de atualização da plataforma](../../Instalação e Atualização/Guia de atualização da plataforma.md) atentando-se para o item [Atualização com balanceamento de carga, alta disponibilidade e tolerância à falha - *Cluster*](https://tdn.totvs.com/pages/viewpage.action?pageId=271666186#Guiadeatualiza%C3%A7%C3%A3odaplataforma-Atualiza%C3%A7%C3%A3ocombalanceamentodecarga,altadisponibilidadeetoler%C3%A2ncia%C3%A0falha-Cluster).\n\nApós a atualização, inicie o serviço do servidor de indexação dedicado." }, { "metadata": { "title": "Servidor de Licenças (License Server)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=142805338", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de Licenças (License Server).md" }, "content": "Servidor de Licenças (License Server)\n\n\n# Índice\n\n- 1 [Visão geral](#ServidordeLicenças(LicenseServer)-Visãogeral)\n- 2 [Instalação e configuração](#ServidordeLicenças(LicenseServer)-Instalaçãoeconfiguração)\n - 2.1 [Teste de conexão](#ServidordeLicenças(LicenseServer)-Testedeconexão)\n\n# Visão geral\n\n---\n\nLicense Server é um recurso computacional que tem como objetivo realizar o controle das licenças de uso dos softwares e aplicações. Através deste recurso é possível prover de forma eficiente e segura as licenças e liberações de utilização de módulos e/ou funcionalidades das aplicações, em conformidade com o contrato firmado entre o cliente e o TOTVS Fluig.\n\n# Instalação e configuração\n\n---\n\nOs detalhes de requisitos do sistema, instalação e configurações podem ser vistos clicando nos links a seguir:\n\n- 1 [Requisitos de Sistema](https://tdn.totvs.com/pages/viewpage.action?pageId=244445844)\n- 2 [Instalação do License Server](https://tdn.totvs.com/pages/viewpage.action?pageId=244445844)\n - 2.1 [Instalação Windows](https://tdn.totvs.com/pages/viewpage.action?pageId=244445844)\n - 2.2 [Instalação Linux](https://tdn.totvs.com/pages/viewpage.action?pageId=244445844)\n - 2.3 [Configuração](https://tdn.totvs.com/pages/viewpage.action?pageId=244445844)\n\nSaiba mais\n\nSe possui dúvidas sobre o licenciamento, veja todos os detalhes na página [Licenciamento da plataforma](../../Sobre a plataforma/Licenciamento da plataforma.md). Procure por **Como obter a quantidade de licenças consumidas?** para saber como consultar a quantidade de usuários ativos por empresa.\n\n## Teste de conexão" }, { "metadata": { "title": "Servidor de Licenças (License Server)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=142805338", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de Licenças (License Server).md" }, "content": "Servidor de Licenças (License Server)\n\n\n---\n\nPara verificar se o servidor de licenças está ativo, existem duas formas: pelo serviço do License Server ou através do teste de conexão na plataforma.\n\nPara fazer o teste de conexão, acesse a plataforma com o usuário wcmadmin e acione **Configurações do sistema**, na aba **Parâmetros da plataforma**. No trecho de configuração **Servidor de licenças**há um botão que possibilita a realização do teste de conexão." }, { "metadata": { "title": "Topologia DMZ", "source": "https://tdn.totvs.com/display/fluig/Topologia+DMZ", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Topologia DMZ.md" }, "content": "Topologia DMZ\n\n\n- 1 [Introdução](#TopologiaDMZ-Introdução)\n- 2 [Pré-requisitos](#TopologiaDMZ-Pré-requisitos)\n- 3 [Topologia](#TopologiaDMZ-Topologia)\n\n# Introdução\n\n---\n\nO TOTVS Fluig Plataforma possui suporte à implementação de DMZ.\n\nO acrônimo DMZ, em segurança da informação, corresponde à DeMilitarized Zone ou \"zona desmilitarizada\". A DMZ é uma pequena rede situada entre uma rede confiável e uma não confiável, geralmente entre a rede local e a Internet.\n\nA função de uma DMZ é manter todos os serviços que possuem acesso externo (tais como servidores HTTP) junto em uma rede local, limitando assim o potencial dano em caso de comprometimento de algum serviço por um invasor.\n\n# Pré-requisitos\n\n---\n\n- O cliente deve possuir um domínio de internet.\n\n- O mesmo endereço de acesso à plataforma deve ser usado tanto para rede externa quanto para a rede interna.\n\n- Quando a plataforma estiver usando SSL, é necessário liberar somente a porta 443 no *firewall* ao invés da porta 8080.\n\n- Liberar no *firewall* os seguintes endereços para acesso a partir do servidor Fluig:\n - Fluig Analytics - https://[analytics.fluig.com](http://analytics.fluig.com);\n - TOTVS Identity - servidor e porta do serviço Identity, por exemplo, https://[fluigidentity.com](http://fluigidentity.com).\n\n- Caso o servidor de *e-mail* usado pela plataforma esteja fora da rede interna, é necessário liberar o endereço e a porta do servidor de *e-mail* nos *firewalls*.\n\n- A topologia descrita e as portas também atendem ao aplicativo móvel do Fluig.\n\n# Topologia\n\n---\n\nA figura abaixo ilustra a topologia e as portas de comunicação usadas pela plataforma.\n\n![](..\\..\\..\\images\\fluig-dmz.png)" }, { "metadata": { "title": "Configurando o fluig Realtime para execução em Load Balance", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623378", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Configurando o fluig Realtime para execução em Load Balance.md" }, "content": "Configurando o fluig Realtime para execução em Load Balance" }, { "metadata": { "title": "Configurando o fluig Realtime para execução em Load Balance", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623378", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Configurando o fluig Realtime para execução em Load Balance.md" }, "content": "Configurando o fluig Realtime para execução em Load Balance\n\n\nAtenção\n\nEsta página foi revisada para considerar as configurações de servidor de aplicação da atualização 1.6 e superiores.\n\n- 1 [Objetivo](#ConfigurandoofluigRealtimeparaexecuçãoemLoadBalance-Objetivo)\n- 2 [Introdução](#ConfigurandoofluigRealtimeparaexecuçãoemLoadBalance-Introdução)\n- 3 [Instalando o fluig Realtime Server](#ConfigurandoofluigRealtimeparaexecuçãoemLoadBalance-InstalandoofluigRealtimeServer)\n- 4 [Configurando o fluig Realtime Server com múltiplas instâncias](#ConfigurandoofluigRealtimeparaexecuçãoemLoadBalance-ConfigurandoofluigRealtimeServercommúltiplasinstâncias)\n- 5 [Configurando o fluig Server para utilizar o fluig Realtime embarcado em cada servidor](#ConfigurandoofluigRealtimeparaexecuçãoemLoadBalance-ConfigurandoofluigServerparautilizarofluigRealtimeembarcadoemcadaservidor)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar os procedimentos para a configuração do fluig Realtime para execução em Load Balance.\n\n# Introdução\n\n---\n\nO fluig Realtime Server, baseado no produto [Node.js](http://nodejs.org/), é utilizado para apresentar as notificações da plataforma na tela do usuário.\n\nEm ambientes onde será utilizado *cluster*, é desejável que todos os módulos estejam redundantes para alcançar a característica de tolerância à falhas.\n\nEm ambientes com *load balance*, é muito importante manter todos os servidores com o horário sincronizado.\n\n# Instalando o fluig Realtime Server\n\n---\n\nEm ambientes Windows, o próprio instalador já instala o fluig Realtime Server. Para obter mais detalhes, acesse [Instalação da plataforma em Windows - Instalador](../../../Instalação e Atualização/Guia de instalação da plataforma/Instalação da plataforma em Windows - Instalador.md).\n\nEm ambientes Linux, acesse [Instalação da plataforma no Linux - Instalador](../../../Instalação e Atualização/Guia de instalação da plataforma/Instalação da plataforma no Linux - Instalador.md).\n\nImportante\n\nAntes de seguir a configuração, efetuar os passos de instalação do servidor [Redis para uso do Load balance Realtime](../Configuração Redis para uso do Load balance Realtime.md)\n\n# Configurando o fluig Realtime Server com múltiplas instâncias\n\n---\n\nPara que as várias instâncias do Node.js se comuniquem, o arquivo **[diretório\\_instalação]/node/bin/fluig.rt/package.json** deve ser editado alterando as seguintes informações:\n\n```\n\"scale\": {\n \"enabled\": true,\n \"redisServer\": \"localhost\",\n \"redisPort\": 6379\n }\n```\n\nOs atributos devem ser alterados conforme detalhado a seguir:\n\n| Atributos | Descrição |\n| --- | --- |\n| **enabled** | Informar \"*true*\" para caracterizar a utilização do node com outras instâncias. |\n| **redisServer** | Informar o endereço do servidor Redis (configuração do servidor [Redis](../Configuração Redis para uso do Load balance Realtime.md)). |\n| **redisPort** | Informar a porta de conexão do servidor Redis. |\n\nNota\n\nApós a alteração, o serviço do Node.js deve ser reiniciado.\n\n# Configurando o fluig Server para utilizar o fluig Realtime embarcado em cada servidor\n\n---\n\nQuando utilizam-se várias instâncias do fluig, cada uma destas instâncias possui um servidor para Realtime em execução.\n\nOs servidores do fluig devem ser configurados para usar o fluig Realtime através do endereço IP de redirecionamento.\n\n1. Crie ou edite o arquivo [Idiretório\\_instalação]/repository/wcmdir/config/[configuration.properties](http://tdn.totvs.com/pages/viewpage.action?pageId=257623031):\n\n ```\n node.chat.url=:7777\n node.realtime.url=:8888\n ```\n\n **** é o endereço IP do servidor informado durante a instalação.\n2. Altere os parâmetros acima para:\n\n ```\n node.chat.url=:7777\n node.realtime.url=:8888\n ```\n\n **** é o endereço IP do redirecionador das requisições (Ex.: [Apache mod\\_proxy](Plataforma em load balance com Apache mod_proxy em Linux.md), [Microsoft NLB](Plataforma em load balance com Microsoft NLB.md))." }, { "metadata": { "title": "Plataforma em load balance com Apache mod_proxy em Linux", "source": "https://tdn.totvs.com/display/fluig/Plataforma+em+load+balance+com+Apache+mod_proxy+em+Linux", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Plataforma em load balance com Apache mod_proxy em Linux.md" }, "content": "Plataforma em load balance com Apache mod_proxy em Linux" }, { "metadata": { "title": "Plataforma em load balance com Apache mod_proxy em Linux", "source": "https://tdn.totvs.com/display/fluig/Plataforma+em+load+balance+com+Apache+mod_proxy+em+Linux", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Plataforma em load balance com Apache mod_proxy em Linux.md" }, "content": "Plataforma em load balance com Apache mod_proxy em Linux\n\n\nFique atento!\n\nEsta página foi revisada para considerar as configurações de *server* do TOTVS Fluig para a atualização **1.6.3** ou **superiores**.\n\nPara atualizações entre 1.6.0 e 1.6.2 acesse: [Como configurar a plataforma em load balance com Apache mod\\_proxy em Linux das releases 1.6.0 à 1.6.2?](https://tdn.totvs.com/pages/viewpage.action?pageId=337350257)\n\n- [Pré-requisitos](#PlataformaemloadbalancecomApachemod_proxyemLinux-Pré-requisitos)\n- [Considerações iniciais](#PlataformaemloadbalancecomApachemod_proxyemLinux-Consideraçõesiniciais)\n- [Instalando a primeira instância](#PlataformaemloadbalancecomApachemod_proxyemLinux-Instalandoaprimeirainstância)\n- [Criando uma segunda instância na mesma instalação](#PlataformaemloadbalancecomApachemod_proxyemLinux-Criandoumasegundainstâncianamesmainstalação)\n- [Criando uma instância em outra máquina](#PlataformaemloadbalancecomApachemod_proxyemLinux-Criandoumainstânciaemoutramáquina)\n- [Configurando o balanceador (mod\\_proxy)](#PlataformaemloadbalancecomApachemod_proxyemLinux-Configurandoobalanceador(mod_proxy))\n - [Passos para usar o Load Balance do Realtime](#PlataformaemloadbalancecomApachemod_proxyemLinux-PassosparausaroLoadBalancedoRealtime)\n- [Ambientes HTTPS](#PlataformaemloadbalancecomApachemod_proxyemLinux-AmbientesHTTPS)\n\n# Pré-requisitos\n\n---\n\nPara atualizar os parâmetros de configuração, deve-se obedecer aos seguintes pré-requisitos:\n\n- O usuário deve ser administrador da plataforma;\n\n- O usuário deve ter acesso aos arquivos de configuração da plataforma.\n\nAtenção!\n\nAntes de prosseguir com as instruções descritas nessa página, siga com atenção as instruções contidas na documentação [Alta disponibilidade e Balanceamento de carga](http://tdn.totvs.com/pages/viewpage.action?pageId=257622931)\n\n# Considerações iniciais\n\n---\n\nA configuração de balanceamento de carga (*load balance)* é a forma mais simples de se obter distribuição de carga e algum nível de alta disponibilidade.\n\nImportante!\n\nEm ambientes com *load balance*, é muito importante manter todos os servidores com o horário sincronizado.\n\nA grande desvantagem é a necessidade de afinidade de sessão, ou seja, uma vez que o usuário foi autenticado em uma instância, sempre será direcionado para a mesma instância. Nesse caso, se essa instância ficar indisponível, o usuário terá que logar novamente na aplicação.\n\n# Instalando a primeira instância\n\n---\n\nSiga os procedimentos abaixo para realizar a instalação da primeira instância do Fluig em um ambiente *load balance.*\n\n- Faça uma instalação normal, conforme o [Guia de instalação da plataforma](../../../Instalação e Atualização/Guia de instalação da plataforma.md), mas **não** inicie os serviços do Fluig.\n\n- **A partir da atualização 2.0**: \n Abra o arquivo **standalone.xml** que está disponível em **[diretório\\_instalação]/appserver/standalone/configuration** em um editor de texto.\n\n- **Para atualizações 1.6.3 até 1.8.2**: \n Abra o arquivo **domain.xml** que está disponível em **[diretório\\_instalação]/appserver/domain/configuration** em um editor de texto.\n\n- No arquivo correspondente à atualização do Fluig que você utiliza (**standalone.xml** ou **domain.xml**), localize a propriedade de *binding* \"java:global/wcm/globalDataDir\" e altere-a informando o caminho da pasta compartilhada entre as instâncias;\n\n```\n\n```\n\n- Localize o *subsystem* \"urn:com.totvs.technology.wcm:1.0\" e altere-o informando o caminho da pasta compartilhada entre as instâncias;\n\n```\n\n```\n\n- Mova o conteúdo da pasta **[diretório\\_instalação]/repository/wcmdir** para a pasta **GLOBAL\\_DATA\\_DIR/wcmdir**\n\n- Mova o conteúdo da pasta **[diretório\\_instalação]/appserver/apps** para a pasta **GLOBAL\\_DATA\\_DIR****/apps**\n\n- Configure o servidor de indexação (fluig Indexer) para ser executado em servidor separado, conforme instruções [aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=257623442).\n\n- Inicie os serviços **fluig\\_Indexer,** **fluig\\_RealTime** e em seguida, inicie o **fluig**.\n\n- Acesse a plataforma com o usuário \"wcmadmin\", crie uma nova empresa (*tenant*) e realize as configurações necessárias.\n\n- Pare o **fluig** e os serviços do **fluig\\_RealTime** e **fluig\\_Indexer.**\n\n# Criando uma segunda instância na mesma instalação\n\n---\n\nO Fluig permite executar uma segunda instância na mesma instalação, ou seja, sem a necessidade de instalar tudo novamente.\n\n- Abra em um editor de texto o arquivo **[diretório\\_instalação]/appserver/domain/configuration/host.xml**\n\n- Localize a *tag* ****\n\n- Dentro dela haverão *tags* chamadas ****\n\n- Adicione uma nova tag ****, conforme exemplo:\n\n**host.xml**\n\n```\n\n \n \n \n \n \n \n\n```\n\n- Certifique-se que o atributo **name** contenha um valor que jamais será repetido em outra instância.\n\n- A primeira instância **sempre** deverá se chamar \"fluig1\", enquanto as demais instâncias podem ter qualquer nome definido.\n\n- O atributo **auto-start** indica se a instância deve (true) ou não (false) ser iniciada imediatamente quando o Fluig for iniciado. Se informado **false**, será preciso iniciá-la manualmente posteriormente usando a ferramenta **jboss-cli**. A recomendação é que a primeira instância seja iniciada sozinha e posteriomente sejam iniciadas as demais instâncias.\n\n- Caso desejar ou for necessário, altere o atributo **port-offset** da *tag* **socket-bindings**. Cada nova instância precisa de um valor diferente (múltiplos de 150 são uma boa indicação).\n\n- Ajuste as configurações de memória na *tag* **heap**.\n\nÉ possível adicionar mais instâncias na mesma instalação. Basta replicar toda a seção **** e tomar o cuidado de alterar, pelo menos, os atributos **port-offset** e **name**.\n\nAs instâncias que forem configuradas para não iniciar automaticamente (auto-start=\"false\") devem ser iniciadas manualmente utilizando a ferramenta jboss-cli, que se encontra em **[diretório\\_instalação]/****appserver/bin**, com o seguinte comando:\n\nNo Linux:\n\n**Linux**\n\n```\n./jboss-cli.sh --controller=\":9990\" --connect --command=\"/host=master/server-config=fluig2:start\"\n```\n\nNo Windows:\n\n**Windows**\n\n```\njboss-cli.bat --controller=\":9990\" --connect --command=\"/host=master/server-config=fluig2:start\"\n```\n\nOnde  é o endereço IP/hostname configurado no arquivo **host.xml** (localizado em [diretório\\_instalação]/appserver/domain/configuration), na seção:\n\n```\n\n    \n\n```\n\n```\n\n```\n\n# Criando uma instância em outra máquina\n\n---\n\n\n\n- Instale a aplicação pelo [procedimento normal](../../../Instalação e Atualização/Guia de instalação da plataforma.md) e siga as instruções até o procedimento antes de iniciar o servidor.\n\n- Abra em um editor de texto o arquivo **[diretório\\_instalação]/appserver/domain/configuration/host.xml**.\n\n- Localize a *tag* ****.\n\n- Dentro dela haverão *tags* chamadas ****. Altere o atributo **name** dessas *tags*. O valor desse atributo precisa ser diferente em cada instância.\n\n# Configurando o balanceador (mod\\_proxy)\n\n---\n\nO Fluig homologa o Apache com o módulo mod\\_proxy para fazer o balanceamento de carga.\n\n- Instale o servidor [HTTP Apache](https://httpd.apache.org/download.cgi), versão 2.4.x.\n\n- Configure o Apache para carregar os módulos necessários (comumente feito através do arquivo **/etc/apache2/mods-enabled/mod\\_proxy.load**), conforme abaixo.\n\nA ordem de carregamento dos módulos é extremamente importante.\n\n```\nLoadModule lbmethod_bybusyness_module /usr/lib/apache2/modules/mod_lbmethod_bybusyness.so\nLoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so\nLoadModule slotmem_shm_module /usr/lib/apache2/modules/mod_slotmem_shm.so\nLoadModule proxy_balancer_module /usr/lib/apache2/modules/mod_proxy_balancer.so\nLoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so\nLoadModule headers_module /usr/lib/apache2/modules/mod_headers.so\nLoadModule lbmethod_byrequests_module /usr/lib/apache2/modules/mod_lbmethod_byrequests.so\n```\n\n- A primeira linha indica o tipo de balanceamento que será feito. No exemplo acima, ele é feito por carga do servidor. Para conhecer outras formas, [consulte o manual](https://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html) do Apache.\n\n- Habilite o mod\\_proxy (em geral isso é feito criando o arquivo **/etc/apache2/sites-enabled/mod\\_proxy.conf**).\n\n```\nHeader add Set-Cookie \"FLUIGCOOKIE=%{UNIQUE_ID}e.%{BALANCER_WORKER_ROUTE}e; path=/\" env=!VARCOOKIE\n\n ProxyRequests Off\n ProxyPreserveHost On\n\n \n BalancerMember http://{ip servidor 1}:8080 route=fluig1\n BalancerMember http://{ip servidor 1}:8230 route=fluig2\n BalancerMember http://{ip servidor 2}:8230 route=fluig3\n\t\t\t\t\t\tProxySet stickysession=FLUIGCOOKIE\n \n\n \n SetHandler balancer-manager\n Order Deny,Allow\n Allow from all\n \n \n Order allow,deny\n Allow from all\n \n\n ProxyPass / balancer://mycluster/ stickysession=FLUIGCOOKIE nofailover=Off\n ProxyPassReverse / balancer://mycluster/\n\n```\n\nAtenção!\n\n- Cada “BalancerMember” indica um servidor e deve apontar para o IP e porta corretos.\n\n- Um *cookie* chamado “FLUIGCOOKIE” é criado para manter a afinidade da sessão. Sem o *cookie*, o procedimento não irá funcionar.\n\nAtenção!\n\nO procedimento abaixo deve ser realizado para utilizar o serviço de Realtime em Load balance." }, { "metadata": { "title": "Plataforma em load balance com Apache mod_proxy em Linux", "source": "https://tdn.totvs.com/display/fluig/Plataforma+em+load+balance+com+Apache+mod_proxy+em+Linux", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Plataforma em load balance com Apache mod_proxy em Linux.md" }, "content": "Plataforma em load balance com Apache mod_proxy em Linux\n\n## Passos para usar o Load Balance do Realtime" }, { "metadata": { "title": "Plataforma em load balance com Apache mod_proxy em Linux", "source": "https://tdn.totvs.com/display/fluig/Plataforma+em+load+balance+com+Apache+mod_proxy+em+Linux", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Plataforma em load balance com Apache mod_proxy em Linux.md" }, "content": "Plataforma em load balance com Apache mod_proxy em Linux\n\n\n---\n\n- Realizar a configuração do Realtime para Load Balance conforme apresentado em [Configurando o fluig Realtime para execução em Load Balance](Configurando o fluig Realtime para execução em Load Balance.md).\n- Adicionar o módulo abaixo, ao final dos demais módulos citados no passo 2.\n\n```\nLoadModule rewrite_module /usr/lib/apache2/modules/mod_proxy_wstunnel.so\n```\n\n- Realizadas as configurações acima, adicionar o código abaixo ao arquivo de configuração do servidor (Passo 3).\n\n```\nListen 8888\nHeader add Set-Cookie \"SERVERID=sticky.%{BALANCER_WORKER_ROUTE}e; path=/\" env=BALANCER_ROUTE_CHANGED\nAllowConnect 8888\n \n\t\n\tProxyRequests Off\n ProxyPreserveHost On\n \n\n \n BalancerMember http://{ip servidor realtime1}:8888 route=load1\n BalancerMember http://{ip servidor realtime2}:8888 route=load2\n ProxySet stickysession=SERVERID\n \n \n \n SetHandler balancer-manager\n Order Deny,Allow\n Allow from all\n \n \n Order allow,deny\n Allow from all\n \n\n\n ProxyPass / balancer://mycluster1/ stickysession=SERVERID nofailover=Off\n ProxyPassReverse / balancer://mycluster1/\n\n\n\n\nListen 7777\nHeader add Set-Cookie \"SERVERID=sticky.%{BALANCER_WORKER_ROUTE}e; path=/\" env=BALANCER_ROUTE_CHANGED\nAllowConnect 7777\n \n\t\n\tProxyRequests Off\n ProxyPreserveHost On\n\n\n \n BalancerMember http://{ip servidor realtime1}:7777 route=read1\n BalancerMember http://{ip servidor realtime2}:7777 route=read2\n ProxySet stickysession=SERVERID\n \n \n \n BalancerMember ws://{ip servidor realtime1}:7777 route=read1\n BalancerMember ws://{ip servidor realtime2}:7777 route=read2\n ProxySet stickysession=SERVERID\n \n \n \n RewriteEngine On\n\tRewriteCond %{HTTP:Upgrade} =websocket [NC]\n\tRewriteRule /(.*) balancer://nodes_ws/$1 [P,L]\n\tRewriteCond %{HTTP:Upgrade} !=websocket [NC]\n\tRewriteRule /(.*) balancer://nodes_polling/$1 [P,L] \n\n \n\n```\n\n# Ambientes HTTPS\n\n---\n\nQuando o usuário estiver usando um ambiente HTTPS, é necessário que as *flags* de segurança \"*Secure*\" e \"*HttpOnly*\" dos *cookies* estejam habilitadas na sessão. Para isso, siga a instrução abaixo:\n\n- Editar o arquivo **/etc/apache2/sites-enabled/mod\\_proxy.conf** e adicionar a seguinte linha no final do arquivo:\n\n```\nHeader edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure\n```\n\nImportante!\n\nAo utilizar balanceamento de carga em ambientes com HTTPS, a [configuração de HTTPS](https://tdn.totvs.com/pages/viewpage.action?pageId=354472893#Configura%C3%A7%C3%A3oHTTPSdaplataforma-Configura%C3%A7%C3%A3odeHTTPSmanual) deve ser replicada manualmente para todos os servidores do Fluig." }, { "metadata": { "title": "Plataforma em load balance com Microsoft NLB", "source": "https://tdn.totvs.com/display/fluig/Plataforma+em+load+balance+com+Microsoft+NLB", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Plataforma em load balance com Microsoft NLB.md" }, "content": "Plataforma em load balance com Microsoft NLB" }, { "metadata": { "title": "Plataforma em load balance com Microsoft NLB", "source": "https://tdn.totvs.com/display/fluig/Plataforma+em+load+balance+com+Microsoft+NLB", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Plataforma em load balance com Microsoft NLB.md" }, "content": "Plataforma em load balance com Microsoft NLB\n\n\nATENÇÃO\n\nA utilização de servidores Microsoft Windows para configuração de load balance é **extremamente NÃO RECOMENDADA.** Conforme a **[documentação](Plataforma em load balance com Microsoft Windows.md).**\n\nAtenção\n\nEsta página foi revisada para considerar as configurações de server do TOTVS Fluig Plataforma para a atualização 1.6.3 ou superior.\n\n# Índice\n\n- 1 [Pré requisitos](#PlataformaemloadbalancecomMicrosoftNLB-Prérequisitos)\n- 2 [Preparando ambiente](#PlataformaemloadbalancecomMicrosoftNLB-Preparandoambiente)\n- 3 [Configurando o Microsoft NLB](#PlataformaemloadbalancecomMicrosoftNLB-ConfigurandooMicrosoftNLB)\n\n# Pré requisitos\n\n---\n\n- O serviço de indexação precisa ser compartilhado por todas as instâncias, portanto deve ser isolado em outro ambiente, podendo ser um servidor único ou [em cluster](http://tdn.totvs.com/display/public/fluig/Fluig+Indexer+em+um+cluster+de+servidores+dedicados);\n\n- Todas as instâncias deverão ter acesso a uma mesma pasta compartilhada, onde será o repositório de arquivos do sistema;\n\n- O banco de dados dever ser único para todas as instâncias;\n\n- Todas as instâncias devem estar atualizadas com a mesma versão da plataforma.\n\n- É preciso manter afinidade de sessão, ou seja, uma vez que o usuário logou acessando em uma instância, sempre será direcionado para a mesma instância.\n\n# Preparando ambiente\n\n---\n\nAntes de começar a instalação, é preciso estar com o ambiente preparado. Faça o seguinte:\n\n**1.** Instale o banco de dados e crie uma instância;\n\nAtenção!\n\nÀ partir da atualização Snowflake (1.6.3), o controle e sincronização do cache do Fluig é realizado através do banco de dados e é compartilhado entre todos os nós de um cluster. Em atualizações 1.6.0 à 1.6.2 **é necessário realizar a instalação do [Redis](../Configuração do fluig cache com Redis.md) como serviço de cache do Fluig antes do passo 2**.\n\n**2.** Escolha uma pasta e um servidor e torne-a acessível para todas as máquinas que farão parte do *load balancer.*\n\n# Configurando o Microsoft NLB\n\n---\n\nExistem 3 portas a serem configuradas:\n\n**7777 e 8888 para o fluig RealTime:**\n\n- Ambas deverão estar no Modo \"Single\"\n- Para mais informações acesse [Configurando o Fluig Realtime para execução em cluster](https://tdn.totvs.com/pages/viewpage.action?pageId=146183926).\n\n**Porta HTTP para o fluig Server**\n\n- Esta porta costuma-se ser a 8080 ou apenas 80.\n- Esta porta deve estar no modo \"Multiple\" e afinidade \"Single\".\n\n![](..\\..\\..\\..\\images\\Config.png)\n\nEm ambientes com *load balance*, é muito importante manter todos os servidores com o horário sincronizado." }, { "metadata": { "title": "Plataforma em load balance com Microsoft Windows", "source": "https://tdn.totvs.com/display/fluig/Plataforma+em+load+balance+com+Microsoft+Windows", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Plataforma em load balance com Microsoft Windows.md" }, "content": "Plataforma em load balance com Microsoft Windows\n\n\nAtenção\n\nA utilização de servidores Microsoft Windows para ambientes com mais de uma instância **não é recomendada**.\n\n## Situação\n\n---\n\nRelatos de diversos usuários, confirmados por testes internos, indicam que a instalação do Fluig em servidores Microsoft Windows não é recomendada quando há necessidade de configurar um Load Balancer, ou seja, quando é preciso utilizar mais de uma instância do Fluig.\n\nOs principais problemas encontrados são:\n\n- **Bloqueio de arquivos**: sistemas de arquivos como o NTFS frequentemente apresentam limitações no acesso simultâneo a arquivos por múltiplos processos, situação que se torna ainda mais crítica quando os arquivos estão localizados em diretórios compartilhados na rede.\n - Algumas situações que causam o múltiplo acesso ao mesmo arquivo:\n - Duas instâncias do Fluig acessando o arquivo;\n - Antivírus verificando arquivos que se encontram na pasta de instalação do Fluig ou no volume;\n - **Principais problemas encontrados**:\n - Ao iniciar o Fluig, o processo de deploy — e, consequentemente, o startup — falha porque um artefato do produto está sendo utilizado por outro processo, como, por exemplo, o antivírus.\n - Ao subir uma segunda instância do Fluig, o processo de deploy — e, consequentemente, o startup — falha, pois um aplicativo customizado localizado na pasta **“apps”** já foi aberto pela primeira instância, e o Microsoft Windows mantém esse arquivo bloqueado.\n - Não é possível visualizar um documento existente porque o arquivo já está aberto por outro usuário em uma instância diferente do Fluig, impedindo seu acesso.\n - **Performance**: a execução do Fluig em servidores Microsoft Windows apresenta desempenho perceptivelmente inferior e demanda mais recursos de hardware do que em servidores Linux, resultando em maior custo operacional.\n\n## Solução" }, { "metadata": { "title": "Plataforma em load balance com Microsoft Windows", "source": "https://tdn.totvs.com/display/fluig/Plataforma+em+load+balance+com+Microsoft+Windows", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Plataforma em load balance com Microsoft Windows.md" }, "content": "Plataforma em load balance com Microsoft Windows\n\n\n---\n\nAtualmente, não existe uma solução definitiva e eficaz para a execução do Fluig em ambiente com Load Balancer sobre Windows.\n\nDiante desse cenário, recomenda-se a migração para servidores Linux, que não apresentam os problemas descritos, oferecem melhor desempenho e demandam menos recursos computacionais." }, { "metadata": { "title": "Plataforma em load balance com NGINX em Linux", "source": "https://tdn.totvs.com/display/fluig/Plataforma+em+load+balance+com+NGINX+em+Linux", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Plataforma em load balance com NGINX em Linux.md" }, "content": "Plataforma em load balance com NGINX em Linux" }, { "metadata": { "title": "Plataforma em load balance com NGINX em Linux", "source": "https://tdn.totvs.com/display/fluig/Plataforma+em+load+balance+com+NGINX+em+Linux", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Alta disponibilidade e balanceamento de carga\\Plataforma em load balance com NGINX em Linux.md" }, "content": "Plataforma em load balance com NGINX em Linux\n\n\nFique atento!\n\nEsta página é válida a partir da atualização **Voyager (2.0)** do TOTVS Fluig.\n\nSe você utiliza uma atualização anterior, acesse [Plataforma em *load balance* com NGINX em Linux da atualização **1.6.3 até 1.8.2**](https://tdn.totvs.com/pages/viewpage.action?pageId=955498748).\n\n- [Pré-requisitos](#PlataformaemloadbalancecomNGINXemLinux-Pré-requisitos)\n- [Considerações iniciais](#PlataformaemloadbalancecomNGINXemLinux-Consideraçõesiniciais)\n- [Instalando a primeira instância](#PlataformaemloadbalancecomNGINXemLinux-Instalandoaprimeirainstância)\n- [Criando uma instância em outra máquina](#PlataformaemloadbalancecomNGINXemLinux-Criandoumainstânciaemoutramáquina)\n- [Configurando o balanceador](#PlataformaemloadbalancecomNGINXemLinux-Configurandoobalanceador)\n- [Ambiente HTTPS](#PlataformaemloadbalancecomNGINXemLinux-AmbienteHTTPS)\n\n# Pré-requisitos\n\n---\n\nPara atualizar os parâmetros de configuração, deve-se obedecer aos seguintes pré-requisitos:\n\n- o usuário deve ser administrador da plataforma;\n\n- o usuário deve ter acesso aos arquivos de configuração da plataforma;\n\n- possuir o NGINX na versão 1.20.1 ou superior instalado. Detalhes de instalação e configuração do NGINX estão disponíveis na [documentação oficial](https://docs.nginx.com/);\n\n Importante!\n\n Somente é possível utilizar o NGINX **até a versão** **1.22** por conta da compatibilidade com o módulo nginx-stick-module-ng.\n- possuir a configuração de [*proxy* reverso](../Proxy reverso/Configuração de proxy reverso NGINX com HTTPS.md);\n\n- possuir o [nginx-sticky-module-ng](https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src/master/) (módulo externo) para implementar o comportamento de *sticky sessions* sem o uso do NGINX Plus. Esse procedimento só é necessário realizar na versão *open-source* do NGINX.\n\nAtenção!\n\nAntes de prosseguir com as instruções descritas nessa página, siga com atenção as instruções contidas na documentação [Alta disponibilidade e balanceamento de carga](http://tdn.totvs.com/pages/viewpage.action?pageId=257622931).\n\n# Considerações iniciais\n\n---\n\nA configuração de balanceamento de carga (*load balance*) é a forma mais simples de se obter distribuição de carga e algum nível de alta disponibilidade.\n\nA grande desvantagem é a necessidade de afinidade de sessão, ou seja, uma vez que o usuário foi autenticado em uma instância, sempre será direcionado para a mesma instância. Nesse caso, se essa instância ficar indisponível, o usuário terá que se autenticar novamente na aplicação.\n\nImportante!\n\n- Em ambientes com *load balance*, é muito importante manter todos os servidores com o horário sincronizado.\n\n- É necessário reiniciar todos os servidores depois de finalizar as configurações.\n\n# Instalando a primeira instância\n\n---\n\nSiga os procedimentos abaixo para realizar a instalação da primeira instância do Fluig em um ambiente *load balance.*\n\n- Faça uma instalação normal, conforme o [Guia de instalação da plataforma](../../../Instalação e Atualização/Guia de instalação da plataforma.md), mas **não** inicie os serviços do Fluig.\n\n- Abra o arquivo **standalone.xml** que está disponível em **[diretório\\_instalação]/appserver/standalone/configuration** em um editor de texto.\n\n- Localize a propriedade de *binding* \"java:global/wcm/globalDataDir\" e altere-a informando o caminho da pasta compartilhada entre as instâncias.\n\n ```\n \n ```\n- Localize também o *subsystem* \"urn:com.totvs.technology.wcm:1.0\" e altere-o informando o caminho da pasta compartilhada entre as instâncias.\n\n ```\n \n ```\n\n- Mova o conteúdo da pasta **[diretório\\_instalação]/repository/wcmdir** para a pasta **GLOBAL\\_DATA\\_DIR/wcmdir**.\n\n- Mova o conteúdo da pasta **[diretório\\_instalação]/appserver/apps** para a pasta **GLOBAL\\_DATA\\_DIR****/apps**.\n\n- Configure o servidor de indexação (Fluig Indexer) para ser executado em servidor separado, conforme instruções descritas em [Servidor de indexação único](../Servidor de indexação dedicado/Servidor de indexação único.md).\n\n- Inicie os serviços **fluig\\_Indexer,** **fluig\\_RealTime** e em seguida, inicie o **Fluig**.\n\n- Acesse a plataforma com o usuário \"wcmadmin\", crie uma nova empresa (*tenant*) e realize as configurações necessárias.\n\n- Pare o **Fluig** e os serviços do **fluig\\_RealTime** e **fluig\\_Indexer**.\n\n# Criando uma instância em outra máquina\n\n---\n\nSiga os procedimentos abaixo para criar uma instância em outra máquina.\n\n- Instale a aplicação pelo [procedimento normal](../../../Instalação e Atualização/Guia de instalação da plataforma.md) e siga as instruções até o procedimento antes de iniciar o servidor.\n\n- Abra o arquivo **standalone.xml** que está disponível em **[diretório\\_instalação]/appserver/standalone/configuration** em um editor de texto.\n\n- Localize a propriedade de *binding* \"java:global/wcm/globalDataDir\" e altere-a informando o caminho da pasta compartilhada entre as instâncias;\n\n ```\n \n ```\n\n- Localize também o *subsystem* \"urn:com.totvs.technology.wcm:1.0\" e altere-o informando o caminho da pasta compartilhada entre as instâncias.\n\n ```\n \n ```\n\n# Configurando o balanceador\n\n---\n\nO Fluig homologa o NGINX com o *upstream* para fazer o balanceamento de carga.\n\n- Instale o servidor [NGINX](https://nginx.org/en/), versão 1.20.1 ou superior.\n\n- Configure o módulo [nginx-sticky-module-ng](https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src/master/) no NGINX para utilizar a afinidade de sessão.\n\n- Habilite o balanceamento com o parâmetro **upstream** (geralmente é feito criando o arquivo **/etc/nginx/nginx.conf** ou **/etc/nginx/conf.d**).\n\n Atenção!\n\n Cada “**BalancerMember**” indica um servidor e deve apontar para o IP e a porta corretos.\n\n Um *cookie* chamado “**FLUIGCOOKIE**” é criado para manter a afinidade da sessão. Sem o *cookie*, o procedimento não irá funcionar.\n\n **nginx.conf**\n\n ```\n upstream mycluster {\n server {Ip do servidor 1}:{PORTA};\n server {Ip do servidor 2}:{PORTA};\n server {Ip do servidor 3}:{PORTA};\n sticky name=FLUIGCOOKIE expires=1h path=/ domain=.exemplo.com;\n }\n\n server {\n listen 80;\n server_name fluig.exemplo.com;\n \n server_tokens off;\n\n add_header 'Access-Control-Allow-Origin' 'http://mycluster';\n add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS, DELETE';\n add_header 'Access-Control-Request-Method' 'GET, PUT, POST, OPTIONS, DELETE';\n add_header 'Access-Control-Allow-Headers' 'Content-Type, X-Requested-With, accept-version';\n add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\" always;\n\n location / {\n proxy_pass http://mycluster;\n add_header Set-Cookie \"FLUIGCOOKIE=$request_id.$upstream_addr; Path=/\";\n\n proxy_pass_request_headers on;\n proxy_set_header Host $http_host;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header X-Forwarded-Server $host;\n proxy_set_header X-Forwarded-Host $host:$server_port;\n proxy_set_header X-Real-IP $remote_addr;\n\n client_max_body_size 880m;\n client_body_buffer_size 256k;\n\n proxy_connect_timeout 800;\n proxy_send_timeout 800;\n proxy_read_timeout 800;\n\n proxy_buffer_size 8k;\n proxy_buffers 8 32k;\n proxy_busy_buffers_size 64k;\n proxy_temp_file_write_size 64k;\n }\n\n }\n ```\n\nImportante!\n\nO procedimento abaixo deve ser realizado para utilizar o serviço de Realtime em *load balance*.\n\n**Passos para usar o *load balance* do Realtime**\n\n- Faça a configuração do Realtime para *load balance* conforme descrito em [Configurando o Fluig Realtime para execução em *load balance*](Configurando o fluig Realtime para execução em Load Balance.md).\n\n- Feitas as configurações acima, adicione o código abaixo no arquivo de configuração do servidor.\n\n **nginx.conf**\n\n ```\n upstream nodeCluster1 {\n sticky name=SERVERID expires=1h path=/ domain=exemplo.com httponly;\n\n server {ip_servidor_realtime1}:8888;\n server {ip_servidor_realtime2}:8888;\n }\n\n server {\n listen 8888;\n\n add_header Set-Cookie \"SERVERID=sticky.$upstream_cookie_SERVERID; Path=/\";\n\n location / {\n proxy_pass http://nodeCluster1;\n proxy_cookie_path / \"/; HTTPOnly; Secure\";\n }\n }\n\n upstream nodes_polling {\n sticky name=SERVERID expires=1h path=/ domain=exemplo.com httponly;\n\n server {ip_servidor_realtime1}:7777;\n server {ip_servidor_realtime2}:7777;\n }\n\n upstream nodes_ws {\n sticky name=SERVERID expires=1h path=/ domain=exemplo.com httponly;\n\n server {ip_servidor_realtime1}:7777;\n server {ip_servidor_realtime2}:7777;\n }\n\n server {\n listen 7777;\n\n add_header Set-Cookie \"SERVERID=sticky.$upstream_cookie_SERVERID; Path=/\";\n\n location / {\n set $upstream \"nodes_polling\"; \n \n if ($http_upgrade = \"websocket\") {\n set $upstream \"nodes_ws\"; \n }\n proxy_pass http://$upstream;\n\n }\n }\n ```\n\n- Após efetuar os passos anteriores, o arquivo \"/etc/nginx/conf.d\" estará desta forma:\n\n **nginx.conf**\n\n ```\n upstream mycluster {\n server {Ip do servidor 1}:{PORTA};\n server {Ip do servidor 2}:{PORTA};\n server {Ip do servidor 3}:{PORTA};\n sticky name=FLUIGCOOKIE expires=1h path=/ domain=.exemplo.com;\n }\n\n server {\n listen 80;\n server_name fluig.exemplo.com;\n \n server_tokens off;\n\n add_header 'Access-Control-Allow-Origin' 'http://mycluster';\n add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS, DELETE';\n add_header 'Access-Control-Request-Method' 'GET, PUT, POST, OPTIONS, DELETE';\n add_header 'Access-Control-Allow-Headers' 'Content-Type, X-Requested-With, accept-version';\n add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\" always;\n\n location / {\n proxy_pass http://mycluster;\n add_header Set-Cookie \"FLUIGCOOKIE=$request_id.$upstream_addr; Path=/\";\n\n proxy_pass_request_headers on;\n proxy_set_header Host $http_host;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header X-Forwarded-Server $host;\n proxy_set_header X-Forwarded-Host $host:$server_port;\n proxy_set_header X-Real-IP $remote_addr;\n\n client_max_body_size 880m;\n client_body_buffer_size 256k;\n\n proxy_connect_timeout 800;\n proxy_send_timeout 800;\n proxy_read_timeout 800;\n\n proxy_buffer_size 8k;\n proxy_buffers 8 32k;\n proxy_busy_buffers_size 64k;\n proxy_temp_file_write_size 64k;\n }\n\n }\n\n upstream nodeCluster1 {\n sticky name=SERVERID expires=1h path=/ domain=exemplo.com httponly;\n\n server {ip_servidor_realtime1}:8888;\n server {ip_servidor_realtime2}:8888;\n }\n\n server {\n listen 8888;\n\n add_header Set-Cookie \"SERVERID=sticky.$upstream_cookie_SERVERID; Path=/\";\n\n location / {\n proxy_pass http://nodeCluster1;\n proxy_cookie_path / \"/; HTTPOnly; Secure\";\n }\n }\n\n upstream nodes_polling {\n sticky name=SERVERID expires=1h path=/ domain=exemplo.com httponly;\n\n server {ip_servidor_realtime1}:7777;\n server {ip_servidor_realtime2}:7777;\n }\n\n upstream nodes_ws {\n sticky name=SERVERID expires=1h path=/ domain=exemplo.com httponly;\n\n server {ip_servidor_realtime1}:7777;\n server {ip_servidor_realtime2}:7777;\n }\n\n server {\n listen 7777;\n\n add_header Set-Cookie \"SERVERID=sticky.$upstream_cookie_SERVERID; Path=/\";\n\n location / {\n set $upstream \"nodes_polling\"; \n \n if ($http_upgrade = \"websocket\") {\n set $upstream \"nodes_ws\"; \n }\n proxy_pass http://$upstream;\n\n }\n }\n ```\n\n# Ambiente HTTPS\n\n---\n\nQuando o Fluig estiver configurado em HTTPS, é necessário que as *flags* de segurança \"*Secure*\" e \"*HttpOnly*\" dos *cookies* estejam habilitadas na sessão. Para isso, siga a instrução abaixo:\n\n```\n sticky name=SERVERID expires=1h path=/ domain=exemplo.com httponly secure;\n```\n\nImportante!\n\nAo utilizar balanceamento de carga em ambientes com HTTPS, a [configuração de HTTPS](https://tdn.totvs.com/pages/viewpage.action?pageId=354472893#Configura%C3%A7%C3%A3oHTTPSdaplataforma-Configura%C3%A7%C3%A3odeHTTPSmanual) deve ser replicada manualmente para todos os servidores do Fluig." }, { "metadata": { "title": "Configurações para autenticação em múltiplos servidores AD com protocolo LDAP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623412", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração de autenticação utilizando LDAP\\Configurações para autenticação em múltiplos servidores AD com protocolo LDAP.md" }, "content": "Configurações para autenticação em múltiplos servidores AD com protocolo LDAP" }, { "metadata": { "title": "Configurações para autenticação em múltiplos servidores AD com protocolo LDAP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623412", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Configuração de autenticação utilizando LDAP\\Configurações para autenticação em múltiplos servidores AD com protocolo LDAP.md" }, "content": "Configurações para autenticação em múltiplos servidores AD com protocolo LDAP\n\n\nFique atento!\n\nEsta página foi revisada para considerar as configurações de server do TOTVS Fluig **a partir** da atualização **1.6**.\n\n- [Objetivo](#ConfiguraçõesparaautenticaçãoemmúltiplosservidoresADcomprotocoloLDAP-Objetivo)\n- [Autenticação em múltiplos servidores AD com protocolo LDAP](#ConfiguraçõesparaautenticaçãoemmúltiplosservidoresADcomprotocoloLDAP-AutenticaçãoemmúltiplosservidoresADcomprotocoloLDAP)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar as configurações válidas para a autenticação em múltiplos servidores AD utilizando o protocolo LDAP (*Lightweight Directory Access Protocol*).\n\n# Autenticação em múltiplos servidores AD com protocolo LDAP\n\n---\n\nPara definir as configurações, é necessário efetuar os passos a seguir de acordo com a atualização do Fluig que você utiliza:\n\n- **A partir da atualização 2.0:**Edite o arquivo **standalone.xml** ([diretório\\_instalação]/appserver/standalone/configuration/standalone.xml).\n\n- **Para atualizações 1.6 até 1.8.2**: \n Edite o arquivo **domain.xml** ([diretório\\_instalação]/appserver/domain/configuration/domain.xml).\n\n- No arquivo correspondente à atualização do Fluig que você utiliza (standalone.xml ou domain.xml), procure o trecho de código abaixo:\n\n ```\n \n \n \n \n \n \n \n \n \n ```\n\n- Substitua a estrutura de *tags* **login-module** pela seguinte estrutura:\n\n ```\n \n \n :/\"/> \n \n \n @\"/> \n \"/> \n \n \n \n \"/> \n \"/> \n \n \n \n \n \n \n :/\"/> \n \n \n @\"/> \n \"/> \n \n \n \n \"/> \n \"/> \n \n \n \n \n ```\n\n- Caso seja necessário utilizar também a autenticação pelos dados do banco de dados, deve ser adicionada também a seguinte estrutura de *tag* **login-module**:\n\n ```\n \n \n \n \n \n ```" }, { "metadata": { "title": "Certificado HTTPS (SSL/TLS) Gratuito", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=269422853", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Certificado HTTPS (SSLTLS) Gratuito.md" }, "content": "Certificado HTTPS (SSL/TLS) Gratuito\n\n\n# Índice\n\n- 1 [Objetivo](#CertificadoHTTPS(SSL/TLS)Gratuito-Objetivo)\n - 1.1 [Como Funciona](#CertificadoHTTPS(SSL/TLS)Gratuito-ComoFunciona)\n - 1.2 [Como utilizar](#CertificadoHTTPS(SSL/TLS)Gratuito-Comoutilizar)\n - 1.2.1 [Em ambiente Linux (CentOS ou derivados) + Apache](#CertificadoHTTPS(SSL/TLS)Gratuito-EmambienteLinux(CentOSouderivados)+Apache)\n\n# Objetivo\n\n---\n\nO objetivo deste artigo é apresentar uma forma de obter o certificado HTTPS gratuito. A **Let’s Encrypt** () é uma autoridade certificadora aberta, gratuita e automática. São membros da Linux Foundation e foram criados com o intuito de trazer mais segurança e privacidade à internet. Entre os principais apoiadores hoje destacam-se Cisco, Akamai, Google, Facebook, Mozilla, HP e outros destes porte.\n\nO certificado é **válido por 60 dias**, porém a renovação pode e deve ser **automatizada**.\n\n## Como Funciona\n\n---\n\nA Let's Encrypt utiliza um protocolo denominado ACME (*Automatic Certificate Management Environment*). Em resumo, se baseia num conjunto de pedidos ou desafios para o servidor *web* que contém o certificado. A validação do domínio é realizada com base nas respostas e garantida pelo uso de um par de chaves. Para tanto é necessário um cliente ACME no servidor que será consultado pela autoridade certificadora (AC). Para mais informações [clique aqui](https://github.com/ietf-wg-acme/acme/).\n\nApós isto, para as solicitações de renovação e revogação dos certificados, basta o servidor enviar mensagens de gerenciamento de certificado e assiná-las com o par de chaves válido. Para obter um certificado, o *client* gera um PKCS e envia à Let’s Encrypt solicitando a emissão de um certificado para o(s) domínio(s), utilizando a chave pública informada.\n\n## Como utilizar" }, { "metadata": { "title": "Certificado HTTPS (SSL/TLS) Gratuito", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=269422853", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Certificado HTTPS (SSLTLS) Gratuito.md" }, "content": "Certificado HTTPS (SSL/TLS) Gratuito\n\n\n---\n\nA Let's Encrypt possui uma lista de dezenas de clientes e APIs para automatizar a geração, configuração e renovação dos certificados.\n\nAbaixo iremos demonstrar um deles em ambiente Linux CentOS e utilizando o cliente Certbot, que é recomendado pela Let’s Encrypt. Para outros sistemas operacionais ou aplicações, consulte o site da [Certbot](https://certbot.eff.org/) ou o guia da [Let's Encrypt](https://letsencrypt.org/getting-started/).\n\nNão é necessário nenhum cadastro prévio.\n\n### Em ambiente Linux (CentOS ou derivados) + Apache\n\n**Instalação Certbot:**\n\n```\nwget https://dl.eff.org/certbot-auto\nchmod a+x certbot-auto\n$ ./certbot-auto\n```\n\n**Usando em modo *webroot*:**\n\n```\ncertbot certonly --webroot -w /var/www/example/ -d www.example.com -d example.com\n```\n\n**Renovando o certificado:**\n\nAdicionar o comando ao crontab para ser executado semanalmente.\n\n```\ncertbot renew --pre-hook \"service httpd stop\" --post-hook \"service httpd start\"\n```\n\n**Saiba Mais** \nEm caso de dúvidas, mais informações podem ser encontradas em:\n\n- **[Let’s Encrypt: https://letsencrypt.org/](https://letsencrypt.org/getting-started/)**\n- **CertBot** (Cliente recomendado): ****\n- [Configuração HTTPS da plataforma](http://tdn.totvs.com/x/vdMgFQ)" }, { "metadata": { "title": "Configuração de níveis de segurança no HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=286516627", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Configuração de níveis de segurança no HTTPS.md" }, "content": "Configuração de níveis de segurança no HTTPS" }, { "metadata": { "title": "Configuração de níveis de segurança no HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=286516627", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Configuração de níveis de segurança no HTTPS.md" }, "content": "Configuração de níveis de segurança no HTTPS\n\n\nFique atento!\n\nEsta página é válida a partir da atualização **Voyager (2.0)** do TOTVS Fluig.\n\nSe você utiliza uma atualização anterior, acesse [Como configurar níveis de segurança no HTTPS da atualização **1.6 até 1.8.2**](https://tdn.totvs.com/pages/viewpage.action?pageId=941241730).\n\n- [Objetivo](#ConfiguraçãodeníveisdesegurançanoHTTPS-Objetivo)\n- [Pré-requisitos](#ConfiguraçãodeníveisdesegurançanoHTTPS-Pré-requisitos)\n- [Níveis de segurança](#ConfiguraçãodeníveisdesegurançanoHTTPS-Níveisdesegurança)\n- [Configurações recomendadas](#ConfiguraçãodeníveisdesegurançanoHTTPS-Configuraçõesrecomendadas)\n - [HTTPS na plataforma](#ConfiguraçãodeníveisdesegurançanoHTTPS-HTTPSnaplataforma)\n - [HTTPS no Apache](#ConfiguraçãodeníveisdesegurançanoHTTPS-HTTPSnoApache)\n- [Validação das configurações](#ConfiguraçãodeníveisdesegurançanoHTTPS-Validaçãodasconfigurações)\n - [Qualys SSL Server Test](#ConfiguraçãodeníveisdesegurançanoHTTPS-QualysSSLServerTest)\n - [Cipherscan](#ConfiguraçãodeníveisdesegurançanoHTTPS-Cipherscan)\n\n# Objetivo\n\n---\n\nO objetivo deste artigo é descrever os procedimentos necessários para definir o nível de segurança aplicado ao protocolo SSL/TLS em ambientes que possuem o HTTPS habilitado.\n\n# Pré-requisitos\n\n---\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- visão geral sobre a plataforma TOTVS Fluig;\n\n- visão geral sobre níveis de segurança e certificado digital.\n\nAlém disso, é necessário acesso ao servidor onde a plataforma está instalada.\n\n# Níveis de segurança\n\n---\n\nO mercado adota como padrão para definir os níveis de segurança para o protocolo SSL/TLS **níveis de compatibilidade**, que são uma combinação dos *Ciphersuite*, versões do protocolo SSL/TLS, tamanho da chave RSA, assinatura do certificado, entre outros. Esses níveis de compatibilidade são divididos entre compatibilidade **Moderna**, **Intermediária** e **Antiga** e podem ser observados no site de [boas práticas para SSL/TLS](https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations) mantido pela Mozilla.\n\nImportante!\n\nO nível de segurança aplicado ao HTTPS na plataforma irá definir sua compatibilidade com navegadores (ex. IE, Chrome, Safari, Firefox) e executáveis (ex. Java). Navegadores e executáveis mais antigos podem apresentar falhas de comunicação com a plataforma em virtude deles não suportarem todas as implementações de segurança modernas para realizar a comunicação.\n\n# Configurações recomendadas\n\n---\n\nPara garantir um alto nível de segurança nas configurações HTTPS da plataforma, iremos apresentar alguns cenários com configurações utilizando a **compatibilidade Moderna** descrito no guia de segurança mantido pela Mozilla para o protocolo SSL/TLS." }, { "metadata": { "title": "Configuração de níveis de segurança no HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=286516627", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Configuração de níveis de segurança no HTTPS.md" }, "content": "Configuração de níveis de segurança no HTTPS\n\n## HTTPS na plataforma\n\n---\n\nNo cenário abaixo, toda a configuração HTTPS é realizada diretamente na plataforma.\n\nDica!\n\nVocê também pode conferir se sua configuração HTTPS está funcionando corretamente na ferramenta: .\n\nImportante!\n\nTodas as configurações abaixo devem ser realizadas com a plataforma fora do ar.\n\nAbaixo seguem as alterações que devem ser realizadas no arquivo de configuração ([diretório\\_instalação]/appserver/standalone/configuration/**standalone*.*xml**) para habilitar a compatibilidade **Moderna**.\n\n**standalone.xml**\n\n```\n\n\t<...>\n\t\n\t# Se necessário complemente com outras chaves Ciphers ou protocolos suportados\n\t<...>\n\n```\n\n### Recomendação" }, { "metadata": { "title": "Configuração de níveis de segurança no HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=286516627", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Configuração de níveis de segurança no HTTPS.md" }, "content": "Configuração de níveis de segurança no HTTPS\n\n\n---\n\nÉ muito importante utilizar chaves e protocolos mais modernos e seguros como os indicados no exemplo acima.\n\nPorém, outras chaves também são suportadas:\n\n```\nTLS_DHE_RSA_WITH_AES_128_GCM_SHA256:TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA\n\n:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:TLS_DHE_RSA_WITH_AES_128_CBC_SHA\n\n:TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:TLS_DHE_DSS_WITH_AES_256_CBC_SHA:TLS_DHE_RSA_WITH_AES_256_CBC_SHA\n```\n\n- Preencha a diretiva **enabled-cipher-suites** do **standalone.xml** substituindo pelos valores suportados acima que estejam de acordo com sua política de segurança. As chaves podem ser validadas em .\n\nOs protocolos TLSv1, TLSv1.1 e TLSv1.2 também são suportados.\n\n- Preencha a diretiva **enabled-protocols** do **standalone.xml** substituindo pelos valores suportados acima que estejam de acordo com sua política de segurança.\n\nAtenção!\n\nConforme informado pela [Microsoft](https://learn.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-#tls-protocol-version-support), os servidores Windows inferiores à versão 2022 não suportam o protocolo TLSv1.3.\n\nAbaixo seguem as alterações que devem ser realizadas no arquivo de configuração no Linux ([diretório\\_instalação]/appserver/bin/standalone.conf) ou Windows ([diretório\\_instalação]/appserver/bin/standalone.conf.bat) para habilitar a compatibilidade **Moderna**.\n\n#### Linux\n\n**standalone.conf**\n\n```\n# Adicione o parâmetro -Djdk.tls.ephemeralDHKeySize=2048\nJAVA_OPTS=\"$JAVA_OPTS -Dfile.encoding=utf8 -Djavamelody.disabled=true -Djdk.tls.ephemeralDHKeySize=2048\"\n```\n\n#### Windows" }, { "metadata": { "title": "Configuração de níveis de segurança no HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=286516627", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Configuração de níveis de segurança no HTTPS.md" }, "content": "Configuração de níveis de segurança no HTTPS\n\n\n**standalone.conf.bat**\n\n```\nrem # Adicione o parâmetro -Djdk.tls.ephemeralDHKeySize=2048\nset \"JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=utf8 -Djavamelody.disabled=true -Djdk.tls.ephemeralDHKeySize=2048\"\n```\n\nImportante!\n\nCaso o Fluig esteja **abaixo da versão 1.7.0**, é necessário instalar e habilitar o [Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files](https://www.oracle.com/java/technologies/javase-jce-all-downloads.html) junto à plataforma, que permite a utilização de *Ciphersuites* mais modernos e avançados na plataforma.\n\nA instalação consiste em remover os arquivos ${fluig-dir}/jdk-64/jre/lib/security/local\\_policy.jar e ${fluig-dir}/jdk-64/jre/lib/security/US\\_export\\_policy.jar do diretório da plataforma e descompactar os arquivos do JCE no diretório ${fluig-dir}/jdk-64/jre/lib/security.\n\nOpcional:\n\nA porta do HTTPS na plataforma também pode ser alterada para **443**, porta padrão do HTTPS que permite o acesso ao endereço sem a necessidade de informar uma porta de acesso, apenas o protocolo **https://**.\n\nAbaixo seguem as alterações que devem ser realizadas no arquivo de configuração (**standalone*.*xml**) da plataforma para mudar a porta para **443**.\n\n**standalone.xml**\n\n```\n\n\t<...>\n\t\n\t<...>\n\n\n# Em algumas versões, pode estar como abaixo: \n# \n```\n\n## HTTPS no Apache" }, { "metadata": { "title": "Configuração de níveis de segurança no HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=286516627", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Configuração de níveis de segurança no HTTPS.md" }, "content": "Configuração de níveis de segurança no HTTPS\n\n\n---\n\nNo cenário abaixo, toda a configuração HTTPS é realizada no Apache. Este é o cenário onde a plataforma é configurada através de um *proxy* reverso.\n\nAbaixo seguem as alterações que devem ser realizadas no arquivo de configuração (geralmente **fluig.conf**) da plataforma no Apache para habilitar a compatibilidade Moderna.\n\nDica!\n\nVocê também pode conferir se sua configuração HTTPS está funcionando corretamente na ferramenta: .\n\n**fluig.conf**\n\n```\n\n ...\n SSLProxyEngine On\n SSLEngine On\n SSLProtocol +TLSv1.3\n SSLHonorCipherOrder on\n SSLCipherSuite \"ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK\" # Se necessário complemente com outras chaves Ciphers suportadas\n   SSLCompression Off\n ...\n\n```\n\n### Recomendação" }, { "metadata": { "title": "Configuração de níveis de segurança no HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=286516627", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Configuração de níveis de segurança no HTTPS.md" }, "content": "Configuração de níveis de segurança no HTTPS\n\n\n---\n\nÉ muito importante utilizar chaves e protocolos mais modernos e seguros como os indicados no exemplo acima.\n\nPorém, outras chaves também são suportadas:\n\n```\nDHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA\n```\n\n- Preencha a diretiva **SSLCipherSuite** do **fluig.conf** substituindo pelos valores suportados acima que estejam de acordo com sua política de segurança. As chaves podem ser validadas em .\n\nOs protocolos TLSv1, TLSv1.1 e TLSv1.2 também são suportados.\n\n- Preencha a diretiva **SSLProtocol** do **fluig.conf** substituindo pelos valores suportados acima que estejam de acordo com sua política de segurança.\n\nAtenção!\n\nConforme informado pela [Microsoft](https://learn.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-#tls-protocol-version-support), os servidores Windows inferiores à versão 2022 não suportam o protocolo TLSv1.3.\n\n# Validação das configurações\n\n---\n\nVocê poderá validar as configurações aplicadas em algumas ferramentas que testam e analisam o HTTPS. Recomendamos as duas abaixo para validação.\n\n## Qualys SSL Server Test\n\n---\n\nFerramenta Web disponível em , que faz uma análise das configurações HTTPS e sugere recomendações com base nos dados coletados.\n\nImportante!\n\nPara a realização desse teste, é mandatório que a plataforma esteja disponível para acesso através da Internet.\n\n## Cipherscan\n\n---\n\nFerramenta *open-source* para Linux disponível em , que utiliza mecanismos do OpenSSL para efetuar a validação." }, { "metadata": { "title": "Configuração HTTPS da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=354472893", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Configuração HTTPS da plataforma.md" }, "content": "Configuração HTTPS da plataforma" }, { "metadata": { "title": "Configuração HTTPS da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=354472893", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Configuração HTTPS da plataforma.md" }, "content": "Configuração HTTPS da plataforma\n\n\nFique atento!\n\nEsta página é válida a partir da atualização **Voyager (2.0)** do TOTVS Fluig.\n\nSe você utiliza uma atualização anterior, acesse:\n\n- para atualizações **1.6.5 até 1.8.2**: [Como configurar HTTPS da atualização 1.6.5 até 1.8.2](https://tdn.totvs.com/pages/viewpage.action?pageId=941883789);\n- para atualizações **1.6.4 ou inferior**: [Configuração HTTPS da atualização 1.6.0 a 1.6.4](https://tdn.totvs.com/pages/viewpage.action?pageId=286516572).\n\n- [Objetivo](#ConfiguraçãoHTTPSdaplataforma-Objetivo)\n- [Pré-requisitos](#ConfiguraçãoHTTPSdaplataforma-Pré-requisitos)\n- [Obter um certificado válido](#ConfiguraçãoHTTPSdaplataforma-Obterumcertificadoválido)\n- [Configuração de HTTPS pelo wcmadmin](#ConfiguraçãoHTTPSdaplataforma-ConfiguraçãodeHTTPSpelowcmadmin)\n- [Configuração de HTTPS manual](#ConfiguraçãoHTTPSdaplataforma-ConfiguraçãodeHTTPSmanual)\n- [Configurações adicionais](#ConfiguraçãoHTTPSdaplataforma-Configuraçõesadicionais)\n - [Configuração para utilização do Fluig Studio com SSL](#ConfiguraçãoHTTPSdaplataforma-ConfiguraçãoparautilizaçãodoFluigStudiocomSSL)\n - [Configurar notificações em tempo real](#ConfiguraçãoHTTPSdaplataforma-Configurarnotificaçõesemtemporeal)\n - [Certificado digital mobile](#ConfiguraçãoHTTPSdaplataforma-Certificadodigitalmobile)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar os passos necessários para utilização do TOTVS Fluig com o protocolo HTTPS.\n\nPlataforma em Cloud\n\nClientes cloud precisam entrar em contato com o time de Cloud para que eles realizem esse procedimento.\n\nDica!\n\nCaso encontre dificuldades para cadastrar um serviço, essa documentação pode lhe ajudar: [Resolução de inconsistência (PKIX *path validation failed*) ao cadastrar serviço](https://centraldeatendimento.totvs.com/hc/pt-br/articles/27662979027223-Fluig-Plataforma-DES-Ao-cadastrar-servi%C3%A7o-retorna-o-erro-PKIX-path-validation-failed).\n\n# Pré-requisitos\n\n---\n\n- Possuir um certificado digital válido;\n\n- Ter um *host* no DNS configurado para a plataforma em um domínio específico.\n\n# Obter um certificado válido\n\n---\n\nPara o certificado ser válido para a Internet, ele deve ser emitido para um domínio específico (WildCard) ou para um *host* deste domínio, o que torna obrigatório configurar a plataforma com o mesmo domínio do certificado se desejar utilizar o HTTPS.\n\nEXEMPLO \n\\*.[suaempresa.com.br](http://suaempresa.com.br).\n\nNota:\n\nSe o certificado for vinculado ao Fluig e o acesso continuar sendo via IP (e não pelo domínio), constantes mensagens de certificado não confiável serão apresentadas, pois o navegador tentará validar a URL de acesso com o domínio do certificado, retornando inconsistências.\n\nCaso sua empresa ainda não possua nenhum certificado, ele deve ser adquirido de uma autoridade certificadora. Não é recomendado o uso de certificados *self-signed* (auto-assinado), já que alguns navegadores não aceitam este tipo de certificado e podem provocar comportamentos inesperados durante a utilização da plataforma.\n\nDicas!\n\n- Uma alternativa gratuita é oferecida pela Linux Foundation através do site *[Let's Encrypt](https://letsencrypt.org/)*. Saiba mais acessando a documentação [Certificado HTTPS (SSL/TLS) Gratuito](Certificado HTTPS (SSLTLS) Gratuito.md) Gratuito.md).\n\n- Caso tenha dúvidas sobre os procedimentos realizados no OpenSSL, consulte a documentação [Utilizando OpenSSL para configurar HTTPS](Utilizando OpenSSL para configurar HTTPS.md).\n\n- Você também pode conferir se sua configuração HTTPS está funcionando corretamente na ferramenta .\n\n# Configuração de HTTPS pelo wcmadmin\n\n---\n\nA partir da atualização [Crystal Lake (1.7.1)](https://tdn.totvs.com/pages/viewpage.action?pageId=545647981), a configuração de HTTPS pode ser realizada diretamente pelo Painel de controle da plataforma, para isso é necessário seguir os passos abaixo.\n\nAtenção!\n\nA configuração pelo wcmadmin é suficiente para que o HTTPS funcione corretamente em ambientes que possuem apenas **um servidor** para o Fluig. Se o seu ambiente possui [balanceamento de carga](../Alta disponibilidade e balanceamento de carga.md), é necessário replicar a configuração manualmente em cada um dos demais servidores do Fluig seguindo os passos [Configuração de HTTPS manual](https://tdn.totvs.com/pages/viewpage.action?pageId=354472893).\n\n- Acesse a plataforma com o usuário **wcmadmin**.\n\n- No menu principal, clique em **Painel de Controle** e, no agrupador **WCM**, clique em **Configurações do sistema.**\n\n**![](..\\..\\..\\..\\images\\wcmadmin.png)**\n\n- Na aba **Portal**, marque a opção **HTTPS** no campo **Protocolo.**\n\nSerá exibida uma mensagem informando que, ao alterar o protocolo para HTTPS, será necessário configurá-lo. \n\n- Clique em **Configurar** para prosseguir com a configuração em tela.\n\n![](..\\..\\..\\..\\images\\Configurar.png)\n\n- No campo **Plataforma**, selecione como será configurado o protocolo HTTPS. As opções são: Apache, Nginx ou TOTVS Fluig Plataforma.\n\n Nota:\n\n A opção Apache ou Nginx é utilizada quando a plataforma é configurada através de um *proxy* reverso. Sempre recomendamos configurar um ambiente distribuído (com topologia DMZ) para reforçar a segurança de seu ambiente. Para mais detalhes consulte a documentação sobre [*Proxy* reverso](../Proxy reverso.md).\n\n O Nginx é possível utilizar somente **até a versão** **1.22** por conta da compatibilidade com o módulo nginx-stick-module-ng.\n\n- Configure o certificado digital de acordo com a opção escolhida:\n\n**TOTVS Fluig Plataforma**\n\n---\n\n![](..\\..\\..\\..\\images\\unknown-macro)\n\nPreencha os campos abaixo:\n\n- **Certificado** \n Selecione o certificado digital que será utilizado para estabelecer a conexão segura da plataforma. Os formatos de arquivos permitidos são: .p12 e .pfx.\n- **Senha** \n Informe a senha do certificado digital para estabelecer a conexão segura da plataforma.\n- **Caminho da chave**Informe o caminho completo (com extensão) da chave privada do certificado para estabelecer a conexão segura da plataforma.\n\n**Apache ou Nginx**\n\n---\n\n![](..\\..\\..\\..\\images\\unknown-macro)\n\nPrimeiramente, preencha os campos abaixo:\n\n- **Caminho do certificado** \n Informe o caminho completo (com extensão .crt, .pem ou .p12) do certificado digital gerado para estabelecer a conexão segura da plataforma.\n- **Caminho da chave** \n Informe o caminho completo (com extensão .key ou .pem) da chave privada do certificado para estabelecer a conexão segura da plataforma.\n\nDepois disso, clique em **Gerar arquivo** para gerar um *template* com as configurações HTTPS.\n\nPor último, baixe o arquivo gerado e utilize para finalizar a configuração na plataforma selecionada (Nginx ou Apache).\n\n- Clique em **Salvar**.\n\nSerão realizadas algumas verificações para validar se o certificado está correto, se a senha informada corresponde ao certificado, entre outras. Se estiver tudo certo, a plataforma realiza as alterações necessárias para concluir a configuração. Ao final, será exibida a mensagem de sucesso.\n\n- Reinicie os serviços da plataforma.\n\nApós configurar o HTTPS na instalação da plataforma, é recomendável conferir se está funcionando corretamente. O teste pode ser feito pela ferramenta [SSL Checker](https://www.sslshopper.com/ssl-checker.html). \nCom a configuração, será possível acessar também o aplicativo Fluig Mobile com HTTPS, sem necessidade de configurações adicionais.\n\n# Configuração de HTTPS manual\n\n---\n\nCaso opte por fazer a configuração manual ou esteja em uma atualização anterior à 1.7.1, os procedimentos de configuração de SSL devem ser realizados conforme os passos abaixo:\n\nAtenção!\n\nSe o seu ambiente possui [balanceamento de carga](../Alta disponibilidade e balanceamento de carga.md), além de aplicar a configuração no servidor principal, ela deve ser replicada para todos os demais servidores do Fluig também.\n\n**oculto**\n\n**Observação interna:**\n\nA explicação abaixo foi repassada ao artigo:  (Como configurar a plataforma com o protocolo HTTPS)\n\nCaso tenha alguma alteração, lembrar de repassar a esse artigo!\n\n- Pare os serviços do Fluig (fluig, fluig\\_indexer, fluig\\_RealTime).\n\n- No arquivo **standalone.xml**, localizado em [Instalação Fluig]/appserver/standalone/configuration, inclua a tag **** no **subsystem \"undertow\"**. \n Não deve ser retirada a *tag* contendo as configurações HTTP.\n\n- Na *tag* HTTP, acrescente o atributo **proxy-address-forwarding=\"true\"** conforme mostrado abaixo.\n\n- Se desejar restringir o tráfego de ***cookie*** **de sessão** em conexões seguras (HTTPS), basta incluir nas configurações do **subsystem undertow** a *tag* **session-cookie** informando o atributo**secure =\"true\". (Opcional)**\n\nDica!\n\nA partir da atualização **Crystal Lake (1.7.1)**, é possível habilitar a opção **Flags \"HttpOnly\" e \"Secure\" nos *cookies*** nas [Configurações do sistema](https://tdn.totvs.com/pages/viewpage.action?pageId=235597328#Plataforma%E2%9D%99Configura%C3%A7%C3%B5esdosistema-Gerenciarconfigura%C3%A7%C3%B5esdosistema), não sendo mais necessário definir essa configuração manualmente.\n\n**standalone.xml**\n\n```\n\n\t<...>\n\t\n\t\t \n\t\t \n\t\t<...>\n\t\n\t\n\t\t<...>\n\t\t \n\t \n\t<...>\n\n```\n\n- Em seguida, no arquivo **standalone.xml**, procure pela *tag* **** que fica dentro da *tag* ****.\n\n- Dentro da *tag* ****, adicione uma nova *tag* **** com as informações do certificado. As instruções a seguir são da configuração do repositório de certificados no formato **PKCS12** (p12):\n\n \n\n- - inclua a *tag* **** juntamente com **** e o **** conforme exemplificado no código abaixo;\n\n- - no atributo **path**, informe o diretório do repositório de certificados (keystore.p12);\n\n- - em **key-password** e **keystore-password**, substitua a valor \"suasenha\" pela senha utilizada na criação do repositório de certificados (keystore).\n\nImportante!\n\nEm ** também contém as configurações de certificado, porém, suas informações não devem ser modificadas, deixando os valores padrão salvos.\n\n**standalone.xml**\n\n```\n\n \n \n \n \n \n\n```\n\nDica!\n\nO diretório \"certs\" se refere à pasta onde os certificados são guardados. Recomendamos que esse diretório seja criado dentro do volume, para evitar que, em uma atualização ou migração de tecnologia, a pasta seja afetada.\n\nDúvidas sobre a utilização do OpenSSL ou sobre os comandos de exportação do PKCS12 (p12), consulte a documentação [Utilizando OpenSSL para configurar HTTPS](Utilizando OpenSSL para configurar HTTPS.md).\n\n- Inicie novamente os serviços do Fluig em sua ordem correta (fluig\\_indexer, fluig\\_RealTime e fluig).\n\n- **O acesso será realizado via HTTPS, na porta 8443.**\n\n- Após configurar o HTTPS na instalação do TOTVS Fluig, é necessário **ajustar o domínio de acesso** com o novo protocolo.\n\n- Para isto, será necessário acessar a plataforma com o usuário **wcmadmin** e, nas configurações do sistema, na aba **Portal**, alterar o **Protocolo** para **HTTPS**. Caso não esteja utilizando um *web server*, é necessário também informar a **Porta** de acesso do servidor da plataforma. Para mais informações, consulte a documentação [Gerenciar configurações do sistema](https://tdn.totvs.com/x/EO4KDg#Configura%C3%A7%C3%B5esdosistema-Gerenciarconfigura%C3%A7%C3%B5esdosistema).\n\nImportante!\n\nÉ recomendado revisar o limite de tempo das requisições lentas, como forma de trazer mais segurança à plataforma. Acesse a documentação [Prevenção de ataques DDoS Slow Post e Slow Headers](https://tdn.totvs.com/x/BzCPI) e saiba mais.\n\n# Configurações adicionais\n\n---\n\nVeja a seguir algumas configurações adicionais que também podem ser feitas." }, { "metadata": { "title": "Configuração HTTPS da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=354472893", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Configuração HTTPS da plataforma.md" }, "content": "Configuração HTTPS da plataforma\n\n## Configuração para utilização do Fluig Studio com SSL\n\n---" }, { "metadata": { "title": "Utilizando OpenSSL para configurar HTTPS", "source": "https://tdn.totvs.com/display/fluig/Utilizando+OpenSSL+para+configurar+HTTPS", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Utilizando OpenSSL para configurar HTTPS.md" }, "content": "Utilizando OpenSSL para configurar HTTPS" }, { "metadata": { "title": "Utilizando OpenSSL para configurar HTTPS", "source": "https://tdn.totvs.com/display/fluig/Utilizando+OpenSSL+para+configurar+HTTPS", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\HTTPS\\Utilizando OpenSSL para configurar HTTPS.md" }, "content": "Utilizando OpenSSL para configurar HTTPS\n\n\n- 1 [Objetivo](#UtilizandoOpenSSLparaconfigurarHTTPS-Objetivo)\n- 2 [Gerar arquivo CSR](#UtilizandoOpenSSLparaconfigurarHTTPS-GerararquivoCSRCSR)\n- 3 [Gerar PKCS12](#UtilizandoOpenSSLparaconfigurarHTTPS-GerarPKCS12)\n\n# Objetivo\n\nApresentar uma forma de gerar o arquivo CSR para solicitação de um certificado a uma entidade certificadora utilizando o utilitário OpenSSL. Mostrar também que, através deste utilitário você pode gerar um repositório de certificados no formato PKCS12 para utilizar em configurações do servidor de aplicação dependendo do dimensionamento do ambiente. Além disso, mostrar os comandos para exportação do certificado e chave privada, do repositório com esta extensão.\n\nAtenção!\n\nÉ importante mencionar que qualquer utilitário que consiga gerar o certificado no formato correto pode ser utilizado. Recomendamos o [OpenSSL](https://www.openssl.org/) pela facilidade de uso e por ser o padrão de mercado. Este procedimento não tem relação com as configurações feitas na plataforma. Portanto, deve ser escolhido o utilitário mais adequado para sua empresa.\n\nCada entidade certificadora trabalha de forma diferente, com diversos formatos de arquivos. Portanto, muitas vezes, será necessário exportar os arquivos em formatos adequados para a configurações no servidor de aplicação. Algumas não solicitam o arquivo CSR para geração do certificado.\n\nSugestão\n\nRecomendamos a utilização do sistema operacional **Linux** para a execução desses procedimentos do **OpenSSL**.\n\n# Gerar arquivo CSR\n\nO *Certificate Sign Request* (CSR) é uma arquivo enviado para uma entidade certificadora a fim de ser gerado os certificados de um determinado domínio.\n\nPara gerar este arquivo recomendamos a utilização do utilitário [OpenSSL](https://www.openssl.org/). Sua instalação no servidor da plataforma não tem impacto no funcionamento da plataforma. Para a instalação do [OpenSSL](https://www.openssl.org/) recomendamos fazer [download](https://wiki.openssl.org/index.php/Binaries) da última versão disponível para seu sistema operacional.\n\nAbaixo seguem os passos para a geração do arquivo utilizando como base a ferramenta [OpenSSL](https://www.openssl.org/).\n\nApós abrir o executável é necessário executar o comando para iniciar o procedimento de geração do CSR:\n\n```\nopenssl req -nodes -newkey rsa:2048 -sha256 -keyout arquivo_chave.key -out certificate.csr\n```\n\nInforme os dados solicitados pelo OpenSSL para a geração do CSR:\n\n![](..\\..\\..\\..\\images\\Image%203.jpg)\n\nApós a conclusão dos passos serão gerados dois arquivos: o arquivo com extensão CSR (certificate.csr) deve ser submetido à entidade certificadora que irá gerar o certificado. O outro arquivo (arquivo\\_chave.key) é a chave privada, que deve ser armazenada em local seguro.\n\nTanto a chave privada (arquivo\\_chave.key) quanto o certificado gerado pela entidade (certificado.crt ou certificado.cer), devem ser salvos em uma pasta no servidor onde fica a aplicação. Recomendamos a criação de uma pasta na raiz da instalação da plataforma (Exemplo: [Instalação da plataforma]/certificado), Vale mencionar que esses arquivos podem ser salvos em qualquer pasta do diretório do servidor.\n\nQuando receber o certificado gerado pela entidade, continue o processo de configuração. Se desejar gerar o repositório (Keystore) no formato PKCS12, siga as instruções abaixo. Para realizar as configurações SSL na plataforma ou também gerar um repositório de certificados na extensão JKS no Java, acesse a documentação [Configurar HTTPS](Configuração HTTPS da plataforma.md).\n\n# Gerar PKCS12\n\nOs arquivos PKCS12 são um tipo de repositório de certificado utilizado na configuração de HTTPS. Para gerar o repositório é necessário ter o certificado (enviado pela entidade certificadora) e a chave privada.\n\nO arquivo arquivo\\_chave.key é a chave privada, enquanto certificado.crt é o certificado retornado pela entidade certificadora.\n\nApós a execução do comando abaixo, é gerado o arquivo com extensão .p12 (repositorio.p12).\n\n```\nopenssl pkcs12 -export -out repositorio.p12 -inkey arquivo_chave.key -in certificado.crt\n```\n\nDependendo do dimensionamento do seu ambiente e web server utilizado, não será necessário ter um repositório com esta extensão portanto, o certificado deverá ser exportado para utilização em outro formato de arquivo.\n\nPara exportar o arquivo \"key\" do repositório \"p12\", execute o seguinte comando:\n\n```\nopenssl pkcs12 -in repositorio.p12 -nocerts -out arquivo_chave.key -nodes\n```\n\nPara exportar o arquivo \"crt\", \"cer\" ou \"ca\" do repositório \"p12\", execute o seguinte comando:\n\n```\nopenssl pkcs12 -in repositorio.p12 -nokeys -out certificado.crt -nodes\n```\n\nPara exportar um certificado com uma cadeia completa, incluindo o certificado intermediário, execute o seguinte comando:\n\n```\nopenssl pkcs12 -export -out repositorio.p12 -inkey privada.key -in certificado.crt -certfile bundle.pem\n```\n\nImportante!\n\nSe o Fluig não aceitar a senha configurada no certificado, refaça o pacote utilizando as tags **-legacy** e **-descert**, conforme exemplo abaixo:\n\n```\nopenssl pkcs12 -export -out repositorio.p12 -inkey privada.key -in certificado.crt -certfile bundle.pem -legacy -descert\n```\n\nSaiba mais em [Erro de senha incorreta ao configurar certificado HTTPS (*failed to decrypt safe contents entry*)](https://centraldeatendimento.fluig.com/hc/pt-br/articles/22399365622679-Fluig-Plataforma-CON-Erro-de-senha-incorreta-ao-configurar-certificado-HTTPS-failed-to-decrypt-safe-contents-entry).\n\nPara consultar como gerar o Bundle, acesse a documentação de [Configuração HTTPS da plataforma](Configuração HTTPS da plataforma.md).\n\nSe o repositório de certificados (.p12) estiver em uma pasta específica ou desejar salvar os arquivos exportados em uma pasta específica, o diretório deve ser informado no comando a ser executado. Exemplo:\n\n```\nopenssl pkcs12 -in C:\\fluig\\certs\\repositorio.p12 -nokeys -out C:\\fluig\\certs\\certificado.crt -nodes\n```" }, { "metadata": { "title": "Configuração de proxy reverso Apache", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=877162376", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso Apache.md" }, "content": "Configuração de proxy reverso Apache" }, { "metadata": { "title": "Configuração de proxy reverso Apache", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=877162376", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso Apache.md" }, "content": "Configuração de proxy reverso Apache\n\n\nFique atento!\n\nEsta página foi revisada para considerar as configurações de *server* do TOTVS Fluig **a partir** da atualização **1.6**.\n\n- [Objetivo](#ConfiguraçãodeproxyreversoApache-Objetivo)\n- [Pré-requisitos](#ConfiguraçãodeproxyreversoApache-Pré-requisitos)\n- [Módulos Apache](#ConfiguraçãodeproxyreversoApache-MódulosApache)\n- [Configuração do Apache (sem SSL)](#ConfiguraçãodeproxyreversoApache-ConfiguraçãodoApache(semSSL))\n - [Listener HTTP](#ConfiguraçãodeproxyreversoApache-ListenerHTTP)\n - [Listener do RealTime](#ConfiguraçãodeproxyreversoApache-ListenerdoRealTime)\n - [Listener FTP](#ConfiguraçãodeproxyreversoApache-ListenerFTP)\n- [Configuração do Apache (SSL) + Fluig (HTTP)](#ConfiguraçãodeproxyreversoApache-ConfiguraçãodoApache(SSL)+Fluig(HTTP))\n - [Configuração para acessar a plataforma via mobile/OAuth](#ConfiguraçãodeproxyreversoApache-Configuraçãoparaacessaraplataformaviamobile/OAuth)\n- [Configuração do Apache (SSL) + Fluig (SSL)](#ConfiguraçãodeproxyreversoApache-ConfiguraçãodoApache(SSL)+Fluig(SSL))\n- [Configurar Rate Limit de requisições](#ConfiguraçãodeproxyreversoApache-ConfigurarRateLimitderequisições)\n\n - [Pré-requisitos](#ConfiguraçãodeproxyreversoApache-Pré-requisitos.1)\n - [Usando mod\\_evasive](#ConfiguraçãodeproxyreversoApache-Usandomod_evasive)\n - [Configuração básica](#ConfiguraçãodeproxyreversoApache-Configuraçãobásica)- [Aplicar ao endpoint específico](#ConfiguraçãodeproxyreversoApache-Aplicaraoendpointespecífico)\n - [Customizando o comportamento de bloqueio](#ConfiguraçãodeproxyreversoApache-Customizandoocomportamentodebloqueio)\n - [Ajuste de sensibilidade (configuração restritiva)](#ConfiguraçãodeproxyreversoApache-Ajustedesensibilidade(configuraçãorestritiva))\n - [Exemplo completo](#ConfiguraçãodeproxyreversoApache-Exemplocompleto)\n- [Ocultar informações no cabeçalho HTTP](#ConfiguraçãodeproxyreversoApache-OcultarinformaçõesnocabeçalhoHTTP)\n\n# Objetivo\n\n---\n\nEste guia orienta a configuração do Apache como *Proxy* Reverso e a implementação de Rate Limit para assegurar a disponibilidade da plataforma contra acessos abusivos.\n\nDicas!\n\n- Após a configuração do *proxy* reverso, não esqueça de alterar a URL de acesso ao portal nas Configurações do sistema da plataforma. [Clique aqui](http://tdn.totvs.com/x/EO4KDg) e saiba como fazer.\n\n- Obtenha mais informações sobre DMZ em [Topologia DMZ](../Topologia DMZ.md).\n\n- [Clique aqui](https://httpd.apache.org/docs/current/platform/windows.html) para ver a documentação do próprio fornecedor sobre a configuração de *proxy* reverso utilizando **Apache no Windows**.\n\n- Se não for configurado, o padrão de *timeout* do *proxy* reverso do Apache é 60 segundos. A configuração recomendada é 300 segundos – que é o *timeout* padrão do TOTVS Fluig – podendo ser ajustado para mais ou para menos de acordo com a necessidade.\n\nImportante!\n\nSalientamos que, ao utilizar um *proxy* reverso, uma prática de segurança recomendada para a plataforma é não expor o servidor de aplicação diretamente na Internet.\n\n[Clique aqui](../../../Especificações Técnicas/Boas práticas de segurança para o seu ambiente.md) e veja outras boas práticas de segurança recomendadas para o seu ambiente.\n\n# Pré-requisitos\n\n---\n\n- Apache™ versão 2.4. O instalador e a documentação oficial do Apache™ podem ser encontrados em .\n\n- Se for utilizar SSL, também será necessário converter o certificado utilizado na configuração da plataforma para os formatos **.cer**, **.key** e **.pem**. O guia para configurar a plataforma em SSL (HTTPS) encontra-se [aqui](http://tdn.totvs.com/x/vdMgFQ).\n\n- Para a porta do realtime (7777) no Apache é necessário habilitar o módulo SSL em todos os vhosts que utilizarem o *realtime*   **SSLEngine On**e **SSLProxyEngine On**.\n\n# Módulos Apache\n\n---\n\nCertifique-se de que os seguintes módulos estão sendo carregados pelo Apache:\n\nNota:\n\nNa versão 2.4 do Apache no Windows, o módulo **LoadModule proxy\\_fdpass\\_module modules/mod\\_proxy\\_fdpass.so** não existe.\n\n```\n# Módulos para WebDAV\nLoadModule dav_module modules/mod_dav.so\nLoadModule dav_fs_module modules/mod_dav_fs.so\nLoadModule dav_lock_module modules/mod_dav_lock.so\n\n# Módulos para proxy reverso\nLoadModule proxy_module modules/mod_proxy.so\nLoadModule proxy_ajp_module modules/mod_proxy_ajp.so\nLoadModule proxy_connect_module modules/mod_proxy_connect.so\nLoadModule proxy_express_module modules/mod_proxy_express.so\nLoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so\nLoadModule proxy_ftp_module modules/mod_proxy_ftp.so\nLoadModule proxy_http_module modules/mod_proxy_http.so\n```\n\nSe for utilizar SSL no lado DMZ, certifique-se ainda de que o seguinte módulo está sendo carregado pelo Apache:\n\n```\n# Módulo para HTTPS\nLoadModule ssl_module modules/mod_ssl.so\n```\n\n# Configuração do Apache (sem SSL)\n\n---\n\n**01**. Acesse a pasta **/etc/httpd/conf.d.**\n\nNota:\n\nO caminho da pasta pode variar, esse caminho do exemplo é de uma instalação Linux CentOS.\n\n****02**. Crie um arquivo de configuração para a plataforma (chamado **fluig.conf**, por exemplo), com o seguinte conteúdo:**\n\n```\nListen 7777\nListen 21\nHeader set Access-Control-Allow-Origin: \"http://\"\nHeader set Access-Control-Allow-Headers: \"Content-Type, X-Requested-With, accept-version\"\nHeader set Access-Control-Allow-Methods: \"GET, PUT, OPTIONS, DELETE, POST\"\nHeader Set Access-Control-Request-Method: \"GET, PUT, OPTIONS, DELETE, POST\"\nProxyRequests Off\nProxyVia On\nAllowConnect 7777\nAllowConnect 21\n```" }, { "metadata": { "title": "Configuração de proxy reverso Apache", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=877162376", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso Apache.md" }, "content": "Configuração de proxy reverso Apache\n\n### Listener HTTP\n\n---\n\n```\n\n ServerName \n ProxyPreserveHost On\n ProxyPass / http://:/\n ProxyPassReverse / http:///\n\n```\n\n### Listener do RealTime\n\n---\n\n```\n\n RequestHeader set X-Forwarded-Proto https\n RequestHeader set Access-Control-Allow-Origin: \"https://\"\n RequestHeader set X-Forwarded-Host :7777\n\n ServerName \n\n SSLProxyEngine On\n SSLEngine On\n\n ProxyRequests Off\n ProxyPreserveHost On\n Include /etc/letsencrypt/options-ssl-apache.conf\n SSLCertificateFile  /cert.pem \n SSLCertificateKeyFile /privkey.pem\n\n # allow for upgrading to websockets\n RewriteEngine On\n RewriteCond %{HTTP:Upgrade} =websocket [NC]\n RewriteRule /(.*) ws://:7777/$1 [P,L]\n RewriteCond %{HTTP:Upgrade} !=websocket [NC]\n RewriteRule /(.*) http://:7777/$1 [P,L]\n\n\n ProxyPass \"/\" \"http://:7777\"\n ProxyPassReverse \"/\" \"http://:7777/\"\n\n ProxyPass \"/\" \"ws://:7777/\"\n ProxyPassReverse \"/\" \"ws://:7777/\"\n\n\n```\n\n### Listener FTP" }, { "metadata": { "title": "Configuração de proxy reverso Apache", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=877162376", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso Apache.md" }, "content": "Configuração de proxy reverso Apache\n\n\n---\n\n```\n\n ServerName \n ProxyPreserveHost On\n ProxyPass / ftp:///\n ProxyPassReverse / ftp://:21/\n\n```\n\nLegenda\n\n****: nome que aparecerá na URL do navegador, por exemplo, http://**meuservidor.com.br**.\n\n****: endereço IP interno do servidor onde o Fluig está rodando, por exemplo, 10.10.2.35.\n\n```\n\n```\n\n# Configuração do Apache (SSL) + Fluig (HTTP)\n\n---\n\nSe não for utilizado HTTPS na plataforma, deve possuir a seguinte configuração:\n\n```\nHeader set Access-Control-Allow-Origin: \"https://meuservidor.fluig.com/\"\nHeader set Access-Control-Allow-Headers: \"Content-Type, X-Requested-With, accept-version\"\nHeader set Access-Control-Allow-Methods: \"GET, PUT, OPTIONS, DELETE, POST\"\nHeader Set Access-Control-Request-Method: \"GET, PUT, OPTIONS, DELETE, POST\"\n \n\n\n RewriteEngine On\n RewriteCond %{HTTPS} off\n RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}\n\n\n\n ServerName \n RequestHeader set X-Forwarded-Host :443\n RequestHeader set X-Forwarded-Proto https\n SSLProxyEngine On\n SSLEngine On\n SSLCertificateFile .crt\n SSLCertificateKeyFile .key\n SSLCertificateChainFile .pem\n ProxyPreserveHost On\n ProxyPass / http://:/\n ProxyPassReverse / https://\n \n\n ServerName \n ProxyPreserveHost On\n ProxyPass / ftp:///\n ProxyPassReverse / ftp://:21/\n\n```\n\nLegenda\n\n<**Nome externo do servidor**>: nome que aparecerá na URL do navegador, por exemplo, http://**meuservidor.com.br**.\n\n<**diretorio-certificado**>: diretório e nome do arquivo do certificado de domínio enviado pela entidade certificadora, por exemplo: /etc/httpd/ssl/cert-dominio.crt\n\n<**diretorio-chave-privada**>: diretório e nome do arquivo da chave privada, enviada pela entidade certificadora, por exemplo: /etc/httpd/ssl/chave-privada.key\n\n<**diretorio-cadeia-certificados**>: diretório e nome do arquivo que contém a cadeia de certificados, por exemplo: /etc/httpd/ssl/cert-cadeia-certificados.pem\n\nNota:\n\nO caminho da pasta pode variar, esse caminho do exemplo é de uma instalação Linux CentOS.\n\n**DICA**: O arquivo referente à cadeia de certificados pode ser criado concatenando os certificados de domínio, intermediários e raiz. No Linux, isto pode ser feito com o comando abaixo:\n\n```\ncat cert-dominio.crt cert-intermediario.crt cert-raiz.crt > cert-cadeia-certificados.pem\n```\n\n**OBS:** Os certificados intermediários e raiz normalmente podem ser encontrados para *download* no *site* da entidade certificadora que você escolheu.\n\n<**IP do servidor fluig**>: endereço IP interno do servidor onde o Fluig está rodando, por exemplo, 10.10.2.35." }, { "metadata": { "title": "Configuração de proxy reverso Apache", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=877162376", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso Apache.md" }, "content": "Configuração de proxy reverso Apache\n\n## Configuração para acessar a plataforma via *mobile*/OAuth" }, { "metadata": { "title": "Configuração de proxy reverso Apache", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=877162376", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso Apache.md" }, "content": "Configuração de proxy reverso Apache\n\n\n---\n\nEssa configuração deve ser realizada para garantir que a requisição chega ao conector **HTTP** com o mesmo protocolo a partir do qual a requisição foi originada.\n\n**01**. Edite o arquivo **standalone.xml** localizado no diretório do servidor de aplicação **[diretório\\_instalação]/appserver/standalone/configuration/**.\n\n**02**. Localize o seguinte código:\n\n**standalone.xml**\n\n```\n\n\t\n\t\n\t\t \n\t\t\n \n\t\n \t\t\n\t\t\n\t\n\t\n\n```\n\n**03**. Na tag **http-listener** inclua o atributo **proxy-address-forwarding** com valor **true**, conforme mostrado abaixo:\n\n```\n\n```\n\n**01**. Edite o arquivo **domain.xml** localizado no diretório do servidor de aplicação **[diretório\\_instalação]/appserver/domain/configuration/**.\n\n**02**. Localize o seguinte código:\n\n**domain.xml**\n\n```\n\n\t\n\t\n\t\t \n\t\t\n \n\t\n \t\t\n\t\t\n\t\n\t\n\n```\n\n**03**. Na tag **http-listener** inclua o atributo **proxy-address-forwarding** com valor **true**, conforme mostrado abaixo:\n\n```\n\n```\n\n# Configuração do Apache (SSL) + Fluig (SSL)\n\n---\n\n**01**. Acesse a pasta **/etc/httpd/conf.d**.\n\nNota:\n\nO caminho da pasta pode variar, esse caminho do exemplo é de uma instalação Linux CentOS.\n\n**02**. Crie um arquivo de configuração para a plataforma (chamado fluig.conf, por exemplo), com o conteúdo abaixo, caso seja utilizado HTTPS também no lado do Fluig.\n\nImportante!\n\nLembrando que, se o seu ambiente utiliza [balanceamento de carga](../Alta disponibilidade e balanceamento de carga.md), a [configuração de HTTPS](https://tdn.totvs.com/pages/viewpage.action?pageId=354472893#Configura%C3%A7%C3%A3oHTTPSdaplataforma-Configura%C3%A7%C3%A3odeHTTPSmanual) deve ser replicada manualmente para todos os servidores do Fluig.\n\n```\nHeader set Access-Control-Allow-Origin: \"https://\"\nHeader set Access-Control-Allow-Headers: \"Content-Type, X-Requested-With, accept-version\"\nHeader set Access-Control-Allow-Methods: \"GET, PUT, OPTIONS, DELETE, POST\"\nHeader Set Access-Control-Request-Method: \"GET, PUT, OPTIONS, DELETE, POST\"\n\n\n\n ServerName \n RequestHeader set X-Forwarded-Host :443\n RequestHeader set X-Forwarded-Proto https\n SSLProxyEngine On\n SSLEngine On\n SSLCertificateFile .crt\n SSLCertificateKeyFile .key\n SSLCertificateChainFile .pem\n ProxyPreserveHost On\n ProxyPass / https://:/\n ProxyPassReverse / https:///\n\n \n\n ServerName \n ProxyPreserveHost On\n ProxyPass / ftp:///\n ProxyPassReverse / ftp://:21/\n\n```\n\n# Configurar Rate Limit de requisições\n\n---" }, { "metadata": { "title": "Configuração de proxy reverso Apache", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=877162376", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso Apache.md" }, "content": "Configuração de proxy reverso Apache\n\n### Pré-requisitos\n\n---\n\nÉ necessário ter o Apache com módulos habilitados:\n\n- mod\\_evasive (proteção contra abuso — recomendado)\n\n### Usando mod\\_evasive\n\n---\n\n**Instalação**\n\nNo Ubuntu/Debian: sudo apt install libapache2-mod-evasive\n\n**Ative**\n\nsudo a2enmod evasive \nsudo systemctl restart apache2\n\n### Configuração básica\n\n---\n\n**Edite**: /etc/apache2/mods-enabled/evasive.conf\n\n**Exemplo**\n\n```\n\n \tDOSHashTableSize 3097\n \tDOSPageCount 5\n \tDOSPageInterval 1\n \tDOSSiteCount 50\n \tDOSSiteInterval 1\n \tDOSBlockingPeriod 10\n \tDOSEmailNotify admin@seusite.com\n\n```\n\n## Aplicar ao endpoint específico\n\n---\n\nO mod\\_evasive não limita diretamente por URL de forma nativa, mas é possível combinar com **Location**.\n\nESTRATÉGIA\n\nVirtualHost + Location ServerName [seu\\_dominio.com](http://seu_dominio.com) SetEnvIf Request\\_URI \"^/api/public/social/post/publish$\" rate\\_limit\n\nO **mod\\_evasive** vai reagir automaticamente ao excesso de requisições nesse endpoint.\n\n## Customizando o comportamento de bloqueio\n\n---\n\nO parâmetro `DOSBlockingPeriod` define a duração da restrição aplicada ao endereço IP identificado como abusivo.\n\n- **Configuração:** `DOSBlockingPeriod 30`\n- **Funcionamento:** Suspende o acesso do IP por **30 segundos**.\n\n**Reativação**\n\nSe o IP realizar uma nova requisição antes do término desse período, o contador é **reiniciado**, prolongando o bloqueio por mais 30 segundos a partir da última tentativa.\n\n### Ajuste de sensibilidade (configuração restritiva)" }, { "metadata": { "title": "Configuração de proxy reverso Apache", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=877162376", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso Apache.md" }, "content": "Configuração de proxy reverso Apache\n\n\n---\n\nEstes parâmetros definem o limiar de tolerância para requisições repetitivas ao mesmo recurso.\n\n- **`DOSPageCount 3`**: Define o limite máximo de solicitações permitidas.\n- **`DOSPageInterval 1`**: Define a janela de tempo (em segundos) para a contagem acima.\n- **Resultado Prático**: O sistema bloqueia o IP se ele exceder **3 requisições por segundo** direcionadas ao mesmo endpoint (página ou objeto específico).\n\nRecomenda-se testar esse limite em ambientes de homologação antes de aplicar em produção.\n\n## Exemplo completo\n\n---\n\nEste exemplo estabelece uma política de limitação de taxa (*rate limiting*) para mitigar comportamentos automatizados abusivos, definindo limites de frequência por recurso individual e por volume global de tráfego originado de um único endereço IP.\n\n```\n\n \tDOSHashTableSize 3097\n \tDOSPageCount 5\n \tDOSPageInterval 1\n \tDOSSiteCount 50\n \tDOSSiteInterval 1\n \tDOSBlockingPeriod 10\n\n\n \tServerName seu_dominio.com\n\n \t\n \t\tRequire all granted\n \t\n\n```\n\n# Ocultar informações no cabeçalho HTTP\n\n---\n\nPara prevenir vulnerabilidades, é importante que as informações não fiquem expostas no cabeçalho HTTP. [Clique aqui](Ocultar informações no cabeçalho HTTP.md) e saiba como ocultá-las." }, { "metadata": { "title": "Configuração de proxy reverso NGINX com HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=736971727", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso NGINX com HTTPS.md" }, "content": "Configuração de proxy reverso NGINX com HTTPS" }, { "metadata": { "title": "Configuração de proxy reverso NGINX com HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=736971727", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso NGINX com HTTPS.md" }, "content": "Configuração de proxy reverso NGINX com HTTPS\n\n\n- [Objetivo](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-Objetivo)\n- [Pré-requisitos](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-Pré-requisitos)\n- [Recomendações](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-Recomendações)\n- [Configurando o NGINX como proxy reverso com HTTPS](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-ConfigurandooNGINXcomoproxyreversocomHTTPS)\n- [Configurar Rate Limit de requisições](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-ConfigurarRateLimitderequisições)\n\n - [Funcionamento do controle de taxa (Rate Limit)](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-Funcionamentodocontroledetaxa(RateLimit))\n - [Configuração de limitação por IP](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-ConfiguraçãodelimitaçãoporIP)- [Aplicar ao endpoint específico](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-Aplicaraoendpointespecífico)\n - [Explicando os parâmetros](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-Explicandoosparâmetros)\n - [Customizando resposta (HTTP 429)](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-Customizandoresposta(HTTP429))\n - [Exemplo completo](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-Exemplocompleto)\n- [Troubleshotting](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-Troubleshotting)\n- [Ocultar informações no cabeçalho HTTP](#ConfiguraçãodeproxyreversoNGINXcomHTTPS-OcultarinformaçõesnocabeçalhoHTTP)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é detalhar as configurações necessárias para utilização de *proxy* reverso NGINX com protocolo HTTPS.\n\n# Pré-requisitos\n\n---\n\n- Possuir o NGINX na versão 1.20.1 ou superior instalado. Detalhes de instalação e configuração do NGINX estão disponíveis [na documentação oficial](https://docs.nginx.com/).\n\n Importante!\n\n Somente é possível utilizar o NGINX **até a versão** **1.22** por conta da compatibilidade com o módulo nginx-stick-module-ng.\n- Possuir um host no DNS configurado para a plataforma, com domínio específico.\n\n- Possuir um certificado digital válido.\n\n# Recomendações\n\n---\n\n- Instalar o NGINX em um servidor separado do servidor onde o Fluig está instalado.\n\n- Faça as alterações necessárias na topologia utilizada, para que o acesso funcione corretamente após implantar o *proxy* reverso. Para saber mais sobre a topologia DMZ, [clique aqui](../Topologia DMZ.md).\n\n EXEMPLOS DE ALTERAÇÕES \n Apontamento de IP na rede interna, liberação de portas, alteração de endereço de acesso do Fluig (usuário wcmadmin).\n\n# Configurando o NGINX como *proxy* reverso com HTTPS\n\n---\n\nSiga o passo a passo, conforme descrito abaixo.\n\n- Certifique-se de que a interface de configuração pública esteja preenchida com o IP do servidor (rede interna). Para isso, abra o arquivo **[FLUIG]/appserver/domain/configuration/host.xml,** localize a tag e verifique o valor da propriedade \"value\":\n\n![](..\\..\\..\\..\\images\\image2023-2-9_11-29-24.png)\n\nImportante!\n\nNão é recomendado utilizar o valor \"0.0.0.0\" na interface de configuração pública.\n\n- Configure o Fluig em HTTPS na plataforma NGINX conforme documentação disponível em [Configuração HTTPS da plataforma](../HTTPS/Configuração HTTPS da plataforma.md).\n\n Importante!\n\n Lembrando que, se o seu ambiente utiliza [balanceamento de carga](../Alta disponibilidade e balanceamento de carga.md), a configuração de HTTPS deve ser replicada [manualmente](https://tdn.totvs.com/pages/viewpage.action?pageId=354472893#Configura%C3%A7%C3%A3oHTTPSdaplataforma-Configura%C3%A7%C3%A3odeHTTPSmanual) para todos os servidores do Fluig.\n\n- No servidor NGINX, utilize os certificados e o arquivo gerado para realizar a seguinte configuração:\n - Salve os certificados na pasta **/etc/nginx/certs**;\n - Cole o arquivo de configuração gerado no **Passo 2** em **/etc/nginx/conf.d**.\n\n- Adicione as diretivas para configuração das notificações em tempo real (serviço Realtime) no arquivo gerado no **Passo 3** - \"**/etc/nginx/conf.d**\":\n - Informe o DNS do servidor na diretiva \"server\\_name\";\n - Informe o caminho completo dos arquivos de certificado (arquivo .cert) na diretiva ssl\\_certificate;\n - Informe o caminho completo dos arquivos de certificado (arquivo .key) na diretiva ssl\\_certificate\\_key;\n - Informe o IP e a porta onde o serviço do Realtime está em execução, na diretiva \"proxy-pass\". A porta padrão do Realtime é 7777, caso não tenha sido alterada.\n\n ```\n server {\n listen 7777 ssl;\n server_name fluig.suaempresa.com;\n ssl_certificate /etc/nginx/certs/fluig.cert;\n ssl_certificate_key /etc/nginx/certs/fluig.key;\n \n location / {\n \tproxy_pass http://[IP_REALTIME]:[PORTA_REALTIME];\n \tproxy_http_version 1.1;\n \tproxy_set_header Host $host;\n \tproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n \tproxy_set_header Upgrade $http_upgrade;\n \tproxy_set_header Connection \"upgrade\";\n }\n }\n ```\n\n- No arquivo \"/etc/nginx/conf.d\", no contexto \"server\", que estará ouvindo a porta 443, configure as seguintes diretivas:\n - Informe o caminho completo dos arquivos de certificado (arquivo .cert) na diretiva ssl\\_certificate;\n - Informe o caminho completo dos arquivos de certificado (arquivo .key) na diretiva ssl\\_certificate\\_key;\n - Oculte a versão do NGINX no cabeçalho de resposta das requisições, informando o valor \"off\" na diretiva \"server\\_tokens\";\n - Adicione as diretivas de cabeçalho (\"add\\_header\") conforme abaixo:\n\n ```\n server {\n listen 443 ssl http2;\n server_name fluig.suaempresa.com;\n server_tokens off;\n \n ssl_certificate /etc/nginx/certs/fluig.cert;\n ssl_certificate_key /etc/nginx/certs/fluig.key;\n ssl_protocols TLSv1.3;\n ssl_ciphers         ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK; # Se necessário complemente com outras chaves Ciphers suportadas\n   ssl_prefer_server_ciphers on;\n ssl_session_cache shared:SSL:10m;\n \n add_header 'Access-Control-Allow-Origin' 'https://fluig.suaempresa.com/';\n add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS, DELETE';\n add_header 'Access-Control-Request-Method' 'GET, PUT, POST, OPTIONS, DELETE';\n add_header 'Access-Control-Allow-Headers' 'Content-Type, X-Requested-With, accept-version';\n add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\" always;\n ```\n\nImportante!\n\nSubstitua \"**fluig.suaempresa.com**\" pelo endereço a partir do qual você deseja acessar o Fluig.\n\nNota:\n\nRecomendamos o uso de chaves e protocolos mais modernos e seguros como os indicados no exemplo. Porém, outras chaves também são suportadas:\n\nDHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA\n\nPreencha a diretiva **ssl\\_ciphers** do conf.d substituindo pelos valores suportados acima que estejam de acordo com sua política de segurança. As chaves podem ser validadas em .\n\nE também os protocolos: TLSv1, TLSv1.1 e TLSv1.2\n\nPreencha a diretiva **ssl\\_protocols** do conf.d substituindo pelos valores suportados acima que estejam de acordo com sua política de segurança.\n\n- No contexto \"server\" que estará ouvindo a porta 443, adicione as seguintes diretivas no contexto \"location /\", no arquivo \"/etc/nginx/conf.d\", conforme abaixo:\n - Na diretiva \"proxy-pass\", informe o IP do servidor do Fluig e a porta definida na instalação da plataforma (a porta padrão é 8080);\n - Adicione as diretivas de cabeçalho para \"proxy\" conforme abaixo:\n\n ```\n location / {\n proxy_pass http://[IP_FLUIG]:[PORTA_FLUIG];\n proxy_ssl_verify off;\n proxy_ssl_ciphers HIGH:!aNULL:!MD5;\n\n proxy_pass_request_headers on;\n proxy_set_header Host $host;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header X-Forwarded-Server $host;\n proxy_set_header X-Forwarded-Host $host:$server_port;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n ```\n\n- Após efetuar os passos anteriores, o arquivo \"/etc/nginx/conf.d\" estará desta forma:\n\n ```\n server {\n listen 7777 ssl;\n server_name fluig.suaempresa.com;\n ssl_certificate /etc/nginx/certs/fluig.cert;\n ssl_certificate_key /etc/nginx/certs/fluig.key;\n \n location / {\n \tproxy_pass http://[IP_FLUIG]:7777;\n \tproxy_http_version 1.1;\n \tproxy_set_header Host $host;\n \tproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n \tproxy_set_header Upgrade $http_upgrade;\n \tproxy_set_header Connection \"upgrade\";\n }\n }\n\n server {\n listen 443 ssl http2;\n server_name fluig.suaempresa.com;\n server_tokens off;\n \n ssl_certificate /etc/nginx/certs/fluig.cert;\n ssl_certificate_key /etc/nginx/certs/fluig.key;\n ssl_protocols TLSv1.3;\n ssl_ciphers \t\tECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK; # Se necessário complemente com outras chaves Ciphers suportadas\n   ssl_prefer_server_ciphers on;\n ssl_session_cache shared:SSL:10m;\n \n add_header 'Access-Control-Allow-Origin' 'https://fluig.empresa.com/';\n add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS, DELETE';\n add_header 'Access-Control-Request-Method' 'GET, PUT, POST, OPTIONS, DELETE';\n add_header 'Access-Control-Allow-Headers' 'Content-Type, X-Requested-With, accept-version';\n add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\" always;\n\n location / {\n proxy_pass http://[IP_FLUIG]:[PORTA_FLUIG];\n proxy_ssl_verify off;\n proxy_ssl_ciphers HIGH:!aNULL:!MD5;\n\n proxy_pass_request_headers on;\n proxy_set_header Host $host;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header X-Forwarded-Server $host;\n proxy_set_header X-Forwarded-Host $host:$server_port;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n\n client_max_body_size 880m;\n client_body_buffer_size 256k;\n\n proxy_buffer_size 8k;\n proxy_buffers 8 32k;\n proxy_busy_buffers_size 64k;\n proxy_temp_file_write_size 64k;\n }\n }\n ```\n\n- Reinicie os serviços do Fluig e do NGINX em ambos os servidores.\n\nImportante!\n\nDependendo do ambiente (versão, sistema operacional utilizado, etc.) algumas diretivas detalhadas nesta documentação podem estar presentes na sua instalação do NGINX também. Isso causará o erro \"*directive is duplicate*\", impossibilitando a inicialização do serviço do NGINX. Caso isso ocorra, verifique qual diretiva será mantida: dos arquivos de configuração do NGINX ou no arquivo de configuração criado com base nessa documentação.\n\n# Configurar Rate Limit de requisições\n\n---" }, { "metadata": { "title": "Configuração de proxy reverso NGINX com HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=736971727", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso NGINX com HTTPS.md" }, "content": "Configuração de proxy reverso NGINX com HTTPS\n\n### Funcionamento do controle de taxa (Rate Limit)\n\nO NGINX gerencia a frequência de requisições através de dois componentes interdependentes:\n\n- **`limit_req_zone` (Definição):** Estabelece a regra global no contexto `http`, configurando a zona de memória compartilhada para armazenar os estados dos IPs e a taxa de transferência permitida (ex: 10 requisições por segundo).\n- **`limit_req` (Aplicação):** Ativa a regra definida anteriormente em escopos específicos, como `server` ou `location` (endpoints).\n- **Chave de Identificação:** Geralmente utiliza o **`$binary_remote_addr`**, que armazena o endereço IP do cliente de forma compacta (4 bytes para IPv4) para economizar memória no servidor.\n\n### Configuração de limitação por IP\n\nEdite o arquivo de configuração (`/etc/nginx/nginx.conf`) e defina a regra dentro do bloco **http**:\n\n```\nhttp {\n \tlimit_req_zone $binary_remote_addr zone=post_publish_limit:10m rate=5r/s;\n\t...\n}\n```\n\n**Entenda os parâmetros**\n\n- **`$binary_remote_addr`**: Identificador binário do IP (mais eficiente que texto).\n- **`zone=post_publish_limit:10m`**: Reserva **10MB** para rastrear o estado dos IPs.\n- **`rate=5r/s`**: Estabelece o teto de **5 requisições por segundo** por usuário.\n\n## Aplicar ao endpoint específico\n\n---\n\nPara aplicar a regra de controle de fluxo a uma rota específica, utilize a diretiva **`limit_req`** dentro do bloco **`location`** desejado, conforme o exemplo abaixo:\n\n```\nserver {\n listen 80;\n server_name seu_dominio.com;\n\n # Aplica o limite apenas ao endpoint de publicação\n location = /api/public/social/post/publish {\n limit_req zone=post_publish_limit burst=10 nodelay;\n proxy_pass http://backend;\n }\n}\n```\n\n## Explicando os parâmetros" }, { "metadata": { "title": "Configuração de proxy reverso NGINX com HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=736971727", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso NGINX com HTTPS.md" }, "content": "Configuração de proxy reverso NGINX com HTTPS\n\n\n---\n\nEsta seção detalha a lógica de controle de fluxo (Rate Limit) aplicada, que define como o servidor processa o volume de requisições e gerencia picos de tráfego:\n\n- **`rate=5r/s`**: Estabelece a velocidade média permitida de 5 requisições por segundo por endereço IP.\n- **`burst=10`**: Cria uma \"margem de tolerância\" para acomodar picos repentinos de até 10 requisições além do limite definido.\n- **`nodelay`**: Determina que as requisições dentro da margem de *burst* sejam processadas imediatamente; sem este parâmetro, o NGINX suaviza o tráfego introduzindo atrasos (delay) para manter a taxa constante.\n\n## Customizando resposta (HTTP 429)\n\n---\n\nPor padrão, o NGINX retorna o erro **503** (Service Unavailable). Para indicar explicitamente que o bloqueio ocorreu por excesso de requisições, utiliza-se o código **429 (Too Many Requests)**:\n\n```\nhttp {\n limit_req_status 429;\n}\n```\n\n## Exemplo completo" }, { "metadata": { "title": "Configuração de proxy reverso NGINX com HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=736971727", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Configuração de proxy reverso NGINX com HTTPS.md" }, "content": "Configuração de proxy reverso NGINX com HTTPS\n\n\n---\n\nEsta configuração consolidada implementa uma estratégia de **defesa em profundidade** no NGINX, garantindo a estabilidade da API por meio de um controle rigoroso de vazão. O exemplo abaixo integra a definição da zona de memória, a customização do código de resposta e a aplicação prática em um endpoint crítico.\n\n```\nhttp {\n # 1. Definição da regra global (identificação, memória e taxa base)\n limit_req_zone $binary_remote_addr zone=post_publish_limit:10m rate=5r/s;\n\n # 2. Padronização da resposta para excesso de requisições\n limit_req_status 429;\n\n server {\n listen 80;\n server_name seu_dominio.com;\n\n # 3. Aplicação restritiva em endpoint sensível\n location = /api/public/social/post/publish {\n # Admite picos (burst) sem introduzir latência artificial (nodelay)\n limit_req zone=post_publish_limit burst=10 nodelay;\n \n proxy_pass http://backend;\n }\n }\n}\n```\n\nAo adotar este modelo, o servidor passa a distinguir acessos legítimos de disparos automatizados, preservando os recursos do backend e fornecendo respostas semanticamente corretas (HTTP 429) ao excederem os limites estabelecidos.\n\n# Troubleshotting\n\n---\n\nErros de *timeout* ou conexão encerrada pelo NGINX.\n\nNota:\n\nSe não for configurado, o padrão de *timeout* do *proxy* reverso do NGINX é 60 segundos. A configuração recomendada é 300 segundos – que é o *timeout* padrão do TOTVS Fluig – podendo ser ajustado para mais ou para menos de acordo com a necessidade.\n\n- Abra o arquivo de configuração do NGINX - /etc/nginx/conf.d - e inclua as diretivas de *timeout* no contexto \"server\" > \"location /\" conforme abaixo:\n\n ```\n proxy_connect_timeout\t300;\n proxy_send_timeout \t\t300;\n proxy_read_timeout \t\t300;\n send_timeout 300;\n ```\n\n- Após incluir as diretivas de *timeout*, o arquivo \"/etc/nginx/conf.d\" estará desta forma:\n\n ```\n server {\n listen 7777 ssl;\n server_name fluig.suaempresa.com;\n ssl_certificate /etc/nginx/certs/fluig.cert;\n ssl_certificate_key /etc/nginx/certs/fluig.key;\n \n location / {\n \tproxy_pass http://[IP_FLUIG]:7777;\n \tproxy_http_version 1.1;\n \tproxy_set_header Host $host;\n \tproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n \tproxy_set_header Upgrade $http_upgrade;\n \tproxy_set_header Connection \"upgrade\";\n }\n }\n\n server {\n listen 443 ssl http2;\n server_name fluig.suaempresa.com;\n server_tokens off;\n \n ssl_certificate /etc/nginx/certs/fluig.cert;\n ssl_certificate_key /etc/nginx/certs/fluig.key;\n ssl_protocols TLSv1.3;\n ssl_ciphers \t\tECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK; # Se necessário complemente com outras chaves Ciphers suportadas\n ssl_prefer_server_ciphers on;\n ssl_session_cache shared:SSL:10m;\n \n add_header 'Access-Control-Allow-Origin' 'https://fluig.empresa.com/';\n add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS, DELETE';\n add_header 'Access-Control-Request-Method' 'GET, PUT, POST, OPTIONS, DELETE';\n add_header 'Access-Control-Allow-Headers' 'Content-Type, X-Requested-With, accept-version';\n add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\" always;\n\n location / {\n proxy_pass http://[IP_FLUIG]:[PORTA_FLUIG];\n proxy_ssl_verify off;\n proxy_ssl_ciphers HIGH:!aNULL:!MD5;\n\n proxy_pass_request_headers on;\n proxy_set_header Host $host;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header X-Forwarded-Server $host;\n proxy_set_header X-Forwarded-Host $host:$server_port;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n\n client_max_body_size 880m;\n client_body_buffer_size 256k;\n\n proxy_connect_timeout\t300;\n proxy_send_timeout \t\t300;\n proxy_read_timeout \t\t300;\n send_timeout 300;\n\n proxy_buffer_size 8k;\n proxy_buffers 8 32k;\n proxy_busy_buffers_size 64k;\n proxy_temp_file_write_size 64k;\n }\n }\n ```\n\n- Reinicie os serviços NGINX para aplicar a alteração realizada.\n\nAtenção:\n\nCaso o problema de *timeout* persista após aplicar a configuração acima, é necessário avaliar o que está ocorrendo ao invés de apenas aumentar o tempo de *timeout*. Se desejar, entre em contato com o seu ESN e solicite uma proposta de consultoria investigativa Fluig.\n\n# Ocultar informações no cabeçalho HTTP\n\n---\n\nPara prevenir vulnerabilidades, é importante que as informações não fiquem expostas no cabeçalho HTTP. [Clique aqui](Ocultar informações no cabeçalho HTTP.md) e saiba como ocultá-las." }, { "metadata": { "title": "Ocultar informações no cabeçalho HTTP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=626350885", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Ocultar informações no cabeçalho HTTP.md" }, "content": "Ocultar informações no cabeçalho HTTP\n\n\n- 1 [Objetivo](#OcultarinformaçõesnocabeçalhoHTTP-Objetivo)\n- 2 [Exposição de informações](#OcultarinformaçõesnocabeçalhoHTTP-Exposiçãodeinformações)\n- 3 [Como ocultar as informações](#OcultarinformaçõesnocabeçalhoHTTP-Comoocultarasinformações)\n - 3.1 [Apache](#OcultarinformaçõesnocabeçalhoHTTP-Apache)\n - 3.2 [Nginx](#OcultarinformaçõesnocabeçalhoHTTP-Nginx)\n - 3.3 [Microsoft NLB](#OcultarinformaçõesnocabeçalhoHTTP-MicrosoftNLB)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é alertar quanto ao problema de expor informações nos cabeçalhos HTTP, bem como apresentar o procedimento para ocultar essas informações nos balanceadores de carga homologados para uso no TOTVS Fluig Plataforma.\n\n# Exposição de informações\n\n---\n\nA aplicação retorna informações nos cabeçalhos HTTP que podem ser aproveitadas em tentativas de invasão. Um aspecto importante do desenvolvimento de aplicações seguras é evitar o vazamento de informações: cabeçalhos HTTP podem fornecer a um atacante o conhecimento sobre o funcionamento interno de uma aplicação. \n\n![](..\\..\\..\\..\\images\\load%20balancer.png)\n\n![](..\\..\\..\\..\\images\\load%20balancer%20nginx.png)\n\n![](..\\..\\..\\..\\images\\load%20balancer%20nlb.png)\n\n# Como ocultar as informações\n\n---\n\nPara evitar essa exposição, sugerimos realizar o tratamento de informações de saída. O procedimento para ocultar as informações depende do *load balancer* utilizado no ambiente: Apache, NGINX ou Microsoft NLB.\n\n## Apache" }, { "metadata": { "title": "Ocultar informações no cabeçalho HTTP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=626350885", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Ocultar informações no cabeçalho HTTP.md" }, "content": "Ocultar informações no cabeçalho HTTP\n\n\n---\n\nPara remover por completo a informação, acompanhe os passos a seguir:\n\n**01.** Instalar o módulo mod- security.\n\n```\nsudo apt install libapache2-mod-security2\n```\n\n**02.** Adicionar o módulo do Apache.\n\n```\nsudo a2enmod security2\n```\n\n**03.** Editar o arquivo de configuração de segurança:\n\n```\nsudo vim /etc/apache2/conf-available/security.conf\n```\n\n**04.** Adicionar a opção:\n\n- SecServerSignature \" \"\n\n Nota:\n\n É possível alterar o conteúdo para qualquer informação. Em vez de adicionar**SecServerSignature \" \"**, adicionar o texto desejado. Exemplo:\n\n - SecServerSignature Fluig\n\n Com isso, a opção Server passa a apresentar:\n\n ![](..\\..\\..\\..\\images\\Apache%203.png)\n\n**05**. Alterar os dois parâmetros para ocultar a informação do **Server**:\n\n- ServerSignature Off\n- ServerTokens Prod\n\n**06**. Incluir os dois parâmetros para ocultar a informação do **X-Powered-By**:\n\n- Header always unset \"X-Powered-By\"\n- Header unset \"X-Powered-By\"\n\n**07**. Reiniciar o Apache.\n\nCom isso, a opção Server passa a não apresentar nenhuma informação:\n\n![](..\\..\\..\\..\\images\\Apache%202.png)\n\n## Nginx" }, { "metadata": { "title": "Ocultar informações no cabeçalho HTTP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=626350885", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Ocultar informações no cabeçalho HTTP.md" }, "content": "Ocultar informações no cabeçalho HTTP\n\n\n---\n\nImportante!\n\nSomente é possível utilizar o Nginx **até a versão** **1.22** por conta da compatibilidade com o módulo nginx-stick-module-ng.\n\nPara remover por completo a informação, acompanhe os passos a seguir:\n\n**01**. Instalar o módulo ngx\\_headers\\_more. A instalação depende de cada sistema operacional. No Debian basta executar o comando abaixo:\n\n**Debian**\n\n```\napt install libnginx-mod-http-headers-more-filter\n```\n\n**02**. Editar o arquivo de configuração onde está configurado o *proxy* reverso e adicionar as opções abaixo na sessão **location**:\n\n```\nlocation / {\n\t...\n\tmore_clear_headers ‘Server’;\n\tmore_clear_headers ‘X-Powered-By’;\n\t...\n}\n```\n\n**03**. Reiniciar o NGINX.\n\nEsta configuração limpa mais informações do cabeçalho HTTP. Neste caso irá remover as informações **Server** e **X-Powered-By**.\n\n***![](..\\..\\..\\..\\images\\Nginx%205.png)***\n\n## Microsoft NLB" }, { "metadata": { "title": "Ocultar informações no cabeçalho HTTP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=626350885", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Proxy reverso\\Ocultar informações no cabeçalho HTTP.md" }, "content": "Ocultar informações no cabeçalho HTTP\n\n\n---\n\nNesse caso, a solução é um pouco diferente, sendo necessário incluir regras de saída utilizando a reescrita de URL. Acompanhe os passos a seguir:\n\nExistem várias configurações de balanceamento de carga e *proxy* reverso. Diante disto, será necessário avaliar cada caso para identificar o melhor local para configuração. O ideal é criar a regra no servidor de saída que geralmente será o *proxy* reverso. Caso exista apenas o balanceamento de carga sem o *proxy* reverso, será necessário criar a regra em cada servidor IIS que faz parte do cluster.\n\n![](..\\..\\..\\..\\images\\nbl%201.png)\n\nNeste caso, deverá ser configurado nos dois servidores, pois não existe um servidor único com *proxy* reverso.\n\n![](..\\..\\..\\..\\images\\nbl%202.png)\n\nJá neste segundo caso, basta configurar uma regra de saída no servidor *proxy* reverso.\n\n- Para realizar a configuração, é necessário criar uma regra de saída na opção URL Rewrite do *site*.\n\n![](..\\..\\..\\..\\images\\nlb%20Passo%201.png)\n\n- Visualizar variáveis do servidor:\n\n![](..\\..\\..\\..\\images\\nlb%20Passo%202.png)\n\n- Adicionar variável:\n\n![](..\\..\\..\\..\\images\\nlb%20Passo%203.png)\n\n- Adicione a varável **RESPONSE\\_SERVER****:**\n\n**![](..\\..\\..\\..\\images\\nlb%20Passo%204.png)**\n\n- Adicione a variável **RESPONSE\\_X-POWERED-BY:**\n\n**![](..\\..\\..\\..\\images\\nlb%20Passo%205.png)**\n\n- Adicione uma nova regra de saída:\n\n![](..\\..\\..\\..\\images\\nlb%20Passo%206.png)\n\n- Em regras de saída escolha regra em branco:\n\n![](..\\..\\..\\..\\images\\nlb%20Passo%207.png)\n\n- Escolha um nome para a regra, em correspondência escolha a opção **variável** e no nome da varável preencha com **RESPONSE\\_SERVER** conforme cadastrado anteriormente.\n\n![](..\\..\\..\\..\\images\\nlb%20Passo%208.png)\n\n- A ação deve ser **reescrita** e o valor deve ser deixado em branco por padrão. Caso escreva algum outro valor, este será apresentado no cabeçalho HTTP.\n\n- Acione **Aplicar**.\n\n![](..\\..\\..\\..\\images\\nlb%20Passo%209.png)\n\n- Para o cabeçalho X-Powered-By deverá seguir os mesmos passos trocando apenas o nome da varável para **RESPONSE\\_X-POWERED-BY:**\n\n**![](..\\..\\..\\..\\images\\nlb%20Passo%2010.png)**\n\n- Ao final teremos duas regras de saída:\n\n![](..\\..\\..\\..\\images\\nlb%20Passo%2011.png)\n\nO resultado esperado aparecerá nos cabeçalhos HTTP:\n\n![](..\\..\\..\\..\\images\\nbl%203.png)\n\nA regra do cabeçalho **Server** foi criada porque pode ou não aparecer, dependendo da forma que estão configurados os serviços de *proxy* reverso e balanceamento de carga." }, { "metadata": { "title": "Servidor de indexação em alta disponibilidade", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623206", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de indexação dedicado\\Servidor de indexação em alta disponibilidade.md" }, "content": "Servidor de indexação em alta disponibilidade" }, { "metadata": { "title": "Servidor de indexação em alta disponibilidade", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623206", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de indexação dedicado\\Servidor de indexação em alta disponibilidade.md" }, "content": "Servidor de indexação em alta disponibilidade\n\n\n**oculto**\n\nPara atualizações 1.5.6 à 1.5.13 acesse: [Como configurar o fluig Indexer para executar em cluster da release 1.5.6 à 1.5.13?](https://tdn.totvs.com/x/zhy7K). *[essa página está arquivada, mas caso seja necessário, solicitar para alguém de Gestão do Conhecimento].*\n\nNota:\n\nEsta página foi revisada para considerar as configurações do serviço de indexação a partir da **Atualização Crystal Mist (1.8.2)**.\n\nCaso possua uma atualização **1.6.4 à 1.8.1** acesse: [ARQ - Como configurar o Servidor de indexação para executar em cluster da release 1.6.4 à 1.8.1?](https://tdn.totvs.com/pages/viewpage.action?pageId=804798298).\n\nCaso possua uma atualização **1.6.0 à 1.6.3** acesse: [ARQ - Como configurar o Servidor de indexação para executar em cluster da release 1.6.0 a 1.6.3?](https://tdn.totvs.com/pages/viewpage.action?pageId=344470997).\n\n# Índice\n\n- 1 [Introdução](#Servidordeindexaçãoemaltadisponibilidade-Introdução)\n- 2 [Redundância](#Servidordeindexaçãoemaltadisponibilidade-Redundância)\n- 3 [Configurando o Apache® ZooKeeper](#Servidordeindexaçãoemaltadisponibilidade-ConfigurandooApache®ZooKeeper)\n- 4 [Configurando o Apache® Solr](#Servidordeindexaçãoemaltadisponibilidade-ConfigurandooApache®Solr)\n- 5 [Configurações de indexação](#Servidordeindexaçãoemaltadisponibilidade-Configuraçõesdeindexação)\n- 6 [Criação de collection](#Servidordeindexaçãoemaltadisponibilidade-Criaçãodecollection)\n- 7 [Configurando o Fluig para usar o Servidor de indexação](#Servidordeindexaçãoemaltadisponibilidade-ConfigurandooFluigparausaroServidordeindexação)\n\n# Introdução\n\n---\n\nAs instruções a seguir completarão a instalação de um Servidor de indexação em um *cluster* de servidores dedicados, continuando as instruções iniciadas na página [Servidor de indexação dedicado](../Servidor de indexação dedicado.md).\n\nNa maioria dos cenários, uma máquina bem dimensionada executando o serviço de indexação é suficiente para atender as demandas de indexação e busca da plataforma.\n\nSendo assim, as configurações apresentadas nesta página são consideradas avançadas, com maior necessidade de administração do ambiente e recomendadas apenas em casos específicos, quando a busca é uma funcionalidade crítica, ou quando se faz necessário garantir a alta disponibilidade deste serviço.\n\n# Redundância\n\n---\n\nO serviço de indexação na plataforma é realizado pelo Apache® Solr. Em um ambiente de alta disponibilidade, são necessárias mais máquinas com este serviço rodando para, no caso de uma delas falhar, ter outras para continuar processando as requisições e, neste caso, o gerenciamento destas requisições será realizado pelo Apache® ZooKeeper.\n\nPara garantir a alta disponibilidade desta funcionalidade, é necessário que exista redundância em ambos os serviços: Apache® Solr para indexação/busca e Apache® ZooKeeper para gerenciamento das configurações de indexação e das requisições. Também é necessário que todas as máquinas do *cluster* sejam acessíveis entre si (estejam na mesma rede).\n\nO princípio de funcionamento do Apache® ZooKeeper é baseado em *quorum*, ou seja, é necessário que a maioria (>50%) dos servidores estejam disponíveis para o processamento das requisições.\n\nPor exemplo, se existirem apenas dois servidores e um deles ficar indisponível, apenas 50% dos servidores estarão saudáveis e, como isso não é a maioria, o *cluster* será incapaz de processar as requisições. Por outro lado, se existirem três servidores e um ficar indisponível, ainda restarão dois saudáveis, ou 66%, atendendo ao critério de maioria. Por esse motivo é recomendado um número ímpar de servidores executando o Apache® ZooKeeper.\n\n# Configurando o Apache® ZooKeeper\n\n---\n\nO primeiro passo é efetuar o *download* da versão 3.9.1 do Apache® ZooKeeper, que pode ser obtida no endereço .\n\nApós efetuar o *download* e extrair o arquivo compactado no diretório de sua preferência [ZOOKEEPER\\_HOME] em cada uma das máquinas do *cluster*, é necessário criar, caso ainda não exista, o arquivo [ZOOKEEPER\\_HOME]/conf/zoo.cfg com o seguinte conteúdo:\n\n**zoo.cfg**\n\n```\ntickTime=2000\ndataDir=C:/zookeeper/data\nclientPort=2181\ninitLimit=5\nsyncLimit=2\n4lw.commands.whitelist=mntr,conf,ruok\n#admin.serverPort=8080\nserver.1=:2888:3888\nserver.2=:2888:3888\nserver.3=:2888:3888\n```\n\n- **tickTime*:*** corresponde ao tempo em milissegundos entre cada *tick*, sendo que uma das validações para determinar se um nó está disponível é de dois *ticks* (similar ao *ping* para verificar se uma máquina é encontrada na rede). Se dois *ticks* consecutivos não obtiverem resposta, ocorre *timeout* e a máquina é considerada indisponível.\n\n- **dataDir**: aponta o diretório onde serão armazenadas as informações referentes ao *cluster.* No início, este diretório deve estar vazio e com permissão de escrita pelo usuário que irá iniciar o ZooKeeper. **O mapeamento deve ser feito sempre com o caracter '/', mesmo em ambientes Windows.**\n\n- **clientPort**: corresponde à porta que será utilizada pelo Apache® Solr.\n\n- **initLimit**: quantidade de tempo (em *ticks*) para que uma máquina com ZooKeeper se conecte e sincronize com a máquina que foi eleita líder. Neste caso, são 5 *ticks* com 2000 milissegundos cada, totalizando 10 segundos. Este valor pode ser incrementado sob demanda se a quantidade de informações gerenciadas pelo ZooKeeper for elevada.\n\n- **syncLimit**: quantidade de tempo (em *ticks*) que uma máquina com ZooKeeper pode estar atrasada em relação à líder. Se uma máquina não conseguir sincronizar com a líder neste intervalo, ela será descartada do *cluster*.\n\n- **4lw.commands.whitelist**: lista de comandos que o ZooKeeper tem permissão para executar.\n\n- **admin.serverPort**: por padrão, o ZooKeeper roda um servidor Jetty na porta 8080. Fica a seu critério escolher a porta, desde que não esteja sendo utilizada por outra aplicação. Basta remover o caractere # da propriedade e alterar o valor da porta.\n\n- **server.X**: são os IDs e localização (endereço na rede interna) de todos os nós do *cluster* e as portas nas quais eles se comunicam entre si. O ID identifica cada nó do *cluster*, precisando ser referenciado em um arquivo de nome 'myid', dentro do diretório definido na propriedade 'dataDir'. Neste exemplo seria necessário criar o arquivo '/var/lib/zookeeperdata/myid' com o conteúdo '1' (sem aspas) para a máquina configurada na propriedade 'server.1', o mesmo arquivo com conteúdo '2' (sem aspas) para a máquina configurada na propriedade 'server.2', e assim por diante, para cada máquina existente no *cluster*. As portas **2888** e **3888** serão utilizadas para comunicação entre cada uma das máquinas do *cluster* e podem ser alteradas de acordo com a necessidade, desde que informadas na linha correspondente ao servidor em questão, no arquivo 'zoo.cfg' de todas as máquinas do *cluster*.\n\nImportante!\n\nCertifique-se de que o arquivo \"myid\" foi criado corretamente em cada máquina (na pasta definida pela propriedade dataDir), tendo o ID numérico do servidor como conteúdo.\n\nCom essa configuração em cada máquina do *cluster*, basta iniciá-las com o seguinte comando:\n\n**No Linux**\n\n```\ncd /bin\nzkServer.sh start zoo.cfg\n```\n\n**No Windows**\n\n```\ncd /bin\nzkServer.cmd\n```\n\n# Configurando o Apache® Solr\n\n---\n\nA instalação do Apache® Solr pode ser realizada através da instalador do Fluig no modo caractere, seguindo o passo a passo para instalar somente o Servidor de indexação em [Windows](http://tdn.totvs.com/pages/viewpage.action?pageId=274325941#Instala%C3%A7%C3%A3oWindows-ModoCaractere-PassoapassoparainstalarsomenteoServidordeIndexa%C3%A7%C3%A3o) ou [Linux](http://tdn.totvs.com/pages/viewpage.action?pageId=152797808#Instala%C3%A7%C3%A3oLinux-ModoCaractere-PassoapassoparainstalarsomenteoServidordeIndexa%C3%A7%C3%A3o).\n\nPara existir redundância, deve conter no mínimo duas máquinas executando este serviço de indexação, podendo estas serem as mesmas máquinas que executam o serviço de gerenciamento (ZooKeeper) ou máquinas distintas na mesma rede, dependendo da arquitetura desejada de tolerância à falhas.\n\nO Solr possui dois modos de inicialização: Standalone e Cloud. Em um ambiente de alta disponibilidade, é necessário utilizar o modo Cloud, apontando para os servidores onde estão sendo executados os serviços de gerenciamento das configurações e requisições (ZooKeeper). Para isso, basta incluir o parâmetro ZK\\_HOST no arquivo de configuração do Servidor de indexação, conforme exemplo abaixo:\n\n**Inicializando o Solr no modo cloud**\n\n```\nZK_HOST=\":2181,:2181,:2181\"\nSOLR_HOST=\"\"\nSOLR_IP_ALLOWLIST=\",,\"\n```\n\nNeste caso, os endereços , e no item ZK\\_HOST são os mesmos informados anteriormente nos parâmetros '**server.X'** do arquivo '**zoo.cfg'**, e a porta 2181 corresponde ao parâmetro **clientPort** informado nesse mesmo arquivo. As aspas devem ser mantidas.\n\nO parâmetro utilizado no item SOLR\\_HOST se refere ao endereço ou IP do próprio servidor que está configurando. As aspas devem ser mantidas.\n\nOs parâmetros IP utilizados no item SOLR\\_IP\\_ALLOWLIST restringem o acesso ao Solr, garantindo que qualquer chamada de um IP/hostname diferente dos que foram configurados será bloqueada. Esta propriedade é **imprescindível** para aumentar a **segurança** do ambiente. Para mais informações, consulte a [documentação do Solr](https://solr.apache.org/guide/solr/9_4/deployment-guide/securing-solr.html#ip-access-control).\n\nA localização deste arquivo de configuração varia de acordo com o sistema operacional e pode ser verificada na tabela abaixo:\n\n| Sistema operacional | Arquivo de configuração | Localização |\n| --- | --- | --- |\n| Linux | [fluig\\_Indexer.in](http://fluig_indexer.in/).sh | /etc/default/ |\n| Windows | [solr.in](http://solr.in/).cmd | [Instalação fluig Indexer]/solr/bin/ |\n\n**Após esta configuração, é necessário iniciar os serviços do Solr (fluig\\_Indexer) em todas as máquinas que o executarão para seguir com os próximos passos.**\n\nImportante!\n\nO serviço de gerenciamento (ZooKeeper) deve ser iniciado antes do serviço de indexação (Solr), caso contrário, este último irá considerar que não há serviço de gerenciamento disponível.\n\n# Configurações de indexação\n\n---\n\nQuando o Apache® Solr é executado no modo Cloud, as configurações do índice são armazenadas e gerenciadas pelo Apache® ZooKeeper. Por isso, primeiramente é necessário publicar as configurações utilizadas pela plataforma. Estas configurações são instaladas juntamente com o serviço de indexação e para publicá-las no serviço de gerenciamento (ZooKeeper), pode-se utilizar o comando abaixo:\n\n**Publicando configurações de indexação da plataforma**\n\n```\n/bin/solr zk upconfig -d fluig -n fluig -z :2181,:2181,:2181\n```\n\n- O parâmetro '**-d** fluig' corresponde ao nome do diretório onde estão armazenadas as configurações utilizadas pela plataforma, instaladas por padrão juntamente com o serviço de indexação, no diretório 'fluig'. O comando irá efetuar o *upload* deste diretório para os endereços informados no parâmetro '**-z**'.\n- O parâmetro '**-n** fluig' corresponde ao nome que esta configuração irá receber no serviço de gerenciamento (ZooKeeper) e será utilizado no próximo passo (criação da *collection*).\n- O parâmetro '**-z'** informa a lista de serviços de gerenciamento (ZooKeeper) onde serão publicadas estas configurações, conforme detalhado anteriormente.\n\nImportante!\n\nComo existe o ZooKeeper para gerenciar o *cluster*, este comando precisa ser executando apenas em uma das máquinas do Solr.\n\n# Criação de *collection*\n\n---\n\nCada empresa (*tenant*) criada no Fluig é mapeada para uma ***collection*** no Apache® Solr. Quando em *cluster*, é necessário definir a quantidade de nós (*shards*) em que o índice será dividido e o fator de replicação (*replicationFactor*) das informações referentes a esta *collection*, através do seguinte comando:\n\n**Criando collection**\n\n```\n/bin/solr create_collection -c -d fluig -shards 1 -replicationFactor 2\n```\n\n- Informe o código numérico que será usado para a empresa criada no Fluig em .\n- Neste caso o parâmetro '**-d**' corresponde ao nome da configuração armazenada no ZooKeeper (parâmetro '**-n**' do comando utilizado anteriormente para *upload*).\n- Informe o número total de instâncias do Apache® Solr após o parâmetro '-replicationFactor'**.**\n\nImportante!\n\nComo existe o ZooKeeper para gerenciar o *cluster*, este comando precisa ser executando apenas em uma das máquinas do Solr, mas **as outras máquinas precisam estar com o Solr em execução**.\n\n# Configurando o Fluig para usar o Servidor de indexação\n\n---\n\nSe o Fluig estiver em **execução**, siga os passos abaixo:\n\n- Acesse o Fluig com o usuário '**wcmadmin**':\n\n![](..\\..\\..\\..\\images\\1.JPG)\n\n- Clique no menu **Painel de Controle → Aba WCM → Configurações do Sistema**:\n\n![](..\\..\\..\\..\\images\\2.JPG)\n\n- Clique na aba **Parâmetros da Plataforma** e localize as configurações do Servidor de **Indexação**:\n\n![](..\\..\\..\\..\\images\\3.jpg)\n\n- **Configure** da seguinte forma:\n - **URL de acesso ao Solr**:  Devem ser informados os endereços dos servidores onde estão sendo executados os serviços de gerenciamento (ZooKeeper), em uma lista de endereços separados por vírgula, da mesma forma que foram informados no parâmetro '**-z**' ao iniciar os serviços de indexação (Solr).\n - **Solr em Servidor Remoto**: Deve estar ativado (ON).\n - **Solr em Cluster**: Deve estar ativado (ON). Esta opção ativa o Solr em *Cluster*, necessária para ambientes em *Cluster*.\n\n![](..\\..\\..\\..\\images\\image2018-3-13_10-50-17.png)\n\n- As alterações nos parâmetros exigem a reinicialização da plataforma. Portanto inicie os serviços na ordem correta.\n\nSe o Fluig estiver **parado**, siga os passos abaixo:\n\n- No servidor onde está instalado o Fluig, acesse o diretório [Instalação fluig]/repository/wcmdir/config e edite o arquivo **[configuration.properties](../../Configurações da plataforma.md)**. Caso o arquivo configuration.properties não exista, crie um novo arquivo com este nome.\n\n**configuration.properties**\n\n```\ntotvs/solrURL=10.171.70.21:2181,10.171.70.22:2181,10.171.70.23:2181\ntotvs/solrCloud=true\ntotvs/solrRemote=true\n```\n\n- Modifique o parâmetro '**totvs/solrURL**' informando a lista de endereços dos servidores onde estão sendo executados os serviços de gerenciamento, da mesma forma que foram informados no parâmetro '**-z**' ao iniciar os serviços de indexação (Solr). Deverá ser informado **apenas** o **IP** ou***hostname*** do servidor e a **porta**, sem o protocolo e contexto.\n\nImportante!\n\nO parâmetro '**totvs/solrCloud**' irá condicionar o Fluig para ativar a opção do Solr em *Cluster*, necessária para ambientes em *Cluster*.\n\n- Inicie os serviços do Fluig na ordem correta." }, { "metadata": { "title": "Servidor de indexação único", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623442", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de indexação dedicado\\Servidor de indexação único.md" }, "content": "Servidor de indexação único" }, { "metadata": { "title": "Servidor de indexação único", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623442", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de indexação dedicado\\Servidor de indexação único.md" }, "content": "Servidor de indexação único\n\n\nAtenção\n\nEsta página foi revisada para considerar as novas configurações de *server* do Fluig para a atualização 1.6.\n\n# Índice\n\n- 1 [Introdução](#Servidordeindexaçãoúnico-Introdução)\n- 2 [Configurando o Fluig para usar o Servidor de indexação](#Servidordeindexaçãoúnico-ConfigurandooFluigparausaroServidordeindexação)\n- 3 [Executando o serviço Fluig Indexer](#Servidordeindexaçãoúnico-ExecutandooserviçoFluigIndexer)\n- 4 [Registrando o Fluig Indexer como serviço no Windows/Linux](#Servidordeindexaçãoúnico-RegistrandooFluigIndexercomoserviçonoWindows/Linux)\n\nImportante!\n\nAntes de prosseguir com as instruções descritas nessa página, realize os passos contidos na documentação [Servidor de indexação dedicado](../Servidor de indexação dedicado.md).\n\n# Introdução\n\n---\n\nAs instruções a seguir completarão a instalação de um Servidor de indexação em um único servidor dedicado, continuando as instruções iniciadas em [Servidor de indexação dedicado](../Servidor de indexação dedicado.md).\n\n# Configurando o Fluig para usar o Servidor de indexação\n\n---\n\nNo servidor onde está instalado o Fluig, acesse o diretório [Instalação fluig]/repository/wcmdir/config e edite o arquivo [configuration.properties](http://tdn.totvs.com/pages/viewpage.action?pageId=257623022). Caso o arquivo configuration.properties não exista, crie um novo arquivo com este nome.\n\nSe o Indexer possuir acesso ao [repositório](http://tdn.totvs.com/pages/viewpage.action?pageId=233766796) do Fluig, adicione/edite a seguinte linha, informando o endereço do servidor de indexação onde o Fluig Indexer foi instalado:\n\n```\ntotvs/solrURL=http://:8983/solr\n```\n\nIsto fará com que os dados do Indexer sejam salvos no [repositório](http://tdn.totvs.com/pages/viewpage.action?pageId=233766796).\n\nOu se o Indexer **não** possuir acesso ao [repositório](http://tdn.totvs.com/pages/viewpage.action?pageId=233766796) do Fluig, adicione/edite as seguintes linhas:\n\n```\ntotvs/solrURL=/solr\ntotvs/solrURL=http://:8983/solr\ntotvs/solrRemote=true\ntotvs/solrCloud=false\n```\n\nIsto fará com que o Fluig envie os documentos para extração e indexação neste servidor. Lembramos apenas que sem acesso ao repositório, este processo é mais lento do que o acesso direto via repositório. Os dados do Indexer serão salvos no servidor do Indexer.\n\nObservação\n\nCaso o parâmetro *solrRemote* seja alterado após a criação de empresa, os dados do Indexer continuarão sendo salvos conforme sua configuração inicial, sendo a alteração válida apenas para novas empresas. A reinicialização do servidor de aplicação pode ser necessária.\n\n# Executando o serviço Fluig Indexer\n\n---\n\n- Basta executar o arquivo [Instalação do fluig Indexer]/solr/startStandalone.sh ou [Instalação do fluig Indexer]/solr/startStandalone.bat que o processo será inicializado.\n\n- Para interromper o serviço de indexação, execute o arquivo [Instalação do fluig Indexer]/solr/stopStandalone.sh ou [Instalação do fluig Indexer]/solr/stopStandalone.bat.\n\nObservação\n\nÉ importante que o Fluig Indexer seja iniciado antes do Fluig, caso contrário este irá considerar que não há serviço de Indexação disponível.\n\n# Registrando o Fluig Indexer como serviço no Windows/Linux\n\n---\n\nPara registrar o Fluig Indexer como serviço, utilize os [procedimentos](../../../Instalação e Atualização/Recriar Serviços do Fluig.md) padrão do sistema operacional em questão." }, { "metadata": { "title": "Arquivo de Emergência", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=275120345", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de Licenças (License Server)\\Arquivo de Emergência.md" }, "content": "Arquivo de Emergência\n\n\nAtenção\n\nEsta página foi revisada para considerar as configurações da atualização 1.6.1 ou superiores.\n\nCaso possua uma atualização anterior acesse a página [Chave de Emergência](http://tdn.totvs.com/x/Rx5BE).\n\n- 1 [Objetivo](#ArquivodeEmergência-Objetivo)\n- 2 [Pré-requisitos](#ArquivodeEmergência-Pré-requisitos)\n- 3 [Procedimento](#ArquivodeEmergência-Procedimento)\n\n# Objetivo\n\n---\n\nO arquivo de emergência serve como contingência para situações em que o [servidor de licenças](../Servidor de Licenças (License Server).md).md) (*License Server*) esta indisponível ou o cliente está aguardando a liberação da chave definitiva.\n\n# Pré-requisitos\n\n---\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre a plataforma\n- Visão geral sobre o [Licenciamento da plataforma](../../../Sobre a plataforma/Licenciamento da plataforma.md)\n\n# Procedimento\n\n---\n\n**1.**Solicitar o arquivo de emergência através do [AutoAtendimento CST](https://suporte.totvs.com/portal/p/10098/autoatendimento_chave-emerg) no Portal do Cliente.\n\nO CNPJ do cliente utilizado para geração do arquivo de emergência deve ser igual ao cadastrado na configuração da [empresa](http://tdn.totvs.com/x/Ju4KDg) da plataforma\n\n**2.** Efetuar login na plataforma. Será apresentada a seguinte mensagem:\n\n**![](..\\..\\..\\..\\images\\demo1.png)**\n\n**3.** Clique no botão **Escolher** e selecione o arquivo de emergência obtido através do AutoAtendimento CST do Portal do Cliente.\n\n**4.** Clique em no botão **Enviar**.\n\n**5.** Efetue novamente o login." }, { "metadata": { "title": "Contingência de Acesso sem License Server", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=221549968", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de Licenças (License Server)\\Contingência de Acesso sem License Server.md" }, "content": "Contingência de Acesso sem License Server" }, { "metadata": { "title": "Contingência de Acesso sem License Server", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=221549968", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de Licenças (License Server)\\Contingência de Acesso sem License Server.md" }, "content": "Contingência de Acesso sem License Server\n\n\n# Índice\n\n- 1 [Objetivo](#ContingênciadeAcessosemLicenseServer-Objetivo)\n- 2 [Pré-requisitos](#ContingênciadeAcessosemLicenseServer-Pré-requisitos)\n- 3 [Como funciona?](#ContingênciadeAcessosemLicenseServer-Comofunciona?)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é mostrar como o TOTVS Fluig Plataforma permite a contingência de acesso à plataforma. Trata-se de um recurso para tolerância de 7 dias de acesso à plataforma quando servidor de licenças estiver inoperante. Dessa forma o cliente poderá utilizar a plataforma sem ser impactado durante os 7 dias a partir da primeira constatação de queda do servidor. O usuário administrador deve ser notificado da instabilidade e o responsável pela instalação do produto, dentro dos 7 dias deve ser acionado para solucionar o incidente.\n\n# Pré-requisitos\n\n---\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre a plataforma\n- Visão geral sobre o [Licenciamento da plataforma](http://tdn.totvs.com/display/fluig/Licenciamento+fluig)\n\n# Como funciona?\n\n---\n\n- O usuário final terá uma tolerância de 7 dias para acesso à plataforma, mesmo que o servidor de licenças esteja inoperante.\n- Quando o Servidor de Licenças estiver inoperante, os usuários administradores serão notificados pela indisponibilidade via e-mail, alerta da plataforma e modal ao executar o login. Mensagens conforme imagens abaixo:\n\n| Mensagens |\n| --- |\n| **Modal ao efetuar o login - Mensagem de estabilização do Servidor de Licenças** |\n| **Modal ao efetuar o login - Mensagem de instabilidade do Servidor de Licenças** |\n| **E-mail de notificação de instabilização do Servidor de Licenças** |\n| **E-mail de notificação de estabilização do Servidor de Licenças** |\n| **Alertas na central de notificações** |\n\n- O recurso utilizado para manter e armazenar o estado de licenças é o cache da plataforma.\n- Enquanto o servidor de licenças estiver inoperante, o usuário poderá utilizar os recursos da plataforma normalmente, inclusive aquelas que executam consultas diretas ao Servidor de Licenças.\n\nNota\n\nOs controles das informações de acesso como expiração do acesso, usuários administradores já notificados pelo incidente, estado atual do servidor de licenças, ficam registrados por empresa e não por instalação da plataforma. Dessa forma uma instalação que possui mais de uma empresa cadastrada, terá controles de acesso e expirações específicas por empresa.\n\nPontos de Atenção\n\nCaso o servidor de aplicação e de cache sofram queda, o estado das licenças no cache será perdido e o período de tolerância de acesso ao produto será apagado. Com isso será solicitada uma chave de acesso ou será permitido acesso pelo modo DEMO.\n\nCaso o servidor de licenças não seja estabilizado em 7 dias após a primeira queda, o cliente visualizará mensagem de erro ao tentar se autenticar na plataforma e será direcionado para o modo DEMO ou para a chave de acesso." }, { "metadata": { "title": "Fluig Identity Partner", "source": "https://tdn.totvs.com/display/fluig/Fluig+Identity+Partner", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de Licenças (License Server)\\Fluig Identity Partner.md" }, "content": "Fluig Identity Partner" }, { "metadata": { "title": "Fluig Identity Partner", "source": "https://tdn.totvs.com/display/fluig/Fluig+Identity+Partner", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Ambiente\\Servidor de Licenças (License Server)\\Fluig Identity Partner.md" }, "content": "Fluig Identity Partner\n\n\n# Índice\n\n- 1 [Objetivo](#FluigIdentityPartner-Objetivo)\n- 2 [Pré-requisitos](#FluigIdentityPartner-Pré-requisitos)\n- 3 [Configuração na plataforma](#FluigIdentityPartner-Configuraçãonaplataforma)\n- 4 [Obter Credenciais e Licença no Identity](#FluigIdentityPartner-ObterCredenciaiseLicençanoIdentity)\n- 5 [Desativar License Server da plataforma](#FluigIdentityPartner-DesativarLicenseServerdaplataforma)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é mostrar como configurar o licenciamento controlado pelo Identity. O Fluig Identity Partner é um modelo de licenciamento que utiliza o TOTVS Identity na nuvem para controlar o acesso a plataforma TOTVS Fluig.\n\n# Pré-requisitos\n\n---\n\nEste recurso é disponibilizado apenas para clientes que são **parceiros TOTVS**.\n\nPara utilizar este licenciamento não é preciso ter a plataforma Fluig integrada com o Identity.\n\n# Configuração na plataforma\n\n---\n\nPara realizar a configuração do licenciamento controlado pelo Identity, siga os passos abaixo:\n\n- Acesse a plataforma com um usuário que contenha perfil de administrador;\n\n- Clique sobre o menu em **Painel de Controle** e localize a opção **Identity Partner Admin**.\n\n- Acesse o Identity e obtenha o License ID, Client ID e Cliente Secret para preencher nos campos solicitados na página de configuração do Identity Partner Admin. Caso tiver dúvidas em como realizar este procedimento no Identity [clique](https://tdn.totvs.com/pages/viewpage.action?pageId=281141190) [aqui](https://tdn.totvs.com/pages/viewpage.action?pageId=281141190).\n- Se este ambiente for de homologação, a opção \"Utilizar ambiente de homologação\" deve ser ativada.\n- Finalizado a inclusão dos IDs, clique em **Ativar**.\n\n![](..\\..\\..\\..\\images\\Licen%C3%A7a8.jpg)\n\n- Caso a plataforma esteja utilizando o License Server, será necessário desativá-lo no painel administrativo da plataforma. Dúvidas em realizar este procedimento, [clique aqui](https://tdn.totvs.com/pages/viewpage.action?pageId=281141190).\n\n# Obter Credenciais e Licença no Identity\n\n---\n\nSiga os passos abaixo para obter as informações solicitadas na plataforma para configuração do Identity Partner Admin.\n\n- Acesse o Identity com um usuário que contenha perfil de administrador;\n- Acione o menu **Aplicativos**;\n- Pesquise pelo aplicativo do Fluig;\n- Clique sobre o aplicativo Fluig que deseja configurar o Identity Partner Admin;\n\n- Acesse a aba **Credenciais OAuth 2.0**.\n- Clique sobre o botão **Gerar Nova Credencial;**\n\n**![](..\\..\\..\\..\\images\\Licen%C3%A7a2.jpg)**\n\n- Informe uma descrição;\n- Clique em **Salvar**.\n\n![](..\\..\\..\\..\\images\\Licen%C3%A7a3.jpg)\n\n- Copie o Client ID e Client Secret e cole na tela de configuração do Identity Partner Admin no Fluig.\n\n![](..\\..\\..\\..\\images\\Licen%C3%A7a4.jpg)\n\n- Acesse a aba **Licenças** para copiar o ID da Licença gerada pelo seu parceiro TOTVS.\n- Basta clicar no ícone de copiar (![](..\\..\\..\\..\\images\\salvar.png)) localizado ao lado do ID.\n- Cole o ID na tela de configuração do Identity Partner Admin no Fluig.\n\n**![](..\\..\\..\\..\\images\\Image%2006%2019%20nov1.jpg)**\n\n# Desativar License Server da plataforma\n\n---\n\nAtenção!\n\nClientes hospedados em Cloud TOTVS deverão abrir um ticket para a Equipe de Atendimento Cloud solicitando a desativação do License Server.\n\nPara realizar este procedimento, acesse a plataforma com o usuário 'wcmadmin' e siga os passos abaixo:\n\n- Clique sobre o menu **Painel de Controle** e acione a opção **Configurações do Sistema**;\n- Acesse a aba **Parâmetros da Plataforma** onde estão localizados os parâmetros de configuração da plataforma;\n\n- Localize na página o item Servidor de Licença;\n- Clique sobre o botão **Habilitar License Server** para Desativá-lo;![](..\\..\\..\\..\\images\\Image%2011.jpg)\n\n- No topo da página clique em Salvar para desativar o License Server. Para que a desativação seja reconhecida pela plataforma será necessário reiniciar os serviços do Fluig.\n\n- Reinicie os serviços do Fluig na ordem correta.\n\n**Parar**: fluig, fluig\\_RealTime, luig\\_Indexer e fluig\\_MemCached (caso utilizar). \n**Iniciar**: fluig\\_MemCached (caso utilizar), fluig\\_Indexer, fluig\\_RealTime e fluig." }, { "metadata": { "title": "Configuração de banco de dados MySQL", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623464", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração de banco de dados MySQL.md" }, "content": "Configuração de banco de dados MySQL" }, { "metadata": { "title": "Configuração de banco de dados MySQL", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623464", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração de banco de dados MySQL.md" }, "content": "Configuração de banco de dados MySQL\n\n\nFique atento!\n\nEsta página é válida para atualizações **1.6** e **superiores** do TOTVS Fluig.\n\nCaso possua uma atualização anterior acesse: [Como configurar o banco de dados MySQL na release 1.5.13 ou inferior?](https://tdn.totvs.com/pages/viewpage.action?pageId=128681321)\n\n- [Versões homologadas do MySQL](#ConfiguraçãodebancodedadosMySQL-VersõeshomologadasdoMySQL)\n- [Passo a passo para configuração do MySQL](#ConfiguraçãodebancodedadosMySQL-PassoapassoparaconfiguraçãodoMySQL)\n - [Criação do usuário e concessão de privilégios](#ConfiguraçãodebancodedadosMySQL-Criaçãodousuárioeconcessãodeprivilégios)\n - [Parâmetro de conexão](#ConfiguraçãodebancodedadosMySQL-Parâmetrodeconexão)\n - [Case sensitive](#ConfiguraçãodebancodedadosMySQL-Casesensitive)\n - [Engines](#ConfiguraçãodebancodedadosMySQL-Engines)\n - [Memória](#ConfiguraçãodebancodedadosMySQL-Memória)\n - [Criação de tabelas](#ConfiguraçãodebancodedadosMySQL-Criaçãodetabelas)\n - [Confirmar alterações](#ConfiguraçãodebancodedadosMySQL-Confirmaralterações)\n- [Criação do banco de dados com codificação UTF-8](#ConfiguraçãodebancodedadosMySQL-CriaçãodobancodedadoscomcodificaçãoUTF-8)\n- [Download do driver](#ConfiguraçãodebancodedadosMySQL-Downloaddodriver)\n- [Otimizando a performance do banco de dados MySQL](#ConfiguraçãodebancodedadosMySQL-OtimizandoaperformancedobancodedadosMySQL)\n\n# Versões homologadas do MySQL\n\n---\n\nPara verificar as versões homologadas do MySQL acesse a [Matriz de Portabilidade](http://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade).\n\n# Passo a passo para configuração do MySQL\n\n---\n\nAs configurações apresentadas abaixo devem ser realizadas antes da criação do banco de dados da plataforma.\n\nAtenção!\n\nA **atualização** para versão **MySQL 8.0**, ou seja, quando já existe um banco criado em versões anteriores, é um processo complexo que envolve diversas configurações e requer muita atenção.\n\nRecomendamos consultar um especialista em banco de dados para executar esses procedimentos devido a complexidade das configurações.\n\nContudo, listamos alguns materiais de apoio que indicamos a leitura antes de prosseguir com a atualização:\n\n- \n\n- \n\nImportante!\n\nPor questões de segurança é altamente recomendável efetuar a encriptação da senha conforme o procedimento informado na documentação [encriptação de senha do banco de dados](http://tdn.totvs.com/x/Oh4WGw)." }, { "metadata": { "title": "Configuração de banco de dados MySQL", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623464", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração de banco de dados MySQL.md" }, "content": "Configuração de banco de dados MySQL\n\n## Criação do usuário e concessão de privilégios\n\n---\n\nPara a criação de um novo usuário em banco de dados MySQL usamos a instrução CREATE USER, conforme sintaxe abaixo:\n\n```\nCREATE USER 'sha2user'@'localhost'\nIDENTIFIED WITH caching_sha2_password BY 'password';\n```\n\nOnde:\n\n- sha2user: Nome do usuário que será criado;\n- localhost: Host que irá acessar;\n- password: Senha do usuário que será criado;\n\nApós criado o usuário é necessário conceder os privilégios de sistema necessários para ele, conforme sintaxe abaixo:\n\n```\nGRANT all ON fluig.* TO 'sha2user'@'localhost';\n```\n\nOnde:\n\n- sha2user: Nome do usuário criado anteriormente;\n- localhost: Host do usuário criado anteriormente;\n\n## Parâmetro de conexão\n\n---\n\nNessa etapa, é realizada uma configuração específica para a versão do **MySQL 8.0.**Para as demais versões do MySQL permanece o que foi configurado por padrão.\n\nCaso a configuração seja para a versão **MySQL 8.0**, é necessário alterar o parâmetro de conexão no arquivo de configurações.\n\nPara isso:\n\n- Acesse o diretório **\\appserver\\standalone\\configuration** e edite o arquivo **standalone.xml**.\n\n- Localize as *tags* ****.\n\n- O parâmetro dessa *tag* deve ser alterado de: **?useSSL=false** para **?allowPublicKeyRetrieval=true&useSSL=false**.\n\n- Acesse o diretório **\\appserver\\domain\\configuration** e edite o arquivo **domain.xml**.\n\n- Localize as *tags* ****.\n\n- O parâmetro dessa *tag* deve ser alterado de: **?useSSL=false** para **?allowPublicKeyRetrieval=true&useSSL=false**.\n\n## *Case sensitive*" }, { "metadata": { "title": "Configuração de banco de dados MySQL", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623464", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração de banco de dados MySQL.md" }, "content": "Configuração de banco de dados MySQL\n\n\n---\n\nPor padrão, *aliases* de tabelas são *case sensitive* no Unix, mas não são no Windows. Para evitar problemas causados por esta característica, no MySQL é necessário adicionar a variável de sistema **lower\\_case\\_table\\_names**no arquivo de configuração do MySQL.\n\n**MySQL em versões anteriores a 8.0**\n\nSe você utiliza o banco de dados MySQL em versões anteriores a 8.0, basta incluir essa variável no arquivo **my.ini** (Windows) ou **my.cnf** (Linux)**.**\n\n```\nlower_case_table_names=1\n```\n\n**MySQL na versão 8.0**\n\nSe você utiliza o banco de dados MySQL na versão 8.0, no **Windows** você não precisa efetuar nenhuma configuração. A variável *lower\\_case\\_table\\_names*já vem configurada por padrão com o valor 1.\n\nNo **Linux**, é OBRIGATÓRIO realizar essa configuração na instalação do servidor MySQL, alterando a variável *lower\\_case\\_table\\_names* para o valor 1.\n\nPor se tratar de uma variável de sistema, que não pode ser alterada posteriormente, é muito importante configurá-la corretamente na instalação.\n\nPara mais informações sobre o uso e configuração do *case sensitive* na versão 8.0, [consulte aqui](https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html).\n\n## *Engines*\n\n---\n\nAlém disso é necessário confirmar que as tabelas serão criadas corretamente no banco de dados. Para isso, no *Command Line Client* do MySQL verifique a *engine* utilizada informando o comando: \n\n```\nSHOW ENGINES\\G\n```\n\nLocalize a *engine* InnoDB, conforme a imagem abaixo:\n\n![](..\\..\\..\\images\\mysql.png)\n\nSe a *engine* InnoDB não for apresentada como *Default*, o parâmetro *default\\_storage\\_engine*também deve ser adicionado ao arquivo, conforme segue:\n\n**Arquivo de configuração do MySQL (Normalmente Linux: my.cnf / Windows: my.ini**\n\n```\ndefault_storage_engine=InnoDB\n```\n\n## Memória" }, { "metadata": { "title": "Configuração de banco de dados MySQL", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623464", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração de banco de dados MySQL.md" }, "content": "Configuração de banco de dados MySQL\n\n\n---\n\nTambém é possível definir a quantidade de memória a ser usada pelo MySQL. Em um servidor dedicado, a boa prática é alocar de 75% a 80% da memória disponível para o banco de dados:\n\n**Arquivo de configuração do MySQL (Normalmente Linux: my.cnf / Windows: my.ini**\n\n```\ninnodb_buffer_pool_size=\n```\n\n- Por exemplo, para alocar 128 MB de memória teríamos: innodb\\_buffer\\_pool\\_size=134217728.\n\n## Criação de tabelas\n\n---\n\nCaso sejam criados formulários com muitos campos, sendo a maioria deles do tipo TEXT, o MySQL pode restringir a criação de tabelas em que o tamanho somado dos campos ultrapasse o limite permitido.\n\nRecomendamos efetuar as seguintes configurações no banco de dados para solucionar essa restrição:\n\n**Arquivo de configuração do MySQL (Normalmente Linux: my.cnf / Windows: my.ini**\n\n```\ninnodb_log_file_size=512M #Somente para MySQL em versões anteriores a 8.0\ninnodb_log_buffer_size=800M\ninnodb_strict_mode=0\n```\n\n## Confirmar alterações" }, { "metadata": { "title": "Configuração de banco de dados MySQL", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623464", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração de banco de dados MySQL.md" }, "content": "Configuração de banco de dados MySQL\n\n\n---\n\nApós realizar as configurações expostas nos passos anteriores, é necessário reiniciar o MySQL e confirmar a aplicação das alterações.\n\nPara verificar se a configuração *case sensitive* foi efetuada com sucesso, execute o comando SQL abaixo. Se no resultado a coluna *value*possuir o valor 1 a configuração está correta.\n\n```\nSHOW GLOBAL VARIABLES LIKE 'lower_case_table_names';\n```\n\nConfirme também a alteração do *Engine* para InnoDB, caso tenha adicionado o parâmetro *default\\_storage\\_engine*ao arquivo*:*\n\n```\nSHOW ENGINES\\G\n```\n\nSe a*engine* InnoDB aparecer como*Default*a configuração foi aplicada com sucesso.\n\nImportante!\n\n- ***Timezone***: o banco de dados MySQL possui validação de *timezone*, sendo assim, para a instalação da plataforma com MySQL, é necessário que o servidor onde está instalada a plataforma tenha o *timezone* válido (reconhecido pelo MySQL).\n\n- **SSL**: se for necessário usar SSL, é preciso alterar o parâmetro *useSSL* para *true*. Esse parâmetro é encontrado na *string* de conexão dentro do arquivo ***standalone.xml*** (**a partir da 2.0**) ou do ***domain.xml*** (**da 1.6 até 1.8.2**)*.*\n\n# Criação do banco de dados com codificação UTF-8\n\n---\n\nA plataforma necessita de uma base de dados com *charset* **UTF-8**. Para criar o banco com esta característica utilize o seguinte comando SQL, substituindo \"nome\\_do\\_banco\" pelo nome do banco a ser criado:\n\n**MySQL em versões anteriores a 8.0**\n\n```\nCREATE DATABASE nome_do_banco CHARACTER SET utf8 COLLATE utf8_general_ci;\n```\n\n**MySQL na versão 8.0**\n\n```\nCREATE DATABASE nome_do_banco CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;\n```\n\nAtenção!\n\nA partir da versão 8.0 o charset utf8 e collate utf8\\_general\\_ci estão descontinuados e em breve não poderão ser mais utilizados.\n\nCaso esteja atualizando para a versão 8.0, ou seja, já tenha um banco criado com o charset utf8 e collate utf8\\_general\\_ci, é necessário planejar a conversão do banco e tabelas para o charset utf8mb4 e collate utf8mb4\\_general\\_ci. \n \nRecomendamos consultar um especialista em banco de dados para executar esses procedimentos. Existem ferramentas que realizam essa conversão e também comandos SQL que podem ser executados manualmente em seu banco de dados.\n\nAtenção!\n\nA partir da release 2.0 do TOTVS Fluig, será obrigatório a utilização do MySQL na versão 8. Em uma atualização, caso as **tabelas padrão** do produto não se encontrem com o charset utf8mb4 e collate utf8mb4\\_general\\_ci, o TOTVS Fluig efetuará a conversão automaticamente na primeira inicialização, não sendo necessário nenhuma conversão manual.\n\nPara tabelas customizadas e tabelas ML\\*, a conversão não será realizada automaticamente. Caso seja necessário, essa alteração deverá ser realizada manualmente.\n\nNota:\n\nNão há um padrão para \"nome\\_do\\_banco\", cada cliente pode colocar o nome que desejar, por exemplo: *fluig*, *fluig-homologacao* ou *minhaempresa*.\n\n# *Download* do *driver*\n\n---\n\nPara utilização do banco de dados MySQL, é necessário fazer o download do *driver* MySQL separadamente.\n\nPor isso, antes de iniciar a instalação/atualização da plataforma, siga os passos a seguir:\n\n**01**. Faça o download do *driver* diretamente no [site do MySQL](http://dev.mysql.com/downloads/connector/j/);\n\nFique atento!\n\nO driver do MySQL deve estar na mesma versão do banco MySQL que você tem instalado. Para saber quais são as versões homologadas acesse a [Matriz de Portabilidade](http://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade).\n\n**02**. No campo **Select Platform** acione a opção **Platform Independent**;\n\n**03**. Clique no botão **Download**ao lado da versão em arquivo ZIP;\n\n**04**. Clique em ***No thanks, just start my download*** e será iniciado o download de um arquivo chamado **mysql-connector-java-XX.Y.ZZ.zip** ou **mysql-connector-j-XX.Y.ZZ.zip**, onde XX.Y.ZZ é a versão atual do *driver*;\n\n**05**. Descompacte o arquivo baixado. Será criada uma pasta chamada **mysql-connector-java-XX.Y.ZZ** ou **mysql-connector-j-XX.Y.ZZ.zip***;*\n\n**06**. Nesta pasta há um arquivo chamado ***mysql-connector-java-XX.Y.ZZ-bin.jar** ou **mysql-connector-j-XX.Y.ZZ.jar***. Esse arquivo é o *driver*.\n\nDurante a instalação da plataforma, será necessário indicar o caminho onde o *driver* do MySQL foi armazenado.\n\nComo atualizar?\n\nA atualização do Fluig não permite atualizar o *driver* pelo instalador. Esse procedimento deve ser executado manualmente, seguindo os passos abaixo:\n\n**01**. Acesse a pasta *\\appserver\\modules\\com\\mysql\\main.*\n\n**02**. Exclua o arquivo *mysql-connector-java.jar* dessa pasta.\n\n**03**. Copie o arquivo *mysql-connector-java-XX.Y.ZZ-bin.jar ou mysql-connector-j-XX.Y.ZZ.jar* (baixado do site e descompactado) para a pasta *\\appserver\\modules\\com\\mysql\\main.*\n\n**04**. Renomeie o arquivo copiado (*mysql-connector-java-XX.Y.ZZ-bin.jar ou mysql-connector-j-XX.Y.ZZ.jar)* para *mysql-connector-java.jar.*\n\n# Otimizando a performance do banco de dados MySQL\n\n---\n\nAtenção!\n\nO limite default do banco **MySQL** para campos tipo *text* é de 195. Dentro deste padrão são realizados todos os testes com formulários no Fluig.\n\n**Não recomendamos** a alteração do parâmetro **innodb\\_log\\_file\\_size** para exportação de campos, pois pode comprometer o desempenho da aplicação.\n\nQuando trabalhamos com um volume elevado de dados e usuários, o banco de dados pode apresentar problemas de baixo desempenho. Um investimento em capacidade física dos servidores é sempre bom, porém há momentos que o *tuning*irá representar ganhos expressivos de performance.\n\nPara mais informações sobre *tunning* e otimização de performance do MySQL consulte a documentação oficial disponível em [MySQL Optimization](http://dev.mysql.com/doc/refman/5.5/en/optimization.html)." }, { "metadata": { "title": "Configuração do banco de dados Oracle", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623480", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração do banco de dados Oracle.md" }, "content": "Configuração do banco de dados Oracle\n\n\nFique atento!\n\nEsta página é válida para atualizações **1.6** e **superiores** do TOTVS Fluig.\n\nCaso possua uma atualização anterior acesse: [ARQ - Como configurar o banco de dados Oracle na release 1.5.13 ou anterior?](https://tdn.totvs.com/pages/viewpage.action?pageId=142811225)\n\n- [Versões homologadas do Oracle](#ConfiguraçãodobancodedadosOracle-VersõeshomologadasdoOracle)\n- [Configuração do banco](#ConfiguraçãodobancodedadosOracle-Configuraçãodobanco)\n - [Criação do usuário e concessão de privilégios](#ConfiguraçãodobancodedadosOracle-Criaçãodousuárioeconcessãodeprivilégios)\n- [Datasource - finalidade da tag new-connection-sql](#ConfiguraçãodobancodedadosOracle-Datasource-finalidadedatagnew-connection-sql)\n\n# Versões homologadas do Oracle\n\n---\n\nPara verificar as versões homologadas do Oracle acesse a [Matriz de Portabilidade.](../../Especificações Técnicas/Matriz de Portabilidade.md)\n\n# Configuração do banco\n\n---\n\n**Pré-requisitos**\n\n- É necessário que o administrador do banco Oracle® (DBA) efetue algumas alterações de segurança no banco de dados Oracle®, fazendo com que o usuário (*schema*) informado na instalação da plataforma não possua permissão de leitura/alteração em outros *schemas* do banco Oracle®, caso existam.\n\n- Deve possuir permissão de leitura/alteração somente no usuário (*schema*) utilizado pela plataforma.\n\nImportante!\n\nPor questões de segurança é altamente recomendável efetuar a encriptação da senha conforme o procedimento informado na documentação [encriptação de senha de banco do dados](http://tdn.totvs.com/x/Oh4WGw).\n\n## Criação do usuário e concessão de privilégios" }, { "metadata": { "title": "Configuração do banco de dados Oracle", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623480", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração do banco de dados Oracle.md" }, "content": "Configuração do banco de dados Oracle\n\n\n---\n\n\n\nPara a criação de um novo usuário em banco de dados Oracle usamos a instrução CREATE USER, conforme sintaxe abaixo:\n\n```\nCREATE USER userid IDENTIFIED BY password [DEFAULT TABLESPACE tablespace] [TEMPORARY TABLESPACE tablespace_temporaria];\n```\n\nOnde:\n\n- userid: Nome do usuário que será criado;\n\n- password: Senha do usuário que será criado;\n\n- tablespace (opcional): Tablespace padrão onde os objetos do banco de dados serão armazenados. Se essa opção for omitida, o Oracle assume a tablespace SYSTEM padrão;\n\n- temp\\_tablespace (opcional): Tablespace padrão onde são armazenados os objetos temporários, como por exemplo tabelas temporárias. Se essa opção for omitida, o Oracle assume um tablespace temporário TEMP.\n\nApós criado o usuário é necessário conceder os privilégios de sistema (conexão e instruções DLL por exemplo) necessários para ele, conforme sintaxe abaixo:\n\n```\nGRANT CONNECT,RESOURCE TO userid;\nGRANT CREATE VIEW TO userid; \nGRANT CREATE TABLE TO userid; \n\nALTER USER userid QUOTA UNLIMITED ON USERS;\n```\n\nOnde:\n\n- userid: Nome do usuário criado anteriormente;\n\nOBS: \n\n- O alter user foi necessário na hora de subir o Fluig para criar as tabelas;\n\nNeste momento é necessário executar os procedimentos SQL abaixo com o usuário **userid** no banco de dados a ser usado para a plataforma:\n\nAtenção!\n\n- É imprescindível conectar no banco de dados com o usuário userid para a execução dos procedimentos acima, a fim de garantir o isolamento e integridade da operação.\n\n- O servidor Fluig deve estar parado no momento da execução do *script*.\n\n```sql\nDECLARE AUX_USERCONNECTED VARCHAR2(30); \nBEGIN\n SELECT USER\n INTO AUX_USERCONNECTED\n FROM DUAL;\n IF (AUX_USERCONNECTED <> 'SYS') AND (AUX_USERCONNECTED <> 'SYSTEM') THEN\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_OBJECTS AS' ||\n ' SELECT * FROM SYS.ALL_OBJECTS WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_SYNONYMS AS' ||\n ' SELECT * FROM SYS.ALL_SYNONYMS WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_SEQUENCES AS' ||\n ' SELECT * FROM SYS.ALL_SEQUENCES WHERE SEQUENCE_OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_CONSTRAINTS AS' ||\n ' SELECT * FROM SYS.ALL_CONSTRAINTS WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_CONS_COLUMNS AS' ||\n ' SELECT * FROM SYS.ALL_CONS_COLUMNS WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_INDEXES AS' ||\n ' SELECT * FROM SYS.ALL_INDEXES WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_IND_COLUMNS AS' ||\n ' SELECT * FROM SYS.ALL_IND_COLUMNS WHERE TABLE_OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_TABLES AS' ||\n ' SELECT * FROM SYS.ALL_TABLES WHERE OWNER IN (SELECT USER FROM DUAL)');\n EXECUTE IMMEDIATE ('CREATE OR REPLACE VIEW ' ||AUX_USERCONNECTED|| '.ALL_TAB_COLUMNS AS' ||\n ' SELECT * FROM SYS.ALL_TAB_COLUMNS WHERE OWNER IN (SELECT USER FROM DUAL)');\n END IF;\nEND;\n```\n\nO **NLS** (*National Language Support*) é utilizado para definir datas, números, moeda e configurações de idioma. O *NLS\\_CHARACTERSET* (charset) para a plataforma é **AL32UTF8**.\n\n![](..\\..\\..\\images\\oracle.png)\n\n# *Datasource* - finalidade da *tag* new-connection-sql\n\n---\n\nAo instalar a plataforma selecionando o banco de dados Oracle, o instalador inclui a *tag* abaixo no arquivo de configuração, de acordo com a atualização:\n\n- **a partir da atualização 2.0:**no arquivo **standalone.xml** ([diretório\\_instalação]/appserver/standalone/configuration/standalone.xml);\n\n- **da atualização 1.6 até a 1.8.2**:no arquivo **domain.xml** ([diretório\\_instalação]/appserver/domain/configuration/domain.xml).\n\n```\nalter session set nls_comp = 'LINGUISTIC' nls_sort = 'BINARY_CI'\n```\n\nOnde:\n\n- o parâmetro **nls\\_comp** especifica o comportamento de agrupamento da sessão do banco de dados. É utilizado como *LINGUISTIC*, onde as comparações irão ignorar maiúsculos e minúsculos, inclusive quando utilizamos *LIKE*, pois a busca passa a ser alfabética e não mais a padrão binária;\n\n- o parâmetro **nls\\_sort** especifica a sequência de agrupamento para consultas *ORDER BY*. É usado como BINARY\\_CI, ou seja, valor *BINARY*. Significa que a ordenação dos caracteres seguirão de acordo com a ordem em que os caracteres aparecem no *Character Set* em uso e o CI é para ignorar maiúsculas e minúsculas." }, { "metadata": { "title": "Configuração do banco de dados SQL Server", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623499", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração do banco de dados SQL Server.md" }, "content": "Configuração do banco de dados SQL Server" }, { "metadata": { "title": "Configuração do banco de dados SQL Server", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623499", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração do banco de dados SQL Server.md" }, "content": "Configuração do banco de dados SQL Server\n\n\nFique atento!\n\nEsta página é válida para atualizações **1.6** e **superiores** do TOTVS Fluig.\n\nCaso possua uma atualização anterior acesse: [ARQ - Como configurar o banco de dados SQL Server na release 1.5.13 ou anterior?](https://tdn.totvs.com/pages/viewpage.action?pageId=73078837)\n\n- [Versões homologadas do SQL Server](#ConfiguraçãodobancodedadosSQLServer-VersõeshomologadasdoSQLServer)\n- [Criação do banco de dados com codificação Latin1\\_General\\_CI\\_AS](#ConfiguraçãodobancodedadosSQLServer-CriaçãodobancodedadoscomcodificaçãoLatin1_General_CI_AS)\n- [Configuração do banco](#ConfiguraçãodobancodedadosSQLServer-Configuraçãodobanco)\n - [Proprietário do banco](#ConfiguraçãodobancodedadosSQLServer-Proprietáriodobanco)\n - [Parâmetros de conexão](#ConfiguraçãodobancodedadosSQLServer-Parâmetrosdeconexão)\n - [Alteração do nível de isolamento](#ConfiguraçãodobancodedadosSQLServer-Alteraçãodoníveldeisolamento)\n - [Configuração da porta TCP 1433](#ConfiguraçãodobancodedadosSQLServer-ConfiguraçãodaportaTCP1433)\n\n# Versões homologadas do SQL Server\n\n---\n\nPara verificar as versões homologadas do Microsoft SQL Server, acesse a [Matriz de Portabilidade](http://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade).\n\n# Criação do banco de dados com codificação Latin1\\_General\\_CI\\_AS\n\n---\n\nImportante!\n\nPor questões de segurança, é altamente recomendável efetuar a encriptação da senha conforme o procedimento descrito em [encriptação de senha do banco de dados](http://tdn.totvs.com/x/Oh4WGw).\n\nA plataforma necessita de uma base de dados com *charset* **Latin1\\_General\\_CI\\_AS**. Só serão aceitos caracteres com codificação Latin1\\_General\\_CI\\_AS, pois caracteres não pertencentes a esta codificação não são homologados para a plataforma, estando sujeito a inconsistências de banco de dados. Na versão 2012 e inferiores do SQL server, a codificação é regionalizada, podendo causar inconsistências quando utilizado, por exemplo, a UTF8.\n\nPara criar o banco com esta característica, autentique-se no SQL Server com o usuário que será utilizado pela plataforma e execute o seguinte comando SQL, onde \"nome\\_do\\_banco\" é o nome do banco a ser criado.\n\n```\nCREATE DATABASE nome_do_banco COLLATE Latin1_General_CI_AS;\n```\n\nOutra alternativa para a criação do banco de dados é utilizar o **Microsoft SQL Server Management Studio,**seguindo o seguintes passos:\n\n- Conecte na instância do SQL Server por meio do **Microsoft SQL Server Management Studio.**\n- Clique com o botão direito do *mouse* na pasta **Bancos de Dados** e selecione a opção **Novo Banco de Dados...**\n\n![](..\\..\\..\\images\\1.png)\n\n- Ao abrir a tela do assistente, selecione a opção **Geral** em **Selecionar uma página.** Em seguida, informe o nome desejado para o banco de dados no campo **Nome do banco de dados** e selecione o usuário que será utilizado pela plataforma no campo **Proprietário.**\n\n![](..\\..\\..\\images\\2.png)\n\n- Seguindo, selecione a opção **Opções** em **Selecionar uma página.** Em seguida, selecione o valor **Latin1\\_General\\_CI\\_AS** no campo **Agrupamento**.\n\n![](..\\..\\..\\images\\Image%208.jpg)\n\n- Para finalizar, encontre a opção **O Instantâneo de Leitura Confirmada Está Ativo** (*Is Read Committed Snapshot On* em inglês) e altere seu valor para ***True*.** Clique no botão **OK** para finalizar a criação do banco de dados.\n\n![](..\\..\\..\\images\\Image%206.jpg)\n\n# Configuração do banco\n\n---\n\nApós a criação do banco de dados é necessário realizar as verificações a seguir." }, { "metadata": { "title": "Configuração do banco de dados SQL Server", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623499", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração do banco de dados SQL Server.md" }, "content": "Configuração do banco de dados SQL Server\n\n## Proprietário do banco\n\n---\n\nO usuário utilizado pela plataforma para conexão com o banco de dados deve ser **proprietário (db\\_owner)** do banco utilizado pela plataforma. Para verificar qual usuário é o proprietário do banco, execute o seguinte comando SQL:\n\n```sql\n SELECT suser_sname(owner_sid) FROM sys.databases WHERE name = 'nome_do_banco';\n```\n\nOnde **nome\\_do\\_banco** é o nome do banco para consulta do proprietário.\n\nCaso o proprietário do banco não seja o usuário utilizado pela plataforma para conexão com o banco de dados, execute o seguinte comando T-SQL para definir este usuário como **proprietário (db\\_owner):**\n\n```\n USE nome_do_banco EXEC sp_changedbowner 'nome_usuario';\n```\n\nOnde **nome\\_do\\_banco** é o nome do banco e **nome\\_usuario**o usuário que se tornará proprietário do banco de dados.\n\n## Parâmetros de conexão\n\n---\n\nVeja a seguir alguns parâmetros que podem ser utilizados na URL de conexão.\n\n### Parâmetro para evitar lentidão\n\n---\n\nPara evitar lentidão em algumas consultas da plataforma, é necessário adicionar um parâmetro de conexão no arquivo de configurações.\n\nPara isso:\n\n**01.** Acesse o arquivo de configurações da plataforma de acordo com a atualização utilizada no seu ambiente:\n\n- **a partir da atualização 2.0:** acesse o arquivo **standalone.xml** ([diretório\\_instalação]/appserver/standalone/configuration/standalone.xml);\n\n- **da atualização 1.6 até a 1.8.2**: acesse o arquivo **domain.xml** ([diretório\\_instalação]/appserver/domain/configuration/domain.xml).\n\n**02.** Localize as *tags* ****.\n\n**03.** Adicione o parâmetro **;sendStringParametersAsUnicode=false** em todas as *tags* ****.\n\nAtenção!\n\nNas atualizações mais recentes, esse parâmetro já é adicionado automaticamente na URL de conexão ao instalar a plataforma com o SQL Server. Por isso, verifique se o parâmetro já está configurado antes de adicioná-lo.\n\n### Conexão criptografada por padrão" }, { "metadata": { "title": "Configuração do banco de dados SQL Server", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623499", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração do banco de dados SQL Server.md" }, "content": "Configuração do banco de dados SQL Server\n\n\n---\n\nPor questões de segurança, a partir da atualização **Voyager (2.0)**, a comunicação com o banco de dados SQL Server passa a ser criptografada por padrão.\n\nMas, não se preocupe, se a configuração de criptografia não foi alterada em nenhum momento, o parâmetro ***trustServerCertificate*** será adicionado automaticamente com o valor ***true*** na URL de conexão ao atualizar a plataforma.\n\nCaso você tenha configurado manualmente o parâmetro ***encrypt*** ou o ***trustServerCertificate***, a atualização não modificará a URL de conexão e a configuração já existente será mantida.\n\n## Alteração do nível de isolamento\n\n---\n\nPara verificar se a opção de isolamento READ\\_COMMITTED\\_SNAPSHOT está habilitado para o banco de dados, execute o seguinte comando SQL:\n\n```sql\n SELECT is_read_committed_snapshot_on FROM sys.databases WHERE name= 'nome_do_banco';\n```\n\nOnde **nome\\_do\\_banco** é o nome do banco para consulta do proprietário.\n\nCaso o retorno da consulta anterior seja o valor **0**, é necessário executar o seguinte comando SQL:\n\n```\nALTER DATABASE nome_do_banco SET READ_COMMITTED_SNAPSHOT ON;\n```\n\nOnde **nome\\_do\\_banco** é o nome do banco de dados a ser utilizado para a plataforma.\n\nImportante!\n\nEsta operação de alteração do nível de isolamento padrão do SQL Server é realizada automaticamente pela plataforma. Porém, é importante atentar-se para o seguinte fator: na criação do banco de dados, é executada uma ação de alteração na base. É normal visualizar no *log* algumas mensagens de erro, tratando-se de um processo padrão para atualização. A situação será normalizada após o término da operação.\n\nAssim que o servidor Fluig estiver no ar, recomendamos que ele seja reinicializado.\n\n## Configuração da porta TCP 1433" }, { "metadata": { "title": "Configuração do banco de dados SQL Server", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257623499", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Configuração do banco de dados SQL Server.md" }, "content": "Configuração do banco de dados SQL Server\n\n\n---\n\nPara liberação do protocolo TCP/IP e conexão do banco com o Fluig através da porta 1433, basta seguir os seguintes passos:\n\n- Executar o **SQL Server Configuration Manager**, no caminho SQL Server Network Configuration > Protocols for > TCP/IP.\n- Certificar-se de que o protocolo TCP/IP esteja ativo e habilitado. \n Na sessão **IPAll** verifique se não há nenhuma porta dinâmica configurada diferente da 1433 e configure apenas a porta estática padrão **1433 em TCP Port**.\n- **TCP Dynamic Ports precisa estar vazio**, caso esteja 0, será criada uma nova porta dinâmica na próxima inicialização do serviço.\n- Após salvar as configurações, será necessário reiniciar o serviço do banco de dados para aplicar as alterações.\n- Para validar se a porta correta está sendo escutada no servidor, pode-se executar um **netstat -an** no cmd.\n\n![](..\\..\\..\\images\\TCP1433.png)" }, { "metadata": { "title": "Encriptação de senha do banco de dados", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=454434362", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Encriptação de senha do banco de dados.md" }, "content": "Encriptação de senha do banco de dados\n\n\nFique atento!\n\nEsta página é válida a partir da atualização **Voyager (2.0)** do TOTVS Fluig.\n\nSe você utiliza uma atualização anterior, acesse [Como encriptar a senha do banco de dados da atualização **1.6 até 1.8.2**](https://tdn.totvs.com/pages/viewpage.action?pageId=940299992).\n\n- [Objetivo](#Encriptaçãodesenhadobancodedados-Objetivo)\n- [Encriptação de senha](#Encriptaçãodesenhadobancodedados-Encriptaçãodesenha)\n - [Encriptação da senha da base de dados (DataSource)](#Encriptaçãodesenhadobancodedados-Encriptaçãodasenhadabasededados(DataSource))\n - [Criar a política de autenticação da aplicação com a senha encriptada](#Encriptaçãodesenhadobancodedados-Criarapolíticadeautenticaçãodaaplicaçãocomasenhaencriptada)\n - [Pronto!](#Encriptaçãodesenhadobancodedados-Pronto!)\n\n# Objetivo\n\n---\n\nEste guia tem como finalidade demonstrar os passos necessários para realizar a encriptação sobre a senha de acesso ao banco de dados.\n\nImportante!\n\nEsse procedimento pode ser realizado para encriptação da senha de todos os bancos de dados homologados pela [Matriz de Portabilidade](../../Especificações Técnicas/Matriz de Portabilidade.md) do TOTVS Fluig.\n\n# Encriptação de senha\n\n---\n\nA encriptação de senha do banco de dados da plataforma é um procedimento muito importante para evitar o acesso não autorizado à base de dados e com isso aumentar a segurança das suas informações.\n\nPara realizar esse procedimento, é necessário seguir as etapas abaixo, que consistem em gerar a senha criptografada e, em seguida, criar a política de autenticação da aplicação com essa senha.\n\n**oculto**\n\n**Informação interna:**\n\nEste passo a passo foi duplicado para o artigo: \n\nSe for feita alguma atualização, lembrar de repassar pra lá.\n\n## Encriptação da senha da base de dados (DataSource)" }, { "metadata": { "title": "Encriptação de senha do banco de dados", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=454434362", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Encriptação de senha do banco de dados.md" }, "content": "Encriptação de senha do banco de dados\n\n\n---\n\nNessa etapa, a senha da base de dados é encriptada usando o método principal da classe **SecureIdentityLoginModule**, passando como parâmetro a senha em texto plano do banco de dados utilizado. Para fazer a configuração, siga os passos abaixo:\n\n- Navegue até a pasta raiz de instalação, e acesse a pasta **appserver.**\n\n**Linux**              ==> /opt/fluig/appserver\n\n**Windows**        ==> c:\\fluig\\appserver\n\n- Gere a senha encriptada.\n\n**Linux:**\n\n```\n../jdk-64/bin/java -cp modules/system/layers/base/org/jboss/logging/main/jboss-logging-3.3.0.Final.jar:modules/system/layers/base/org/picketbox/main/picketbox-5.0.3.Final.jar org.picketbox.datasource.security.SecureIdentityLoginModule senha#do#banco@123!\n```\n\n**Windows**:\n\n```\njava -cp modules/system/layers/base/org/picketbox/main/picketbox-5.0.3.Final.jar org.picketbox.datasource.security.SecureIdentityLoginModule senha-do-banco\n```\n\nImportante!\n\nNeste caso, **senha-do-banco** será a senha de acesso ao banco de dados e o resultado será:\n\n**Encoded password: 4c5ab21b9ec71385f5e13f39fd754340**\n\n## Criar a política de autenticação da aplicação com a senha encriptada" }, { "metadata": { "title": "Encriptação de senha do banco de dados", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=454434362", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Encriptação de senha do banco de dados.md" }, "content": "Encriptação de senha do banco de dados\n\n\n---\n\nNessa etapa é mostrado onde fica o arquivo de configuração para acesso ao banco de dados (**standalone.xml**), a aplicação da política de autenticação pelo aplicativo e a sua respectiva configuração.\n\nImportante!\n\nAntes de fazer qualquer alteração, é importante manter uma cópia do arquivo standalone.xml original, caso seja necessário retornar alguma configuração.\n\n- Navegue até a pasta raiz de instalação do TOTVS Fluig Plataforma e acesse a pasta de configuração onde está o arquivo **standalone.xml**. Abra esse arquivoem modo administrador ou root.\n\n**Linux**              ==> /opt/fluig/appserver/standalone/configuration\n\n**Windows**        ==> c:\\fluig\\appserver\\standalone\\configuration\n\n- Edite o arquivo **standalone.xml** incluindo o bloco que contém a política de autenticação e a senha encriptada gerada na etapa anterior. Ao abrir o arquivo standalone.xml, procure pela *tag*:\n\n```\n\n```\n\n- Dentro da *tag* **** é necessário inserir o seguinte bloco:\n\n```\n\n \n \n \n \n \n \n \n \n\n```\n\n- O atributo **security-domain name** será usados posteriormente na configuração de acesso ao banco de dados.\n\n- Edite o arquivo **standalone.xml** alterando o bloco de acesso ao banco de dados. Ao abrir o arquivo, procure pelas *tags*:\n\n```\n\n \n \n \n\t\t\n```\n\n- No primeiro *datasource* cujo *pool-name* é **FluigDS**, é necessário eliminar o seguinte bloco:\n\n```\n\nadmin\nsenhaDeTextoPlano\n\n```\n\n- Após remover o bloco acima, substituí-lo pelo bloco abaixo:\n\n```\n\n encrypted-FluigDS\n\n```\n\n- No segundo *datasource* cujo *pool-name* é **FluigDSRO**, é necessário eliminar o seguinte bloco:\n\n```\n\nadmin\nsenhaDeTextoPlano\n\n```\n\n- Após remover o bloco acima, substituí-lo pelo bloco abaixo.\n\n```\n\n encrypted-FluigDS\n\n```" }, { "metadata": { "title": "Encriptação de senha do banco de dados", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=454434362", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Encriptação de senha do banco de dados.md" }, "content": "Encriptação de senha do banco de dados\n\n## Pronto!\n\n---\n\nApós estes procedimentos, sua plataforma pode ser iniciada e passa a operar com a senha do banco encriptada, evitando acessos não autorizados e trazendo mais segurança para as suas informações." }, { "metadata": { "title": "Transparent Data Encryption (TDE)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=773891064", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Transparent Data Encryption (TDE).md" }, "content": "Transparent Data Encryption (TDE)" }, { "metadata": { "title": "Transparent Data Encryption (TDE)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=773891064", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de Banco de Dados\\Transparent Data Encryption (TDE).md" }, "content": "Transparent Data Encryption (TDE)\n\n\n# Índice\n\n- 1 [Objetivo](#TransparentDataEncryption(TDE)-Objetivo)\n- 2 [Visão geral](#TransparentDataEncryption(TDE)-Visãogeral)\n- 3 [TDE em MySQL](#TransparentDataEncryption(TDE)-TDEemMySQL)\n- 4 [TDE em SQL Server](#TransparentDataEncryption(TDE)-TDEemSQLServer)\n- 5 [TDE em Oracle](#TransparentDataEncryption(TDE)-TDEemOracle)\n\n# Objetivo\n\n---\n\nDescrever a utilização de TDE (*Transparent Data Encryption*) nos bancos de dados homologados para o TOTVS Fluig.\n\n# Visão geral\n\n---\n\nApós a análise da viabilidade de uso de TDE (*Transparent Data Encryption*) nos bancos de dados homologados para o TOTVS Fluig, concluiu-se que é possível utilizar este recurso em todos os bancos de dados, mas apenas as versões pagas.\n\nOs bancos possuem algumas características que se diferem entre eles, como por exemplo performance, mas todos possuem a mesma finalidade de criptografar os dados em repouso. Os procedimentos de ativação do TDE listados a seguir foram realizados em todos os bancos homologados.\n\n# TDE em MySQL\n\n---\n\nO MySQL Enterprise TDE é um recurso disponível na edição *Enterprise* do MySQL que fornece criptografia de dados em nível de arquivo. Ele permite criptografar automaticamente os dados armazenados nos arquivos do banco de dados MySQL, protegendo as informações confidenciais contra acesso não autorizado, violações de segurança física e acesso indevido aos arquivos do banco de dados.\n\nPara habilitar a criptografia dos arquivos de banco de dados é necessário incluir as seguintes linhas no arquivo de configuração do MySQL, **my.cnf** (ou um arquivo cnf customizado):\n\n```\nearly-plugin-load=keyring_encrypted_file.so\nkeyring_encrypted_file_data=/var/lib/mysql-keyring/keyring-encrypted\nkeyring_encrypted_file_password=SeuP4ssw0rdAqui\n```\n\nOnde:\n\n- **early-plugin-load:** especifica o *plug-in* a ser carregado;\n- **keyring\\_encrypted\\_file\\_data:** configura o local do arquivo usado pelo *plug-in* para armazenamento de dados;\n- **keyring\\_encrypted\\_file\\_password:** especifica a senha para criptografar o arquivo de dados do conjunto de chaves.\n\nApós habilitado, é possível criptografar as tabelas do banco de dados. Não é necessário criptografar todas as tabelas, podem ser criptografadas apenas as tabelas mais relevantes.\n\nPara criptografar uma tabela, seja ela nova ou já existente, usa-se CREATE TABLE ou ALTER TABLE, juntamente com ENCRYPTION=”Y”.\n\nEXEMPLO:\n\n```\nALTER TABLE banco.tabela ENCRYPTION=\"Y\";\n```\n\nÉ possível criptografar todas as tabelas do banco de dados durante sua criação.\n\nEXEMPLO:\n\n```\nCREATE SCHEMA fluig DEFAULT CHARACTER SET utf8 DEFAULT ENCRYPTION 'Y';\n```\n\nÉ possível verificar quais tabelas estão criptografadas usando a seguinte consulta SQL:\n\n```sql\nSELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS\nFROM INFORMATION_SCHEMA.TABLES\nWHERE CREATE_OPTIONS = 'ENCRYPTION=\"Y\"';\n```\n\nA criptografia dos arquivos de banco de dados é transparente. Portanto, não é necessária nenhuma mudança na aplicação.\n\nÉ importante mencionar que requisitos legais e regulatórios exigem uma rotação periódica da chave mestra de criptografia. Também é recomendado rotacionar a chave mestra sempre que suspeitar de uma violação de segurança. A rotação da chave mestra de criptografia altera apenas a chave mestra e criptografa novamente as chaves de *tablespace*.\n\nOutro fator importante é que a chave mestra de criptografia é armazenada na memória do *keyring* do MySQL. Utilizando um cofre de chaves, esse *keyring* é tanto persistido quanto protegido. Nem a chave mestra e nenhuma das chaves do *tablespace* são gravadas em disco em texto simples.\n\nExistem diversos cofres de chaves disponíveis no mercado e também há um protocolo comum da indústria suportado pela maioria dos cofres. O protocolo é o KMIP e ele é originado da OASIS.\n\nPerder chaves – seja por acidente, má gestão ou invasão – significa perder seus dados. Para garantir que suas chaves estejam disponíveis, seguras, auditáveis etc., é recomendado utilizar um *software* de gerenciamento de cofres de chaves, como o Oracle Key Vault. O Oracle Key Vault permite implantar rapidamente soluções de criptografia e outras soluções de segurança, gerenciando centralmente as chaves de criptografia para o MySQL.\n\nA utilização do MySQL Enterprise Transparent Data Encryption pode ter um impacto no desempenho do sistema devido ao processamento adicional necessário para a criptografia e descriptografia dos dados. No entanto, o impacto real depende de vários fatores, incluindo a capacidade de processamento do servidor, o volume de dados, a complexidade dos algoritmos de criptografia utilizados e a carga de trabalho do sistema.\n\nAlém do impacto no desempenho, os dados criptografados podem ocupar mais espaço em disco do que os dados não criptografados. Isso ocorre porque a criptografia geralmente adiciona informações extras aos dados para garantir sua integridade e segurança. Portanto, é importante considerar o impacto no armazenamento quando se utiliza o TDE.\n\nLevando em consideração tais fatores, recomenda-se realizar testes de desempenho em um ambiente de desenvolvimento para avaliar o impacto real antes de implementar o TDE em um ambiente de produção.\n\nDica!\n\nSaiba mais sobre o **MySQL Enterprise TDE** em:\n\n- [MySQL Enterprise Transparent Data Encryption (TDE) - provides at-rest encryption for physical InnoDB tablespace data files](https://dev.mysql.com/blog-archive/mysql-enterprise-transparent-data-encryption-tde-provides-at-rest-encryption-for-physical-innodb-tablespace-data-files/)\n\n- [MySQL Enterprise Transparent Data Encryption (TDE)](https://www.mysql.com/products/enterprise/tde.html)\n\n- [File-Per-Table Tablespace Encryption](https://dev.mysql.com/doc/refman/8.0/en/innodb-data-encryption.html#innodb-data-encryption-enabling-disabling)\n\n# TDE em SQL Server\n\n---\n\nA criptografia de dados transparente (TDE) criptografa os arquivos de dados SQL Server, Banco de Dados SQL do Azure e Azure Synapse Analytics. Essa criptografia é conhecida como criptografia de dados em repouso. Esse recurso não está disponível na versão Express.\n\nPara ajudar a proteger um banco de dados de usuário, você pode tomar precauções como:\n\n- projetar um sistema seguro;\n- criptografar ativos confidenciais;\n- criar um *firewall* em todos os servidores de banco de dados.\n\nNo entanto, uma parte mal intencionada que rouba mídia física, como unidades ou fitas de *backup*, pode restaurar ou anexar o banco de dados e procurar seus dados.\n\nUma solução é criptografar dados confidenciais em um banco de dados e usar um certificado para proteger as chaves que criptografam os dados. Essa solução impede que alguém sem as chaves use os dados. Mas você deve planejar esse tipo de proteção com antecedência.\n\nA TDE realiza a criptografia e a descriptografia de E/S em tempo real dos arquivos de *log* e de dados. A criptografia usa uma DEK – chave de criptografia de banco de dados. O registro de inicialização do banco de dados armazena a chave para disponibilidade durante a recuperação. O DEK é uma chave simétrica. Ele é protegido por um certificado que o banco de dados do *master* servidor armazena ou por uma chave assimétrica que um módulo EKM protege.\n\nA TDE protege os dados \"em repouso\", que são os dados e os arquivos de *log*. Ela permite que você siga muitas leis, regulamentos e diretrizes estabelecidos em vários setores. Isso possibilita que os desenvolvedores de *software* criptografem dados usando algoritmos de criptografia AES e 3DES, sem alterar os aplicativos existentes.\n\nAo contrário do que acontece no MySQL, a TDE não aumenta o tamanho do banco de dados criptografado no SQL Server.\n\nPara realizar o procedimento no SQL Server, utilize:\n\n```\nUSE master;\nGO\n\nCREATE MASTER KEY ENCRYPTION BY PASSWORD = 'p4ssw0Rd';\nGO\n\nCREATE CERTIFICATE Certificado WITH SUBJECT = 'NomeDoCert';\nGO\n\nUSE fluigDatabase;\nGO\n\nCREATE DATABASE ENCRYPTION KEY\nWITH ALGORITHM = AES_256\nENCRYPTION BY SERVER CERTIFICATE Certificado;\nGO\n\nALTER DATABASE fluigDatabase\nSET ENCRYPTION ON;\nGO\n\nUse master;\nGO\n\nBACKUP CERTIFICATE Certificado TO FILE = 'diretorio\\de\\sua\\preferencia\\cert' \n    WITH\n      PRIVATE KEY  \n      (  \n        FILE = 'diretorio\\de\\sua\\preferencia\\key' , \n        ENCRYPTION BY PASSWORD = 'p4ssw0Rd'\n      )\n```\n\nDica!\n\nSaiba mais sobre o **SQL Server TDE** em:\n\n- [TDE (*Transparent Data Encryption*)](https://learn.microsoft.com/pt-br/sql/relational-databases/security/encryption/transparent-data-encryption?view=sql-server-ver16)\n\n- [Fazer *backup* da chave privada do EFS (Sistema de Arquivos de Criptografia) do agente de recuperação no Windows](https://learn.microsoft.com/pt-br/troubleshoot/windows-server/identity/back-up-recovery-agent-efs-private-key)\n\n- [Criptografia de *backup*](https://learn.microsoft.com/pt-br/sql/relational-databases/backup-restore/backup-encryption?view=sql-server-ver16)\n\n- [Backup certificate (Transact-SQL)](https://learn.microsoft.com/pt-br/sql/t-sql/statements/backup-certificate-transact-sql?view=sql-server-ver16)\n\n# TDE em Oracle\n\n---\n\nO *Transparent Data Encryption* (TDE) permite criptografar dados confidenciais armazenados em tabelas e espaços de tabela.\n\nDepois que os dados são criptografados, esses dados são descriptografados de forma transparente para usuários ou aplicativos autorizados quando eles acessam esses dados. O TDE ajuda a proteger os dados armazenados na mídia – também chamados de dados em repouso – caso a mídia de armazenamento ou o arquivo de dados seja roubado.\n\nO Oracle Database usa mecanismos de autenticação, autorização e auditoria para proteger os dados no banco de dados, mas não nos arquivos de dados do sistema operacional onde os dados são armazenados. Para proteger esses arquivos de dados, o Oracle Database fornece *Transparent Data Encryption* (TDE). TDE criptografa dados confidenciais armazenados em arquivos de dados. Para impedir a descriptografia não autorizada, o TDE armazena as chaves de criptografia em um módulo de segurança externo ao banco de dados, denominado *keystore*.\n\nÉ possível configurar o Oracle Key Vault como parte da implementação do TDE. Isso permite gerenciar de forma centralizada os *keystores* TDE (chamados de carteiras TDE no Oracle Key Vault). Por exemplo, é possível fazer *upload* de um *keystore* de *software* para o Oracle Key Vault e, em seguida, disponibilizar o conteúdo desse *keystore* para outros bancos de dados habilitados para TDE. Consulte o Guia do Administrador do Oracle Key Vault para obter mais informações.\n\nPara configurar o TDE no banco de dados Oracle, faça o seguinte procedimento:\n\n- Acesse o **sqlplus**:\n\n ```\n sqlplus / as sysdba\n ```\n\n- Configure o **wallet\\_root**:\n\n ```\n system set wallet_root='/u01/app/oracle/product/19.0.0/db_1/admin/ORCLCDB/wallet' scope=spfile sid='*';\n ```\n- Após configurar o **wallet\\_root**, é necessário reiniciar o banco de dados:\n\n- Configure o **TDE\\_CONFIGURATION**:\n\n ```\n alter system set tde_configuration=\"KEYSTORE_CONFIGURATION=FILE\" scope=both sid='*';\n ```\n\n- Crie um **Protected-Password KeyStore**:\n\n ```\n administer key management create keystore identified by your_p4ssw0rd;\n ```\n\n- Crie um **auto-login**:\n\n ```\n administer key management create auto_login keystore from keystore identified by your_p4ssw0rd;\n ```\n\n- Configure o **TDE\\_MASTERKEY**:\n\n ```\n administer key management set keystore open force keystore identified by your_p4ssw0rd;\n administer key management set key force keystore identified by your_p4ssw0rd with backup;\n administer key management set keystore close identified by your_p4ssw0rd;\n ```\n\nApós os procedimentos mencionados acima, é possível criptografar uma ou mais tabelas do banco de dados utilizando algoritmos AES128 ou AES256. A sobrecarga de desempenho do uso do AES256 é considerada aproximadamente 40% mais lenta do que o AES128. Portanto, o uso do AES128 pode ser considerado uma solução balanceada.\n\nDica!\n\nSaiba mais sobre o **Oracle TDE** em:\n\n- [Part I Using Transparent Data Encryption](https://docs.oracle.com/database/121/ASOAG/asopart1.htm#ASOAG600)" }, { "metadata": { "title": "Causas de erros no envio de notificações por e-mail", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=820170215", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de envio de e-mail\\Causas de erros no envio de notificações por e-mail.md" }, "content": "Causas de erros no envio de notificações por e-mail" }, { "metadata": { "title": "Causas de erros no envio de notificações por e-mail", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=820170215", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de envio de e-mail\\Causas de erros no envio de notificações por e-mail.md" }, "content": "Causas de erros no envio de notificações por e-mail\n\n\n# Índice\n\n- [Objetivo](#Causasdeerrosnoenviodenotificaçõesporemail-Objetivo)\n- [Pré-requisitos](#Causasdeerrosnoenviodenotificaçõesporemail-Pré-requisitos)\n- [Versão do Fluig anterior à 1.7.1-220607](#Causasdeerrosnoenviodenotificaçõesporemail-VersãodoFluiganteriorà1.7.1-220607)\n- [Realizar a configuração do envio de e-mails](#Causasdeerrosnoenviodenotificaçõesporemail-Realizaraconfiguraçãodoenviodee-mails)\n- [Habilitar o envio de e-mails](#Causasdeerrosnoenviodenotificaçõesporemail-Habilitaroenviodee-mails)\n - [Saiba mais](#Causasdeerrosnoenviodenotificaçõesporemail-Saibamais)\n- [Configuração de notificações do usuário](#Causasdeerrosnoenviodenotificaçõesporemail-Configuraçãodenotificaçõesdousuário)\n - [Saiba mais](#Causasdeerrosnoenviodenotificaçõesporemail-Saibamais.1)\n- [Testar o envio de e-mails](#Causasdeerrosnoenviodenotificaçõesporemail-Testaroenviodee-mails)\n- [Testes complementares](#Causasdeerrosnoenviodenotificaçõesporemail-Testescomplementares)\n- [Diagrama de processos](#Causasdeerrosnoenviodenotificaçõesporemail-Diagramadeprocessos)\n- [Spam](#Causasdeerrosnoenviodenotificaçõesporemail-Spam)\n- [Envio de e-mails por datasets](#Causasdeerrosnoenviodenotificaçõesporemail-Enviodee-mailspordatasets)\n- [Templates de e-mail em múltiplas instalações](#Causasdeerrosnoenviodenotificaçõesporemail-Templatesdee-mailemmúltiplasinstalações)\n- [Conflitos em configurações](#Causasdeerrosnoenviodenotificaçõesporemail-Conflitosemconfigurações)\n- [Envio de logs](#Causasdeerrosnoenviodenotificaçõesporemail-Enviodelogs)\n\n# Objetivo\n\n---\n\nO objetivo desta documentação é reunir as maiores causas de erros, ao realizar o envio de notificações por e-mail, no TOTVS Fluig Plataforma.\n\n# Pré-requisitos\n\n---\n\n- Servidores respeitando o [Modelo de dimensionamento](../../Especificações Técnicas/Dimensionamento/Modelo de dimensionamento.md).\n- Plataforma de acordo com os padrões da [Matriz de portabilidade](https://tdn.totvs.com/display/fluig/Matriz+de+portabilidade).\n- Ambiente em consonância com os ciclos de [Atualização da plataforma](../../Sobre a plataforma/Atualização da plataforma.md).\n- Conferir outras [Especificações Técnicas](../../Especificações Técnicas.md) necessárias.\n- Interesse em realizar a [Configuração de envio de e-mail](../Configuração de envio de e-mail.md).\n\n# Versão do Fluig anterior à 1.7.1-220607\n\n---\n\n**01.** Nessa versão, foram liberadas correções importantes relacionadas ao envio de notificações por e-mail.\n\n**02.** Antes de prosseguir, é importante que atualize a versão de sua plataforma, conforme os ciclos de [Atualização da plataforma](../../Sobre a plataforma/Atualização da plataforma.md).\n\n# Realizar a configuração do envio de e-mails\n\n---\n\n**01.** Para que a plataforma envie notificações por e-mail, essa configuração deve ser habilitada pelo administrador.\n\n**02.** A configuração de e-mails pode ser feita de duas formas: por **empresa** ou **global**.\n\n**03.** Por **empresa**, a configuração é feita individualmente e será aplicada apenas para a empresa em questão.\n\n**04.** Já a **global**, será obedecida por todas as empresas cadastradas no Fluig.\n\n**05.** Os parâmetros para cada uma das situações, você encontra na [Configuração de envio de e-mail](https://tdn.totvs.com/pages/releaseview.action?pageId=257623560).\n\n# Habilitar o envio de e-mails\n\n---\n\n**01.** Por padrão o envio de e-mail na plataforma está habilitado após a instalação, porém, é possível que essa opção seja desativada por quem administra a empresa, assim, nenhum usuário receberá e-mails.\n\n**02.** O usuário também pode desativar o recebimento de e-mails, caso desejar.\n\n**03.** Para habilitar o envio de e-mails, siga os passos abaixo:\n\n- Acessar **Painel de Controle** → **Pessoas** →  **Notificações padrões para novos usuários**.\n\n![](..\\..\\..\\images\\image-2024-1-16_17-27-34.png)\n\n- Na sessão **Defina os meios de notificação disponíveis**,alterar os valores para **ON**.\n- Lembrando que, as configurações realizadas nessa sessão específica, serão aplicadas **à todos os usuários**.\n\n![](..\\..\\..\\images\\image-2024-1-16_17-29-26.png)\n\n- Na sessão **Defina os padrões de configuração de recebimento de notificações para novos usuários**, definir quais notificações aparecerão para novos usuários.\n- Nesse caso, **apenas novos usuários** serão afetados com as alterações realizadas nessa sessão.\n\n![](..\\..\\..\\images\\image-2024-2-14_15-26-36.png)" }, { "metadata": { "title": "Causas de erros no envio de notificações por e-mail", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=820170215", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de envio de e-mail\\Causas de erros no envio de notificações por e-mail.md" }, "content": "Causas de erros no envio de notificações por e-mail\n\n## Saiba mais\n\n---\n\n- [Plataforma ❙ Notificações](https://tdn.totvs.com/pages/viewpage.action?pageId=234455600)\n\n# Configuração de notificações do usuário\n\n---\n\n**01.** Por padrão, todos os e-mails são habilitados para envio, porém, cada usuário pode alterá-los no seu perfil, conforme a sua necessidade.\n\n**02.** Para conferir se um usuário específico receberá e-mails de notificação, verifique as configurações de notificação desse usuário, conforme os passos abaixo:\n\n- Acessar a plataforma e clicar sobre o ícone de **Notificações** no alto da tela.\n\n![](..\\..\\..\\images\\image-2024-2-14_15-37-18.png)\n\n- Acionar o botão de **Configurações** e escolher as notificações que deseja receber.\n\n![](..\\..\\..\\images\\image-2024-2-14_15-32-14.png)\n\n## Saiba mais" }, { "metadata": { "title": "Causas de erros no envio de notificações por e-mail", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=820170215", "path": "\\Plataforma Documentação técnica\\Configuração\\Configuração de envio de e-mail\\Causas de erros no envio de notificações por e-mail.md" }, "content": "Causas de erros no envio de notificações por e-mail\n\n\n---\n\n- [Plataforma ❙ Configuração de notificações](https://tdn.totvs.com/pages/viewpage.action?pageId=233763976)\n\n# Testar o envio de e-mails\n\n---\n\n**01.** Certifique-se de que foi realizada corretamente a [Configuração de envio de e-mail](../Configuração de envio de e-mail.md). Na dúvida, mesmo que a tela esteja preenchida, reinicie os serviços do Fluig, pois a configuração só funciona após a reinicialização.\n\n**02.** Para testar o envio de e-mail pela interface através da **Configuração global** siga os passos abaixo:\n\n- Acessar a plataforma com o usuário **wcmadmin**.\n- Buscar o identificador **WCM → Configurações do Sistemas**.\n\n![](..\\..\\..\\images\\image-2024-2-14_16-1-30.png)\n\n- Acionar a aba **Parâmetros da plataforma** e preencher os campos de **Configuração de e-mail**.\n\n![](..\\..\\..\\images\\image-2024-2-14_16-4-34.png)\n\n- Clicar em **Testar conexão**.\n\n![](..\\..\\..\\images\\image-2024-2-14_16-6-52.png)\n\n**03.** Se você utiliza a **Configuração por empresa,** siga os passos abaixo para realizar o teste de conexão com o servidor de e-mails:\n\n- Acessar a plataforma com o usuário **wcmadmin**.\n- Buscar o identificador **WCM → Empresas**.\n\n![](..\\..\\..\\images\\image-2024-2-14_16-10-5.png)\n\n- Selecionar a **empresa** desejada e clicar em **Editar**.\n\n![](..\\..\\..\\images\\image-2024-2-14_16-11-20.png)\n\n- Acionar a aba **E-mail** e marcar **ON** na opção **Deseja habilitar o envio de e-mail?**\n\n![](..\\..\\..\\images\\image-2024-2-14_16-14-36.png)\n\n- Preencher os campos de **Configuração de e-mail** e clicar em **Testar conexão**.\n\n![](..\\..\\..\\images\\image-2024-2-14_16-16-11.png)\n\nObservação\n\nCaso verifique alguma inconsistência após a realização dos passos **02** ou **03** acima, colete o log de erros do produto no caminho [diretório\\_instalação]\\appserver\\standalone\\log\\server.log (a partir da **2.0**) ou [diretório\\_instalação]\\appserver\\domain\\servers\\fluig1\\log\\server.log (**1.6 até 1.8.2**) e solicite a análise da equipe de Suporte através de um ticket na [Central do cliente](https://suporte.totvs.com/), opção **Abrir *ticket***.\n\n# Testes complementares\n\n---\n\n**01.** Averiguar se você está recebendo e-mails de outros recursos do Fluig.\n\n**02. Sugestões para testes:**\n\n- Notificações de processos ao iniciar uma solicitação e selecionar o seu usuário como responsável;\n- Notificações de processos na movimentação de solicitações (sem customizações quanto ao remetente);\n- Notificações de documentos efetuando login com outro usuário, acessando uma pasta e compartilhando um documento para o seu usuário;\n- Comentários nas publicações;\n- Seguir usuários;\n- Recuperação de senha pela opção *\"Esqueceu sua senha?\"*;\n- Participação de usuários em comunidades, entre outras.\n\n# Diagrama de processos\n\n---\n\n**01.** Verificar se as notificações estão habilitadas na configuração do diagrama do processo nas abas **Acompanhamento** e **Atraso**.\n\n![](..\\..\\..\\images\\image-2024-2-14_16-33-57.png)\n\n# Spam\n\n---\n\n**01.** Em alguns situações, o servidor de e-mails detecta como***\"spam\"*** o e-mail enviado pelo Fluig, verifique se esse não é o seu caso.\n\n**02.** Inclua o **remetente padrão** do Fluig na ***whitelist*** do seu servidor de e-mails.\n\n# Envio de e-mails por datasets\n\n---\n\n**01.** Caso o envio de e-mails seja realizado por um **dataset**, solicite a análise da equipe de Suporte através de um ticket na [Central de Atendimento](https://centraldeatendimento.fluig.com/hc/pt-br), opções **Nova Solicitação** → **Suporte Técnico.**\n\n**02.** Anexe ao ticket o **código de desenvolvimento** desse **dataset**.\n\n# Templates de e-mail em múltiplas instalações\n\n---\n\n**01.** Caso possuam mais de um ambiente Fluig **(homologação/teste/desenvolvimento/produção)**, verifique se o template de e-mail está correto em todos os ambientes.\n\n**02.** Os templates de e-mail utilizados pelo Fluig estão nos caminhos:\n\n- *\\templates\\tplmail.*\n- *\\repository\\wcmdir\\templates\\tplmail\\TPL\\_WCM\\_MAIL\\_TEST\\_CONFIG.*\n\n# Conflitos em configurações\n\n---\n\n**01.** Valide se há conflitos entre a **Configuração global de e-mail** e a **Configuração por empresa**. Caso você possua apenas **UMA** empresa cadastrada, recomendamos desabilitar o envio de e-mail por empresa e utilizar somente a **Configuração global** em:\n\n- **wcmadmin → Painel de Controle** **→** identificador **WCM → Configurações do sistema**, (utilizar, preferencialmente, o **\"Remetente Padrão\"**).\n\n# Envio de logs\n\n---\n\n**01.** No decorrer dos testes, colete capturas de tela *(printscreen)* ou faça vídeos durante a realização das verificações.\n\n**02.** Caso nenhum dos passos acima solucione a situação reportada, envie o material e os logs para a equipe de Suporte através de um ticket na [Central de Atendimento](https://centraldeatendimento.fluig.com/hc/pt-br), opções **Nova Solicitação** → **Suporte Técnico**." }, { "metadata": { "title": "Aplicativo My Safe id", "source": "https://tdn.totvs.com/display/fluig/Aplicativo+My+Safe+id", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Aplicativo My Safe id.md" }, "content": "Aplicativo My Safe id" }, { "metadata": { "title": "Aplicativo My Safe id", "source": "https://tdn.totvs.com/display/fluig/Aplicativo+My+Safe+id", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Aplicativo My Safe id.md" }, "content": "Aplicativo My Safe id\n\n\n- 1 [Objetivo](#AplicativoMySafeid-Objetivo)\n- 2 [Autenticação Multifator + My Safe id](#AplicativoMySafeid-AutenticaçãoMultifator+MySafeid)\n- 3 [Como obter o aplicativo My Safe id?](#AplicativoMySafeid-ComoobteroaplicativoMySafeid?)\n- 4 [Como adicionar uma conta ao My Safe id?](#AplicativoMySafeid-ComoadicionarumacontaaoMySafeid?)\n - 4.1 [Como editar os dados da conta?](#AplicativoMySafeid-Comoeditarosdadosdaconta?)\n - 4.2 [Como remover a conta?](#AplicativoMySafeid-Comoremoveraconta?)\n- 5 [Como adicionar uma conta do TOTVS Identity ao My Safe id?](#AplicativoMySafeid-ComoadicionarumacontadoTOTVSIdentityaoMySafeid?)\n- 6 [Como adicionar uma conta do Google ao My Safe id?](#AplicativoMySafeid-ComoadicionarumacontadoGoogleaoMySafeid?google)\n\n# Objetivo\n\nO objetivo deste guia é orientar os usuários sobre a utilização do aplicativo **My Safe id** para proteção de suas contas em serviços *online* através da autenticação multifator.\n\n# Autenticação Multifator + My Safe id\n\nA autenticação multifator oferece uma camada adicional de segurança para serviços e aplicações *web* através de um token (chave eletrônica) gerado no aplicativo My Safe id. Este token deve ser informado na página de login do serviço para liberar o acesso à conta.\n\nAssumindo que apenas o usuário tem acesso ao aparelho - e portanto ao token - agentes maliciosos serão barrados, mesmo que possuam o login e a senha, pois não dispõe do código gerado pelo My Safe id. Além disso, para impedir a reutilização de um token, o código é substituído automaticamente a cada 30 segundos.\n\n![](..\\..\\..\\images\\120@2x.png)\n\n# Como obter o aplicativo My Safe id?\n\nO aplicativo My Safe id pode ser obtido para iPhone na [App Store](https://itunes.apple.com/br/app/safe-id/id1304505629?mt=8) e para smartphones Android na [Google Play Store](https://play.google.com/store/apps/details?id=com.fluig.mfa).\n\n# Como adicionar uma conta ao My Safe id?\n\nA conta do serviço ou aplicação *web* pode ser adicionada ao My Safe id de duas formas: através do escaneamento de um código (*QR code*) ou informando manualmente a chave de acesso.\n\nTanto o *QR Code* quanto a chave para inclusão manual são fornecidos pelo serviço/aplicação que será adicionado ao My Safe id. [Veja um exemplo](https://tdn.totvs.com/pages/viewpage.action?pageId=309405201).\n\n- Abrir o aplicativo My Safe id no smartphone.\n\n- Acionar o botão ![](..\\..\\..\\images\\icon-plus.png) para acessar a tela de inclusão de contas.\n\nÉ necessário conceder ao My Safe id a permissão de acesso à câmera do aparelho para o escaneamento do código.\n\n- A câmera do aparelho será ativada para escaneamento do *QR* *code*.\n\n- Aponte a câmera para o *QR code* para efetuar a leitura da código.\n\n- Pronto! A conta será adicionada automaticamente à tela inicial do My Safe id e o token já pode ser utilizado para autenticação no serviço.\n\n![](..\\..\\..\\images\\safe_id_escanear.gif)\n\n- Abrir o aplicativo My Safe id no smartphone.\n\n- Acionar o botão ![](..\\..\\..\\images\\icon-plus.png) para acessar a tela de inclusão de contas.\n\n- Acionar **OK, Entendi** no canto inferior da tela.\n\n- Acionar **Adicione manualmente** no canto inferior da tela.\n\n- Informar o nome do serviço/aplicação no campo **Título**.\n\n- Informar o nome de usuário ou e-mail de acesso no campo **Conta**.\n\n- Informar a chave de acesso fornecida pelo serviço/aplicação no campo **Chave**.\n\n- Acionar ![](..\\..\\..\\images\\icon-check.png) para salvar as informações.\n\n- Pronto! A conta será adicionada automaticamente à tela inicial do My Safe id e o token já pode ser utilizado para autenticação no serviço.\n\n![](..\\..\\..\\images\\safe_id_manualmente.gif)\n\nSem internet? Sem problemas!\n\nNão é necessária conexão à internet no smartphone para adicionar novas contas ou para consultar os tokens no My Safe id." }, { "metadata": { "title": "Aplicativo My Safe id", "source": "https://tdn.totvs.com/display/fluig/Aplicativo+My+Safe+id", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Aplicativo My Safe id.md" }, "content": "Aplicativo My Safe id\n\n## Como editar os dados da conta?\n\nO My Safe id permite a edição do título e do usuário/login associados à conta. Abra o aplicativo e siga os passos abaixo.\n\n- Navegar até a conta que será alterada deslizando a tela para os lados.\n\n![](..\\..\\..\\images\\Editar_1.png)\n\n- Acionar ![](..\\..\\..\\images\\icon-edit.png) no canto superior direito da tela.\n\n![](..\\..\\..\\images\\Editar_2.png)\n\n- Informar o novo título e/ou conta.\n\n- Acionar ![](..\\..\\..\\images\\icon-check.png) para salvar as alterações.\n\n![](..\\..\\..\\images\\Editar_3.png)\n\n## Como remover a conta?" }, { "metadata": { "title": "Aplicativo My Safe id", "source": "https://tdn.totvs.com/display/fluig/Aplicativo+My+Safe+id", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Aplicativo My Safe id.md" }, "content": "Aplicativo My Safe id\n\n\nO My Safe id permite remover as contas adicionadas. Abra o aplicativo e siga os passos abaixo.\n\n- Navegar até a conta que será removida deslizando a tela para os lados.\n\n![](..\\..\\..\\images\\Remover_1.png)\n\n- Acionar ![](..\\..\\..\\images\\icon-edit.png) no canto superior direito.\n\n![](..\\..\\..\\images\\Remover_2.png)\n\n- Acionar ![](..\\..\\..\\images\\icon-delete.png).\n\n- Para confirmar a exclusão, acionar **OK**.\n\n![](..\\..\\..\\images\\Remover_3.gif)\n\n# Como adicionar uma conta do TOTVS Identity ao My Safe id?\n\nO passo a passo a seguir demonstra como habilitar a autenticação multifator em uma conta do TOTVS Identity e adicioná-la ao My Safe id.\n\nDICA!\n\nLembrando que essa configuração, por padrão, é opcional, mas pode ser configurada como obrigatória pela administração da empresa. Para mais detalhes, consulte a documentação [Multi-Factor Authentication](https://tdn.totvs.com/pages/viewpage.action?pageId=317297191).\n\n- A demonstração a seguir será ilustrada a partir do ponto de vista de um Usuário comum do TOTVS Identity, porém o procedimento é o mesmo para contas Administrador.\n- Passar o cursor do *mouse* sobre o nome do usuário no canto superior direito da página para exibir o menu da conta.\n- Acionar **Segurança**.\n\n![](..\\..\\..\\images\\MFA%20Passo%201.gif)\n\n- Baixar o aplicativo **My Safe id** a partir da loja de aplicativos correspondente ao sistema operacional do smartphone utilizado pelo usuário (iPhone ou Android).\n\n- Abrir o My Safe id no aparelho.\n\n- Acionar ![](..\\..\\..\\images\\icon-plus.png) no app\n\n- Apontar a câmera do dispositivo para o código de barras bidimensional (*QR Code*) fornecido pelo TOTVS Identity.\n\n![](..\\..\\..\\images\\Autentica%C3%A7%C3%A3o%20multifator.png)\n\n- Feita a leitura, o My Safe id irá gerar um token de acesso. Cada token possui duração máxima de 30 segundos e será renovado automaticamente.\n\n- Informar o token no campo **000-000**. O token será validado e, se estiver correto, uma mensagem de sucesso será apresentada.\n\n![](..\\..\\..\\images\\MFA%20Passo%203.gif)\n\n- A partir de agora, após preencher o e-mail e senha ao acessar o TOTVS Identity, o usuário deverá abrir o My Safe id no aparelho e informar o token gerado pelo aplicativo para se autenticar.\n\n![](..\\..\\..\\images\\MFA%20Login.png)\n\n# Como adicionar uma conta do Google ao My Safe id?\n\nO passo a passo a seguir demonstra como habilitar a autenticação multifator em uma conta do Google (Passos 1 a 4) e adicioná-la ao My Safe id (Passos 5 a 10).\n\n- Acessar a página **Minha Conta** do Google ().\n\n- Acionar **Login e Segurança** → **Verificação em duas etapas → Primeiros passos**.\n\n**![](..\\..\\..\\images\\gifsafeid.gif)**\n\n- Informar a senha da conta do Google e acionar **Próxima**.\n\n![](..\\..\\..\\images\\safeid1.png)\n\n- O Google exige que a conta seja verificada com um número de telefone.\n\n- Informar o número do telefone que deseja utilizar para a autenticação (com DDD) e acionar **Próxima**.\n\nPor padrão, um código de verificação será enviado por mensagem de texto (SMS) para o número informado. Também é possível receber este código através de uma ligação telefônica.\n\n- Preencher o campo com o código recebido e acionar **Próxima**.\n\n![](..\\..\\..\\images\\gifmypass3.gif)\n\n- Confirmada a validade do número de telefone informado, acionar **Ativar** para que a conta do Google passe a suportar a autenticação multifator.\n\n![](..\\..\\..\\images\\safeid2.png)\n\n- Na página exibida após a ativação, localize a sessão **App Google Autenticador**.\n\n- Acionar **Configurar**.\n\n![](..\\..\\..\\images\\mp8.png)\n\n- Selecionar o tipo do dispositivo onde o My Safe id está instalado (**Android** ou **iPhone**) e acionar **Próxima**.\n\n![](..\\..\\..\\images\\mp7.png)\n\n- Abrir o My Safe id no aparelho smartphone.\n\n- Acionar o botão ![](..\\..\\..\\images\\icon-plus.png) no aplicativo para acessar a tela de inclusão de contas.\n\n- Apontar a câmera do smartphone para *QR code* apresentado na tela para efetuar a leitura do código.\n\n- Na página da conta Google, acionar **Próxima**.\n\nUsou QR Code?\n\nCaso a conta tenha sido adicionada utilizando a leitura do QR Code, o próximo passo pode ser desconsiderado. Avançar para o Passo 9.\n\n- Para incluir a chave manualmente, acionar **Não consegue ler o código?**.\n\n![](..\\..\\..\\images\\mp10.png)\n\n- Abrir o aplicativo My Safe id no smartphone.\n\n- Acionar o botão ![](..\\..\\..\\images\\icon-plus.png) no aplicativo para acessar a tela de inclusão de contas.\n\n- Acionar **Adicione manualmente** no canto inferior da tela.\n\nEste passo só deve ser executado por usuários que desejem adicionar a conta do Google ao My Safe id manualmente e **não** pelo escaneamento do *QR code*.\n\n- Informar o nome do serviço/aplicação no campo **Título**, por exemplo, \"Google\".\n\n- Informar o e-mail do Google no campo **Conta**, por exemplo, \"seuemail@gmail.com\".\n\n- Informar a chave de acesso fornecida pelo Google no campo **Chave**.\n\n- Acionar ![](..\\..\\..\\images\\icon-check.png) para salvar as informações.\n\n- Na página da conta Google, acionar **Próxima**.\n\n![](..\\..\\..\\images\\mp9.png)\n\n- Na página **Minha Conta**, acionar **Concluído** para finalizar a configuração da verificação em duas etapas através do aplicativo My Safe id.\n\n![](..\\..\\..\\images\\mp12.png)\n\n- A partir de agora, ao acessar a conta do Google será exigida, além do endereço de e-mail e senha, o token gerado pelo My Safe id.\n\n![](..\\..\\..\\images\\safeid4.png)" }, { "metadata": { "title": "Desabilitando a integração da plataforma com o Identity", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=857583857", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Desabilitando a integração da plataforma com o Identity.md" }, "content": "Desabilitando a integração da plataforma com o Identity" }, { "metadata": { "title": "Desabilitando a integração da plataforma com o Identity", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=857583857", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Desabilitando a integração da plataforma com o Identity.md" }, "content": "Desabilitando a integração da plataforma com o Identity\n\n\n- [Pré-requisitos](#DesabilitandoaintegraçãodaplataformacomoIdentity-Pré-requisitos)\n- [Acessar o wcmadmin com a plataforma integrada ao Identity](#DesabilitandoaintegraçãodaplataformacomoIdentity-AcessarowcmadmincomaplataformaintegradaaoIdentity)\n- [Desabilitar a integração com o Identity](#DesabilitandoaintegraçãodaplataformacomoIdentity-DesabilitaraintegraçãocomoIdentity)\n\n# Pré-requisitos\n\n---\n\n- Possuir o TOTVS Fluig Plataforma em **atualização 1.6.x ou superior** instalado e configurado conforme as orientações do [Guia de Instalação fluig](../../Instalação e Atualização/Guia de instalação da plataforma.md).\n- Possuir um contexto criado no TOTVS Identity, conforme as orientações da página [Criação de Conta no Identity](https://tdn.totvs.com/x/sAzMCg).\n- Ter uma empresa cadastrada no Fluig e integrada com o Identity, de acordo com a documentação [Integração da plataforma com o Identity](Integração da plataforma com o Identity.md).\n\n# Acessar o wcmadmin com a plataforma integrada ao Identity\n\n---\n\n**01.** Quando realizada a integração TOTVS Fluig Plataforma com o TOTVS Identity, toda tentativa de acesso à tela de login do Fluig será direcionado para a tela do Identity.\n\n**02.** Para acessar com o wcmadmin é necessário usar a seguinte URL:\n\n- **http://[endereco]:[porta]/portal/home?wcmadmin=true**\n\nExemplos:\n\n- \n- \n\n# Desabilitar a integração com o Identity\n\n---\n\n**01.** De posse dos dados de acesso do usuário **wcmadmin** do Fluig, é possível desabilitar a integração com o Identity.\n\n- Acessar o Fluig com o usuário **wcmadmin**.\n- Acessar o **Painel de Controle** → agrupador **WCM** → **Empresas**.\n- Assinalar a empresa desejada e acionar **Editar**.\n\n![](..\\..\\..\\images\\image-2024-7-18_14-8-40.png)\n\n- Acessar a aba **Autenticação**.\n- Assinalar **NÃO** na opção**\"**Deseja habilitar o acesso com Identity?**\"**.\n- Clicar em **Salvar**.\n\n![](..\\..\\..\\images\\image-2024-7-18_14-12-12.png)\n\n- Uma notificação push será exibida em tela informando que a autenticação via Identity foi desabilitada e sugerindo executar o processo de recuperação de senha para todos os usuários.\n- Marque a opção **Sim**.\n\n![](..\\..\\..\\images\\image-2024-7-18_14-15-22.png)\n\n- Deverá aparecer um push na cor **verde** indicando que o processo de recuperação de senha foi realizado com sucesso.\n\n![](..\\..\\..\\images\\image-2024-7-18_14-18-43.png)" }, { "metadata": { "title": "Integração da plataforma com o Identity", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73080143", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Integração da plataforma com o Identity.md" }, "content": "Integração da plataforma com o Identity" }, { "metadata": { "title": "Integração da plataforma com o Identity", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73080143", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Integração da plataforma com o Identity.md" }, "content": "Integração da plataforma com o Identity\n\n\n- [Pré-requisitos](#IntegraçãodaplataformacomoIdentity-Pré-requisitos)\n- [Configurar a integração com o Identity](#IntegraçãodaplataformacomoIdentity-ConfiguraraintegraçãocomoIdentity)\n- [Enviar usuários do Fluig para o Identity](#IntegraçãodaplataformacomoIdentity-EnviarusuáriosdoFluigparaoIdentityenviar)\n- [Múltiplas Empresas](#IntegraçãodaplataformacomoIdentity-MúltiplasEmpresas)\n- [Consultar token de integração](#IntegraçãodaplataformacomoIdentity-Consultartokendeintegração)\n\n# Pré-requisitos\n\n---\n\n- Possuir o TOTVS Fluig Plataforma em **atualização 1.6.x ou superior** instalado e configurado conforme as orientações do [Guia de Instalação fluig](../../Instalação e Atualização/Guia de instalação da plataforma.md). O endereço de acesso à plataforma será solicitado durante a configuração da integração com o TOTVS Identity.\n\n- Solicitar um contexto no Identity ao suporte, conforme as orientações da página [Criação de Conta no Identity](https://tdn.totvs.com/x/sAzMCg).\n\n- Possuir uma empresa cadastrada no Fluig.\n\nTanto para o cadastro da empresa no Fluig quanto para a criação do contexto no Identity é necessário definir um administrador. O endereço de e-mail deste administrador deve ser o mesmo para ambos os casos.\n\n- Caso já existam usuários cadastrados na empresa do Fluig que será sincronizada, **deve-se garantir que todos estes usuários** possuam um endereço de e-mail cadastrado e que este endereço seja válido e único, ou seja, não tenha sido usado no cadastro de outro usuário.\n- Caso tenha mais de uma empresa cadastrada no fluig, recomendadmos utilizar contas distintas do Identity para configurar a integração com essas empresas. Utilizar a mesma conta do Identity(URL e token), pode impactar no login de usuários que utilizam o mesmo email em diferentes empresas\n - Exemplo: \n - Empresa1 com um usuário: login: user1, email: [user@company.com](mailto:user1@rmail.com)\n - Empresa2 com um usuário: login: user2, email: [user@company.com](mailto:user1@rmail.com) (mesmo email) \n Caso essas 2 empresas no fluig forem cadastradas com a mesma conta do Identity, o usuário **user2** não conseguirá efetuar o login na **Empresa2**, apenas na **Empresa1.**\n\n**oculto**\n\ne procedimento foi repassado ao artigo  (Como integrar a plataforma ao Identity)\n\nCaso seja feita alguma alteração, lembrar de repassar a esse artigo.\n\n# Configurar a integração com o Identity\n\n---\n\nImportante!\n\nPara realizar a integração com o Identity, recomendamos que o ambiente fluig esteja em HTTPS. Acesse nossa documentação e confira mais detalhes e informações sobre a [configuração HTTPS da plataforma.](../Configuração de Ambiente/HTTPS/Configuração HTTPS da plataforma.md)\n\nDe posse dos dados de acesso ao contexto no Identity e um usuário administrador, é possível iniciar a integração com o Fluig.\n\n**oculto**\n\nEsse procedimento foi repassado ao artigo  (Como integrar a plataforma ao Identity)\n\nCaso seja feita alguma alteração, lembrar de repassar a esse artigo.\n\nO primeiro procedimento da integração é preencher a URL de acesso ao Fluig no aplicativo Fluig do Identity.\n\n- Acessar o contexto criado no Identity, por exemplo, https://[suaempresa].fluigidentity.com, com as credenciais do administrador.\n\n- Acionar o menu **Aplicativos**.\n\n- Acionar **Fluig** na lista de aplicativos. É possível localizá-lo utilizando o campo Pesquisar no canto superior esquerdo.\n\n- Selecionar a aba **Entrar**.\n\n- Acionar **Editar** localizado no canto superior direito.\n\n![](..\\..\\..\\images\\Passo%201.gif)\n\n- Informar o endereço de acesso ao Fluig no campo **Domínio**.\n\n- Ao final da URL de acesso deve ser incluído o caminho **/portal/idp**, por exemplo: [http://meufluig.com:8080/**portal/idp**.](http://ENDERECO_FLUIGPORTA)\n\n- Marcar a opção **Sincronizar login SAML com e-mail do AD** (Recomendado).\n\n- Acionar **Salvar** no final da página.\n\nAo acessar o aplicativo Fluig pelo Identity, o usuário será direcionado para o endereço informado neste campo (Domínio), portanto ele precisa ser preenchido com a URL da aplicação Fluig.\n\n![](..\\..\\..\\images\\Passo%202.JPG)\n\nEm seguida, deve-se copiar o token do aplicativo.\n\n- Selecionar a aba **Visão Geral**.\n\n- Acionar **Token de Configuração**.\n\n- Copiar o valor do token, pois será utilizado posteriormente para configuração da empresa no Fluig (Passo 5).\n\n![](..\\..\\..\\images\\Passo%203.gif)\n\nA partir de agora, a configuração será realizada no fluig.\n\n- Acessar o Fluig com o usuário **wcmadmin**.\n\n- Acessar o **Painel de Controle** → agrupador **WCM** → **Empresas**.\n\n- Assinalar a empresa desejada e acionar **Editar**.\n\nPara cada contexto do Identity é suportada a integração com apenas uma empresa do Fluig.\n\n![](..\\..\\..\\images\\Passo%204.JPG)\n\n- Acessar a aba **Autenticação**.\n\n- Assinalar a opção**\"**Deseja habilitar o acesso com Identity?**\"**\n\n- Informar a URL do contexto da empresa no Identity, por exemplo, \n\n- Informar o token de configuração obtido no Passo 3.\n\n![](..\\..\\..\\images\\Passo%205.JPG)\n\nIntegração entre o Fluig No-Code e Fluig Plataforma\n\nNesta página é possível habilitar o botão para ativação da integração entre o [Fluig No-Code e Fluig Plataforma](https://tdn.totvs.com/download/attachments/73080143/Integra%C3%A7%C3%A3o%20Fluig%20No-Code%20e%20Fluig%20Plataforma.JPG?version=3&modificationDate=1719345563183&api=v2), caso o usuário tenha o pacote adquirido. Para saber mais a respeito desta integração, acesse a documentação sobre a [Ativação da oferta TOTVS Fluig No-Code.](https://tdn.totvs.com/x/YW10Ig) \n\nO usuário também poderá observar os [Parâmetros do Identity](https://tdn.totvs.com/download/attachments/73080143/Parametros%20do%20Identity.JPG?version=1&modificationDate=1657226691087&api=v2) nesta mesma página.\n\n- Para garantir que os dados informados estão corretos e a conexão com o Identity está disponível, acionar **Ações** → **Testar conexão**.\n\n- Se a mensagem \"Conexão com o servidor do Identity realizada com sucesso\" for apresentada, a configuração está correta e pode ser concluída.\n\n- Acionar **Salvar**. A empresa exibirá o status \"Habilitado\" na coluna Identity da página Empresas.\n\nE os usuários?\n\nApós a integração, é possível [enviar os usuários](https://tdn.totvs.com/pages/viewpage.action?pageId=73080143) cadastrados no Fluig automaticamente para o contexto da empresa no Identity ou [adicioná-los manualmente](https://tdn.totvs.com/x/NyaTEg).\n\n![](..\\..\\..\\images\\Testar%20conex%C3%A3o.gif)\n\n**oculto**\n\n# Enviar usuários do Fluig para o Identity\n\n---\n\nPara criar contas no Identity para usuários previamente existentes na empresa do Fluig, está disponível nas propriedades da empresa a opção **Enviar usuários**. Ao utilizar este recurso, as contas do usuário no Fluig e no Identity serão vinculadas automaticamente.\n\n**oculto**\n\nEsse procedimento foi repassado ao artigo  (Como integrar a plataforma ao Identity)\n\nCaso seja feita alguma alteração, lembrar de repassar a esse artigo.\n\n- Acionar **Ações** → **Enviar usuários**.\n\n[![](..\\..\\..\\images\\Enviar%20usu%C3%A1rios.gif)](https://tdn.totvs.com/download/attachments/73080143/Parametros%20do%20Identity.JPG?version=1&modificationDate=1657226691087&api=v2)\n\nCondições de preenchimento do campo idp\\_id no banco de dados do TOTVS Fluig Plataforma\n\nA rotina de integração das contas no Fluig e Identity funciona de acordo com as seguintes condições:\n\n**01.** Se no banco de dados do Fluig, o registro do usuário já tiver o campo idp\\_id preenchido, ele não será sincronizado.\n\n**02.** Se o idp\\_id não estiver preenchido, o usuário será enviado ao Identity:\n\n**2.1** Caso o e-mail deste usuário já esteja cadastrado em uma conta no domínio do cliente no Identity, o seu ID é preenchido na coluna idp\\_id da tabela fdn\\_usertenant.\n\n**2.2** Caso o e-mail deste usuário já esteja cadastrado em uma conta no Identity, mas atrelado a um outro domínio, ele também será adicionado ao domínio do cliente e o seu ID é preenchido na coluna idp\\_id da tabela fdn\\_usertenant.\n\n**2.3** Se ele não estiver cadastrado em nenhum domínio, o usuário é criado no Identity, vinculado ao domínio do cliente e o seu ID é preenchido na coluna idp\\_id da tabela fdn\\_usertenant.\n\nUma vez utilizado o recurso Enviar usuários, é possível verificar quais contas foram efetivamente criadas e integradas no Identity através do *log* de envio.\n\n- Acionar **Ações** → **Exportar *log* de envio**.\n\n![](..\\..\\..\\images\\Exportar%20log.gif)\n\n- Será gerado um arquivo CSV contendo as colunas **login**, **e-mail**, **data de envio** e o **status** da operação de criação do usuário.\n\n![](..\\..\\..\\images\\log_envio_usuarios.png)\n\n- Os usuários enviados são automaticamente atrelados ao aplicativo Fluig no Identity.\n\n![](..\\..\\..\\images\\Passo%204..JPG)\n\n- Quando o processo for terminado, os usuários enviados poderão acessar o Fluig pelo Identity.\n\n- A senha destes usuários no Identity será composta da seguinte forma: [primeiro nome com a primeira letra maiúscula]@123. Por exemplo:\n\n**Nome do usuário:** John Steel\n\n**Login no Identity:** [john.steel@empresa.com.br](mailto:john.steel@empresa.com.br)\n\n**Senha no Identity:** John@123\n\n- Se um usuário enviado pelo Fluig possuir uma conta prévia no Identity, sua senha de acesso não será alterada.\n\n- Caso o primeiro nome do usuário possua 13 caracteres ou mais, a senha será criada usando apenas os 12 primeiros caracteres do nome + @123. Por exemplo, se o nome do usuário for Joriscleidson, a senha gerada será Joriscleidso@123.\n\n- Se o primeiro nome do usuário for muito curto, o Fluig irá adicionar números ao final da senha até atingir o tamanho mínimo exigido pelo Identity (8 caracteres). Por exemplo, se o nome da usuária for Lu, a senha gerada será Lu@12345.\n\n- Os usuários podem alterar a senha do Identity através da página Meu Perfil a qualquer momento.\n\nAtenção!\n\nCaso tenha alguma dúvida durante esse processo, verifique a documentação [IDE - Por que novos usuários não são provisionados no fluig?](https://tdn.totvs.com/pages/viewpage.action?pageId=267788725).\n\n# Múltiplas Empresas\n\n---\n\nQuando a instalação do TOTVS Fluig Plataforma possui múltiplas empresas e uma ou mais empresas tiverem a integração com o Identity habilitada, será feita a autenticação por contexto.\n\nNa autenticação por contexto o usuário deverá acessar o Fluig através da URL com o código da empresa, por exemplo, **[http://meufluig.com/portal/empresa1](http://meufluig.com/portal/empresa)**, para que o Fluig identifique em qual empresa o usuário está se autenticando. Caso não seja informado o código da empresa na URL, será apresentada a página de seleção de empresa (vide abaixo) para que o usuário informe o código antes de prosseguir com a autenticação.\n\nA URL de acesso com o código da empresa é válida somente para o acesso à plataforma Fluig, e não deve ser adicionada na configuração do aplicativo no TOTVS Identity.  No Identity permanece a URL normal, que é: .\n\n![](..\\..\\..\\images\\empresa%20nao%20encontrada.png)\n\nEm empresas cuja integração com o Identity está habilitada, o usuário será direcionado para a página de login do Identity. Nas demais a página padrão de login do Fluig será carregada para autenticação.\n\nAviso\n\nCada contexto do Identity suporta a integração com apenas uma empresa do Fluig. As demais empresas de uma mesma instalação do Fluig não poderão ser integradas ao mesmo contexto do Identity.\n\n# Consultar token de integração\n\n---\n\n**![](..\\..\\..\\images\\v%C3%ADdeo.png) [Veja o vídeo](https://tdn.totvs.com/download/attachments/73080143/Obter%20token.gif?version=3&modificationDate=1657281096190&api=v2)**\n\nPara consultar o token de integração, siga os passos abaixo:\n\n**01**. Acessar o contexto criado no Identity, por exemplo, https://[suaempresa].[fluigidentity.com](http://fluigidentity.com), com as credenciais do administrador.\n\n**02**. Acionar o menu **Aplicativos**.\n\n**03**. Acionar **Fluig** na lista de aplicativos. É possível localizá-lo utilizando o campo Pesquisar no canto superior esquerdo.\n\n**04**. Na aba **Visão geral**, acionar **Token de Configuração** e copiar o valor do token.\n\n**oculto**\n\nPágina Aplicativos para widgets de Experiências de Uso\n\n---\n\nApós a configuração da integração entre Fluig e Identity, uma página chamada Aplicativos será automaticamente criada e incluída no menu principal do Fluig. Essa página contém os *widgets* de Experiência de Uso e Analytics dispostos no seguinte *layout*:\n\n![](..\\..\\..\\images\\layout.png)\n\nOs 3 primeiros *slots* destinam-se às *widgets* de **Acesso Centralizado**, exibidas nesta ordem: Geral, Favoritos e Mais Acessados. O *slot* inferior à esquerda destina-se ao *widget* de **Consulta Rápida** e o inferior à direita apresenta o *widget* **Analytics**.\n\n- Os *widgets* de Acesso Centralizado serão automaticamente configurados caso um ERP já esteja integrado ao Identity.\n\n![](..\\..\\..\\images\\acesso%20centralizado%20-%20novo.png)\n\n- Para configurar o *widget* de Consulta Rápida, é necessário editar a página e seguir os procedimentos descritos na documentação [Widgets de Experiência de Uso](../../Recurso de Páginas e Widgets (WCM).md)/Widgets de experiência de uso.md).\n\n![](..\\..\\..\\images\\consulta%20r%C3%A1pida%20apresenta%C3%A7ao.png)\n\n- Para configurar o *widget* Analytics, é necessário editar a página e seguir os procedimentos descritos na documentação [Widgets de Experiência de Uso](../../Recurso de Páginas e Widgets (WCM).md)/Widgets de experiência de uso.md).\n\n![](..\\..\\..\\images\\analytics.png)\n\nDesativar página Aplicativos e Experiências de Uso\n\nPara que a página Aplicativos não seja exibida no menu principal do Fluig, deve-se acessar o **Painel de controle** → agrupador **WCM** → **Minhas Páginas** e excluir a página.\n\nPara desabilitar as Experiências de Uso, deve-se acessar as propriedades da empresa através do Painel de Controle do usuário wcmadmin (agrupador **WCM** → **Empresas** → **Editar** → **Cadastrar dados adicionais**) e alterar o valor do parâmetro USER-EXPERIENCE-ACTIVE para ***false**.*" }, { "metadata": { "title": "Solução de problemas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=322149870", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Aplicativo My Safe id\\Solução de problemas.md" }, "content": "Solução de problemas\n\n\n- 1 [O token do My Safe id é inválido](#Soluçãodeproblemas-OtokendoMySafeidéinválido)\n- 2 [O novo token também é inválido](#Soluçãodeproblemas-Onovotokentambéméinválido)\n- 3 [Desinstalei o My Safe id do aparelho](#Soluçãodeproblemas-DesinstaleioMySafeiddoaparelho)\n- 4 [Troquei de aparelho](#Soluçãodeproblemas-Troqueideaparelho)\n- 5 [Sou o administrador do contexto e preciso redefinir o MFA na minha própria conta](#Soluçãodeproblemas-SouoadministradordocontextoeprecisoredefiniroMFAnaminhaprópriaconta)\n\nNesta página reunimos algumas situações comuns que podem ocorrer durante a utilização da autenticação multifator do TOTVS Identity (ou outros serviços) com o My Safe id e que procedimentos podem ser realizados para solucioná-las.\n\n#### O token do My Safe id é inválido\n\nAguarde a geração de um novo token pelo My Safe id (isso demora no máximo 30 segundos) e tente novamente.\n\n#### O novo token também é inválido\n\nNas configurações de Data e Hora do *smartphone* em que o My Safe id está instalado, habilitar a opção **Automaticamente** (iPhone) ou **Data e hora automáticas** e **Fuso horário automático** (Android).\n\n#### Desinstalei o My Safe id do aparelho\n\nSolicite ao administrador do contexto da sua empresa no Identity redefinir a configuração MFA da sua conta. O procedimento está descrito no manual [Gerenciar Usuário](http://tdn.totvs.com/pages/viewpage.action?pageId=317306108#GerenciarUsuário-RedefiniracessocomMFAdousu%C3%A1rio).\n\nApós a redefinição, basta acessar novamente o menu **Segurança** → **Multi-Factor Authentication** para escanear um novo QR Code e habilitar o My Safe id novamente no aparelho.\n\n#### Troquei de aparelho" }, { "metadata": { "title": "Solução de problemas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=322149870", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Aplicativo My Safe id\\Solução de problemas.md" }, "content": "Solução de problemas\n\n\nSolicite ao administrador do contexto da sua empresa no Identity redefinir a configuração MFA da sua conta. O procedimento está descrito no manual [Gerenciar Usuário](http://tdn.totvs.com/pages/viewpage.action?pageId=317306108#GerenciarUsuário-RedefiniracessocomMFAdousu%C3%A1rio).\n\nApós a redefinição, basta acessar novamente o menu **Segurança** → **Multi-Factor Authentication** para escanear um novo QR Code e habilitar o My Safe id novamente no aparelho.\n\n#### Sou o administrador do contexto e preciso redefinir o MFA na minha própria conta\n\nCaso você seja o único administrador do contexto, abra um ticket para o [Suporte do TOTVS Fluig](http://suporte.fluig.com) que faremos a redefinição da MFA da sua conta para você." }, { "metadata": { "title": "Modo de Provisionamento Fluig", "source": "https://tdn.totvs.com/display/fluig/Modo+de+Provisionamento+Fluig", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Integração da plataforma com o Identity\\Modo de Provisionamento Fluig.md" }, "content": "Modo de Provisionamento Fluig" }, { "metadata": { "title": "Modo de Provisionamento Fluig", "source": "https://tdn.totvs.com/display/fluig/Modo+de+Provisionamento+Fluig", "path": "\\Plataforma Documentação técnica\\Configuração\\Identity\\Integração da plataforma com o Identity\\Modo de Provisionamento Fluig.md" }, "content": "Modo de Provisionamento Fluig\n\n\n# Índice\n\n- 1 [Pré-requisitos](#MododeProvisionamentoFluig-Pré-requisitos)\n- 2 [Sobre o provisionamento Fluig](#MododeProvisionamentoFluig-SobreoprovisionamentoFluig)\n- 3 [Configuração de provisionamento no aplicativo](#MododeProvisionamentoFluig-Configuraçãodeprovisionamentonoaplicativo)\n- 4 [Desativação de usuários](#MododeProvisionamentoFluig-Desativaçãodeusuários)\n\n# Pré-requisitos\n\n---\n\n- O ambiente Fluig precisa estar em uma **atualização Waterdrop (1.6.4) ou superior**.\n- É necessário que tenha sido realizada a configuração de [acesso externo](https://centraldeatendimento.fluig.com/hc/pt-br/articles/360026366992) no ambiente Fluig.\n\n# Sobre o provisionamento Fluig\n\n---\n\nProvisionamento é o processo de criação automática de usuários do Identity em uma outra aplicação ou serviço. Existem tipos distintos de provisionamento disponíveis, como SCIM, Salesforce, Google e Fluig. Nesta página será abordada a configuração do Modo de Provisionamento Fluig.\n\nEm uma [integração padrão](../Integração da plataforma com o Identity.md) entre fluig e Identity, o provisionamento do usuário é realizado apenas quando o indivíduo faz o primeiro acesso ao fluig através do Identity. Contudo, é possível configurar o aplicativo para que a criação no fluig seja feita ao atribuir o app para o usuário no Identity.\n\nPor exemplo, ao criar o usuário João de Souza em , o administrador poderá atribuir a ele um aplicativo Fluig. Após a atribuição, o Identity enviará uma requisição via API ao Fluig para que o perfil do usuário João de Souza também seja criado automaticamente na plataforma.\n\nSaiba como fazer atribuição de aplicativos [Gerenciar usuários](http://tdn.totvs.com/pages/viewpage.action?pageId=317306108#Gerenciarusuário-Atribuiraplicativosaousuário).\n\nAtenção\n\nUsuários com status **Convidado** ou **Desativado** não serão provisionados, apenas usuários com status **Ativo**. Para usuários convidados, o provisionamento ocorrerá no momento em que a conta for ativada.\n\n# Configuração de provisionamento no aplicativo\n\n---\n\nSiga o passo a passo para habilitar o provisionamento de usuários em um aplicativo Fluig.\n\n- Acessar o Identity com o Administrador do contexto.\n\n- Acionar o menu **Aplicativos**.\n\n- Localizar o aplicativo **Fluig** e clicar sobre o nome para acessar as configurações.\n\n- Acionar a opção **Clonar** para criar um novo aplicativo com as mesmas propriedades do atual.\n\n![](..\\..\\..\\..\\images\\Image%2002%2020%20012.png)\n\n- Selecionar a aba **Provisionar**.\n\n- Marcar a opção **Habilitar Provisionamento**.\n\n![](..\\..\\..\\..\\images\\Image%2002%2020%20013.png)\n\n- No item **Modo de Provisionamento**, marcar a opção Fluig.\n\n- Em **Tipo de Autenticação**, marcar a opção OAuth 1.0a.\n\n- No campo **URL REST**, informar a URL da API de criação de usuários do Fluig, substituindo {dominio} pelo endereço de acesso ao Fluig:\n\n```\n{dominio}/api/public/wcm/user/create\n```\n\n- Em **Nome do usuário do Administrador do Domínio**, informar o e-mail de um usuário que seja administrador tanto do Fluig quanto do Identity. Este usuário deve existir em ambas as ferramentas.\n\n- Informar a senha desse mesmo administrador no campo **Senha do Administrador do Domínio**.\n\n- Definir uma senha padrão temporária para os usuários que serão criados através do provisionamento em **Senha Temporária do Usuário**.\n\n![](..\\..\\..\\..\\images\\Image%2002%2020%20014.png)\n\n- Para concluir, é preciso atribuir o aplicativo aos usuários. Para saber mais, acesse a documentação [Atribuir aplicativos aos usuários](https://www.google.com/url?q=https://tdn.totvs.com/pages/viewpage.action?pageId%3D203763890&sa=D&source=hangouts&ust=1586283909786000&usg=AFQjCNGKNwXza4hnzGyU6EkDKgl8GH2DlQ).\n\n![](..\\..\\..\\..\\images\\importante.png)\n\n**IMPORTANTE!** \nDependendo da quantidade de usuários que estejam na fila, o processo de provisionamento pode demorar a partir de 15 minutos para ser concluído.\n\nOrientamos que o aplicativo seja configurado, para que seja mantido ativo somente a cópia do padrão navegável.\n\n# Desativação de usuários\n\n---\n\nQuando o usuário for desassociado do aplicativo Fluig no Identity e não possuir pendências na plataforma, ele é desativado na plataforma.\n\nCaso tenha alguma pendência, ele só é desativado do Identity. Nesse caso, o administrador da plataforma deverá fazer a transferência de pendências do usuário e desativá-lo manualmente.\n\nSe o usuário for excluído do Identity, ele não é desativado na plataforma Fluig.\n\n**Saiba mais**\n\nSaiba como fazer a transferência de pendências e a desativação do usuário nos helps [Transferir Pendência](http://tdn.totvs.com/x/lIH5DQ) e [Usuários](http://tdn.totvs.com/x/c4H5DQ))" }, { "metadata": { "title": "Abrir documentos a partir de widgets mobile", "source": "https://tdn.totvs.com/display/fluig/Abrir+documentos+a+partir+de+widgets+mobile", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Abrir documentos a partir de widgets mobile.md" }, "content": "Abrir documentos a partir de widgets mobile\n\n\n# Índice\n\n- 1 [Objetivo](#Abrirdocumentosapartirdewidgetsmobile-Objetivo)\n- 2 [Abrir documentos via widgets mobile](#Abrirdocumentosapartirdewidgetsmobile-Abrirdocumentosviawidgetsmobile)\n\n## Objetivo\n\nEste guia tem por objetivo auxiliar usuários que queiram abrir documentos no mobile por meio de widgets utilizando uma chamada para a função \"JSInterface.openDocument\".\n\nA partir da versão **1.16.16 do IOS** e da versão **1.6.5.28 do Android** é possível abrir documentos via widgets nos aplicativos Fluig Mobile. Veja o passo a passo abaixo.\n\n## Abrir documentos via widgets mobile\n\n---\n\nPara abrirmos documentos via widgets, basta acrescentarmos uma chamada para a função **JSInterface.openDocument** passando como parâmetro e código do documento no GED, além disso é possível também passarmos o título que será utilizado na janela do documento. Como no exemplo abaixo:\n\nSerá preciso checar se está no mobile realmente.\n\n```\n// O primeiro passo é checarmos se estamos no mobile\nif (WCMAPI.isMobileAppMode()) {\n var config = {\n documentId: 83, // Código do documento que será aberto\n title: \"Meu documento PDF\" // Título que será usado na janela (Opcional)\n };\n\n // Por fim abrimos o documento.\n var configString = JSON.stringify(config);\n JSInterface.openDocument(configString);\n}\n```\n\nAo adicionar esta chamada os documentos no Fluig mobile serão abertos via widgets." }, { "metadata": { "title": "Android", "source": "https://tdn.totvs.com/display/fluig/Android", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Android.md" }, "content": "Android\n\n\nAqui você encontra todas as documentações do Fluig Mobile que são destinadas aos dispositivos com sistema operacional Android.\n\n---\n\n- [Android - Como realizar o login no Fluig Mobile?](Android/Android - Como realizar o login no Fluig Mobile.md)\n- [Android - Como utilizar os componentes Leitura de código de barras e QR Code?](Android/Android - Como utilizar os componentes Leitura de código de barras e QR Code.md)" }, { "metadata": { "title": "Aplicativo Approval", "source": "https://tdn.totvs.com/display/fluig/Aplicativo+Approval", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Aplicativo Approval.md" }, "content": "Aplicativo Approval\n\n\nAcompanhe as dicas de usabilidade do app Approval aqui.\n\n---\n\n- [Como realizar o login no Approval?](Aplicativo Approval/Como realizar o login no Approval.md)" }, { "metadata": { "title": "Bloquear ação download de documento para Android", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=511548770", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Bloquear ação download de documento para Android.md" }, "content": "Bloquear ação download de documento para Android\n\n\n# Índice\n\n- 1 [Bloquear download de documentos](#BloquearaçãodownloaddedocumentoparaAndroid-Bloqueardownloaddedocumentos)\n - 1.1 [Configurando permissão de download de documentos no My Fluig](#BloquearaçãodownloaddedocumentoparaAndroid-ConfigurandopermissãodedownloaddedocumentosnoMyFluig)\n - 1.2 [Configurando permissão de download do documento](#BloquearaçãodownloaddedocumentoparaAndroid-Configurandopermissãodedownloaddodocumento)\n - 1.3 [Comportamento da configuração para o usuário no aplicativo](#BloquearaçãodownloaddedocumentoparaAndroid-Comportamentodaconfiguraçãoparaousuárionoaplicativo)\n - 1.4 [Permissões de download e impressão na aba Segurança](#BloquearaçãodownloaddedocumentoparaAndroid-PermissõesdedownloadeimpressãonaabaSegurança)\n\n# Bloquear download de documentos\n\n---\n\nOs procedimentos abaixo demonstram como bloquear no My Fluig o *download* de documentos que tenham essa opção desabilitada pelo publicador/administrador.\n\n## Configurando permissão de download de documentos no My Fluig" }, { "metadata": { "title": "Bloquear ação download de documento para Android", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=511548770", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Bloquear ação download de documento para Android.md" }, "content": "Bloquear ação download de documento para Android\n\n\n---\n\nÉ possível configurar permissão de *download* para visualização de documentos no aplicativo Android. Para realizar esta alteração siga os passos abaixo:\n\n- Efetue a autenticação no TOTVS Fluig Plataforma pela web utilizando o usuário **wcmadmin** e acesse **Painel de Controle  → WCM → Empresas**.\n\n- Selecione a empresa que deseja alterar e então clique na opção **Editar**.\n\n- A tela de edição de empresa será apresentada. Clique no botão **Cadastrar dados adicionais****.**\n\n- A tela de dados adicionais da empresa será apresentada. No campo **Chave,** informe o valor **enableDocumentSecurityOnMobile**e no campo **Valor**informe:\n\n***true*:**  Para que a configuração de permissão de *download* do documento definida pelo publicador seja considerada na visualização pelo My Fluig.\n\n***false*:** Para habilitar a visualização do documento através do dispositivo móvel aos usuários que possuam permissão de Leitura (ou superior), independente da configuração definida pelo publicador.\n\n- Clique no botão **Salvar** para salvar os dados adicionais. O item **enableDocumentSecurityOnMobile**será adicionado na listagem de dados adicionais da empresa.\n\n![](..\\..\\..\\images\\enabledocumentdownload.jpg)\n\n## Configurando permissão de download do documento" }, { "metadata": { "title": "Bloquear ação download de documento para Android", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=511548770", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Bloquear ação download de documento para Android.md" }, "content": "Bloquear ação download de documento para Android\n\n\n---\n\nAlém de configurar a chave **enableDocumentSecurityOnMobile**na empresa, é necessário também configurar a permissão no documento, da seguinte forma:\n\n- Acesse a pasta onde o documento está salvo e no final da linha do documento, clique no botão **Mais opções ![](..\\..\\..\\images\\maisopcoes.JPG)** e selecione **Propriedades**.\n\n- Selecione a aba **Informações Gerais** e localize o campo **Permite download e impressão?**\n\n- Para que o documento possa ser baixado e visualizado no *mobile*, basta manter o campo assinalado.\n\n- Para impedir o *download* do documento, **desmarque esta opção**. **Conforme a imagem abaixo**:\n\n![](..\\..\\..\\images\\bloqueio%20de%20download%20no%20mobile.png)\n\nHey!\n\nPara garantir a segurança do arquivo físico, certifique-se em marcar a opção **Utiliza visualizador interno?**.\n\n## Comportamento da configuração para o usuário no aplicativo\n\n---\n\nAcompanhe o funcionamento da configuração de bloqueio da ação de download e como ela será apresentada para o usuário nos passos abaixo:\n\n- Caso o usuário tenha permissão para fazer o *download* do documento, será possível baixar e visualizar o documento tocando na opção **Salvar documento**.\n\n**![](..\\..\\..\\images\\Screenshot_20241002-102748-portrait.png)**\n\n- Caso o usuário não tenha permissão para fazer o *download* do documento, ou seja, quando na Fluig Plataforma o parâmetro **enableDocumentSecurityOnMobile** foi definido como *true*, o documento não será visualizado ou baixado e na tela será apresentada a seguinte mensagem:\n\n![](..\\..\\..\\images\\Screenshot_20241002-105333-portrait.png)\n\n## Permissões de download e impressão na aba Segurança" }, { "metadata": { "title": "Bloquear ação download de documento para Android", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=511548770", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Bloquear ação download de documento para Android.md" }, "content": "Bloquear ação download de documento para Android\n\n\n---\n\nNas propriedades de documentos e pastas, há uma opção chamada **Download e impressão** na aba **Segurança**, que permite especificar quais usuários/grupos terão o download do documento liberado.\n\nCaso o Fluig esteja na Atualização 1.5.12 ou anterior, quando a chave **enableDocumentSecurityOnMobile** for configurada no ambiente, independentemente do valor atribuído a ela (*true* ou *false*), as permissões de download e impressão definidas na aba Segurança não serão levadas em consideração pelo My Fluig.\n\nA partir da Atualização 1.5.13, as configurações da aba Segurança serão aplicadas no My Fluig, desde que a chave **enableDocumentSecurityOnMobile** tenha sido habilitada.\n\n![](..\\..\\..\\images\\aba%20seguran%C3%A7a%20em%20documentos%20e%20pastas.png)\n\nAtenção\n\nUma vez definido o parâmetro **enableDocumentSecurityOnMobile**, esta configuração será aplicada para os novos usuários que adicionarem sua conta no aplicativo do Fluig para Android.\n\nPara usuários que já possuem a conta configurada em um dispositivo móvel Android, na próxima vez em que o aplicativo for aberto, esta configuração será atualizada. Caso o dispositivo estiver usando rede 3G, essa verificação é feita apenas uma vez por dia." }, { "metadata": { "title": "Desenvolvimento de formulário mobile", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=146181573", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Desenvolvimento de formulário mobile.md" }, "content": "Desenvolvimento de formulário mobile" }, { "metadata": { "title": "Desenvolvimento de formulário mobile", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=146181573", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Desenvolvimento de formulário mobile.md" }, "content": "Desenvolvimento de formulário mobile\n\n\n# Índice\n\n- 1 [Formulário mobile](#Desenvolvimentodeformuláriomobile-Formuláriomobile)\n- 2 [Recomendações para processos com formulário mobile](#Desenvolvimentodeformuláriomobile-Recomendaçõesparaprocessoscomformuláriomobile)\n- 3 [Benefícios](#Desenvolvimentodeformuláriomobile-Benefícios)\n- 4 [Criando um formulário mobile](#Desenvolvimentodeformuláriomobile-Criandoumformuláriomobile)\n- 5 [Carregando dados do dataset em modo offline](#Desenvolvimentodeformuláriomobile-Carregandodadosdodatasetemmodooffline)\n- 6 [Desenvolvimento de formulário mobile](#Desenvolvimentodeformuláriomobile-Desenvolvimentodeformuláriomobile)\n - 6.1 [Funções mobile](#Desenvolvimentodeformuláriomobile-Funçõesmobile)\n - 6.1.1 [getAttachments](#Desenvolvimentodeformuláriomobile-getAttachments)\n - 6.1.2 [beforeValidateAttachments](#Desenvolvimentodeformuláriomobile-beforeValidateAttachments)\n - 6.2 [Pai x Filho e Zoom para dispositivos móveis](#Desenvolvimentodeformuláriomobile-PaixFilhoeZoomparadispositivosmóveis)\n - 6.2.1 [Inserir anexos da solicitação diretamente do formulário](#Desenvolvimentodeformuláriomobile-Inseriranexosdasolicitaçãodiretamentedoformulário)\n - 6.2.2 [Desabilite o evento Pull to refresh do componente nativo](#Desenvolvimentodeformuláriomobile-DesabiliteoeventoPulltorefreshdocomponentenativo)\n - 6.2.3 [Como identificar se estou usando o mobile nos eventos?](#Desenvolvimentodeformuláriomobile-Comoidentificarseestouusandoomobilenoseventos?)\n - 6.2.4 [Consumo de Datasets via xmlRPC](#Desenvolvimentodeformuláriomobile-ConsumodeDatasetsviaxmlRPC)\n - 6.2.5 [Explorando o input file no mobile](#Desenvolvimentodeformuláriomobile-Explorandooinputfilenomobile)\n - 6.2.6 [Formulário único](#Desenvolvimentodeformuláriomobile-Formulárioúnico)\n - 6.2.7 [Anexos de formulário](#Desenvolvimentodeformuláriomobile-Anexosdeformulário)\n - 6.2.8 [Guia de estilos off-line](#Desenvolvimentodeformuláriomobile-Guiadeestilosoff-line)\n - 6.2.9 [Versões mínimas dos browsers suportados](#Desenvolvimentodeformuláriomobile-Versõesmínimasdosbrowserssuportados)\n - 6.2.10 [Atualizar anexos de javascript de formulário mantendo sua versão ao importar para o Eclipse](#Desenvolvimentodeformuláriomobile-AtualizaranexosdejavascriptdeformuláriomantendosuaversãoaoimportarparaoEclipse)\n\n# Formulário *mobile*\n\n---\n\nNo Fluig, é possível movimentar solicitações *workflow*, a partir de aplicativos. Devido a isso, ao salvar um formulário no Fluig, automaticamente o formulário mobile é gerado, de acordo com o mapeamento dos campos do formulário do processo.\n\nApesar do Fluig dispor da geração automática de formulários, existem diversas particularidades para o desenvolvimento de formulário mobile. Estas serão tratadas no decorrer deste guia.\n\n# Recomendações para processos com formulário *mobile*\n\n---\n\n- **Formulário responsivo:** hoje no mercado existem variados tamanhos de telas e resoluções dos dispositivos, por isso qualquer formulário desenvolvido para mobile deve ser responsivo, ou seja, deve se adequar a qualquer tamanho de tela.\n- **Estética:** a aparência visual e design do HTML devem ser atraentes para os usuários, conseguimos isso através de CSS, por isso recomendamos a utilização do Fluig Style Guide.\n- **Usabilidade:** o formulário deve ser fácil de usar, contendo apenas os campos importantes para a tarefa ou processo.\n- **Área de clique:** os elementos do HTML devem estar bem posicionados de forma que facilite a área de clique.\n\n![](../../../images/simula%C3%A7%C3%A3o-forms-mobile(2).png).png)\n\n- **Posicionamento das ações:** as ações mais importantes devem estar posicionadas onde o usuário consegue alcançar facilmente, conforme a imagem abaixo.\n\n![](..\\..\\..\\images\\image2014-6-23%20123259.png)\n\n![](..\\..\\..\\images\\image2014-6-23%2012337.png)\n\n- **Desenvolvimentos:**os desenvolvimentos devem ser feitos dentro dos eventos do processo ou de definições de formulário na Web, todos os eventos que são aplicados nos formulários Web também são aplicados nos formulários mobile. Para mais informações acesse o guia **[Desenvolvimento de Formulários](http://tdn.totvs.com/pages/viewpage.action?pageId=75270483)**.\n- **Acesso a serviços internos**: o acesso a serviços internos pode ser feito através de Datasets via xmlRPC. Para mais informações, **[clique aqui](https://tdn.totvs.com/pages/viewpage.action?pageId=146181573#Desenvolvimentodeformul%C3%A1riomobile-ConsumodeDatasetsviaxmlRPC)**.\n- **Acesso a serviços externos:** recomendamos a utilização de Datasets para acessar serviços externos, esses Datasets são acessados no mobile via xmlRPC conforme descrito acima.\n- **Nem todas informações precisam estar no formulário mobile:** o grande limitador do mobile é o tamanho de tela do dispositivo, por isso mapeie os campos que são mais importantes para que tenham prioridade no formulário. Existem campos que são de teor informativo e sem grande utilidade no processo ou tarefas, estes não precisam ser inclusos no formulário mobile.\n- **Consultas aos datasets via Javascript em eventos para validação de formulários:** não é recomendada a consulta em Datasets dentro dos eventos **[beforeMovementOptions](https://tdn.totvs.com/pages/viewpage.action?pageId=270924158#EventosdeFormul%C3%A1rio-beforeMovementOptions)** e **[beforeSendValidate](https://tdn.totvs.com/pages/viewpage.action?pageId=270924158#EventosdeFormul%C3%A1rio-beforeSendValidate)**, pois cada requisição gera uma atividade assíncrona, cujo tempo de retorno pode interferir na lógica de validação definida.\n- **Carregamento inicial do formulário dentro de Javascript**: dependendo da plataforma e da versão do sistema operacional, o tempo e a ordem de carregamento do formulário a partir de um .js pode resultar em um comportamento diferente do planejado.\n\n```\n$(document).ready(function() { metodoDeCarregamento(); } //código presente em arquivo .js que será executado em tempo de carregamento (load) do mesmo e não do formulário.\n```\n\n- Incluir a função metodoDeCarregamento() dentro de um *timeout*:\n\n```\nsetTimeout(function() { metodoDeCarregamento(); }, 1);\n```\n\n- Usar o método dentro do evento *onload*:\n\n```\n\n```\n\n- **Formulários offline:** para a plataforma Android, o serviço da API pública [/public/ecm/dataset/search](http://fluig.totvs.com/api/public/ecm/dataset/search) não carregará os dados em modo *offline*, quando a requisição for realizada através do método POST.\n- **Eventos de teclado na plataforma Android:** o evento *onkeypress*, atribuído para campos HTML, não é detectado pelo teclado da plataforma Android. Recomendamos utilizar o evento *oninput* e realizar os tratamentos necessários na chamada desse evento.\n\n- A tag possui a capacidade de suportar diferentes tipos de dados, dessa forma, como boa prática quando a mesma for utilizada, o atributo type deve ser definido, por exemplo:\n\n```\n\n```\n\n**Tipos:**Definições de formulário mobile suporta os tipos abaixo:\n\n- text\n- textArea\n- radio\n- select\n- combobox\n- checkbox.\n- email (3)\n- tel (3)\n- range (3)\n- date (3)\n- time (1)(3)\n- week (2)(3)\n- number\n- hidden\n- password\n\n**(1)** Existe um bug no Android Lollipop (5.0) que inviabiliza o uso do tipo *time*. Para mais informações, [clique aqui](https://code.google.com/p/chromium/issues/detail?id=434695);\n\n**(2)** O campo *week* não é suportado pelo iOS;\n\n**(3)** Existe um bug no Android Jelly Bean (4.1, 4.2 e 4.3) que inviabiliza o uso do tipo *select*. Para mais informações, [clique aqui](https://code.google.com/p/android/issues/detail?id=42518#c12), [aqui](http://stackoverflow.com/questions/12090899/android-webview-jellybean-should-not-happen-no-rect-based-test-nodes-found/15153292#15153292) e [aqui](http://stackoverflow.com/questions/13438189/android-webview-in-different-tabs). Como medida de correção, a sugestão é utilizar o componente de Zoom: [Desenvolvimento de Formulários - Zoom](http://tdn.totvs.com/pages/viewpage.action?pageId=75270483#DesenvolvimentodeFormul%C3%A1rios-Zoom).\n\nAtenção\n\nNão está homologada a implementação de evento que utilizem *Gestures* (*swipe*, *longpress*, *tap*, entre outros) em formulário no Fluig Mobile.\n\n# Benefícios\n\n---\n\n**Porque devo usar formulários no mobile?**\n\n- Permite iniciar/movimentar solicitações de qualquer dispositivo móvel, independente de sua localização geográfica;\n- Acesso rápido as informações, mostrando apenas informações mais relevantes;\n- Permite a continuidade do processo, mesmo fora do ambiente empresarial;\n- Através do recurso \"Processo *Off-line*\" é possível preencher informações mesmo sem acesso a internet, para futura sincronização.\n\n# Criando um formulário mobile\n\n---\n\nInformações\n\nAo criar formulários para dispositivos móveis, é importante adotar algumas diretrizes para assegurar uma experiência eficaz para o usuário e garantir que a disposição dos campos e botões não comprometa a usabilidade. Nesse sentido:\n\n- Evite posicionar os botões personalizados do formulário em áreas que concorram com o espaço reservado para o botão flutuante, geralmente utilizado ao acessar um processo ou tarefa. Isso visa garantir que os usuários não enfrentem dificuldades ao inserir dados no formulário.\n- Garanta que os botões e campos do formulário sejam adaptáveis a diferentes tamanhos de tela e orientações, proporcionando uma experiência consistente em diversos dispositivos.\n- Evite sobrecarregar a tela com múltiplos botões inferiores no formulário, dando prioridade à ação principal associada ao botão flutuante. Isso simplifica a interação do usuário, focando na funcionalidade mais relevante.\n\nAtenção!\n\nAo realizar customizações, atente-se para que a renderização seja feita de forma correta em navegadores mobile. A customização deve estar compatível com o Safari para iOS e Chrome para Android.\n\nVersões mínimas de cada plataforma que devem ser consideradas durante o desenvolvimento\n\n| Versão mínima de cada plataforma | Versão mínima de cada browser |\n| --- | --- |\n| Android 4.0 (Ice Cream Sandwich) | Webkit 534.30 |\n| iOS 7 | Mobile Safari 9537.53 |\n\nNo Fluig é possível criar definições de formulários de diferentes maneiras, utilizando o Fluig Studio, através da modelagem de processos *workflow* ou através de upload de formulário na navegação de documentos.\n\nAcompanhe a seguir, movimentando-se pelas abas abaixo, as formas de criação de formulários:\n\nAtenção!\n\nFormulários de processos que possuem versões em rascunho não são carregados quando o usuário está offline (sem conexão com a internet). Somente informações do rascunho do processo são apresentadas.\n\n**Fluig Studio**\n\nPara incluir um novo formulário com suporte a dispositivos móveis, desenvolva um único formulário que atenda todos requisitos para o funcionamento na web e mobile, e realize o procedimento padrão para **[exportação de formulário](https://tdn.totvs.com/pages/viewpage.action?pageId=73894420#Guiar%C3%A1pidodaplataforma-Exportandoumformul%C3%A1rio)**.\n\n**Configuração de formulário mobile em processos**\n\nÉ possível permitir a criação do Formulário mobile também através do **Gerador de Formulário**, conforme os passos abaixo:\n\n**01.** Crie ou edite um processo existente e acionar o item **Formulário**;\n\n![](..\\..\\..\\images\\geracaoFormulario3%20-%20C%C3%B3pia.png)\n\n---\n\n**02.** Selecione a pasta destino onde o formulário será publicado, também atribua um título e descrição. Após isso, clique em **Criar Formulário**;\n\n![](..\\..\\..\\images\\geracaoFormulario2%20-%20C%C3%B3pia.png)\n\n---\n\n**03.**  Inclua os campos e em cada um deles, selecione se este será também adicionado ao formulário para dispositivos móveis, clicando na opção **Formulário Mobile?**.\n\n![](..\\..\\..\\images\\geracaoFormulario.png)\n\nInformação\n\nNem todos os campos mapeados no formulário do processo podem ser mapeados para o formulário em dispositivos m´oveis. Os campos que podem ser mapeados exibem a opção **Formulário mobile?**\n\n**Upload via navegação de documentos**\n\nNo upload via navegação de documentos é feito uma publicação de um formulário único, que deve atender os requisitos de funcionamento para web e mobile.\n\n![](..\\..\\..\\images\\UPLOAD.png)\n\nAtenção\n\nAs definições de formulários geradas pelos métodos de criação acima elencados, precisam ser editados e caso necessite de algum desenvolvimento especial, eles são gerados automaticamente contendo os itens básicos para seu funcionamento.\n\nAtenção\n\nAo contrário da web, o comportamento da função *setHidePrintLink* no mobile não esconde o botão de impressão. Mas também não permite que o usuário efetue a impressão do formulário.\n\n# Carregando dados do dataset em modo o*ffline*\n\n---\n\nPara realizar o carregamento dos dados do dataset em modo *offline* no formulário do processo, é necessário relacionar o dataset ao campo zoom faz uso durante o modo *offline.*Acompanhe a seguir, o procedimento para configuração do carregamento:\n\n**Localizar o formulário**\n\n**01.** Dentro do ECM, localize o formulário que está sendo utilizado no processo e em seguida acione **Propriedades**.\n\n**![](..\\..\\..\\images\\Localizar%20formul%C3%A1rio.png)**\n\n**Datasets do formulário**\n\n**02.** Após clicar nas propriedades do formulário, navegue até a aba **Datasets do Formulário** e relacione o dataset ao qual está sendo utilizado no campo zoom.\n\n![](..\\..\\..\\images\\Datasets%20do%20formul%C3%A1rio.png)\n\nAtenção\n\nApós definir as configurações, é necessário efetuar a limpeza de cache no aplicativo e realizar uma nova consulta.\n\nAcesse nossa documentação e saiba mais sobre como **[Habilitar dataset offline no mobile](https://tdn.totvs.com/pages/viewpage.action?pageId=235598394#Plataforma%E2%9D%99Datasets-Habilitardatasetofflinenomobile)**.\n\n# Desenvolvimento de formulário mobile\n\n---\n\nCom a inclusão de formulários que suportem a visualização em dispositivos móveis, é possível movimentar solicitações *workflow* e realizar o preenchimento das informações de formulários com maior mobilidade e agilidade." }, { "metadata": { "title": "Desenvolvimento de formulário mobile", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=146181573", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Desenvolvimento de formulário mobile.md" }, "content": "Desenvolvimento de formulário mobile\n\n## Funções mobile\n\n---" }, { "metadata": { "title": "Desenvolvimento de widgets mobile", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+widgets+mobile", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Desenvolvimento de widgets mobile.md" }, "content": "Desenvolvimento de widgets mobile\n\n\n# Índice\n\n- 1 [Widgets Mobile](#Desenvolvimentodewidgetsmobile-WidgetsMobile)\n - 1.1 [Recomendações para o desenvolvimento de widgets:](#Desenvolvimentodewidgetsmobile-Recomendaçõesparaodesenvolvimentodewidgets:)\n- 2 [Desenvolvendo widgets com suporte a exibição no Fluig Mobile](#Desenvolvimentodewidgetsmobile-DesenvolvendowidgetscomsuporteaexibiçãonoFluigMobile)\n- 3 [API Pública](#Desenvolvimentodewidgetsmobile-APIPública)\n - 3.1 [Widgets com exibição de iframe em webviews do iOS](#Desenvolvimentodewidgetsmobile-WidgetscomexibiçãodeiframeemwebviewsdoiOS)\n\n# Widgets Mobile\n\nNo Fluig, agora é possível visualizar widgets por meio das páginas, a partir de aplicativos móveis. Porém existem algumas particularidades que precisam ser lembradas para que o usuário tenha uma boa experiência com este recurso.\n\nTodas as interfaces devem ser desenvolvidas nativamente, com exceção da visualização dos widgets da página que será renderizada pelo *webview* nativo da plataforma.\n\nQualquer tipo de autenticação requerido pela widget é de inteira responsabilidade do servidor do Fluig (SSO, por exemplo), o Mobile é apenas responsável por mostrar o HTML retornado pelo servidor no *webview*.\n\nA visualização de páginas e widgets *offline* não é suportada no aplicativo Fluig Mobile.\n\n### Recomendações para o desenvolvimento de widgets:" }, { "metadata": { "title": "Desenvolvimento de widgets mobile", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+widgets+mobile", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Desenvolvimento de widgets mobile.md" }, "content": "Desenvolvimento de widgets mobile\n\n\n1. **HTML Responsivo:** Hoje no mercado existem variados tamanhos de telas e resoluções, por isso qualquer html desenvolvido para Mobile deve ser responsivo, ou seja, deve se ajustar a qualquer tamanho de tela.\n2. **Estética:** A aparência visual e design da widget devem ser atraentes para os usuários, conseguimos isso através de CSS, para isso recomendamos a utilização do [Fluig style guide](http://style.fluig.com).\n3. **Usabilidade:** A widget deve ser fácil de usar, contendo apenas o conteúdo necessário para usuário.\n4. **Área de toque:** Os elementos do html devem estar bem posicionados de forma que facilite a área de toque, pois hoje existem dispositivos que as telas são muito pequenas.\n5. **Posicionamento das ações:**As ações mais importantes devem estar posicionadas onde o usuário consegue alcançar facilmente, conforme a figura:\n\n ![](..\\..\\..\\images\\image2014-6-23%20123259.png)\n\n ![](..\\..\\..\\images\\image2014-6-23%2012337.png)\n6. **Converter widgets já existentes para Mobile :**Para agilizar o desenvolvimento focado em mobile e web é necessário utilizar frameworks que tratam a responsividade, recomendamos a utilização do [Fluig Style Guide](https://style.fluig.com/).\n7. **Elementos Suportados:** Widgets Mobile suportam os tipos: \n 1. text\n 2. textArea\n 3. radio\n 4. select\n 5. combobox\n 6. checkbox.\n 7. email (3)\n 8. tel (3)\n 9. range (3)\n 10. date (3)\n 11. time (1)(3)\n 12. week (2)(3)\n 13. number\n 14. hidden\n 15. password\n\n(1) Existe um bug no Android Lollipop (5.0) que inviabiliza o uso do tipo *time*. Para mais informações, [clique aqui](https://code.google.com/p/chromium/issues/detail?id=434695). \n(2) O campo *week* não é suportado pelo iOS.\n\nNão está homologada a implementação de evento que utilizem Swipe.\n\n# Desenvolvendo widgets com suporte a exibição no Fluig Mobile\n\nCada uma das plataformas utiliza um browser diferente para a renderização de HTML. Esta informação deve ser considerada durante o desenvolvimento para evitar problemas de compatibilidade com os arquivos JavaScript/CSS. A tabela abaixo apresenta a versão mínima dos browsers de cada plataforma que deve ser considerada durante o desenvolvimento:\n\n| Versão mínima da plataforma | Versão mínima do browser |\n| --- | --- |\n| Android 4.0 (Ice Cream Sandwich) | Webkit 534.30 |\n| iOS 7 | Mobile Safari 9537.53 |\n\nPara o desenvolvimento de *widgets* com suporte a dispositivos mobile deve ser adicionado a propriedade **application.mobileapp** no arquivo *[application.info](http://application.info) com o valor **true**.*\n\nEsta propriedade será processada e persistida na base de dados durante o processo de *deploy*do *widget*.\n\n**application.info**\n\n```\napplication.type=widget\napplication.code=news\napplication.title=Not\\u00EDcias da Semana\napplication.description=Exibe uma lista com as \\u00FAltimas not\\u00EDcias da semana\napplication.category=KitIntranet\t\napplication.renderer=freemarker\napplication.icon=icon.png\ndeveloper.code=developer\ndeveloper.name=TOTVS S.A.\ndeveloper.url=http://www.fluig.com\nview.file=view.ftl\nedit.file=edit.ftl\napplication.uiwidget=true\napplication.resource.js.1=/resources/js/news.js\napplication.resource.css.2=/resources/css/news.css\nsimple.deploy=false\napplication.mobileapp=true\n```\n\nA variável booleana **mobileAppMode** no template do FreeMarker determina se a widget está sendo renderizada através de uma requisição do aplicativo mobile. O Fluig irá verificar o *header* User-Agent da requisição e caso seja oriundo do aplicativo mobile o valor da variável **mobileAppMode** será `true`. Através desta variável é possível modificar o comportamento da widget quando renderizada pelo aplicativo mobile. O valor da variável **mobileAppMode** também está disponível via JavaScript através do método **WCMAPI.isMobileAppMode()**.\n\n```\nif (WCMAPI.isMobileAppMode()) {\n this.DOM.find('a').attr('href', '#');\n}\n```\n\n# API Pública\n\nEstá disponível o [serviço na API Pública para realizar a consulta de páginas do Fluig](https://api.fluig.com/resource_PageRest.html#path__2.0_pages_findPages.html). Esta consulta retornará somente as páginas que o usuário tenha permissão de visualização. O retorno do serviço será paginado com uma lista de PageVOs contendo as informações das páginas, entre elas a URL de acesso, URL do ícone, páginas filhas (quando houverem) e se está disponível para o aplicativo mobile. Será possível informar os seguintes filtros:\n\n- **parentPageCode**: Código da página pai. Quando informado, retorna somente as páginas filhas da página informada.\n\n- **isMobile**: Caso informado `true` retorna somente as páginas disponíveis para o aplicativo mobile.\n\n- **pageIndex:**Caso informado, será o *index* da página a ser exibida\n\n- **pageSize:**Caso informado, definirá a quantidade de registros por página.\n\n- **searchLevel:**Caso informado, busca hierarquicamente as páginas filhas .\n\n- **internalPages:**Caso informado true, a consulta de páginas resultará somente em paginas internas da plataforma.\n\n- **filter**: String para filtrar o dados em caso de busca." }, { "metadata": { "title": "Desenvolvimento de widgets mobile", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+widgets+mobile", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Desenvolvimento de widgets mobile.md" }, "content": "Desenvolvimento de widgets mobile\n\n## Widgets com exibição de *iframe* em *webviews* do iOS\n\nO aplicativo do Fluig, em alguns casos, utiliza *webviews* para visualização de páginas. Os *webviews* utilizam como base o navegador padrão do dispositivo, como por exemplo, o Safari quando o dispositivo em questão utiliza o sistema iOS (iPads e iPhones).\n\nQuando o navegador Safari de um dispositivo com sistema iOS encontra um *iframe* dentro da página, ele ajusta a largura do iframe tomando como base a largura do conteúdo exibido dentro do *iframe*, e ignora qualquer parâmetro de largura definido pelo desenvolvedor. Esse comportamento só acontece no navegador Safari (e, portanto, em *webviews* que utilizam o Safari como base) de dispositivos com o sistema iOS.\n\nPara contornar esse comportamento, é necessário desenvolver uma técnica de CSS que ajustará o *iframe* com largura de 100% e altura de 100%, sendo essa altura necessária para compensar a ausência de *scroll* no *iframe*, um parâmetro necessário para o funcionamento da técnica de CSS.\n\n**CSS para iframes no Safari do iOS**\n\n```\n \n```" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\n# Índice\n\n- 1 [Sobre o My Fluig](#GuiadeutilizaçãoMyFluig-SobreoMyFluig)\n - 1.1 [Principais características e benefícios](#GuiadeutilizaçãoMyFluig-Principaiscaracterísticasebenefícios)\n - 1.2 [Pré-requisitos](#GuiadeutilizaçãoMyFluig-Pré-requisitos)\n- 2 [Instalação do My Fluig](#GuiadeutilizaçãoMyFluig-InstalaçãodoMyFluig)\n- 3 [Adicionando conta no My Fluig](#GuiadeutilizaçãoMyFluig-AdicionandocontanoMyFluig)\n- 4 [Utilizando o My Fluig](#GuiadeutilizaçãoMyFluig-UtilizandooMyFluig)\n - 4.1 [Conhecendo o menu principal](#GuiadeutilizaçãoMyFluig-Conhecendoomenuprincipal)\n - 4.2 [Conhecendo a central de tarefas](#GuiadeutilizaçãoMyFluig-Conhecendoacentraldetarefas)\n - 4.3 [Home](#GuiadeutilizaçãoMyFluig-Home)\n- 5 [Documentos](#GuiadeutilizaçãoMyFluig-Documentos)\n - 5.1 [Publicando documentos ou pastas](#GuiadeutilizaçãoMyFluig-Publicandodocumentosoupastas)\n - 5.2 [Mais ações de documentos ou pastas](#GuiadeutilizaçãoMyFluig-Maisaçõesdedocumentosoupastas)\n- 6 [Processos](#GuiadeutilizaçãoMyFluig-Processos)\n - 6.1 [Iniciar solicitações](#GuiadeutilizaçãoMyFluig-Iniciarsolicitações)\n - 6.2 [Movimentar processos](#GuiadeutilizaçãoMyFluig-Movimentarprocessos)\n - 6.2.1 [Adicionar anexos à solicitações](#GuiadeutilizaçãoMyFluig-Adicionaranexosàsolicitações)\n - 6.2.2 [Listagem de anexos do processo](#GuiadeutilizaçãoMyFluig-Listagemdeanexosdoprocesso)\n- 7 [Documentos](#GuiadeutilizaçãoMyFluig-Documentos.1)\n - 7.1 [Publicando documentos ou pastas](#GuiadeutilizaçãoMyFluig-Publicandodocumentosoupastas.1)\n - 7.1.1 [Visualizar documentos](#GuiadeutilizaçãoMyFluig-Visualizardocumentos)\n - 7.1.2 [Aprovar documentos](#GuiadeutilizaçãoMyFluig-Aprovardocumentos)\n- 8 [Páginas](#GuiadeutilizaçãoMyFluig-Páginas)\n- 9 [Substitutos](#GuiadeutilizaçãoMyFluig-Substitutos)\n- 10 [Social](#GuiadeutilizaçãoMyFluig-Social)\n - 10.1 [Acessar Social](#GuiadeutilizaçãoMyFluig-AcessarSocial)\n - 10.2 [Conhecer comunidades](#GuiadeutilizaçãoMyFluig-Conhecercomunidades)\n- 11 [Conexões](#GuiadeutilizaçãoMyFluig-Conexões)\n- 12 [Rascunhos](#GuiadeutilizaçãoMyFluig-Rascunhos)\n- 13 [Configurando o My Fluig](#GuiadeutilizaçãoMyFluig-ConfigurandooMyFluig)\n\n# Sobre o My Fluig\n\n---\n\nCom o aplicativo My Fluig, é possível acessar todos os recursos do Fluig mesmo longe do escritório.\n\nDica!\n\nPara que o aplicativo seja exibido nos idiomas suportados (Inglês, Espanhol e Português) é preciso que a configuração seja feita a partir das configurações de idioma do dispositivo, dessa forma, o aplicativo respeitará o idioma definido no dispositivo." }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n## Principais características e benefícios\n\n---\n\nCom o My Fluig é possível:\n\n- Iniciar solicitações de processos;\n- Executar solicitações;\n- Aprovar documentos;\n- Publicar documentos;\n- Navegação de documentos;\n- Visualização de documentos;\n- Interagir em comunidades e com conexões através de comunidades;\n- Gerenciar favoritos (adicionar, remover e visualizar) em processos, documentos e colaboração (usuários e comunidades);\n- O aplicativo My Fluig é universal, você pode utilizá-lo em smartphones ou tablets. No caso de tablets, o aplicativo é renderizado para melhor uso da área de tela;\n- Mesmo sem conexão com a internet, o aplicativo permite a exibição de informações já visualizadas anteriormente (navegação off-line). Assim que a conexão com a internet for reestabelecida (seja por Wi-Fi ou redes de telefonia móvel), o aplicativo permitirá a utilização dos recursos disponíveis, além de atualizar as informações salvas anteriormente.\n\n## Pré-requisitos" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\n---\n\nO My Fluig possui pré-requisitos de instalação conforme o dispositivo utilizado.\n\n**Android**\n\n| Versões suportadas | Dispositivos suportados | Armazenamento |\n| --- | --- | --- |\n| Android 8.1 ou superior | Smartphones e tablets | Requer cartão de memória disponível no dispositivo |\n\n**iPhone/iPad**\n\n| Versões suportadas | Dispositivos suportados |\n| --- | --- |\n| iOS 14 ou superior | iPhone e iPad |\n\n**Conexão com a internet**\n\nPara instalação e uso do aplicativo My Fluig, é necessária conexão com a internet. Através de plano de dados (3/4G/5G) ou redes Wi-Fi. No caso de uso de plano de dados, taxas podem ser aplicadas.\n\nDica\n\nEntre em contato com sua operadora de telefonia móvel para maiores informações sobre cobrança e limites de tráfego.\n\n**Instalação do aplicativo**\n\nÉ necessário possuir uma conta na loja de aplicativos do dispositivo utilizado, para a instalação do aplicativo My Fluig. Para mais informações sobre criação de contas em loja de aplicativos, entre em contato com o suporte da plataforma utilizada.\n\n# Instalação do My Fluig\n\nO My Fluig, está disponível para as plataformas **iOS** e**Android**, gratuitamente,  na AppStore e na Google Play.\n\n| | |\n| --- | --- |\n\nPara instalação, siga os seguintes passos:\n\n- Acesse pelos botões acima ou abra a loja do dispositivo e procure por My Fluig;\n\n- Toque em **Instalar**;\n\n- Informe seus dados de acesso da respectiva loja, caso necessário;\n- Aguarde o download e instalação.\n\nApós finalizada a instalação, o My Fluig ![](..\\..\\..\\images\\icon.png)está disponível para uso.\n\n# Adicionando conta no My Fluig\n\n---\n\nPara utilização do My Fluig, é necessário adicionar sua conta do TOTVS Fluig  Plataforma.\n\n- Ao iniciar o aplicativo, insira o servidor da empresa que será acessada.\n\nAtenção\n\nÉ necessário informar o endereço do TOTVS Fluig Plataforma (não do TOTVS Identity) no aplicativo para acessá-lo. Em caso de dúvidas procure o administrador da plataforma,.\n\n![](..\\..\\..\\images\\Screenshot_20231019-134746-portrait.png)\n\n- Após informar o servidor, informe o login/e-mail e senha e toque em **Acessar**;\n\n![](..\\..\\..\\images\\Screenshot_20231019-134811-portrait.png)\n\n- Após realizar o login, você será direcionado para a [Central de Tarefas](https://tdn.totvs.com/pages/viewpage.action?pageId=107940624), onde poderá consultar as tarefas e pendências do seu usuário.\n\n![](..\\..\\..\\images\\Screenshot_20231019-143719-portrait.png)\n\n- Caso tenha esquecido sua senha, é possível solicitar uma nova. Basta tocar em **Esqueceu sua senha?**.\n\n- Esse recurso é apresentado ao encerrar a sessão no aplicativo, logo abaixo do campo Senha.\n- Ao inserir o e-mail/login um e-mail é enviado para que a senha seja redefinida.\n\nPara que esse recurso funcione como o esperado, a configuração de e-mails precisa estar habilitada e configurada na plataforma Fluig. Saiba mais em [Configuração de envio de e-mail](../Configuração de envio de e-mail.md).\n\n![](..\\..\\..\\images\\Screenshot_20231019-145327-portrait.png)\n\n# Utilizando o My Fluig\n\n---" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n## Conhecendo o menu principal" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\nApós realizar o login com a sua conta, chegou a hora de conhecer um pouco mais sobre o My Fluig. Vamos começar pelo menu principal? Clicando no ícone de menu ![](..\\..\\..\\images\\flaticon-menu.png) o menu é apresentado com todos os itens de menu. Vamos falar um pouco sobre cada item a diante na documentação.\n\n- **Foto de perfil**: a partir da foto de perfil é possível acessar o perfil do usuário que está com a sessão ativa no aplicativo. Também é possível trocar a foto de perfil a partir do ícone de lápis ![](..\\..\\..\\images\\flaticon-edit.png).\n- **Home**: visualize a página inicial do Fluig com todas as widgets disponíveis para o aplicativo. Pode-se visualizar postagens de documentos em comunidades, posts, artigos, comentários e muito mais.\n- **Documentos**: visualize as pastas e documentos da plataforma na palma da sua mão, além disso, também é possível tomar ações como abrir o documento, renomear, remover, assim como visualizar informações a partir das abas detalhes, documento e social.\n- **Processos**: acesse os processos, inicie solicitações, define um processo como favorito, além de poder torná-lo offline para visualizar suas informações sem conexão com internet.\n- **Central de tarefas**: na central de tarefas você acompanha todas as tarefas e solicitações para o seu usuário, bem como pode visualizar as tarefas em atraso, e conta com o atalho para a pasta Meus documentos (pasta pessoal de cada usuário).\n- **Social**: na parte social do aplicativo, é possível visualizar comunidades, as conexões e a timeline social do aplicativo, onde é possível ver as postagens de outros usuários em comunidades. Também e possível interagir comentando, curtindo e compartilhando a postagem.\n- **Comunidades**: em comunidades é possível visualizar as comunidades em que participa e todas as comunidades, além disso, é possível definir uma comunidade como favorita ou remove-la dos favoritos, também pode acessar ou deixar de participar da comunidade.\n- **Páginas**: em páginas é possível acessar as páginas já criadas na plataforma a partir do aplicativo My Fluig.\n- **Substitutos**: em substitutos é possível acessar o histórico de ações dos substitutos, além disso também é possível adicionar um usuário como seu substituto, acessar a área do usuário que você substitui e acessar as notificações relacionadas as ações de substitutos.\n- **Conexões**: aqui você visualiza as conexões que está seguindo, seus seguidores e todas as conexões. Além disso, é possível pesquisar por uma conexão específica no campo de busca e tomar algumas ações como visualizar o perfil da conexão, definir como favorito e solicitar pedido de conexão.\n- **Rascunhos**: aqui você acessa todos os rascunhos disponíveis, como processos, documentos, social e comentários de documentos.\n\n![](..\\..\\..\\images\\Screenshot_20231027-102723-portrait.png)" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n## Conhecendo a central de tarefas\n\nNo My Fluig, você pode ter acesso a todas as pendências através da **Central de Tarefas**. Conheça cada item da central de tarefas.\n\n- **Tarefas a concluir**: neste atalho da central de tarefas você pode acessas todas as tarefas a concluir que são ordenadas das mais antigas para as mais novas. Além disso, no ícone ![](../../../images/flaticon-more-vert%20(2).png).png)você pode tornar offline as tarefas e fazer movimentação em bloco.\n- **Tarefas em pool**: neste atalho você pode consultar todas as tarefas em pool do seu usuário, que são separadas por Grupos e Papéis. São ordenadas das mais antigas para as mais novas e conta com filtro para selecionar grupos ou papéis específicos.\n- **Solicitações**: neste atalho você acompanha todas as solicitações sob sua gerência e solicitações abertas por você. Também são ordenadas das mais antigas para as mais novas.\n- **Meus documentos**: este atalho dá acesso a pasta Meus documentos, que é uma pasta pessoal e cada usuário tem a sua. Sendo de gerência do próprio usuário. Ao acessar o atalho você pode verificar os documentos pelas abas Para aprovar e Meus documentos.\n- **Aprovação de documentos pendentes**: esse atalho fica na seção Meus documentos e aqui você pode acessar os documentos pendentes de aprovação.\n- **Rascunhos**: quando houver rascunhos ele ficará identificado por uma tarja cinza identificando a quantidade de rascunhos. Clicando nele, é possível tomar as ações para rascunho.\n- **Caixa de saída**: quando houver itens na caixa de saída também ficarão identificados por uma tarja cinza identificando a quantidade de itens na caixa de saída. Clicando nele, é possível tomar as ações para caixa de saída.\n\n![](../../../images/rascunho%20flutter%20my%20fluig_google-pixel4-clearlywhite-portrait%20(1).png).png)\n\n## Home" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\n---\n\nNa home do My Fluig você pode acompanhar todas as notícias, novidades e comunicados importante da sua empresa e tem por objetivo reunir os recursos que são mais utilizados pelas pessoas. É possível definir *widgets* específicos – por exemplo: *widgets* de pendências, documentos populares, mural – que serão exibidas ao acessar a Home, após a autenticação ou a partir da opção Home localizada no menu principal.\n\nTodas essas preferencias devem ser configuradas a partir do TOTVS Fluig Plataforma. Para saber mais detalhes sobre as configurações acesse as documentações [Home](https://tdn.totvs.com/x/Gb7uDQ), [Layout](https://tdn.totvs.com/x/sYP5DQ) e [Widgets](https://tdn.totvs.com/x/qYP5DQ).\n\nJá no aplicativo você pode tomar algumas ações nas postagens disponíveis como apoiar, comentar, compartilhar e ser notificado.\n\n# Documentos\n\n---\n\nNo My Fluig, você pode acessar a navegação de documentos através da opção **Documentos** do Menu Principal. Nesta opção você pode ter acesso aos documentos e pastas publicados no TOTVS Fluig Plataforma que seu usuário tenha permissão.\n\n## Publicando documentos ou pastas" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\nVeja abaixo como você pode publicar documentos como imagens ou arquivos em pastas que seu usuário possui permissão.\n\nNavegue até a pasta que deseja publicar a imagem.\n\n![](..\\..\\..\\images\\Screenshot_20231030-095706-portrait.png)\n\nExistem duas opções disponíveis para publicação na parte inferior da tela:\n\n- **Nova Pasta:** Cria uma pasta, antes de sua criação você atribui um nome para ela.\n- **Novo Documento**: Permite publicar uma foto ou arquivos existentes no seu dispositivo, ou tirar uma foto para publicar naquele momento.\n\nA opção **Novo Documento** só é apresentada habilitada ao acessar uma pasta. Pois não é possível adicionar um documento fora da estrutura de pastas. Para mais detalhes acesse o guia [Documentos](https://tdn.totvs.com/x/7e-uDQ).\n\n![](..\\..\\..\\images\\Screenshot_20231030-101138-portrait.png)![](../../../images/Screenshot_20231030-102406%20(1)-portrait.png)-portrait.png)\n\nAtenção\n\nQuando o usuário não tem permissão para publicar documentos ou pastas, os botões **Novo Documento** e **Nova Pasta** ficam desabilitados. Também é necessário que o dispositivo possua um aplicativo de galeria multimídia para importação de imagens através do botão Novo Documento, sendo nativo do sistema ou não.\n\nNo menu contextual da pasta você pode realizar as seguintes ações:\n\n- **Novo d****ocumento**: Incluir uma nova imagem.\n- **Nova pasta**: Incluir uma nova pasta dentro da pasta acessada (subpasta).\n- **Renomear**: Renomear a pasta corrente.\n- **Remover**: Remover a pasta corrente.\n\n![](..\\..\\..\\images\\Screenshot_20231030-102853-portrait.png)\n\nAtenção\n\nAlém dos recursos principais no menu contextual, também é possível adicionar a pasta aos favoritos tocando no ícone em formato de estrela.\n\nA publicação de documentos por meio do My Fluig é possível através do recurso **Enviar** para ou **Compartilhar ![](..\\..\\..\\images\\flaticon-share.png)** presente nos dispositivos mobile. (Sendo os documentos com formatos suportados pelo TOTVS Fluig Plataforma).\n\n- Selecione o documento ao qual será publicado no My Fluig e toque em \"Enviar Para\" ou \"Compartilhar\" (dependendo do dispositivo).\n- Toque no aplicativo My Fluig.\n\nO documento será publicado na pasta escolhida.\n\n![](..\\..\\..\\images\\compartilhar001.png)![](..\\..\\..\\images\\escolherapp001.png)![](..\\..\\..\\images\\publicar001.png)" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n## Mais ações de documentos ou pastas" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\nVeja abaixo como fazer as outras ações disponíveis para documentos e pastas no My Fluig.\n\n- Acesse o item de menu **Documentos**;\n- O diretório com as pastas será apresentado. Na pasta escolhida toque em **Apoiar**. Ao apoiar uma pasta ela fica identificada pelo ícone ![](..\\..\\..\\images\\flaticon-like.png).\n\n![](../../../images/oie_transparent%20(62).png).png)\n\n- Na pasta escolhida toque em **Comentar**;\n- A tela para inserir o comentário será aberta, insira o comentário e toque em **Publicar**.\n\nPasta com comentário tem identificação do ícone ![](..\\..\\..\\images\\fluigicon-discuss.png)\n\nCaso a pasta já tenha comentários, será exibido os demais comentários.\n\nO comentário é limitado a dez mil (10.000) caracteres.\n\n![](../../../images/oie_transparent%20(62).png).png)\n\n- Na estrutura raiz de pastas toque no botão **Nova pasta**;\n- Insira uma descrição para a pasta e toque em **Confirmar**.\n\nTambém é possível adicionar uma nova pasta através do ícone ![](..\\..\\..\\images\\fluigicon-list-dropdown.png) > **Nova pasta**.\n\n![](../../../images/Screenshot_20231030-102406%20(1)-portrait.png)-portrait.png)\n\n- Acesse a pasta na qual o documento que deseja apoiar está localizado;\n- Ao localizar o documento toque em **Apoiar**.\n\nOs documentos apoiados são identificados pelo ícone ![](..\\..\\..\\images\\flaticon-like.png).\n\n![](..\\..\\..\\images\\Screenshot_20231030-154604-portrait.png)\n\n- Acesse a pasta na qual está o documento a ser comentado;\n- Localize o documento a ser comentado;\n- Toque em **Comentar**;\n- Insira o comentário e toque em **Publicar**;\n\nDocumento com comentário tem identificação do ícone ![](..\\..\\..\\images\\fluigicon-discuss.png)\n\nCaso o documento já tenha comentários, será exibido os demais comentários.\n\nO comentário é limitado a 10.000 caracteres.\n\n![](..\\..\\..\\images\\Screenshot_20231030-155305-portrait.png)\n\nAo acessar o documento é apresentada três ações que vamos detalhar abaixo:\n\n- Localize na estrutura de pastas em qual pasta está localizado o documento que deseja acessar;\n- Toque sobre o documento para abrir as ações: **Abrir documento**, **Renomear** e **Remover**.\n - **Abrir documento**: abre o documento para visualização;\n - **Renomear**: abre para renomear o documento acessado;\n - **Remover**: abre para remover o documento.\n\nAlém disso, são apresentadas três abas na parte inferior da tela onde também é possível acessar alguns detalhes. As abas são:\n\n- **Documento**: é aberta por padrão trazendo as informações acima;\n- **Detalhes**: apresentada as informações do documento como quem publicou, o identificador, descrição e versão do documento. Além de apresentar a opção Enviar por e-mail;\n- **Social**: apresentada as informações da parte social do documento, como os apoios e comentários do documento.\n\nTambém é possível definir o documento como favorito através do ícone de estrela![](..\\..\\..\\images\\flaticon-star.png).\n\n![](..\\..\\..\\images\\Screenshot_20231030-161510-portrait.png)\n\n- Na pasta na qual deseja adicionar o documento toque no botão Novo documento ou toque no ícone ![](..\\..\\..\\images\\fluigicon-list-dropdown.png). Ambas opções abrem para adicionar o documento;\n- Defina entre **Adicionar da biblioteca** para adicionar documentos a partir da biblioteca do dispositivo ou **Adicionar da câmera** para adicionar uma imagem diretamente na câmera do dispositivo.\n\n![](..\\..\\..\\images\\Screenshot_20231030-101138-portrait.png)\n\n# Processos\n\n---" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n## Iniciar solicitações\n\nAtravés do My Fluig, você pode iniciar todos os processos que estão disponíveis no seu TOTVS Fluig Plataforma.\n\n- No menu principal, selecione **Processos**;\n\n![](..\\..\\..\\images\\Screenshot_20231027-102723-portrait.png)\n\n- Todos os processos serão exibidos separados por categorias;\n\n![](..\\..\\..\\images\\Screenshot_20231108-150201-portrait.png)\n\n- Ao tocar em um processo da lista, o formulário do processo será exibido na aba **Formulário**. Na aba **Decisão** é possível preencher as informações do processo e enviar o processo para a próxima fase. Além disso também é possível acessar a aba **Anexos** e visualizar os anexos do processo, assim como adicionar novos anexos (caso possua permissão para isso).\n\nCom o processo aberto também é possível acessar mais algumas informações no ícone ![](../../../images/flaticon-more-vert%20(2).png).png) como:\n\n- **Visualizar fluxo**: visualiza o fluxograma do processo (desenho);\n- **Imprimir**: imprime o processo;\n- **Anexar**: permite anexar arquivos no processo através do ECM, câmera, galeria e arquivo do dispositivo.\n\nAo lado direito no nome do processo é possível tomar mais ações através do ícone ![](../../../images/flaticon-more-vert%20(2).png).png)que abre as seguintes ações:\n\n- **Favoritar**: define o processo como favorito;\n- **Tornar disponível offline**: define o processo como offline, podendo acessá-lo sem conexão com a internet;\n- **Iniciar solicitação**: inicia a solicitação do processo preenchendo as informações do processo.\n\n![](..\\..\\..\\images\\Screenshot_20231108-153541-portrait.png)![](..\\..\\..\\images\\Screenshot_20231108-153857-portrait.png)\n\n## Movimentar processos" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\nAtravés do My Fluig, você pode movimentar os processos disponíveis no Fluig Plataforma para seu usuário.\n\n- No menu principal, toque em **Central de Tarefas**.\n\n![](..\\..\\..\\images\\menufluigmobile.png)\n\nNa Central de Tarefas toque na opção **Tarefas a Concluir**\n\n![](..\\..\\..\\images\\Screenshot_20231127-123949-portrait.png)\n\nSerão exibidos todas as solicitações que estão pendentes para o usuário que está acessando o aplicativo.\n\nAtenção\n\nPara encontrar com mais facilidade as solicitações é possível ordenar pelas solicitações mais novas ou mais antigas.\n\nAo tocar uma solicitação da lista de tarefas a concluir, será exibido os dados deste solicitação. Os dados são dividido em:\n\n- **Formulário**: visualize e preencha o formulário;\n- **Decisão**: selecione a atividade destino, bem como o usuário responsável (se necessário);\n- **Histórico**: visualize o histórico do processo;\n- **Anexos**: adicione, remova anexos, ou publique no ECM (de acordo com a segurança definida no processo).\n\nPara visualizar as demais ações da solicitação toque no ícone ![](../../../images/flaticon-more-vert%20(2).png).png)para abrir as opções abaixo:\n\n- **Visualizar fluxo**: visualize o fluxo do processo;\n- **Imprimir**: imprima a solicitação;\n- **Anexar**: anexe um documento.\n\n![](..\\..\\..\\images\\Screenshot_20231127-124449-portrait.png)\n\nPara movimentar a solicitação, após preencher todas informações, é necessário acionar o botão **Enviar**.\n\n![](..\\..\\..\\images\\Screenshot_20231127-125149-portrait.png)\n\n### Adicionar anexos à solicitações" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\nAtravés do My Fluig, você pode adicionar anexos nas solicitações. Acompanhe abaixo:\n\n \n\nCom a solicitação escolhida aberta, toque no ícone ![](../../../images/flaticon-paperclip%20(1).png).png) e escolha entre as opções apresentadas:\n\n- **ECM**: possível selecionar um arquivo já publicado no Fluig como anexo;\n- **Câmera**: permite adicionar um arquivo diretamente da câmera do dispositivo;\n- **Galeria**: permite adicionar um arquivo a partir da galeria do dispositivo;\n- **Arquivo do dispositivo**: permite adicionar um arquivo das demais pastas de arquivo do dispositivo.\n\n![](..\\..\\..\\images\\Screenshot_20231127-130645-portrait.png)\n\n### Listagem de anexos do processo\n\nAbaixo você pode acompanha como visualizar e editar todos os anexos de uma solicitação.\n\nCom a solicitação aberta, toque na aba **Anexos**.\n\n![](..\\..\\..\\images\\Screenshot_20231127-132558-portrait.png)\n\nNa listagem de anexos, é possível visualizar, renomear ou excluir anexos. Veja abaixo:\n\n**Visualizar documento**: toque no anexo para visualizar ou toque no ícone ![](../../../images/flaticon-more-vert%20(2).png).png)e depois em Visualizar documento.\n\n**Renomear documento**: toque no ícone ![](../../../images/flaticon-more-vert%20(2).png).png)e depois em Renomear documento.\n\n**Excluir documento**: toque no ícone![](../../../images/flaticon-more-vert%20(2).png).png)e depois em Excluir documento.\n\nUma mensagem confirmando a ação será apresentada, toque em Excluir para concluir a ação de exclusão.\n\n![](..\\..\\..\\images\\Screenshot_20231127-132906-portrait.png)\n\n# Documentos\n\n---\n\nNo My Fluig, você pode acessar a navegação de documentos através da opção **Documentos** do menu principal. Nesta opção é possível ter acesso aos documentos e pastas publicados no TOTVS Fluig Plataforma que seu usuário tenha permissão.\n\n## Publicando documentos ou pastas" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\nVeja abaixo como publicar documentos em pastas que seu usuário possua permissão.\n\n- No menu principal toque em **Documentos**;\n- Navegue e acesse a pasta em que deseja publicar o documento;\n- Toque no ícone ![](..\\..\\..\\images\\fluigicon-list-dropdown.png) e depois em Novo documento;\n- Duas opções de inclusão serão apresentadas:\n - **Adicionar da biblioteca**: permite adicionar um documento da biblioteca do dispositivo.\n - **Adicionar da câmera**: permite adicionar um documento diretamente da câmera do dispositivo.\n- Selecione o documento que deseja adicionar e toque na opção de confirmação do seu dispositivo.\n\nUma mensagem informando que o documento está sendo enviado para a pasta escolhida será apresentada e logo depois o documento é apresentado na lista de documentos da pasta.\n\n![](..\\..\\..\\images\\Screenshot_20231127-134440-portrait.png)\n\nPara publicar pastas, o processo é praticamente o mesmo de publicar documentos. Siga os passos abaixo:\n\n- No menu principal toque em **Documentos**;\n\nÉ possível publicar pastas na raiz da navegação dos documentos.\n\n- Para isso, toque no ícone ![](../../../images/oie_transparent%20(68).png).png) e depois em **Nova pasta**.\n- Insira o nome da pasta e toque em **Confirmar**.\n\nPara publicar uma nova pasta, dentro de outra pasta já existentes siga os passos abaixo:\n\n- Dentro da pasta na qual deseja publicar uma outra pasta (subpasta) toque no ícone ![](../../../images/oie_transparent%20(68).png).png) e depois em **Nova pasta**.\n- Insira o nome da pasta e toque **Confirmar**.\n\n![](..\\..\\..\\images\\Screenshot_20231127-135413-portrait.png)![](..\\..\\..\\images\\Screenshot_20231127-135434-portrait.png)\n\n**Primeira imagem na criação de pasta na raiz da navegação**. **Segunda imagem na criação de pasta dentro de uma outra pasta**.\n\n \n\n### Visualizar documentos" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\nPara visualizar documentos no My Fluig siga os passos abaixo:\n\n- No menu principal, toque em **Documentos**;\n- Localize e acesse a pasta na qual deseja visualizar o documento;\n- Toque no documento. Será feito o dowload do documento se necessário;\n- Um menu com opções será apresentado, toque em Abrir documento;\n- Escolha qual aplicativo irá abrir o documento para visualização;\n- O documento será aberto para visualização.\n\nAs demais opções do menu apresentado são:\n\n**Aba documentos**\n\n- **Abrir documento**: permite abrir o documento via aplicativo escolhido para visualização do documento;\n- **Renomear**: permite renomear o documento;\n- **Remover**: permite remover o documento.\n\n**Aba detalhes**\n\n- **Enviar por e-mail**: permite permite enviar os detalhes do documento por e-mail;\n\n**Aba social**\n\n- **Comentar**: permite visualizar e adicionar comentários ao documento.\n\n![](..\\..\\..\\images\\Screenshot_20231127-141022-portrait.png)![](..\\..\\..\\images\\Screenshot_20231127-141330-portrait.png)![](..\\..\\..\\images\\Screenshot_20231127-142631-portrait.png)![](..\\..\\..\\images\\Screenshot_20231127-141403-portrait.png)\n\n \n\n### Aprovar documentos" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\nVeja abaixo como aprovar documentos que estão pendentes para seu usuário.\n\n- No menu principal, selecione **Central de Tarefas**:\n- Toque em **Meus documentos**.\n- Uma listagem de documentos será aberta. Para visualizar os documentos para aprovar, toque na aba **Para aprovar**;\n- Toque no documento para abri-lo ou toque no ícone ![](../../../images/flaticon-more-vert%20(2).png).png)e depois em **Aprovar**;\n- Insira uma observação caso necessário, e toque em Confirmar.\n\nO documento será aprovado com sucesso.\n\n![](..\\..\\..\\images\\Screenshot_20231019-143719-portrait.png)![](..\\..\\..\\images\\Screenshot_20231127-143803-portrait.png)![](..\\..\\..\\images\\Screenshot_20231127-143821-portrait.png)\n\n# Páginas\n\n---\n\nVisualize as páginas no My Fluig.\n\n- No menu principal toque em Páginas;\n- A lista de páginas será apresentada. Toque na página que deseja acessar;\n\nSomente widgets habilitadas para visualização no mobile são exibidas.\n\n# Substitutos\n\n---\n\nA funcionalidade de usuário substituto possibilita que, por determinado período, um usuário (substituto) possa realizar as tarefas de outro usuário (substituído). Através do My Fuig é possível adicionar e acessar as pendencias do usuário que você substitui, assim como definir usuários para serem seus substitutos.\n\n- No menu principal toque em Substitutos;\n- A tela de substitutos será apresentada com os substitutos definidos, se houver.\n\n- Com a tela de substitutos aberta toque no ícone![](..\\..\\..\\images\\flaticon-add-plus.png);\n- Toque no campo **Nome do substituto**;\n- A lista de usuários será apresentada;\n- Toque no usuário que deseja definir como seu substituto;\n- Toque em **Concluir**.\n- Após toque em **Avançar** localizado ao lado direito superior da tela;\n- Em **Período da substituição** defina o período de inicio e fim da substituição.\n- Toque em Avançar;\n- No campo Substituir em todos os processos é possível definir se o usuário substituto ficará responsável por todos os processos durante o período da substituição;\n\nCaso este botão não seja habilitado, no campo abaixo (selecionar processo) é possível definir quais processos o usuário que será seu substituto ficará responsável.\n\n- Após essa configuração Toque em **Salvar**.\n\nApós a configuração, a última tela apresenta o usuário que será seu substituto e as informações de período e processos.\n\n![](..\\..\\..\\images\\Screenshot_20231128-180922-portrait.png)![](..\\..\\..\\images\\Screenshot_20231128-181413-portrait.png)![](..\\..\\..\\images\\Screenshot_20231128-182258-portrait.png)![](..\\..\\..\\images\\Screenshot_20231128-182555-portrait.png)\n\n- Com a tela de substituto aberta toque no substituto que deseja editar;\n- É possível trocar o usuário substituto, mudar o período da substituição e mudar as configurações do processo.\n\n- Com a tela de substituto aberta toque no substituto que deseja remover;\n- Toque no ícone![](..\\..\\..\\images\\flaticon-trash.png);\n- Uma mensagem confirmando a ação será apresentada, toque em **Remover**.\n\n![](..\\..\\..\\images\\Screenshot_20231128-183723-portrait.png)\n\n# Social\n\n---" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n### Acessar Social\n\nAtravés do My Fluig, você pode se comunicar com os colaboradores e com a comunidades de sua empresa. Veja abaixo:\n\n- No menu principal toque em **Social**;\n- A parte social do aplicativo será aberta, apresentando as publicações em comunidades, artigos e comentários;\n\n![](..\\..\\..\\images\\Screenshot_20231127-151048-portrait.png)\n\nVisualize as notificações recebidas para curtidas, comentário de publicação, pedido de relacionamento, movimentação de processos, aprovação de documentos e etc.\n\n- Toque no ícone de notificações do aplicativo localizado na parte superior direita da tela.\n- As notificações serão exibidas na tela.\n\n![](..\\..\\..\\images\\Screenshot_20231127-151454-portrait.png)\n\n### Conhecer comunidades" }, { "metadata": { "title": "Guia de utilização My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107940624", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig.md" }, "content": "Guia de utilização My Fluig\n\n\nAcompanhe as novidades das comunidades na qual você participa no My Fluig.\n\n- No menu principal toque em **Comunidades**;\n- As comunidades são apresentadas em duas abas distintas: **Participando** e **Todas**;\n\nA aba **Participando** é exibida primeiramente por padrão.\n\n- Toque em **Todas** para visualizar todas as comunidades existentes na empresa;\n\n![](..\\..\\..\\images\\Screenshot_20231127-154744-portrait.png)\n\n- No menu principal toque em **Comunidades**;\n- Toque em **Todas** para visualizar todas as comunidades existentes na empresa e escolha qual comunidade deseja participar;\n- Toque no ícone ![](../../../images/flaticon-more-vert%20(2).png).png)e depois em **Participar**. Ou toque no botão verde **Participar**.\n\n![](..\\..\\..\\images\\Screenshot_20231127-155353-portrait.png)\n\n- No menu principal toque em **Comunidades**;\n- Toque na comunidade que deseja acessar;\n- A comunidade será apresentada para visualização de seu conteúdo;\n\nOutra forma de acessar uma comunidade é tocar no ícone ![](../../../images/flaticon-more-vert%20(2).png).png)e depois em **Acessar comunidade**.\n\n![](..\\..\\..\\images\\Screenshot_20231127-160003-portrait.png)![](../../../images/oie_transparent%20(64).png).png)\n\nÉ possível definir como favoritas as comunidades que seu usuário mais acessa. Essas comunidades ficam identificadas pelo ícone de estrela. É possível remover as comunidades definir como favoritas em qualquer momento conforme a necessidade do usuário.\n\n- No menu principal toque em **Comunidades**;\n- Toque na comunidade que deseja definir como favorita;\n- Toque no ícone ![](../../../images/flaticon-more-vert%20(2).png).png) e depois em **Favoritar**.\n\nNote que ao definir uma comunidade como favorita ela ficará identificada como na imagem a seguir: ![](../../../images/oie_transparent%20(66).png).png)\n\n![](../../../images/oie_transparent%20(65).png).png)\n\n- Para remover uma comunidade dos favoritos toque no ícone ![](../../../images/flaticon-more-vert%20(2).png).png)e depois em **Remover favorito**.\n\n# Conexões\n\n---\n\nVeja suas conexões e as conexões que ainda não segue de forma simples e rápida. Veja abaixo como é prático:\n\nAs conexões são compostas por contatos que seu usuário tem relacionamento. Essa sessão fica em três abas distintas: Seguindo, Seguidores e Todas.\n\n- **Seguindo:** mostra todas as conexões que seu usuário segue;\n- **Seguidores:** mostra todas as conexões que são seus seguidores, ou seja, usuários que seguem você;\n- **Todas:** todas as conexões da empresa são apresentadas.\n\n![](../../../images/oie_transparent%20(72).png).png)\n\n- No menu principal toque em **Conexões**;\n- A tela de conexões será apresentada. A aba seguindo é apresentada primeiramente por padrão.\n\nPara acessar uma conexão em qualquer uma das abas o processo é o mesmo.\n\n- Localize a conexão que deseja acessar e toque sobre ela. O perfil da conexão escolhida será apresentado. Também é possível clicar no ícone ![](../../../images/flaticon-more-vert%20(2).png).png) e depois em **Visitar perfil**.\n\n![](..\\..\\..\\images\\Screenshot_20231128-165124-portrait.png)![](../../../images/oie_transparent%20(67).png).png)\n\n- Siga todos os passos do item **Acessar conexões**;\n- Na aba Todas toque sobre o botão **Seguir**;\n\nApós realizar o pedido para seguir a conexão, ao lado do nome da conexão fica o indicativo (solicitado).\n\n![](..\\..\\..\\images\\Screenshot_20231128-165124-portrait.png)\n\n- Para deixar de seguir uma conexão localize a conexão desejada;\n- Toque no ícone ![](../../../images/flaticon-more-vert%20(2).png).png) e depois em **Deixar de seguir**.\n\n- Escolha a conexão que deseja definir como favorita;\n- Toque no ícone ![](../../../images/flaticon-more-vert%20(2).png).png) ao lado do nome da conexão;\n- Toque em **Favoritar**;\n\nNote que ao definir uma conexão como favorita ela ficará identificada pelo ícone de estrela conforme imagem abaixo.\n\n![](..\\..\\..\\images\\Screenshot_20231128-170857-portrait.png)\n\n- Para remover uma conexão dos favoritos localize a conexão desejada;\n- Toque no ícone ![](../../../images/flaticon-more-vert%20(2).png).png) e depois em **Remover favorito**.\n\n# Rascunhos\n\n---\n\nPara acessar os rascunhos, siga os passos abaixo:\n\n- No menu principal toque no item **Rascunhos**, disponível no menu principal do aplicativo.\n\n![](..\\..\\..\\images\\rascunhos.png)\n\n- Os rascunhos foram criados para evitar que o usuário perca informações quando o dispositivo não está mais conectado à internet, ou perdeu a conexão momentaneamente. Desta forma, é possível salvar no dispositivo a ação que estava sendo realizada, para quando a conexão for restabelecida seja possível enviar as informações novamente, evitando retrabalho. É possível armazenar rascunhos de processos, documentos e colaboração: \n \n - **Processos**: novas solicitações ou movimentação de solicitação (execução de atividades);\n - **Documentos**: publicação de documentos;\n - **Colaboração**: novas publicações e comentários de publicação\n\nAtenção\n\nAo salvar o rascunho de uma solicitação através My Fluig, os dados informados são armazenados no próprio dispositivo e não são enviados ao servidor do Fluig até que seja acionado o botão **Enviar**. Este comportamento difere do Fluig Plataforma acessado via navegador *web*, onde o envio dos dados da solicitação para o servidor é realizado assim que o botão **Salvar** é acionado.\n\nIsso significa, por exemplo, que ao salvar o rascunho de uma nova solicitação via Mobile, ela não será iniciada, enquanto que na *web*, algumas informações, como o número da solicitação, são gerados já no momento em que a solicitação é salva.\n\n# Configurando o My Fluig\n\n---\n\nSiga os passos abaixo para configurar preferências do aplicativo.\n\n- Toque no ícone ![](..\\..\\..\\images\\flaticon-settings.png) localizado ao lado direito do nome do usuário;\n- Toque em **Configurações do aplicativo**. As seguinte informações são apresentadas:\n - **Qualidade da imagem**: defina a qualidade da imagem entre baixa, média e alta.\n - **LED**: defina entre habilitado ou desabilitado.\n - **Cache**: utilizado para a limpeza do cache. (Essa opção limpa os dados de documentos e imagens)\n\n- Toque no ícone ![](..\\..\\..\\images\\flaticon-settings.png) localizado ao lado direito do nome do usuário;\n- Toque em Gerenciar contas;\n - **Cache**: defina a frequência entre 1 minuto, 5 minutos, 10 minutos, 30 minutos e 1 hora no qual será feito o salvamento das informações em cache.\n - **Mostrar notificações**: defina se deseja receber notificações.\n - **Download de documentos favoritos**: defina entre Habilitado (somente wi-fi) ou Desabilitado.\n - **Sincronização automática de processos**: defina a frequência com que a sincronização automática será feita entre 1 hora, 30 minutos, 15 minutos, 5 minutos e Desabilitado.\n - **Sincronização diária de processos offline**: defina a frequência da sincronização entre Desabilitado, Via wi-fi e Via wi-fi ou rede de dados.\n - **Tema**: Escolha um tema entre as cores verde, amarelo, cinza, laranja e rosa.\n - **Tela inicial configurada pelo administrador**: essa opção é exibida somente para informar qual foi a página inicial que o usuário administrador da empresa configurou.\n - **Habilitar o novo social**: define entre Habilitado ou Desabilitado.\n - **Cache**: defina a frequência para a limpeza do cache. (Essa opção limpa os dados de documentos e imagens)\n\n- **Informações legais**: informações legais do aplicativo My Fluig.\n- **Política de privacidade**: política de privacidade do aplicativo My Fluig.\n- **Termos de uso**: termos de uso do aplicativo My Fluig.\n\nCaso a rotação de tela do dispositivo estiver habilitada, o My Fluig respeitará essa condição rotacionando suas telas. Porém este não é um comportamento homologado e recomendamos que o uso do aplicativo seja feito com o dispositivo na vertical." }, { "metadata": { "title": "iOS", "source": "https://tdn.totvs.com/display/fluig/iOS", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\iOS.md" }, "content": "iOS\n\n\nAqui você encontra todas as documentações do Fluig Mobile que são destinadas aos dispositivos com sistema operacional iOS.\n\n---\n\n- [iOS - Como realizar o login no Fluig Mobile?](iOS/iOS - Como realizar o login no Fluig Mobile.md)\n- [iOS - Como utilizar os componentes Leitura de código de barras e QR Code?](iOS/iOS - Como utilizar os componentes Leitura de código de barras e QR Code.md)" }, { "metadata": { "title": "Personalização da tela inicial do My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=198938892", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Personalização da tela inicial do My Fluig.md" }, "content": "Personalização da tela inicial do My Fluig" }, { "metadata": { "title": "Personalização da tela inicial do My Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=198938892", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Personalização da tela inicial do My Fluig.md" }, "content": "Personalização da tela inicial do My Fluig\n\n\n# Índice\n\n- 1 [Objetivo](#PersonalizaçãodatelainicialdoMyFluig-Objetivo)\n- 2 [Configurando tela inicial do My Fluig](#PersonalizaçãodatelainicialdoMyFluig-ConfigurandotelainicialdoMyFluig)\n\n# Objetivo\n\nO objetivo deste guia é apresentar o passo a passo necessário para personalizar a tela inicial do My Fluig.\n\n# Configurando tela inicial do My Fluig\n\n---\n\nPara maior personalização do aplicativo Fluig, é possível configurar a tela inicial do aplicativo. Para realizar esta alteração realize os seguintes passos:\n\n**01.** Efetue a autenticação no Fluig Plataforma utilizando o usuário **wcmadmin**, e então acesse **Painel de Controle  ► WCM ► Empresas**.\n\n**02.** Selecione a empresa que deseja alterar a tela inicial do aplicativo e então clique em **Editar**.\n\n**03.** A tela de edição de empresa será apresentada. Clique no botão **Cadastrar dados adicionais**.\n\n**04.** A tela de dados adicionais da empresa será apresentada. No campo **Chave**informe o valor **startScreen**e no campo **Valor**informe:\n\n- PROCESS:  Se você deseja que a tela inicial seja a inicialização de processos.\n- SOCIAL: Se você deseja que a tela inicial  seja a timeline.\n- DOCUMENT: Se você deseja que a tela inicial  seja a navegação de documentos.\n- HOMEAPP: Define que a home do aplicativo será exibida como tela inicial.\n- TASKS: Se você deseja que a tela inicial  seja a central de tarefas.\n- COMMUNITY:ALIAS\\_DA\\_COMUNIDADE : Se você deseja que a tela inicial seja uma comunidade, o parâmetro ALIAS\\_DA\\_COMUNIDADE deve ser preenchido e válido para direcionar para comunidade correta.\n- PAGE:IDENTIFICADOR\\_UNICO : Se você deseja que a tela inicial seja uma página, o parâmetro IDENTIFICADOR\\_UNICO deve ser preenchido e válido para direcionar para página correta.\n\n**05.** Clique no botão **Salvar** para salvar os dados adicionais. O item **startScreen**será adicionado na listagem de dados adicionais da empresa\n\n![](..\\..\\..\\images\\startscreen.png)\n\n**06.** Clique no botão **Salvar** para salvar as alterações na empresa e efetivar a alteração da tela inicial do aplicativo.\n\nQuando funciona?\n\nA alteração terá efeito após a segunda utilização do aplicativo ou ao cadastrar a empresa novamente.\n\nQuero voltar ao que era antes\n\n1. A home padrão do aplicativo será definida nos casos onde o parâmetro starscreen não esteja configurado e a página home da plataforma Fluig não possua widgets com visualização suportada no mobile ativada.\n2. Para que a home da plataforma seja definida como tela inicial, basta remover o parâmetro startScreen e adicionar a visualização no mobile em pelo menos uma widget que contém essa opção.\n3. Caso deseje voltar a utilizar outras páginas como home no aplicativo, basta passar alguns dos parâmetros informados no **passo 04** do item **Configurar tela inicial do My Fluig**." }, { "metadata": { "title": "Protocolo fluig://", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=240309710", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Protocolo fluig.md" }, "content": "Protocolo fluig://" }, { "metadata": { "title": "Protocolo fluig://", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=240309710", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Protocolo fluig.md" }, "content": "Protocolo fluig://\n\n\n# Índice\n\n- 1 [Objetivo](#Protocolofluig://-Objetivo)\n- 2 [Definições Gerais](#Protocolofluig://-DefiniçõesGerais)\n- 3 [Como abrir aplicativos externos pelo Fluig](#Protocolofluig://-ComoabriraplicativosexternospeloFluig)\n - 3.1 [Telefone e Email](#Protocolofluig://-TelefoneeEmail)\n- 4 [Geolocalização](#Protocolofluig://-Geolocalização)\n - 4.1 [Geolocalização com o aplicativo Waze](#Protocolofluig://-GeolocalizaçãocomoaplicativoWaze)\n\n# Objetivo\n\nO objetivo deste guia é detalhar as formas de interação com o aplicativo Fluig mobile através do URL *scheme* \"fluig://\", bem como a utilização de outros *schemes* a partir do próprio aplicativo. Desta forma, é possível realizar a abertura de recursos do Fluig Plataforma em interface nativa do aplicativo e habilitar a utilização de outros serviços, por exemplo: em um formulário, por meio de geolocalização, realizar a abertura de um aplicativo de mapas.\n\nPara mais informações, as documentações referentes a cada plataforma encontram-se nos seguintes *links*: [Apple](https://developer.apple.com/library/mac/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html), [Google](https://developer.android.com/guide/components/intents-common.html), [Microsoft](https://msdn.microsoft.com/pt-br/library/windows/apps/jj662937(v=vs.105).aspx).\n\nAtenção\n\nO uso de links não é recomendado dentro de um formulário workflow, pois ao acessá-los, o contexto de onde se está, é perdido, prejudicando o usuário.\n\n# Definições Gerais\n\nO Fluig mobile suporta a interceptação de determinadas URLs, que possibilitam ao usuário utilizar *links* pré-configurados para abrir recursos do aplicativo do Fluig. Ao tocar sobre estes *links* em outra aplicação instalada no dispositivo móvel, o usuário será redirecionado para o Fluig mobile.\n\nAlguns dos recursos disponíveis são a abertura de processos, acesso às comunidades e perfis de usuários. Esses *links* podem ser utilizados tanto externamente, realizando a chamada via navegador e aplicativos de terceiros quanto internamente, no próprio Fluig mobile.\n\nA seguir serão apresentado os *links* reconhecidos pelo aplicativo, através do URL *scheme* \"fluig://\".\n\nNo My Fluig é possível acessar recursos do aplicativo por meio de *links*. Para isso, basta compor um *link* em HTML incluindo o *scheme* \"fluig://\" no inicio do endereço. Por exemplo:\n\n```\nLink Mobile para o fluig Portal\n```\n\nDessa forma, ao tocar no link, o dispositivo móvel entenderá que ele deve ser aberto através do aplicativo My Fluig.\n\nAviso!\n\n- Caso o *link* configurado aponte para uma conta não configurada no Fluig mobile, o aplicativo será aberto na tela de cadastro.\n\n- Ao tocar no link configurado quando o dispositivo não tem o Fluig mobile instalado, nada ocorrerá.\n\n**Fique atento!**\n\nNo Fluig mobile é possível abrir links nativos via click de usuário e também via programação. Para os casos onde o usuário deseja abrir uma tela nativa utilizando um link para click é necessário fazer o uso do **href** configurando a url em questão utilizando o *scheme* “fluig://”. \n**Exemplo:** Link Mobile para o fluig Portal\n\nJá para os casos onde o usuário deseja abrir uma tela nativa via programação, é necessário fazer o uso do **window.open** configurando a url em questão. \n**Exemplo:** window.open(fluig://http//suaempresa.com/portal/p/empresa/social/id-do-perfil)\n\nOs dois modos de abertura de links funcionam com os links disponíveis na aba **Outros exemplos**.\n\n![](../../../images/oie_transparent%20(43).png).png)![](..\\..\\..\\images\\protocolo2.png)\n\nAbaixo estão listados exemplos dos *links* atualmente suportados para acesso externo no Fluig mobile, sendo que o endereço de cada página existente no Fluig pode ser copiado ao acessar a página em questão a partir do navegador *web*.\n\n- Comunidade:\n\n ```\n Comunidade\n ```\n- Perfil:\n\n ```\n Perfil\n ```\n- Documento:\n\n ```\n Documento\n ```\n- Processo:\n\n ```\n Processo\n ```\n- Central de Tarefas:\n\n ```\n Central de Tarefas\n ```\n- Conexões - Seguindo:\n\n ```\n Seguidores\n ```\n- Conexões - Seguidores:\n\n ```\n Seguindo\n ```\n\nAviso !\n\n- Estarão disponíveis para uso do protocolo fluig:// apenas os *links* de páginas informadas acima. O uso de outras URLs \"fluig://\" para páginas não suportadas pelo aplicativo irá direcionar o usuário para a tela inicial do Fluig mobile.\n\n- Todos os *links* listados acima estão disponíveis para iOS, Android e Windows Phone.\n\n# Como abrir aplicativos externos pelo Fluig\n\nAplicativos nativos do sistema operacional, como Telefone e Email, possuem o seu próprio URL *scheme* ( \"tel://\" e \"mailto://\", respectivamente) e a partir desses *schemes* é possível executar ações dentro de um formulário ou *widget* para realizar ligações, enviar emails e outros recursos acionados ao tocar em um botão ou *link*.\n\nAssim como o Fluig mobile e aplicativos nativos do sistema, aplicativos de terceiros também possuem seu próprio *scheme* com recursos diferenciados. Portanto, também é possível iniciar estes aplicativos externos a partir de um formulário ou *widget* no Fluig mobile, desde que os aplicativos externos suportem os respectivos *schemes*.\n\nEm caso de dúvidas, é necessário consultar a documentação do aplicativo desejado, pois cada aplicativo tem suas particularidades." }, { "metadata": { "title": "Protocolo fluig://", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=240309710", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Protocolo fluig.md" }, "content": "Protocolo fluig://\n\n## Telefone e Email" }, { "metadata": { "title": "Protocolo fluig://", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=240309710", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Protocolo fluig.md" }, "content": "Protocolo fluig://\n\n\nDispositivos móveis geralmente possuem aplicativos nativos de telefone e email pré-instalados e esses apps seguem um padrão de resposta ao serem iniciados por outros aplicativos através dos *schemes* \"tel://\" para o telefone e \"mailto://\" para o email. A partir do *scheme*, outros aplicativos podem invocá-los, passando informações relevantes e automatizando o processo de uma ligação ou envio de *email*.\n\nEm um dispositivo móvel que possua mais de um aplicativo de telefone ou *email* instalado, será possível escolher qual aplicativo será iniciado, não sendo obrigatório utilizar os aplicativos nativos.\n\nEm caso de dúvidas para utilização dos *schemes* e suporte a plataforma desejada, as seguintes documentações podem ser consultadas: [Apple](https://developer.apple.com/library/mac/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html), [Google](https://developer.android.com/guide/components/intents-common.html), [Microsoft](https://msdn.microsoft.com/pt-br/library/windows/apps/jj662937%28v=vs.105%29.aspx).\n\nA utilização do recurso de ligação telefônica em formulários é uma de muitas ferramentas disponíveis que tornam o seu formulário mais interativo, completo e eficaz. O recurso de ligação é acionado ao tocar no *link* de um número de telefone, como no exemplo abaixo.\n\nIsso faz com que o Fluig mobile interprete a ação e abra o aplicativo de telefone do seu dispositivo, já informando o número de telefone cadastrado no formulário.\n\n![](..\\..\\..\\images\\tel.png)![](..\\..\\..\\images\\doc2.png)\n\nPara mais informações sobre essa implementação, faça o download do exemplo (**form-mobile-mail**) de implementação [clicando aqui.](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/form-mobile-mail)\n\nAssim como o telefone, com o *scheme* \"mailto://\" é possível abrir o aplicativo de *email* que deseja e iniciar uma nova mensagem com os dados cadastrados nos campos de um formulário. Ao tocar no *link* de *email* do usuário, será executado um aplicativo de *email* instalado no dispositivo móvel para realização do envio de *email*, como na imagem abaixo.\n\n![](..\\..\\..\\images\\mail.png)![](..\\..\\..\\images\\doc.png)\n\nPara mais informações de como utilizar o *scheme* \"mailto://\", faça o download do exemplo (**form-mobile-tel**) de implementação [clicando aqui.](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/form-mobile-tel)\n\nAviso !\n\nPara aplicativos de terceiros, deve-se consultar a documentação sobre a utilização de *scheme*s no *site* do desenvolvedor do aplicativo em questão.\n\n# Geolocalização\n\nO recurso de geolocalização permite obter a localização do usuário através da *internet* durante a abertura de um formulário, desde que esse formulário possua o recurso de geolocalização implementado e o usuário permita o acesso à sua localização. Esse recurso também pode ser utilizado em páginas e processos.\n\nÉ possível criar formulários mais ricos e dinâmicos em conteúdo através da geolocalização do usuário que estiver acessando o formulário, permitindo por exemplo, tocar em um botão para abrir o aplicativo de navegação Waze.\n\nPara saber como utilizar a geolocalização acesse a documentação: [Desenvolvimento de formulário mobile](Desenvolvimento de formulário mobile.md)." }, { "metadata": { "title": "Protocolo fluig://", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=240309710", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Protocolo fluig.md" }, "content": "Protocolo fluig://\n\n## Geolocalização com o aplicativo Waze\n\nCom o My Fluig, você pode abrir outros aplicativos instalados no dispositivo e um deles é o Waze (aplicativo de navegação GPS). Isso torna possível repassar as coordenadas obtidas através de um formulário com geolocalização para o Waze realizar a navegação.\n\n![](..\\..\\..\\images\\geolocalizacao11.png)![](..\\..\\..\\images\\geolocalizacao12.png)\n\nPara mais recursos de implementação disponíveis pelo Waze, clique [aqui](https://www.waze.com/pt-BR/about/dev) e para um exemplo (**form-mobile-waze**) de implementação em formulários, [aqui.](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/form-mobile-waze)" }, { "metadata": { "title": "Recebimento de link Fluig mobile", "source": "https://tdn.totvs.com/display/fluig/Recebimento+de+link+Fluig+mobile", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Recebimento de link Fluig mobile.md" }, "content": "Recebimento de link Fluig mobile\n\n\n# Índice\n\n- 1 [Objetivo](#RecebimentodelinkFluigmobile-Objetivo)\n - 1.1 [Abrir link direto no app Fluig](#RecebimentodelinkFluigmobile-AbrirlinkdiretonoappFluig)\n - 1.1.1 [IOS](#RecebimentodelinkFluigmobile-IOS)\n - 1.1.2 [Android](#RecebimentodelinkFluigmobile-Android)\n\n## Objetivo\n\nVeja abaixo os passos para a abertura de links dentro aplicativo Fluig mobile.\n\n### Abrir link direto no app Fluig\n\n---\n\nPara abrir links direto no aplicativo Fluig, siga os passos abaixo:\n\n#### IOS\n\n**01.** Ao receber um link pertencente ao aplicativo Fluig por meio de outro aplicativo, como o WhatsApp, por exemplo, clique sobre o link.\n\n**02.**O navegador será aberto, e nos casos onde a pessoa já possuir o aplicativo instalado será apresentada uma mensagem: \"Abrir está página no Fluig?\"\n\n**03.** Acionar **Abrir**, a tela correspondente ao link será aberta no aplicativo.\n\n#### Android\n\n**01.** Ao receber um link pertencente ao aplicativo Fluig por meio de outro aplicativo, como o WhatsApp, por exemplo, clique sobre o link.\n\n**02.** O aplicativo será automaticamente aberto na tela correspondente ao link recebido." }, { "metadata": { "title": "Recursos do My Fluig", "source": "https://tdn.totvs.com/display/fluig/Recursos+do+My+Fluig", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Recursos do My Fluig.md" }, "content": "Recursos do My Fluig" }, { "metadata": { "title": "Recursos do My Fluig", "source": "https://tdn.totvs.com/display/fluig/Recursos+do+My+Fluig", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Recursos do My Fluig.md" }, "content": "Recursos do My Fluig\n\n\nConfira os recursos disponíveis no My Fluig de acordo com cada sistema operacional. Caso o recurso desejado no sistema não esteja listado significa que ele ainda não possui um plano para estar disponível no My Fluig. Para isso, recomendamos deixar sua sugestão em nossa [central colaborativa](https://centraldeatendimento.totvs.com/hc/pt-br/community/topics).\n\n---\n\n| | | | |\n| --- | --- | --- | --- |\n| ***Card*** | **Recurso** | iOS | Android |\n| ECM | Publicação de documentos | | |\n| Aprovação de documentos | | |\n| Copiar *link* de um documento | | |\n| Criar pasta | | |\n| Renomear um documento ou pasta | | |\n| Remover um documento ou pasta | | |\n| Rascunho de publicação de documentos | | |\n| Adicionar documento ou pasta aos favoritos | | |\n| Visualização dos documentos favoritos | | |\n| Permitir baixar os documentos favoritos de forma *off-line* nas configurações | | |\n| Visualizar os detalhes do documento | | |\n| Visualizar anexos de um documento | | |\n| Incluir anexos em um documentos | | |\n| Publicação de documentos pelo recurso \"Abrir com\" (Compartilhar) | | |\n| Criação de artigos (pela navegação de documentos) | | |\n| Visualização de artigos (pela navegação de documentos) | | |\n| Busca de documentos | | |\n| Impressão de documentos | | |\n| Copiar e Mover | | |\n| Criação e visualização de registros de formulário | | |\n| Visualizador Interno de documentos  - Extensões aceitas em iOS: xls, xlsx, pdf, doc, docx, ppt, pptx, png, jpg, jpeg, gif e mp4 - Extensões aceitas em Android: pdf, png, jpg, jpeg, gif e mp4 | | |\n| Documento espelho | | |\n| Aprovação de documento como substituto | | |\n| Visualização de documento externo | | |\n| Criação de documento externo | | |\n| Ordenação da navegação | | |\n| Documentos em consenso de aprovação | | |\n| Alterar a decisão da aprovação quando o documento encontra-se em consenso | | |\n| Iniciar reuniões a partir de um documento | | |\n| Assinatura digital | | |\n| Eventos de documentos | | |\n| Social | Visualizar *timeline* | | |\n| Apoiar e comentar publicações | | |\n| Adicionar usuários e comunidades aos favoritos | | |\n| Visualizar os usuários e comunidade favoritos | | |\n| Visualizar *timeline* da comunidade | | |\n| Acessar os documentos da comunidade | | |\n| Acessar os artigos da comunidade | | |\n| Acessar os formulários (enquetes) da comunidade | | |\n| Acessar galeria de imagens | | |\n| Acessar galeria de vídeos | | |\n| Visualizar detalhes da comunidade | | |\n| Publicar na própria *timeline* | | |\n| Criar publicação na comunidade (somente texto) | | |\n| Criar publicação com foto na comunidade | | |\n| Criar publicação com vídeo na comunidade | | |\n| Criar publicação com múltiplas imagens na comunidade | | |\n| Visualizar publicação com múltiplas imagens na comunidade | | |\n| Rascunho de publicação | | |\n| Rascunho de comentário | | |\n| Compartilhar publicação | | |\n| Visualizar publicação compartilhada | | |\n| Notificações | | |\n| Notificações *Push* | | |\n| Suporte aos eventos sociais | | |\n| Busca: publicações, usuários e comunidades | | |\n| Visualizar lista de comunidades | | |\n| Seguir / Deixar de seguir comunidades | | |\n| Visualizar lista de usuários que está seguindo e seguidores | | |\n| Seguir / Deixar de seguir usuários | | |\n| Configuração da permissão de publicação, curtir, comentar e excluir. | | |\n| Criar visão diferente de item da *timeline* | | |\n| Widgets de Conteúdo Adicional | | |\n| Iniciar / Participar de reuniões | | |\n| BPM | Consulta de indicadores da central de tarefas | | |\n| Listar tarefas pendentes de aprovação | | |\n| Listar tarefas solicitadas | | |\n| Listar tarefas em consenso | | |\n| Listar processo sob gerência | | |\n| Ordenação das tarefas | | |\n| Filtros personalizados | | |\n| Inicialização de solicitações | | |\n| Movimentação de processos | | |\n| Formulário Pai x Filho (Fluig Style Guide) | | |\n| Formulário com *zoom* (Fluig Style Guide) | | |\n| Eventos de formulário | | |\n| Eventos de processo | | |\n| Utilização do Fluig Style Guide | | |\n| Geolocalização | | |\n| Adicionar foto do formulário | | |\n| Anexar documento do GED à solicitação | | |\n| Anexar fotos à solicitação | | |\n| Consulta de solicitações | | |\n| Movimentação de tarefa como substituto | | |\n| Adicionar processo aos favoritos | | |\n| Visualização de processo favorito | | |\n| Rascunho de processo | | |\n| Processo Listar Tarefas | | |\n| Tarefas Ad-hoc | | |\n| Processo Off-line | | |\n| Datasets On-Line | | |\n| Dataset Off-line | | |\n| Impressão de formulário | | **\\*\\*** |\n| Assinatura digital | | |\n| Confirmar senha em processo | | |\n| Plataforma | *Login OAuth* | | |\n| *Login* integrado com AD | | |\n| *Login* integrado com LDAP | | |\n| *Login* integrado com Identity | | |\n| *Login* SSO (*Single sing-on*) | | |\n| Eventos de usuário | | |\n| Troca de senha do usuário | | |\n| Solicitar e-mail para redefinição de senha (Fluxo de e-mail de recuperação) | | |\n\n**\\*\\*** A Impressão de formulários em dispositivos Android está disponível a partir da versão 5.0 (Lollipop).\n\n| | | | | |\n| --- | --- | --- | --- | --- |\n| **Legenda** | | | | |\n| - Disponível | | | | |\n| - Indisponível | | | | |" }, { "metadata": { "title": "Suporte a páginas e widgets no aplicativo Fluig mobile", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=224108112", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Suporte a páginas e widgets no aplicativo Fluig mobile.md" }, "content": "Suporte a páginas e widgets no aplicativo Fluig mobile" }, { "metadata": { "title": "Suporte a páginas e widgets no aplicativo Fluig mobile", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=224108112", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Suporte a páginas e widgets no aplicativo Fluig mobile.md" }, "content": "Suporte a páginas e widgets no aplicativo Fluig mobile\n\n\n# Índice\n\n- 1 [Objetivo](#SuporteapáginasewidgetsnoaplicativoFluigmobile-Objetivo)\n- 2 [Widgets suportadas pelo Fluig mobile](#SuporteapáginasewidgetsnoaplicativoFluigmobile-WidgetssuportadaspeloFluigmobile)\n- 3 [Habilitar widgets para visualização mobile](#SuporteapáginasewidgetsnoaplicativoFluigmobile-Habilitarwidgetsparavisualizaçãomobile)\n- 4 [Como visualizar widgets de comunidades através de dispositivos móveis](#SuporteapáginasewidgetsnoaplicativoFluigmobile-Comovisualizarwidgetsdecomunidadesatravésdedispositivosmóveis)\n- 5 [Analytics no Fluig Mobile](#SuporteapáginasewidgetsnoaplicativoFluigmobile-AnalyticsnoFluigMobile)\n\n# Objetivo\n\nO objetivo deste guia é detalhar o suporte à exibição e criação de widgets do TOTVS Fluig Plataforma no aplicativo Fluig mobile.\n\n# Widgets suportadas pelo Fluig mobile\n\nAbaixo lista de widgets com compatibilidade para visualização no Fluig mobile:\n\n| | |\n| --- | --- |\n| | **Documentos Populares** |\n| Veja quais são os documentos mais acessados. |\n| | **Endereço Web** |\n| Acesse endereços *web* de forma fácil e rápida. Para que o *widget* Endereço Web renderize corretamente a URL solicitada, é necessário que o servidor de destino da URL aceite requisições do tipo *cross-origin*, ou seja, requisições realizadas por páginas *web* de domínios diferentes. Caso contrário, o seguinte erro será exibido no console do navegador: \"Requisição *cross-origin* bloqueada: A política de mesma origem (*Same Origin Policy*) impede a leitura do recurso remoto em http://. (Motivo: o cabeçalho CORS '*Access-Control-Allow-Origin*' não está presente)\". |\n| | **Editor de conteúdo** |\n| Personalize páginas e comunidades com o conteúdo desejado. |\n| | **Analytics** |\n| Visualize gráficos e *Dashboards* do Analytics de forma fácil e rápida. Se você está utilizando o Analytics pelo iOS, atente-se às recomendações [desse item](https://tdn.totvs.com/pages/viewpage.action?pageId=224108112). |\n| | **Aniversariantes** |\n| Visualize os aniversariantes do mês, com destaque para os aniversariantes do dia. Esse *widget* faz parte da solução Kit Intranet e pode ser obtido através [deste *link*](https://git.fluig.com/projects/SAMPLES/repos/kit-intranet/browse/kitintranet.zip) do diretório Git do Fluig e o procedimento de instalação está disponível no [Portal do Desenvolvedor](http://tdn.totvs.com/display/fluig/Kit+Intranet#KitIntranet-Instala%C3%A7%C3%A3oeatualiza%C3%A7%C3%A3odoKitIntranet). |\n\n# Habilitar widgets para visualização mobile\n\nPara que uma página esteja disponível no aplicativo mobile, deve existir pelo menos uma instância de Widget habilitada para o aplicativo mobile na página. Para isso será necessário:\n\n- Acessar o modo de edição da página.\n\n![](..\\..\\..\\images\\image2018-7-23_16-45-14.png)\n\n- Assinalar quais widgets da página serão apresentadas no aplicativo mobile, clicando no ícone **Habilitar no aplicativo mobile.**\n\n Este ícone só estará presente para widgets que possuam suporte ao aplicativo mobile\n\n ![](..\\..\\..\\images\\image2018-7-23_16-46-39.png)\n\n- Publicar a nova versão da página.\n\n![](..\\..\\..\\images\\image2018-7-23_16-49-47.png)\n\nAtenção!\n\nA renderização das páginas no aplicativo mobile apresentará apenas o conteúdo das widgets habilitadas sequencialmente. Isso significa que serão apresentadas as widgets uma embaixo da outra, conforme a ordenação dos slots: todas as widgets do slot a, depois b, depois c e assim sucessivamente.\n\n![](..\\..\\..\\images\\Visualizacao%20widgets%20mobile.png)\n\n**Visualização dos widgets no mobile**\n\n# Como visualizar widgets de comunidades através de dispositivos móveis\n\nO Fluig Mobile trata os *widgets* incluídos em páginas de comunidades como **Conteúdo Adicional** da comunidade.\n\nPara acessar esse conteúdo, basta tocar no botão **Visualizar conteúdo adicional** disponível na parte superior da *timeline* da comunidade ou na opção **Conteúdo adicional**, através do menu contextual.\n\nApenas as plataformas iOS e Android suportam widgets em comunidades (Conteúdo Adicional). Para obter maiores detalhes, acesse o [Guia de Utilização Fluig - Mobile](http://tdn.totvs.com/pages/viewpage.action?pageId=107940624)[.](http://tdn.totvs.com/pages/viewpage.action?pageId=107940624#GuiadeUtiliza%C3%A7%C3%A3ofluig-Mobile-Android)\n\n# Analytics no Fluig Mobile\n\nPara o funcionamento correto da widget de Analytics no Fluig Mobile versão iOS, devemos habilitar os *Cookies* de terceiros no dispositivo.\n\n*Um Cookie é um arquivo de texto muito simples, cuja composição depende diretamente do conteúdo do endereço Web visitado. Por exemplo, a maioria do sites armazenam informações básica, como endereços IP e preferências sobre idiomas, cores, etc.*\n\nAtenção\n\nPara dispositivos IOS é **indispensável a utilização do protocolo HTTPS** para garantir o funcionamento esperado da widget Analytics. Em alguns browsers é necessária a utilização do protocolo HTTPS para que a mesma apresente o funcionamento correto.\n\nComo habilitar cookies no iPhone ou iPad\n\n1. e “**Privacidade e Segurança**”, garanta que as funções “**Impedir Rastreamento**” e “**Bloquear Todos os Cookies**” estejam desabilitadas.\n\n**![](..\\..\\..\\images\\Safari.png)**" }, { "metadata": { "title": "Android - Como realizar o login no Fluig Mobile?", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=551442889", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Android\\Android - Como realizar o login no Fluig Mobile.md" }, "content": "Android - Como realizar o login no Fluig Mobile?\n\n\n# Índice\n\n- 1 [Como acesso usando o servidor? Com ou sem Identity habilitado](#AndroidComorealizarologinnoFluigMobile?-Comoacessousandooservidor?ComousemIdentityhabilitado)\n\nO aplicativo Fluig oferece acesso à ambientes habilitado ao Identity ou não, no entanto, a forma de autenticação em ambas as situações são as mesmas. Confira os passos abaixo para realizar o login no Fluig Mobile.\n\n### Como acesso usando o servidor? Com ou sem Identity habilitado\n\n---\n\n**01.** Acionar **Minha conta fluig**.\n\n**02.** Em **Endereço**, inserir a URL do servidor de acesso, logo depois acionar **Salvar**.\n\n**03.** A tela de login será apresentada, inserir seus dados de acesso e acionar **Acessar**." }, { "metadata": { "title": "Android - Como utilizar os componentes Leitura de código de barras e QR Code?", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=559498199", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Android\\Android - Como utilizar os componentes Leitura de código de barras e QR Code.md" }, "content": "Android - Como utilizar os componentes Leitura de código de barras e QR Code?\n\n\n# Índice\n\n- 1 [Objetivo](#AndroidComoutilizaroscomponentesLeituradecódigodebarraseQRCode?-Objetivo)\n - 1.1 [Criando um formulário](#AndroidComoutilizaroscomponentesLeituradecódigodebarraseQRCode?-Criandoumformulário)\n - 1.2 [Funcionamento do componente](#AndroidComoutilizaroscomponentesLeituradecódigodebarraseQRCode?-Funcionamentodocomponente)\n - 1.3 [Confira na prática](#AndroidComoutilizaroscomponentesLeituradecódigodebarraseQRCode?-Confiranaprática)\n - 1.3.1 [Exemplo de uso](#AndroidComoutilizaroscomponentesLeituradecódigodebarraseQRCode?-Exemplodeuso)\n\n## Objetivo\n\nO objetivo deste guia é orientar o usuário a como utilizar os componentes Leitura de código de barras e o componente de leitura de QR Code em um formulário de workflow no My Fluig, bem como suas configurações e uso.\n\nO componente de **leitura de código de barras** possui suporte as codificações 128C / GS1-128 / UCC/EAN-128 e EAN-13. E pode ser implementado ao formulário através do Fluig Studio.\n\nOs passos e métodos abaixo podem ser usados tanto na implementação do componente de leitura de código de barras quanto para o componente de leitura de QR Code.\n\n### Criando um formulário" }, { "metadata": { "title": "Android - Como utilizar os componentes Leitura de código de barras e QR Code?", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=559498199", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Android\\Android - Como utilizar os componentes Leitura de código de barras e QR Code.md" }, "content": "Android - Como utilizar os componentes Leitura de código de barras e QR Code?\n\n\n---\n\n **01.** O primeiro passo será criar um formulário via fluig Studio, para isso basta seguir atentamente os passos das documentações [Fluig Studio](../../../Instalação e Atualização/Guia de instalação Fluig Studio.md) e [Desenvolvimento de formulários](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários.md).\n\nPode ser interessante fazer a leitura das documentações [Configuração para uso inicial](../../../Desenvolvimento sobre a plataforma/Fluig Studio/Configuração para uso inicial do Fluig Studio.md)\n\n[do Fluig Studio](../../../Desenvolvimento sobre a plataforma/Fluig Studio/Configuração para uso inicial do Fluig Studio.md) e [Guia de atualização Fluig Studio](../../../Instalação e Atualização/Guia de atualização Fluig Studio.md) para garantir seu correto funcionamento e garantir uma boa experiência.\n\n**02.** Implementar o componente Leitura de código de barras ou o componente de leitura de QR Code no desenvolvimento do formulário.\n\n### Funcionamento do componente\n\n---\n\nOs componentes de leitura do código de barras e leitura de QR Code se baseiam em **2 métodos** que devem ser incluídos dentro de uma tag **\n```" }, { "metadata": { "title": "Como realizar o login no Approval?", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=549487946", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Aplicativo Approval\\Como realizar o login no Approval.md" }, "content": "Como realizar o login no Approval?\n\n\n# Índice\n\n- 1 [Como acesso com servidor? Sem Identity habilitado](#ComorealizarologinnoApproval?-Comoacessocomservidor?SemIdentityhabilitado)\n- 2 [Como acesso com e-mail corporativo e Identity habilitado? Ambiente de produção](#ComorealizarologinnoApproval?-Comoacessocome-mailcorporativoeIdentityhabilitado?Ambientedeprodução)\n- 3 [Como acesso com e-mail corporativo e Identity habilitado? Ambiente homologação](#ComorealizarologinnoApproval?-Comoacessocome-mailcorporativoeIdentityhabilitado?Ambientehomologação)\n\nO aplicativo Approval possui três formas de acesso. Veja abaixo qual forma se adéqua melhor a sua necessidade no momento de login.\n\n### Como acesso com servidor?  Sem Identity habilitado\n\n---\n\nPara acessar o Approval utilizando o servidor da sua empresa, siga os passos abaixo:\n\n**01.** Acionar **Acessar com servidor**.\n\n**02.** Inserir o endereço do servidor da sua empresa. Ex: \n\n**03.** Inserir seu e-mail corporativo e senha.\n\n**04.** Acionar **Acessar**.\n\n### Como acesso com e-mail corporativo e Identity habilitado? Ambiente de produção\n\n---\n\nPara acessar o app utilizando o e-mail, seu usuário precisa estar habilitado com Identity (gerenciador de usuários do Fluig). Siga os passos abaixo:\n\nCaso seu usuário não esteja habilitado, você consegue acessar o app pelo servidor da empresa. Descrito no item acima.\n\n**01.** Inserir seu e-mail corporativo (Cadastrado no Fluig no momento da criação do seu usuário).\n\n**02.** Acionar **Continuar** para acessar o aplicativo.\n\n### Como acesso com e-mail corporativo e Identity habilitado? Ambiente homologação" }, { "metadata": { "title": "Como realizar o login no Approval?", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=549487946", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Aplicativo Approval\\Como realizar o login no Approval.md" }, "content": "Como realizar o login no Approval?\n\n\n---\n\nPara acessar o Approval no ambiente de homologação basta seguir os passos abaixo:\n\n**01.** Acionar o ícone de ajuda![](..\\..\\..\\..\\images\\flaticon-question.png)ao lado esquerdo da tela do aplicativo;\n\n**02.** Logo depois acione **Quero acessar usando o ambiente de homologação**;\n\n**03.** Insira seu e-mail corporativo e acione **Continuar**;\n\n**04.** Você será autenticado no Approval.\n\nCaso você acionar o ícone![](..\\..\\..\\..\\images\\flaticon-question.png)e aparecer o botão **Quero acessar usando o ambiente de produção** será necessário fechar o app Approval, fecha-lo nos apps em segundo plano, abri-lo novamente e refazer os passos descritos acima." }, { "metadata": { "title": "Guia padrão das URL's de notificações", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=546255611", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig\\Guia padrão das URL's de notificações.md" }, "content": "Guia padrão das URL's de notificações\n\n\n# Índice\n\n- 1 [Objetivo](#GuiapadrãodasURL'sdenotificações-Objetivo)\n - 1.1 [Como funciona](#GuiapadrãodasURL'sdenotificações-Comofunciona)\n - 1.2 [Padrão das URL's](#GuiapadrãodasURL'sdenotificações-PadrãodasURL's)\n\n# Objetivo\n\n---\n\nEsse guia tem como objetivo demonstrar como é possível direcionar o usuário para uma tela do aplicativo utilizando links em determinadas seções do aplicativo Fluig Mobile.\n\n## Como funciona\n\n---\n\nÉ possível direcionar o usuário para uma tela específica do aplicativo usando [links com padrões específicos](https://tdn.totvs.com/pages/viewpage.action?pageId=546255611#Guiapadr%C3%A3odasURL%27sdenotifica%C3%A7%C3%B5es-Padr%C3%A3odasURL%27s). Para isso, o aplicativo intercepta links das seguintes seções:\n\n- Notificações *push*\n- Central de notificações do aplicativo\n- Textos de posts\n- Textos de comentários\n- Widgets\n\n## Padrão das URL's" }, { "metadata": { "title": "Guia padrão das URL's de notificações", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=546255611", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\Guia de utilização My Fluig\\Guia padrão das URL's de notificações.md" }, "content": "Guia padrão das URL's de notificações\n\n\n---\n\nAo clicar no link em uma das seções acima listadas, o aplicativo irá avaliar esse link de acordo com a tabela abaixo direcionando o usuário para a tela correspondente:\n\nOs links são avaliados exatamente na ordem exibida na tabela abaixo e irá direcionar o usuário assim que o padrão for detectado. Verifique se não há ambiguidade de padrão na sua URL.\n\n| | |\n| --- | --- |\n| **Direcionado para o perfil da comunidade ou usuário** | \"/social/{alias}\" \"/community/{alias}\" \"/subject/{alias}\" |\n| **Abre o diretório do artigo** | \"/articles/{alias}/{id da pasta onde está armazenado o artigo}\" |\n| **Abre o documento do artigo** | \"/arcticleview/{alias}/{id do documento de artigo}\" |\n| **Abre o diretório da enquete** | \"/form/{alias}/{id da pasta que está armazenada a enquete}\" |\n| **Abre o resultado da função de busca no menu lateral esquerdo** | \"/searchresult?text={termo da busca}\" |\n| **Abre o documento com a versão definida** | \"/ecmnavigation?app\\_ecm\\_navigation\\_doc={id do documento}[&app\\_ecm\\_navigation\\_docversion=\\{versão do documento}]\" \"pagecentraltask?app\\_ecm\\_centraltask\\_wdnrdocto={id do documento}[&app\\_ecm\\_centraltask\\_wdnrversao=\\{versão do documento}]\" |\n| **Abre a instância do processo** | \"/pagecentraltask?app\\_ecm\\_centraltask\\_processinstanceid={id da instância do processo}\" \"/pageworkflowview?app\\_ecm\\_workflowview\\_detailsProcessInstanceID={id da instância do processo}\" |\n| **Inicia um novo processo** | \"/pageprocessstart?app\\_ecm\\_process\\_id={id do processo}\" \"/pageworkflowview?app\\_ecm\\_workflowview\\_processinstanceid={id do processo}\" \"/pageworkflowview?processID={id do processo}\" |\n| **Abre o post** | \"/post/{alias}/{id post}\" |\n| **Abre widgets** | Como as widgets podem ter URL's customizáveis, não existe um padrão a ser respeitado. Nesse caso, validamos se a URL definida está de acordo com a URL de uma widget que foi definida no sistema. |" }, { "metadata": { "title": "iOS - Como realizar o login no Fluig Mobile?", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=551443159", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\iOS\\iOS - Como realizar o login no Fluig Mobile.md" }, "content": "iOS - Como realizar o login no Fluig Mobile?\n\n\n# Índice\n\n- 1 [Como acesso usando o servidor? Com ou sem Identity habilitado](#iOSComorealizarologinnoFluigMobile?-Comoacessousandooservidor?ComousemIdentityhabilitado)\n\nO aplicativo Fluig oferece acesso à ambientes habilitado ao Identity ou não, no entanto, a forma de autenticação em ambas as situações são as mesmas. Confira os passos abaixo para realizar o login no Fluig mobile.\n\n### Como acesso usando o servidor? Com ou sem Identity habilitado\n\n---\n\n**01.** Acionar **Minha conta fluig**.\n\n**02.** Em **Endereço**, inserir a URL do servidor de acesso, logo depois acionar **Salvar**.\n\n**03.** A tela de login será apresentada, inserir seus dados de acesso e acionar **Acessar**." }, { "metadata": { "title": "iOS - Como utilizar os componentes Leitura de código de barras e QR Code?", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=559498224", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\iOS\\iOS - Como utilizar os componentes Leitura de código de barras e QR Code.md" }, "content": "iOS - Como utilizar os componentes Leitura de código de barras e QR Code?\n\n\n# Índice\n\n- 1 [Objetivo](#iOSComoutilizaroscomponentesLeituradecódigodebarraseQRCode?-Objetivo)\n - 1.1 [Criando um formulário](#iOSComoutilizaroscomponentesLeituradecódigodebarraseQRCode?-Criandoumformulário)\n - 1.2 [Funcionamento do componente](#iOSComoutilizaroscomponentesLeituradecódigodebarraseQRCode?-Funcionamentodocomponente)\n - 1.3 [Confira na prática](#iOSComoutilizaroscomponentesLeituradecódigodebarraseQRCode?-Confiranaprática)\n - 1.3.1 [Exemplo de uso](#iOSComoutilizaroscomponentesLeituradecódigodebarraseQRCode?-Exemplodeuso)\n\n## Objetivo\n\nO objetivo deste guia é orientar o usuário a como utilizar os componentes Leitura de código de barras e o componente de leitura de QR Code em um formulário de workflow no My Fluig, bem como suas configurações e uso.\n\nO componente de **leitura de código de barras** possui suporte as codificações 128C / GS1-128 / UCC/EAN-128 e EAN-13. E pode ser implementado ao formulário através do Fluig Studio.\n\nOs passos e métodos abaixo podem ser usados tanto na implementação do componente de leitura de código de barras quanto para o componente de leitura de QR Code.\n\n### Criando um formulário" }, { "metadata": { "title": "iOS - Como utilizar os componentes Leitura de código de barras e QR Code?", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=559498224", "path": "\\Plataforma Documentação técnica\\Configuração\\Mobile\\iOS\\iOS - Como utilizar os componentes Leitura de código de barras e QR Code.md" }, "content": "iOS - Como utilizar os componentes Leitura de código de barras e QR Code?\n\n\n---\n\n **01.** O primeiro passo será criar um formulário via fluig Studio, para isso basta seguir atentamente os passos das documentações [Fluig Studio](../../../Instalação e Atualização/Guia de instalação Fluig Studio.md) e [Desenvolvimento de formulários](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários.md).\n\nPode ser interessante fazer a leitura das documentações [Configuração para uso inicial](../../../Desenvolvimento sobre a plataforma/Fluig Studio/Configuração para uso inicial do Fluig Studio.md)\n\n[do Fluig Studio](../../../Desenvolvimento sobre a plataforma/Fluig Studio/Configuração para uso inicial do Fluig Studio.md) e [Guia de atualização Fluig Studio](../../../Instalação e Atualização/Guia de atualização Fluig Studio.md) para garantir seu correto funcionamento e garantir uma boa experiência.\n\n**02.** Implementar o componente Leitura de código de barras ou o componente de leitura de QR Code no desenvolvimento do formulário.\n\n### Funcionamento do componente\n\n---\n\nO componente de leitura do código de barras se baseia em **2 métodos** que devem ser incluídos dentro de uma tag **\n```" }, { "metadata": { "title": "Aceleradores de desenvolvimento Fluig", "source": "https://tdn.totvs.com/display/fluig/Aceleradores+de+desenvolvimento+Fluig", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Aceleradores de desenvolvimento Fluig.md" }, "content": "Aceleradores de desenvolvimento Fluig" }, { "metadata": { "title": "Aceleradores de desenvolvimento Fluig", "source": "https://tdn.totvs.com/display/fluig/Aceleradores+de+desenvolvimento+Fluig", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Aceleradores de desenvolvimento Fluig.md" }, "content": "Aceleradores de desenvolvimento Fluig\n\n\n- [Objetivo](#AceleradoresdedesenvolvimentoFluig-Objetivo)\n- [Lista de snippets](#AceleradoresdedesenvolvimentoFluig-Listadesnippets)\n- [Link para download](#AceleradoresdedesenvolvimentoFluig-Linkparadownload)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar a lista das *snippets* (aceleradores de desenvolvimento) disponíveis no repositório git Fluig, organizadas por seus respectivos CARDS. Veja também como instalar e utilizar *Snippets*.\n\n# Lista de *snippets*\n\n---\n\n| CARD | Categoria | Nome do componente | Descritivo |\n| --- | --- | --- | --- |\n| BPM | JS | Adicionar Filho em tabela | Adicionar um filho em tabela pai filho no formulário do processo |\n| BPM | JS | Dataset consulta Pai-filho | Consulta de registros Pai-Filho em um dataset customizado |\n| BPM | JS | Criar Pasta no GED docAPI | Código utilizando docAPI para criar uma pasta no GED |\n| BPM | JS | Criar Pasta no GED Service | Dataset que utiliza o serviço SOAP do Fluig ECMFolderService para criar uma pasta |\n| BPM | JS | Script para Envio de E-mail | Script que envia e-mail customizado (sem template) utilizando um HTML. |\n| BPM | JS | Exemplo de parâmetros customHTML - DisplayFields | Criar ações customizadas com o parâmetro customHTML no evento de formulário displayFields |\n| BPM | JS | Formatação Data DD/MM/YYYY | Função javascript de formatação de data DD/MM/YYYY |\n| BPM | JS | Exemplos de propriedades do formController | Exemplos para uso em eventos de formulário da propriedade 'form' |\n| BPM | JS | Formulário utilizando FormMode | Validar os estados de um formulário para criar regras de negocio |\n| BPM | HTML | Biblioteca vcXMLRPC.js | Adicionar biblioteca vcXMLRPC.js no formulário HTML |\n| BPM | JS | Lista de Anexos | Retornar a lista de anexos do processo |\n| BPM | JS | Exemplos de logs para debug | Linhas de comandos para escrever Logs em eventos |\n| BPM | JS | Envio de email com template | Envio de notificacao por email utilizando template |\n| BPM | JS | Propriedades de eventos - Validacao (WK) | Propriedades para utilizar em eventos (WKDef, WKVersDef, WKNumProces, WKNumState, WKCompany, WKUser, WKUserComment, etc) |\n| BPM | JS | Selecionar tabela Pai-filho | Selecionar registros de uma tabela Pai-filho |\n| BPM | JS | Criar Grupos de Usuário (FluigAPI) | Criação de grupos de usuário utilizando FluigAPI em eventos |\n| BPM | JS | Adicionar usuários em Grupos (FluigAPI) | Vincular usuários a grupos através da FluigAPI |\n| BPM | JS | Dados do Usuário (FluigAPI) | Obter dados do usuário corrente em eventos utilizando FluigAPI |\n| BPM | JS | URL de documento (FluigAPI) | Obter a URL de documento via FluigAPI |\n| DATASET | JS | Constraint LIKE em String | Constraint para consulta dataset com parte de String (Like) |\n| DATASET | JS | Funcoes get e setCardValue | Linha de comando para pegar e/ou setar valor em campo de formulário (Dataset ou Evento) |\n| DATASET | JS | Função startProcess | Função hAPI responsável por iniciar um processo (Dataset ou Evento) |\n| DATASET | JS | REST - POST - Criar usuario | Exemplo de API REST para criação de novo usuário no Fluig |\n| DATASET | JS | Acesso fonte de dados externa | Código para acessar fonte de dados externa configurada no standalone.xml (a partir da 2.0) ou no domain.xml (1.6 até 1.8.2) do ambiente |\n| DATASET | JS | Consumir serviço externo utilizando AuthorizeService | Exemplo de código para consumir um serviço externo cadastrado nos serviços do painel de controle do TOTVS Fluig Plataforma |\n| WCM | HTML | Char Line | Gráfico Line do Fluig Style Guide |\n| WCM | HTML | Chart Bar | Gráfico Bar do Fluig Style Guide |\n| WCM | HTML | Chart Radar | Gráfico Radar do Fluig Style Guide |\n| WCM | JS | REST - GET - Listar usuários | Exemplo de requisição REST utilizando a API de consulta a usuários da plataforma |\n| WCM | JS | REST - POST - Listar Documentos | Exemplo de requisição REST para listagem de documentos de um diretório |\n| WCM | JS | REST - POST- Genérica | Requisições REST do tipo POST, para utilizar esta snippet basta alterar os valores das variáveis endpoint e params |\n| WCM | JS | REST - POST - Envio de e-mail | Envio de e-mail através da API Fluig (As configurações de envio de e-mail devem estar previamente configuradas) |\n| WCM | JS | REST - POST - Start Process | Envio para iniciar processo através da API-REST Fluig process management |\n| WCM | JS | Funções WCMAPI | Funções WCMAPI, úteis públicas e documentadas |\n| WCM | JS | Widget - Datatable - Dataset | Exemplo de script js de widget utilizando o objeto Datatable consumindo um Dataset ( colleagues) |\n| WCM | JS | Funções js do recurso Zoom | Funções de javascript para implementação de zoom |\n| WCM | HTML | Zoom Padrão | Recurso Zoom padrão consultando dataset interno |\n| WCM | JS | Salvar parâmetros em páginas | Utilização de API para salvar parâmetros em modo edição de uma página WCM |\n| WCM | JS | Upload de Arquivo | Upload de arquivo e publicação no GED |\n| WCM | JS | Validar CPF | Função que recebe valor e valida se é um CPF válido |\n| WCM | JS | Validar CNPJ | Função que recebe valor e valida se é um CNPJ válido |\n| WCM | JS | Cancelar solicitações via API | Cancela uma ou mais solicitações via API |\n| Mobile | JS | Geolocalização | Funções Javascript para uso em formulário com o objetivo de obter as coordenadas de geolocalização do dispositivo Mobile |\n| Mobile | JS | Leitura código de barras | Funções Javascript para ler um código de barras em formulários Mobile |\n| BIRT | JS | Importação bibliotecas Fluig | Importação de bibliotecas para acesso a Datasets do Fluig |\n| BIRT | JS | Imprimir no log Fluig | Imprimir no server.log do Fluig mensagens a partir de eventos do BIRT |\n| GED | CSS | Classe label de campo obrigatório | Utilize a classe \"required\" para adicionar um asterisco vermelho após o label |\n\nEm caso de dúvidas, favor efetuar a abertura de chamado do produto Fluig.\n\nSugestões são bem vindas, caso exista alguma nova snippet, fique à vontade para incluí-la em nosso git, assim poderemos cada vez mais, ajudar e sustentar o ambiente ECO Fluig.\n\n# Link para *download*\n\n---\n\nPara utilizar no Eclipse, baixar o pacote através da URL [http://update.fluig.com/snippets](https://www.google.com/url?q=http://update.fluig.com/snippets&sa=D&source=hangouts&ust=1576687266652000&usg=AFQjCNG6X86HrdPxxL4WW4hyjgUUxH-onA) na opção de Help - Install New Software.\n\n![](..\\..\\images\\image2019-12-17_16-3-27.png)" }, { "metadata": { "title": "Desenvolvimento de Datasets", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets.md" }, "content": "Desenvolvimento de Datasets" }, { "metadata": { "title": "Desenvolvimento de Datasets", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets.md" }, "content": "Desenvolvimento de Datasets\n\n\n# Índice\n\n- 1 [Objetivo](#DesenvolvimentodeDatasets-Objetivo)\n- 2 [Pré-requisitos](#DesenvolvimentodeDatasets-Pré-requisitos)\n- 3 [Datasets](#DesenvolvimentodeDatasets-Datasets)\n- 4 [Tipos de Datasets](#DesenvolvimentodeDatasets-TiposdeDatasets)\n - 4.1 [Exemplificando](#DesenvolvimentodeDatasets-Exemplificando)\n- 5 [Consultando dados](#DesenvolvimentodeDatasets-consultandoConsultandodados)\n - 5.1 [Via Painel de Controle](#DesenvolvimentodeDatasets-ViaPaineldeControle)\n - 5.2 [Via Widget](#DesenvolvimentodeDatasets-ViaWidget)\n- 6 [Acessando um Dataset](#DesenvolvimentodeDatasets-AcessandoumDataset)\n- 7 [Importar e Exportar Datasets](#DesenvolvimentodeDatasets-ImportareExportarDatasets)\n- 8 [Para saber mais](#DesenvolvimentodeDatasets-Parasabermais)\n\n# Objetivo\n\n---\n\nEste guia tem o objetivo de apresentar o conceito de Dataset, suas possíveis parametrizações e sua importância no TOTVS Fluig Plataforma.\n\n# Pré-requisitos\n\n---\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre a plataforma TOTVS Fluig\n- Visão geral sobre integração de sistemas\n\nAtenção!\n\nA partir das atualizações **1.6.5 Liquid**, **1.7.0 Lake** e **1.7.1 Crystal Lake**, os *select* passados por *constraint* em dataset serão bloqueados pelo serviço. Orientamos a leitura da documentação [Datasets acessando banco de dados externo](Desenvolvimento de Datasets/Datasets acessando banco de dados externo.md) que contém um exemplo da correta utilização do procedimento.\n\n# Datasets\n\n---\n\nA plataforma Fluig permite disponibilizar informações provindas de várias fontes de dados através de formas variadas de apresentação, dependendo da necessidade de cada cliente. Esse recurso é atendido pelo componente Dataset, que padroniza o acesso às informações, independente da origem dos dados. É possível apresentar ou processar informações referentes a:\n\n- dados da própria plataforma (como usuários, grupos, papéis, tarefas, etc.);\n- dados criados pelo usuário mas gerenciados pela plataforma (dados de formulários);\n- dados externos (como entidades de um ERP);\n- valores fixos (como uma lista de estados ou unidades de medida).\n\nUm Dataset disponibiliza operações que viabilizam sua consulta como: consultar quais são as colunas disponíveis, quantos registros foram retornados na consulta, os valores de cada campo, e filtrar os valores de retorno.\n\nO diagrama abaixo apresenta um modelo conceitual sobre os Datasets.\n\n![](..\\..\\images\\image2013-8-30%20154126.png)\n\n# Tipos de Datasets\n\n---\n\nExistem três tipos de datasets gerenciados pela plataforma: internos, simples e avançados:\n\n- **Internos**: permitem acessar dados das entidades do TOTVS Fluig Plataforma, como usuários, grupos, processos ou tarefas, por exemplo, e também os dados existentes em formulários publicados pelos usuários (cada formulário criado via plataforma cria um dataset interno, com a opção de dar o nome para o dataset de formulário).\n\n Confira [aqui](Desenvolvimento de Datasets/Datasets internos.md) mais detalhes sobre os datasets internos que acessam dados das entidades da plataforma.\n- **Simples**: realizam consulta em dados provindos de API, de forma simplificada e sem codificação, por isso podem ser utilizados em uma grande gama de situações, por exemplo: extração de dados de um serviço externo (via *WebServices*, por exemplo). A plataforma pode gerar a integração sem qualquer tipo de codificação, sendo necessário apenas informar o endereço e o método do *Webservice* que contém as informações.\n\n Acesse [aqui](Desenvolvimento de Datasets/Dataset Simples.md) para saber como construir facilmente um dataset simples.\n- **Avançados:**  é uma forma de customização do dataset simples, permitindo navegar nos dados retornados por meio de uma codificação em JavaScript. Por exemplo: definição de uma lista de valores fixos (como estados de um país).\n\n Acesse [aqui](Desenvolvimento de Datasets/Construção do Dataset Avançado.md) para saber como codificar um dataset avançado.\n\nAs nomenclaturas dos tipos *simples* e *avançados* foram adotadas a partir da **atualização 1.6.5**. Antes disso, os tipos de datasets eram chamados de *gerados* ou *customizados*, respectivamente.\n\nAinda que os Datasets possam ter origens distintas, não existe qualquer diferença sob a perspectiva do componente que realizará consultas neste Dataset. Esta característica representa um grande benefício para os usuários, uma vez que a fonte dos Datasets pode ser alterada sem que isto represente retrabalho nos pontos onde ele é utilizado." }, { "metadata": { "title": "Desenvolvimento de Datasets", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets.md" }, "content": "Desenvolvimento de Datasets\n\n## Exemplificando\n\n---\n\nPara entender melhor, considere um processo *workflow* que precise trabalhar com uma lista de centros de custo. Em um primeiro momento, pode-se trabalhar com um Dataset simples que monte, de forma fixa, os registros referentes a cada um dos centros de custo necessários para este processo.\n\nUma vez que codificar a lista se torne pouco flexível (devido a alterações frequentes nos dados), é possível definir que a fonte de dados seja baseada em um Dataset de formulário, desde que se observe o nome dos campos do Dataset, não haverá qualquer impacto sobre o processo *workflow*.\n\nEm um terceiro momento, pode-se optar por mudar o Dataset novamente, desta vez extraindo os centros de custo do ERP do cliente. Novamente não haverá impacto para o processo *workflow* (ou para os demais pontos que utilizem o Dataset), desde que se mantenha a estrutura do Dataset inalterada.\n\n# Consultando dados\n\n---\n\nA consulta aos dados retornados pelo Dataset pode ser feita pelo Fluig Studio ou pela própria plataforma (via painel de controle ou *widget*).\n\n## Via Painel de Controle\n\nA partir da **atualização 1.6.2**, o administrador do sistema pode consultar o que o Dataset está retornando, acessando Painel de Controle > Datasets, localizando o Dataset desejado, e acionando Mais ações > Consultar. Os dados retornados serão apresentados de forma semelhante à janela abaixo.\n\n![](..\\..\\images\\Exportar.gif)\n\n## Via Widget" }, { "metadata": { "title": "Desenvolvimento de Datasets", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets.md" }, "content": "Desenvolvimento de Datasets\n\n\nAtravés da widget **Listar registros de *datasets,***é possível consultar os Datasets disponíveis bem como visualizar o seu conteúdo. Com isto é possível verificar quais os campos disponíveis, tanto para filtros quanto para acesso. Através desta widget, visualizações de datasets podem ser publicadas em páginas ou comunidades.\n\nO exemplo abaixo apresenta um exemplo de Dataset sendo visualizado pela widget:\n\n![](..\\..\\images\\Widget%20Dataset%20165.png)\n\nPara filtrar os dados na *widget* de visualização de Datasets, é necessário selecionar quais os campos que você deseja utilizar o filtro, conforme a imagem a seguir:\n\n![](..\\..\\images\\Widget%20configurado%20165.png)\n\nObservações\n\nEm Datasets internos o filtro por campos ***metadata*** funcionará apenas se forem únicos, ou seja, se deseja filtrar por \"***metadata#parent\\_id\"***, o filtro deve estar ativado apenas para ele. Em Datasets simples ou avançados, o filtro deve ser implementado junto ao seu código de criação.\n\nVia Fluig Studio\n\nPara conhecer a consulta de datasets via Fluig Studio, acesse a página de [Visualização de Datasets](Fluig Studio/Visualização de Datasets.md).\n\n# Acessando um Dataset\n\n---\n\nVários pontos da plataforma podem fazer uso dos Datasets. Dependendo do local onde o Dataset é utilizado, podem ocorrer variações na forma de acessá-lo ou de manuseá-lo. Para saber mais sobre as formas de acesso ao dataset, consulte a documentação [Acessando Datasets](Desenvolvimento de Datasets/Acessando Datasets.md).\n\nOs Datasets de fontes externas também podem ser sincronizados, para reduzir o número de acessos a serviços de dados e tráfego de informações. Para saber como funciona a sincronização, consulte [Sincronização de Datasets](Desenvolvimento de Datasets/Sincronização de datasets.md).\n\n# Importar e Exportar Datasets\n\n---\n\nA plataforma possibilita exportar um dataset do ambiente de teste/homologação para posteriormente importá-lo no servidor de produção. A partir da **atualização 1.6.5**, esse recurso está disponível pela tela de Datasets, no Painel de Controle. Nas atualizações anteriores, a importação e exportação de datasets ocorria apenas pelo Fluig Studio.\n\n# Para saber mais\n\n---\n\nVídeos How To\n\nVeja mais vídeos how to sobre datasets em: [Datasets - Consulta, criação e registros](https://tdn.totvs.com/pages/viewpage.action?pageId=270925461)." }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\n![](..\\..\\images\\pratica.png)\n\n**COLOQUE EM PRÁTICA!** \nEssa página contém as instruções principais e exemplos de implementação, servindo como ponto de partida para seu desenvolvimento. Os exemplos devem ser analisados e adaptados para cada cenário e necessidade específica, lembrando que as implementações realizadas são de responsabilidade do cliente e não possuem suporte do time TOTVS Fluig.\n\n# Índice\n\n- 1 [Eventos globais](#DesenvolvimentodeEventos-Eventosglobais)\n - 1.1 [SocialPostEventVO](#DesenvolvimentodeEventos-SocialPostEventVO)\n- 2 [Desenvolvimento de Eventos](#DesenvolvimentodeEventos-DesenvolvimentodeEventos)\n - 2.1 [Eventos do tipo \"Before\"](#DesenvolvimentodeEventos-Eventosdotipo\"Before\")\n - 2.2 [Eventos do tipo \"After\"](#DesenvolvimentodeEventos-Eventosdotipo\"After\")\n- 3 [Eventos Gerais Disponíveis](#DesenvolvimentodeEventos-EventosGeraisDisponíveis)\n - 3.1 [DisplayCentralTasks](#DesenvolvimentodeEventos-DisplayCentralTasks)\n - 3.2 [DisplayCustomMetadata](#DesenvolvimentodeEventos-DisplayCustomMetadata)\n - 3.3 [BeforeWatchContent](#DesenvolvimentodeEventos-BeforeWatchContent)\n - 3.4 [AfterWatchContent](#DesenvolvimentodeEventos-AfterWatchContent)\n - 3.5 [BeforeUnwatchContent](#DesenvolvimentodeEventos-BeforeUnwatchContent)\n - 3.6 [AfterUnwatchContent](#DesenvolvimentodeEventos-AfterUnwatchContent)\n - 3.7 [beforeCreateUser](#DesenvolvimentodeEventos-beforeCreateUser)\n - 3.8 [afterCreateUser](#DesenvolvimentodeEventos-afterCreateUser)\n - 3.9 [beforeUpdateUser](#DesenvolvimentodeEventos-beforeUpdateUser)\n - 3.10 [afterUpdateUser](#DesenvolvimentodeEventos-afterUpdateUser)\n - 3.11 [beforeDeactivateUser](#DesenvolvimentodeEventos-beforeDeactivateUser)\n - 3.12 [afterDeactivateUser](#DesenvolvimentodeEventos-afterDeactivateUser)\n - 3.13 [beforeActivateUser](#DesenvolvimentodeEventos-beforeActivateUser)\n - 3.14 [afterActivateUser](#DesenvolvimentodeEventos-afterActivateUser)\n - 3.15 [beforeLogin](#DesenvolvimentodeEventos-beforeLogin)\n - 3.16 [afterLogin](#DesenvolvimentodeEventos-afterLogin)\n - 3.17 [onLoginError](#DesenvolvimentodeEventos-onLoginError)\n - 3.18 [onLogout](#DesenvolvimentodeEventos-onLogout)\n - 3.19 [onNotify](#DesenvolvimentodeEventos-onNotify)\n - 3.20 [beforeSendNotification](#DesenvolvimentodeEventos-beforeSendNotification)\n - 3.21 [afterSendNotification](#DesenvolvimentodeEventos-afterSendNotification)\n - 3.22 [onDisplayTasks](#DesenvolvimentodeEventos-onDisplayTasks)\n - 3.23 [onDisplayTasksSummary](#DesenvolvimentodeEventos-onDisplayTasksSummary)\n- 4 [Objetos utilizados nos eventos](#DesenvolvimentodeEventos-Objetosutilizadosnoseventos)\n\n - 4.1.1 [DocumentDto](#DesenvolvimentodeEventos-DocumentDto)\n - 4.1.2 [DocumentEditDto](#DesenvolvimentodeEventos-DocumentEditDto)\n - 4.1.3 [ApproverDto](#DesenvolvimentodeEventos-ApproverDto)\n - 4.1.4 [DocumentSecurityConfigDto](#DesenvolvimentodeEventos-DocumentSecurityConfigDto)\n - 4.1.5 [RelatedDocumentDto](#DesenvolvimentodeEventos-RelatedDocumentDto)\n - 4.1.6 [ProcessDefinitionVersionDto](#DesenvolvimentodeEventos-ProcessDefinitionVersionDtoProcessDefinitionVersionDto)\n - 4.1.7 [WatchDTO](#DesenvolvimentodeEventos-WatchDTO)\n - 4.1.8 [SocialPostEventVO](#DesenvolvimentodeEventos-SocialPostEventVOSocialPostEventVO)\n - 4.1.9 [SociableEventVO](#DesenvolvimentodeEventos-SociableEventVOSociableEventVO)\n - 4.1.10 [SocialEventVO](#DesenvolvimentodeEventos-SocialEventVOSocialEventVO)\n - 4.1.11 [SocialShareEventVO](#DesenvolvimentodeEventos-SocialShareEventVOSocialShareEventVO)\n - 4.1.12 [SocialCommentEventVO](#DesenvolvimentodeEventos-SocialCommentEventVOSocialCommentEventVO)\n - 4.1.13 [SocialDenounceEventVO](#DesenvolvimentodeEventos-SocialDenounceEventVOSocialDenounceEventVO)\n - 4.1.14 [SocialLikeEventVO](#DesenvolvimentodeEventos-SocialLikeEventVOSocialLikeEventVO)\n - 4.1.15 [SocialCommunityRelationEventVO](#DesenvolvimentodeEventos-SocialCommunityRelationEventVOSocialCommunityRelationEventVO)\n - 4.1.16 [SocialFollowEventVO](#DesenvolvimentodeEventos-SocialFollowEventVOSocialFollowEventVO)\n - 4.1.17 [SocialPictureEventVO](#DesenvolvimentodeEventos-SocialPictureEventVOSocialPictureEventVO)\n - 4.1.18 [GenericAlertEventVO](#DesenvolvimentodeEventos-GenericAlertEventVOGenericAlertEventVO)\n - 4.1.19 [GenericAlertEventVO](#DesenvolvimentodeEventos-GenericAlertEventVO)\n - 4.1.20 [WorkflowTasksVO](#DesenvolvimentodeEventos-WorkflowTasksVOWorkflowTasksVO)\n - 4.1.21 [WorkflowTasksVO](#DesenvolvimentodeEventos-WorkflowTasksVO)- 4.2 [Exemplo com usuário de aplicação](#DesenvolvimentodeEventos-Exemplocomusuáriodeaplicação)\n- 5 [Atualização do Analytics](#DesenvolvimentodeEventos-AtualizaçãodoAnalytics)\n - 5.1 [Definição](#DesenvolvimentodeEventos-Definição)\n - 5.2 [Exemplo de uso](#DesenvolvimentodeEventos-Exemplodeuso)\n\n# Eventos globais\n\n---\n\nOs eventos globais do fluig são executados pela plataforma antes ou após alguma ação ocorrer (Ex: Aprovação de documento, movimentação de processo, publicação de comentário etc). Tais eventos podem ser personalizados através da linguagem Javascript. Os eventos são divididos em eventos do tipo before, que ocorre antes que a ação que disparou o evento seja efetivada e do tipo after, que ocorre após a ação acontecer." }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n#### SocialPostEventVO" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nVeja o exemplo em nosso repositório [aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse).\n\n# Desenvolvimento de Eventos\n\n---\n\nO desenvolvimento de eventos é realizado pela criação de scripts na linguagem “JavaScript”. O código de implementação de cada script é armazenado em banco de dados e dispensa o uso de quaisquer outros arquivos, como por exemplo, “custom.p”.\n\nAtenção\n\nPara que um usuário que não é administrador da empresa possa criar, importar, editar e remover eventos globais é necessário que ele possua a permissão \"Configurar Eventos Globais\". Esta permissão pode ser concedida pelo administrador através do item \"Permissões\" disponível no agrupador \"Pessoas\" do Painel de Controle do fluig.\n\nSaiba como realizar esse procedimento [clicando aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=269431799).\n\nOs desenvolvimentos sobre a plataforma fluig são feitos pelo administrador, a partir do fluig Studio. No projeto fluig, clique com o botão direito sobre a pasta *events*e em seguida *Novo -> Evento Global fluig* conforme a figura abaixo.\n\n![](..\\..\\images\\image2013-9-19%20152928.png)\n\n**Figura 1 - Criação de evento - fluig Studio.**\n\nEm seguida basta informar o Servidor e o Nome do Evento que será adicionado. Uma tela para edição do evento será aberta, conforme imagem a seguir:\n\n![](..\\..\\images\\image2013-9-19%20153341.png)\n\n**Figura 2 - Criação de evento - fluig Studio.**\n\nÉ possível observar também que o arquivo .js foi adicionado a pasta *events* do projeto.\n\nO fluig permite utilizar o  log de execução nos eventos desenvolvidos sobre a plataforma. Através da variável global “log” é possível obter o feedback da execução de cada evento. Existem quatro níveis de log, são eles:\n\n- **ERROR:** apresentação de erros.\n- **DEBUG:** depurar a execução.\n- **WARN:** informar possível problema de execução.\n- **INFO:** apresentação de mensagens.\n\nA apresentação de cada um dos tipos de log está condicionada a configuração do servidor de aplicação. Por exemplo, no servidor de aplicação, por padrão, as mensagens do tipo info e warn são apresentadas no console do servidor e as do tipo debug, error são apresentadas no arquivo de log. Abaixo um exemplo de uso do log em script:\n\n```\n log.info(\"Testando o log info\");\n```\n\nTeríamos no console do servidor a mensagem “Testando o log info”.\n\nAtenção\n\nGrande parte dos eventos possuem **WKUser** para identificar o usuário. Esse ao utilizar a função de substituto, onde um usuário pode substituir outro, irá sempre retornar o usuário que está no momento utilizando o sistema.\n\nExemplo: Ana colocou Bruno como seu substituto, Bruno acessa o sistema e faz uma ação em nome da Ana, sistema irá retornar o código do usuário Bruno nos eventos que usam **WKUser**.\n\nAtenção\n\nEm todos os eventos é possível realizar chamadas para os serviços disponíveis na API pública. Acesse [aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=185736325) nosso guia de consumo da API pública em eventos." }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n## Eventos do tipo \"**Before\"**\n\n---\n\nDe uma forma geral, os eventos do tipo **before** são executados antes que a ação que disparou o evento seja efetivada, desta forma é possível filtrar os dados que são passados ou até mesmo evitar que a ação executada seja concluída.\n\nPara bloquear a ação basta lançar uma *Exception* passando uma mensagem de texto que será exibida em formado de *toast* para o usuário:\n\n**Exemplo:**\n\n**Estrutura do Evento**\n\n```\n throw \"Você não pode efetuar esta ação após as 18 horas.\"\n```\n\n## Eventos do tipo \"**After\"**\n\n---\n\nJá os eventos do tipo **after** são executados após a efetivação da ação e não possuem nenhuma influência sobre esta. Ou seja, qualquer dado alterado no parâmetro recebido dentro do evento não será refletido sobre o conteúdo persistido da ação.\n\nOutra característica interessante desse tipo de evento é que eles ***não devem lançar exceção***, caso isso ocorra a exceção ignorada pelo sistema.\n\n# Eventos Gerais Disponíveis\n\n---\n\nA seguir serão detalhados os eventos gerais disponíveis no fluig. Eventos que podem ser disparados sem exclusividade de atividades de um card específico.\n\n### DisplayCentralTasks" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEste evento é disparado sempre antes de ser exibida a central de tarefas. Através dele é possível inserir, alterar ou remover os links da central de tarefas. O evento recebe como parâmetro um LinkedHashMap com os links disponíveis na central de tarefas.\n\nExemplo adicionando um link customizado ao final dos itens da central de tarefas:\n\n```\nfunction displayCentralTasks (links){\nlinks.put(\"Fluig\",\"http://www.fluig.com\");\n}\n```\n\nExemplos alterando a ordem de exibição dos links padrões e adicionando três novos, um no início e dois ao final:\n\n```\nfunction displayCentralTasks (links){\n\tvar _links = new java.util.LinkedHashMap();\n\t_links.put(\"Fluig\",\"http://www.fluig.com\"); \n var it = links.keySet().iterator();\n while (it.hasNext()) { \n var key = it.next();\n _links.put(key, links.get(key));\n\t} \n\t_links.put(\"Fluig - DEV\" ,\"http://dev.fluig.com\");\n\t_links.put(\"Google\",\"http://www.google.com.br/search?sourceid=chrome&ie=UTF-8&q=\" + getValue(\"WKUser\"));\n\n\tlinks.clear();\n\tlinks.putAll(_links);\n}\n```\n\nDisponibilizamos algumas informações sobre o usuário e a empresa, porém somente para consulta através do método getValue.\n\n| | |\n| --- | --- |\n| WKUser | Código do usuário |\n| WKCompany | Número da empresa |\n\n**Exemplo**\n\n```\nfunction displayCentralTasks (links){\nlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```\n\n### DisplayCustomMetadata" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEste evento é disparado sempre antes de ser exibidos os campos customizados de um documento, tanto na publicação como edição. Através dele é possível sugerir valores iniciais para campos customizados dos metadados de um documento. O evento recebe como parâmetro uma referência aos campos customizados.\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n}\n```\n\nNo contexto deste evento a variável fields pode ser usada para consultar ou modificar os valores dos campos customizados de um documento. Não permitindo adicionar novos campos.\n\nPara inserir novos campos em um documento existe diversos maneiras disponíveis.\n\n- Pela herança da pasta pai.\n- No cadastro de Campos Customizados, marcando a opção *Mostrar em todos documentos* ou da forma padrão.\n- Através do WebService CustomFieldsService.\n- Na edição dos metadados do documento, pelo usuário.\n\nPara consultar o valor de um campo customizado neste evento, utiliza-se o fields.getValue passando como parâmetro o código do campo desejado. Retornando “null”, casso o campo não esteja disponível para este documento.\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n\tlog.info(\"Valor do Campo 1: \" + fields.getValue(\"campo1\"));\n}\n```\n\nJá pra a edição utiliza-se o fields.setValue, passando como parâmetro, primeiro o nome do campo, em seguida o valor.\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n\tfields.setValue(\"campo1\",\"Valor para o Campo 1\");\n}\n```\n\nAlem dos valores dos campos customizados disponibilizamos algumas informações do documento que está sendo criado ou editado, porém somente para consulta através do método getValue.\n\n| | |\n| --- | --- |\n| WKUser | Código do usuário |\n| WKCompany | Número da empresa |\n| WKNumParentDocument | Número da pasta pai |\n| WKDocumentType | Tipo do documento |\n| WKPrivateDocument | Se o documento esta sendo publicado na pasta particular (true/false) |\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n\tlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n### BeforeWatchContent\n\nUtilizado quando ao acompanhar algum conteúdo se deseja recuperar informações do registro e usar antes da ação de \"acompanhar\". Por exemplo, ao acompanhar um documento, é possível recuperar suas informações e usá-las em um dataset.\n\n**Exemplo**\n\n```\nfunction beforeWatchContent(companyId, watchDTO){\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| companyId | Código da Empresa | int |\n| watchDTO | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction beforeWatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"DOCUMENT\"){\n\t\tvar objClass = \"com.totvs.technology.social.document.6\";\n\t\tvar objClass = watchDTO.getObjectClass();\n\t\tvar patt = new RegExp( /\\d+/) ; \n\t\tvar documentId = patt.exec(objClass) ;\n\t\tvar documentVersion = watchDTO.getObjectId();\n\t\tvar doc = getValue(\"WKDocument\"); \n\t\tvar company = companyId; \n\t\tvar ds ;\n\t\ttry { \n\t\t\tvar c1 = DatasetFactory.createConstraint( \"allocatedDocumentPK.companyId\", company, company, ConstraintType.MUST); \n\t\t\tvar c2 = DatasetFactory.createConstraint(\"allocatedDocumentPK.sourceDocument\",documentId,documentId, ConstraintType.MUST); \n\t\t\tvar c3 = DatasetFactory.createConstraint(\"allocatedDocumentPK.sourceVersion\", documentVersion,documentVersion, ConstraintType.MUST); \n\t\t\tvar c4 = DatasetFactory.createConstraint(\"active\", \"true\",\"true\",ConstraintType.MUST); \n\t\t\tvar constraints = new Array(c1, c2, c3, c4); \n\t\t\t\n\t\t\tds = DatasetFactory.getDataset(\"allocatedDocument\", null, constraints, null); \n\t\t}catch (e) {\n\t\t\tlog.error(\"Erro ao tentar recuperar o documento em CheckOut: \" + e.message); \n\t\t} \n\t \n\t\tif(ds!=null && ds.rowsCount>0){ \n\t\t throw \"Sua solicitação de notificação foi negada, pois o documento está em checkout.\" ; \n\t\t}\n\t}\n}\n```\n\n### AfterWatchContent" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nUtilizado quando ao acompanhar algum conteúdo se deseja recuperar informações do registro e usar após a ação de \"acompanhar\". Por exemplo, ao acompanhar um post, é possível recuperar suas informações e usá-las para informar o usuário sobre o autor do post.\n\n**Exemplo**\n\n```\nfunction afterWatchContent(companyId, watchDTO){\t\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| companyId | Código da Empresa | int |\n| watchDTO | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction afterWatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"POST\"){\n\t\tthrow \"O usuário \"+watchDTO.getUserAlias()+\" vai ser notificado sobre o post \" + watchDTO.getText() + \" do autor \" + watchDTO.getPostAuthor() ;\n\t}\n}\n```\n\n### BeforeUnwatchContent\n\nUtilizado quando ao deixar de acompanhar algum conteúdo se deseja recuperar informações do registro e usar antes da ação de \"deixar de acompanhar\". Por exemplo, ao tentar deixar de acompanhar uma comunidade, é possível decidir se o usuário pode deixar de acompanhá-la.\n\n**Exemplo**\n\n```\nfunction beforeUnwatchContent(companyId, watchDTO){\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| companyId | Código da Empresa | int |\n| watchDTO | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction beforeUnwatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"COMMUNITY\"){\n\t\t\n\t\tthrow \"Você não pode deixar de ser notificado sobre a comunidade \" + watchDTO.getDescription() ;\n\t}\n}\n```\n\n### AfterUnwatchContent" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nUtilizado quando ao deixar de acompanhar algum conteúdo se deseja recuperar informações do registro e usar após a ação de \"deixar de acompanhar\". Por exemplo, ao deixar de acompanhar um post, é possível recuperar suas informações e informar o usuário que aquele post possui muitos seguidores.\n\n**Exemplo**\n\n```\nfunction afterUnwatchContent(companyId, watchDTO){\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| companyId | Código da Empresa | int |\n| watchDTO | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction afterUnwatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"POST\" && watchDTO.getNumberWatchers() < 3 ){\n\t\tlog.erro(\"O post \\\"\" + watchDTO.getText() + \"\\\" do autor \" + watchDTO.getPostAuthor() + \" deixou de ser polemico\" )\n\t}\n}\n```\n\n### beforeCreateUser" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEvento disparado antes da criação de um novo usuário. Pode ser utilizado quando for necessário realizar validações no usuário antes da sua criação ou adicionar dados adicionais programaticamente.\n\n```\nfunction beforeCreateUser(user) {\n}\n```\n\nSomente os atributos firstName, lastName, fullName podem ser modificados. Para adicionar dados adicionais para o usuário deve ser utilizado o método **addData** do UserEventVO.\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| user | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n\nExemplo de implementação:\n\n```\nfunction beforeCreateUser(user) {\n\t// Verifica se a senha informada atende os requisitos mínimos\n\tvar passwordPattern = \"((?=.*\\\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,16})\";\n\tif (!user.getPassword().matches(passwordPattern)) {\n\t\tthrow \"A senha do usuário não atendeu os requisitos mínimos!\";\n\t}\n\n\t// Adiciona um dado adicional ao usuário informando a sua data de criação\n\tvar dateFormat = new java.text.SimpleDateFormat(\"dd/MM/yyyy HH:mm:ss\");\n\tuser.putData(\"CreationDate\", dateFormat.format(new Date()));\n}\n```\n\n### afterCreateUser" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEvento disparado depois da criação de um novo usuário. Pode ser utilizado quando for necessário realizar alguma rotina com o usuário criado, como exemplo a criação de recursos adicionais para o usuário.\n\n```\nfunction afterCreateUser(user) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| user | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n\nExemplo de implementação:\n\n```\nfunction afterCreateUser(user) {\n\t// Instância um cliente da API pública do Fluig. O usuário aplicativo utilizado\n\t// precisa ser um administrador do Fluig\n\t// Documentação para criar usuário aplicativo: http://tdn.totvs.com/x/KAFlDw\n\tvar consumer = oauthUtil.getNewAPIConsumer(\n\t\t\t\"e3fe3d72-bfcc-4552-8c9b-93c66531dab9\", //Consumer Key do OAuth App\n\t\t\t\"6bd0591b-73d8-4a9e-a161-d54dd92d3172-5a21991e-453f-4ea1-b80c-f42d4c57759d\", //Consumer Secret do OAuth App\n\t\t\t\"11a419dd-0c8a-4388-bd32-d66319bd750b\", //Access Token do Usuário Aplicativo\n\t\t\t\"fd2b53a4-b43d-4118-9725-68abaa1b41a9ee584784-73b2-454b-942f-5e07ad114234\"); //Token Secret do Usuário Aplicativo\n\n\t// Adiciona o usuário criado na comunidade RH através da utilização do método \n\t// addParticipants do serviço de comunidades da API Pública\n\t// Alterar a comunidade RH para a comunidade que deseja realizar a ação em seu ambiente\n\tvar postJson = '{\"communityAlias\": \"RH\", \"userAliases\": [\"' + user.getLogin() + '\"]}';\n\tconsumer.post(\"/public/social/community/addParticipants\", postJson);\n}\n```\n\n### beforeUpdateUser" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEvento disparado antes da atualização de um usuário. Pode ser utilizado quando for necessário realizar validações no usuário antes da sua atualização ou adicionar dados adicionais programaticamente.\n\n```\nfunction beforeUpdateUser(user) {\n}\n```\n\nSomente os atributos firstName, lastName, fullName podem ser modificados. Para adicionar dados adicionais para o usuário deve ser utilizado o método **addData** do UserEventVO.\n\nPara verificar se a senha do usuário foi alterada basta utilizar o método **getPassword**, onde caso seja retornado algum valor significa que a senha foi alterada. Já para verificar se a atualização do usuário foi realizada por ele próprio, através da edição de perfil, é necessário comparar o login do usuário recebido como parâmetro, através do método **getLogin** com o login do usuário corrente, resgatado através da chamada **getValue(\"WKUser\")**, onde caso sejam iguais significa que a atualização foi realizada pelo próprio usuário.\n\nExemplo:\n\n```\n// Verifica se foi alterada a senha do usuário\nif (user.getPassword() != null) {\n\tdoSomething();\n}\n \n// Verifica se a atualização do usuário foi realizada por ele próprio\nif (user.getLogin().equals(getValue(\"WKUser\"))) {\n\tdoSomething();\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| user | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n\nExemplo de implementação:\n\n```\nfunction beforeUpdateUser(user) {\n\t// Verifica se foi alterada a senha do usuário\n\tif (user.getPassword() != null) {\n\t\t// Caso a senha tenha sido alterada verifica se ela atende os requisitos mínimos\n\t\tvar passwordPattern = \"((?=.*\\\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,16})\";\n\t\tif (!user.getPassword().matches(passwordPattern)) {\n\t\t\tthrow \"A senha do usuário não atendeu os requisitos mínimos!\";\n\t\t}\n\t}\n\n\t// Adiciona um dado adicional ao usuário informando a última data de atualização\n\tvar dateFormat = new java.text.SimpleDateFormat(\"dd/MM/yyyy HH:mm:ss\");\n\tuser.putData(\"LastUpdateDate\", dateFormat.format(new Date()));\n}\n```" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n### afterUpdateUser\n\nEvento disparado depois da atualização de um usuário, ou após a gravação de uma nova senha, pelo recurso de reset de senha da [tela de login](https://tdn.totvs.com/pages/viewpage.action?pageId=389547065).\n\nO evento *afterUpdateUser* será disparado no reset de senha pela tela de login somente na **atualização 1.6.5 ou superior**.\n\nEsse evento pode ser utilizado quando for necessário realizar alguma rotina com o usuário atualizado, como exemplo a atualização de recursos adicionais do usuário.\n\n```\nfunction afterUpdateUser(user) {\n}\n```\n\nPara verificar se a senha do usuário foi alterada basta utilizar o método **getPassword**, onde caso seja retornado algum valor significa que a senha foi alterada. Já para verificar se a atualização do usuário foi realizada por ele próprio, através da edição de perfil, é necessário comparar o login do usuário recebido como parâmetro, através do método **getLogin** com o login do usuário corrente, resgatado através da chamada **getValue(\"WKUser\")**, onde caso sejam iguais significa que a atualização foi realizada pelo próprio usuário.\n\nExemplo:\n\n```\n// Verifica se foi alterada a senha do usuário\nif (user.getPassword() != null) {\n\tdoSomething();\n}\n \n// Verifica se a atualização do usuário foi realizada por ele próprio\nif (user.getLogin().equals(getValue(\"WKUser\"))) {\n\tdoSomething();\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| user | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n\nExemplo de implementação:\n\n```\nfunction afterUpdateUser(user) {\n\tlog.info(\"O usuário \" + user.getFullName() + \" foi alterado.\");\n}\n```\n\n### beforeDeactivateUser" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEvento disparado antes da desativação de um usuário. Pode ser utilizado quando for necessário realizar validações no usuário antes da sua desativação.\n\n```\nfunction beforeDeactivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário a ser desativado | String |\n\nExemplo de implementação:\n\n```\nfunction beforeDeactivateUser(login) {\n\t// Instância um cliente da API pública do Fluig. O usuário aplicativo utilizado\n\t// precisa ser um administrador do Fluig\n\tvar consumer = oauthUtil.getNewAPIConsumer(\n\t\t\t\"e3fe3d72-bfcc-4552-8c9b-93c66531dab9\", \n\t\t\t\"6bd0591b-73d8-4a9e-a161-d54dd92d3172-5a21991e-453f-4ea1-b80c-f42d4c57759d\",\n\t\t\t\"11a419dd-0c8a-4388-bd32-d66319bd750b\",\n\t\t\t\"fd2b53a4-b43d-4118-9725-68abaa1b41a9ee584784-73b2-454b-942f-5e07ad114234\");\n\n\t// Verifica se o usuário que esta sendo desativado é moderador de alguma comunidade. \n\tvar moderateCommunities = [];\n\tvar communities = JSON.parse(consumer.get(\"/public/social/community/listCommunities\")).content;\n\tfor (var i in communities) {\n\t\tvar isModerator = JSON.parse(consumer.get(\"/public/social/community/isCommunityModerator/\" \n\t\t\t\t+ communities[i].alias + \"/\" + login)).content;\n\t\tif (isModerator) {\n\t\t\tmoderateCommunities.push(communities[i].name);\n\t\t}\n\t}\n\n\t// Caso o usuário seja moderador de alguma comunidade lança uma exceção informando que\n\t// o usuário é moderador de comunidades e não pode ser desativado\n\tif (moderateCommunities.length > 0) {\n\t\tthrow \"O usuário \" + login + \" não pode ser desativado por ser moderador nas comunidades: \" \n\t\t\t\t+ moderateCommunities.join(\", \") + \".\";\n\t}\n}\n```\n\n### afterDeactivateUser" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEvento disparado depois da desativação de um usuário. Pode ser utilizado quando for necessário realizar alguma rotina com o usuário desativado.\n\n```\nfunction afterDeactivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário desativado | String |\n\nExemplo de implementação:\n\n```\nfunction afterDeactivateUser(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\tservice.deactivateUser(login);\n\n\tlog.info(\"O usuário \" + login + \" foi desativado no serviço customizado.\");\n}\n```\n\n### beforeActivateUser\n\nEvento disparado antes da ativação de um usuário. Pode ser utilizado quando for necessário realizar validações no usuário antes da sua ativação.\n\n```\nfunction beforeActivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário a ser ativado | String |\n\nExemplo de implementação:\n\n```\nfunction beforeActivateUser(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\n // Caso o usuário esteja desativado no serviço customizado lança uma exceção informando\n\t// que o usuário está desativado no serviço customizado e não pode ser ativado no Fluig\n if (service.isDeactivatedUser(login)) {\n\t\tthrow \"O usuário \" + login + \" está desativado no serviço customizado e não pode ser ativado!\";\n }\n}\n```\n\n### afterActivateUser" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEvento disparado depois da ativação de um usuário. Pode ser utilizado quando for necessário realizar alguma rotina com o usuário ativado.\n\n```\nfunction afterActivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário ativado | String |\n\nExemplo de implementação:\n\n```\nfunction afterActivateUser(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\tservice.activateUser(login);\n\n\tlog.info(\"O usuário \" + login + \" foi ativado no serviço customizado.\");\n}\n```\n\n### beforeLogin" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEvento disparado antes do login de um usuário. Pode ser utilizado quando for necessário realizar validações antes do usuário ser autenticado no fluig, possibilitando o cancelamento do login caso seja lançada uma exceção através do evento.\n\nAtenção!\n\nO uso indevido do evento *beforeLogin* pode ocasionar inconsistência no login da plataforma, fazendo com que o usuário não consiga mais logar. Recomendamos atenção ao utilizar este evento.\n\n```\nfunction beforeLogin(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário | String |\n\nExemplo de implementação:\n\n```\nfunction beforeLogin(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\n\t// Caso o usuário esteja bloqueado pelo serviço customizado lança uma exceção informando\n\t// que o usuário está desativado no serviço customizado e cancela o login no Fluig\n if (service.isBlockedUser(login)) {\n\t\tthrow \"O usuário \" + login + \" está desativado no serviço customizado\";\n }\n}\n```\n\n### afterLogin" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEvento disparado após o login de um usuário. Pode ser utilizado quando for necessário realizar alguma rotina  quando o usuário é autenticado no fluig.\n\n```\nfunction afterLogin(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário | String |\n\nExemplo de implementação:\n\n```\nfunction afterLogin(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n service.addUserSession(login);\n}\n```\n\nO evento **afterLogin** funciona mesmo com a autenticação via Identity. O DesktopSSO ou a autenticação automática não interfere na execução do evento, porque ele é executado depois do login não importando como é feito.\n\n### onLoginError" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEvento disparado quando ocorrer um erro de login de um usuário. Este erro pode ser por login e senha inválidos ou usuário inativo. Pode ser utilizado quando for necessário realizar alguma rotina quando ocorrer um erro de login ou apresentar uma mensagem personalizada para o usuário.\n\n```\nfunction onLoginError(login, errorCause) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário | String |\n| errorCause | Motivo do erro de login, onde: 0 - Login e senha inválidos 1 - Usuário inativo | Integer |\n\nExemplo de implementação:\n\n```\nfunction onLoginError(login, errorCause) {\n\t// Verifica se a causa de erro foi senha inválida (0 - Senha inválida, 1 - Usuário inativo)\n\tif (errorCause == 0) {\n\t\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\t\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n\t var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n\t var service = serviceLocator.getCustomServicePort();\n\t \n\t service.registerLoginAttempt(login);\n\t \n\t // Utiliza o serviço customizado para verificar quantas tentativas de login o usuário já\n\t // realizou. Caso tenha ultrapassado 3 tentativas bloqueia o usuário neste serviço \n\t // customizad e lança uma exceção informando ao usuário que ele foi bloqueado.\n\t var loginAttempts = service.checkLoginAttempts(login);\n\t if (loginAttempts > 3) {\n\t \tservice.blockUser(login);\n\t \tthrow \"Seu usuário foi bloqueado por ultrapassar 3 tentativas de login\"\n\t } else {\n\t \tthrow \"Tentativa de login \" + loginAttempts + \" de 3\"\n\t }\n\t}\n}\n```\n\n### onLogout" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEvento disparado quando o usuário realizar logout. Pode ser utilizado quando for necessário realizar alguma rotina quando o usuário realiza o logout no portal através da opção Sair.\n\n```\nfunction onLogout(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário | String |\n\nExemplo de implementação:\n\n```\nfunction onLogout(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n service.removeUserSession(login);\n \n log.info(\"Usuário \" + login + \" efetuou logout\");\n}\n```\n\n### onNotify" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nPara interferir no envio de uma notificação padrão do fluig, deve ser utilizado o evento global *onNotify*, que é disparado no momento em que qualquer notificação do fluig é enviada. Nesse evento, podem ser feitas alterações como, por exemplo, adicionar outros destinatários ao e-mail, modificar os valores dos parâmetros utilizados no template de e-mail, etc.\n\nAbaixo se encontra um exemplo de como implementar esse evento:\n\n```\nfunction onNotify(subject, receivers, template, params) {\n if (template == \"TPLDOCUMENT_APPROVAL_PENDING\") {\n receivers.add(\"usuario@dominio.com\");\n }\n}\n```\n\nAtenção\n\nA partir da versão 1.3.3 do fluig, recomenda-se fazer a validação do template utilizando **template == \"TPLDOCUMENT\\_APPROVAL\\_PENDING****\"**ao invés da função match(), evitando assim redundâncias na customização, pois o match() pode retornar como válido para mais de um template em casos como TPLNEW\\_TASK e TPLNEW\\_TASK\\_POOL\\_GROUP.\n\nDica\n\nA partir da versão fluig 1.5.13 o fluigAPI estárá habilitado para este evento.\n\nO evento onNotify está disponível na lista de eventos globais. Ao selecionar esse evento na lista de eventos disponíveis, a assinatura da função acima já será preenchida automaticamente. Este evento disponibiliza os seguintes parâmetros:\n\n| Parâmetro | Descrição |\n| --- | --- |\n| subject | É o assunto do e-mail. A alteração desta variável irá implicar que todos os usuários recebam o e-mail com o novo assunto configurado. Exemplo de utilização: **subject.add(\"ASSUNTO\");** |\n| receivers | Lista de e-mails destinatários. Também é possível adicionar outros e-mails, de usuários que não participam do processo. Inclusive, podem ser adicionados e-mails de usuários que não estão cadastrados no fluig, caso seja necessário notificar uma pessoa que não tenha acesso ao sistema. |\n| template | Permite validar qual tipo de e-mail está sendo enviado (por exemplo, template de documento em aprovação, documento expirando, etc). Com base nessa variável podemos distinguir quais e-mails queremos customizar. É recomendável que sempre seja verificado o código do template, para evitar que ocorram alterações em outros tipos de e-mail, que não necessitariam de customização. |\n| params | É um mapa de dados que permite alterar/incluir parâmetros para que sejam apresentados no e-mail. O nome dos parâmetros informados nesse mapa devem ser os mesmos que são utilizados dentro do arquivo de template. |\n\nNo exemplo que foi apresentado acima é validado se o template se refere ao *\"TPLDOCUMENT\\_APPROVAL\\_PENDING\"* (que corresponde a documento pendente de aprovação). Em caso positivo, um novo e-mail será adicionado na lista de destinatários. Ou seja, além do responsável pela aprovação, outra pessoa será notificada, recebendo uma cópia do e-mail. Como está sendo validado o código do template, os demais tipos de e-mail não serão afetados.\n\nOs templates podem ser consultados dentro do diretório do volume, em: *\\templates\\tplmail*. Se for necessário adicionar algum parâmetro no e-mail padrão, os templates podem ser editados diretamente nesse diretório.\n\nImportante\n\n- O evento global onNotify possui bind de variáveis para acesso à log, datasetManager, DatasetFactory, DatasetBuilder, ConstraintType e ServiceManager.\n- Recomenda-se verificar a lista de parâmetros (params) recebida antes de utilizá-los, pois estes variam de acordo com o template utilizado.\n- Quando um workflow possuir evento onNotify, o evento global onNotify será ignorado para os e-mails daquele processo.\n- É imprescindível a validação pelo código do template antes de qualquer implementação, pois TODOS os e-mails passarão por esta customização quando o evento estiver registrado.\n\nDica\n\nQuando o evento onNotify for utilizado como evento global, é necessário informar uma constraint extra informando o usuário para fixar as permissões, já que o evento onNotify não é executado por nenhum usuário mas sim pelo sistema. Vale lembrar ainda que quando for utilizar algum dataset interno do fluig, é necessário tambem informar uma constraint.\n\n**Exemplo**:\n\nvar constraintUser = DatasetFactory.createConstraint(\"userSecurityId\", \"nome\\_do\\_usuario\", \"nome\\_do\\_usuario\", ConstraintType.MUST);" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n### beforeSendNotification" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEvento disparado antes do envio de uma notificação ao usuário. Pode ser utilizado quando for necessário adicionar alguma informação à nota ou alterar a prioridade de uma notificação, possibilitando o cancelamento do envio da notificação caso seja definida uma prioridade através do evento.\n\nObservação\n\nPor questões de segurança, somente os campos *priority* e *note* podem ser alterados. Outras alterações não serão consideradas.\n\nImportante\n\nCaso seja lançada uma exceção através do evento a notificação não será enviada, mas esse não é o modo correto de cancelar o envio. Definir o campo *priority* como \"NONE\" impede que a notificação seja enviada sem a necessidade de lançar exceção.\n\nAbaixo segue um exemplo de como implementar esse evento:\n\n```\nfunction beforeSendNotification(notification) {\n if (notification.eventType == \"DENOUNCED_CONTENT\") {\n notification.priority = \"NONE\";\n }\n if (notification.eventType == \"DOCUMENT_APPROVED\") {\n notification.priority = \"NORMAL\";\n }\n if (notification.eventType == \"DOCUMENT_REPROVED\") {\n notification.priority = \"HIGH\";\n }\n if (notification.eventType == \"LIKE\") {\n notification.priority = \"LOW\";\n }\n}\n```\n\nSão disponibilizadas algumas propriedades referentes à notificação que está sendo enviada.\n\n| | | |\n| --- | --- | --- |\n| **Propriedade** | **Descrição** | **Tipo** |\n| aliasSender | Alias de quem enviou a notificação. Pode vir nulo nos casos em que a notificação é enviada pelo sistema. | String |\n| aliasReceiver | Alias de quem vai receber a notificação. | String |\n| place | Lugar onde foi feita a ação que gerou a notificação. Pode vir nulo quando não for um lugar socializavel. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| object | Objeto sobre o qual foi feita a ação que gerou o alerta. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| eventType | Tipo do evento que gerou a notificação. | String |\n| metadata | Metadados da notificação. | Hashmap |\n| priority | Prioridade da notificação. Valores válidos:  NONE, LOW, NORMAL, HIGH. | String |\n| note | Nota enviada junto à notificação. | String |\n\nVeja o exemplo (**event-notification**) no repositório do fluig clicando [aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/event-notification)." }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n### afterSendNotification\n\nEvento disparado após o envio de uma notificação ao usuário. Pode ser utilizado quando for necessário registrar alguma informação, para auditoria, por exemplo.\n\nAbaixo segue um exemplo de como implementar esse evento:\n\n```\nfunction afterSendNotification(notification){\n\t\tlog.info(\"notification as send for \" + notification.aliasReceiver);\n}\n```\n\nSão disponibilizadas algumas propriedades referentes à notificação que foi  enviada.\n\n| | | |\n| --- | --- | --- |\n| **Propriedade** | **Descrição** | **Tipo** |\n| aliasSender | Alias de quem enviou a notificação. Pode vir nulo nos casos em que a notificação é enviada pelo sistema. | String |\n| aliasReceiver | Alias de quem vai receber a notificação. | String |\n| place | Lugar onde foi feita a ação que gerou a notificação. Pode vir nulo quando não for um lugar socializavel. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| object | Objeto sobre o qual foi feita a ação que gerou o alerta. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| eventType | Tipo do evento que gerou a notificação. | String |\n| metadata | Metadados da notificação. | Hashmap |\n| priority | Prioridade da notificação. | String |\n| note | Nota enviada junto à notificação. | String |\n\nVeja o exemplo (**event-notification**) no [repositório do fluig](http://tdn.totvs.com/display/fluig/htt) clicando [aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/event-notification).\n\n### onDisplayTasks" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEste evento é disparado antes de serem exibidas as tarefas das aba \"Tarefas a concluir\" , \"Minhas solicitações\", \"Tarefas em pool\", \"Tarefas em consenso\" e \"Minhas tarefas sob gerência\" na central de tarefas. Através dele é possível inserir, alterar ou remover itens da central de tarefas. O evento recebe como parâmetro uma lista de [WorkflowTasksVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) das tarefas existentes.\n\nExemplo adicionando, editando e removendo uma tarefa personalizada ao final da lista de tarefas:\n\n```\nfunction onDisplayTasks(tasks) {\n\t// Adiciona uma tarefa customizada\n\tvar newTask = new WorkflowTasksVO();\n\tnewTask.setCode(\"TOTVS\");\n\tnewTask.setUrl(\"http://www.totvs.com\");\n\tnewTask.setProcessDescription(\"Nova Tarefa\");\n\tnewTask.setRequesterName(\"João da Silva\");\n\tnewTask.setStateDescription(\"Atividade 1\");\n\tnewTask.setColleagueName(\"Ana Maria\");\n\tnewTask.setStartDateProcess(\"07/09/2025\");\n\tnewTask.setDateExpires(\"07/10/2025\");\n\ttasks.add(newTask);\n\n\tfor (var i = 0; i < tasks.size(); i++) {\n\t\t// Remove a solicitação com o id 1\n\t\tif (tasks.get(i).getProcessInstanceId() == 1) {\n\t\t\ttasks.remove(i);\n\t\t\ti--; // Necessário para não pular um item após a remoção\n\t\t} else {\n\t\t\t// Altera a descrição de todos os processos para \"Nova Tarefa alterada\"\n\t\t\ttasks.get(i).setProcessDescription(\"Nova Tarefa alterada\");\n\t\t}\n\t}\n```\n\nDisponibilizamos algumas informações para consulta através do método getValue.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKUser | Código do usuário logado. | String |\n| WKUserLocale | Idioma do usuário logado. | String |\n| WKCompany | Número da empresa. | Int |\n| taskUserId | Código do usuário substituído, em caso de visualização da central como substituto. Nos demais casos retorna o usuário logado. | String |\n| taskType | Indicador do tipo de tarefas que estão sendo exibidas, “open” tarefas a concluir e “requests” para minhas solicitações. | String |\n| filter | Filtros utilizados. | Map |\n| order | Ordenação aplicada. | String |\n| maxResult | Número de resultados por página. | Int |\n| page | Número da página atual. | Int |\n| taskId | Em caso de pool,  quando o taskType for pool, o taskId trará uma string contendo o tipo no caso ‘Role’ para papel ou ‘Group‘ para grupo e seu código. Exemplo: ‘Pool:Role:admin’ para um pool do papel ‘admin’. | String |\n\n**Exemplo**\n\n```\nfunction onDisplayTasks(links){\nlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n### onDisplayTasksSummary\n\nEste evento é disparado antes de serem exibidos os contadores das abas e gráficos da central de tarefas e widgets de BPM. Através dele é possível alterar números de tarefas pendentes de cada tipo.\n\nExemplo alterando o número de tarefas abertas e no prazo:\n\n```\nfunction onDisplayTasksSummary(resumeTasks) {\n\tresumeTasks.openTasks=20;\n}\n```\n\nO objeto recebido como parâmetro contém:\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| expiredTasks | Solicitações atrasadas. | Int |\n| openTasks | Solicitações no prazo. | Int |\n| myRequests | Minhas solicitações. | Int |\n| toApprover | Aprovação de documentos pendentes. | Int |\n| myDocuments | Documentos aguardando aprovação. | Int |\n| checkout | Documento em checkout. | Int |\n| learningTasks | Atividades de Aprendizado. | Int |\n\n```\nfunction onDisplayTasksSummary(resumeTasks) {\n\tresumeTasks.expiredTasks=10;\n\tresumeTasks.openTasks=20;\n\tresumeTasks.myRequests=30;\n\tresumeTasks.toApprover=40;\n\tresumeTasks.myDocuments=50;\n\tresumeTasks.checkout=60;\n\tresumeTasks.learningTasks=70;\n}\n```\n\nDisponibilizamos algumas informações para consulta através do método getValue.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKUser | Código do usuário logado. | String |\n| WKUserLocale | Idioma do usuário logado. | String |\n| WKCompany | Número da empresa. | Int |\n| taskUserId | Código do usuário substituído, em caso de visualização da central como substituto. Nos demais casos retorna o usuário logado. | String |\n\n**Exemplo**\n\n```\nfunction onDisplayTasks(links){\nlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```\n\n# Objetos utilizados nos eventos\n\n---\n\nExistem alguns objetos disponibilizados pelo produto que são utilizados nos eventos, nas próximas sessões eles serão explicados seus métodos e seus retornos.\n\n#### DocumentDto" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEste objeto representa o documento e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getDocumentId() | Retorna o número do documento. | int |\n| getVersion() | Retorna o número da versão do documento. | int |\n| getCompanyId() | Retorna o código da empresa em que o documento foi publicado. | Int |\n| getUUID() | Retorna o UUID (identificador Único Global) do documento. | String |\n| getDocumentTypeId() | Retorna o tipo do arquivo físico, se retornar branco ou nulo é porque esse tipo não é conhecido pelo fluig. | String |\n| getLanguageId() | Retorna o código do Idioma do documento. | String |\n| getIconId() | Retorna o código do Ícone do documento. | int |\n| getTopicId() | Retorna o código do assunto do documento. | int |\n| getColleagueId() | Retorna a matricula do usuário que criou o documento. | String |\n| getDocumentDescription() | Retorna a descrição do documento. | String |\n| getAdditionalComments() | Retorna os comentários adicionais do documento. | String |\n| getPhisicalFile() | Retorna o nome do arquivo físico atrelado ao documento. | String |\n| getCreateDate() | Retorna a data de criação. | java.util.Date |\n| getApprovedDate() | Retorna a data de Aprovação. | java.util.Date |\n| getLastModifiedDate() | Retorna a Data da última modificação. | java.util.Date |\n| getDocumentType() | Retorna o tipo do documento, onde: 0 à Pasta raiz 1 à Pasta 2 à Documento normal 3 à Documento externo 4 à Formulário 5 à Registro de formulário 7 à Anexo Workflow 8 à Novo Conteúdo 9 à Aplicativo 10 à Relatório portal à Site portalPage à Página de Site | String |\n| getExpirationDate() | Retorna a data de expiração. | java.util.Date |\n| getParentDocumentId() | Retorna o número da Pasta/Formulário pai | int |\n| getRelatedFiles() | String com o nome do arquivo físico principal e anexos. | String |\n| getActiveVersion() | Retorna se a versão é ativa. | boolean |\n| getVersionDescription() | Retorna a descrição da versão. | String |\n| getDownloadEnabled() | Retorna se o documento permite Download | boolean |\n| getApproved() | Retorna se o documento está em aprovação. | boolean |\n| getValidationStartDate() | Retorna a partir de que data em que o documento poderá ser visualizado. | java.util.Date |\n| getPublisherId() | Retorna a matricula do usuário que publicou o documento. | String |\n| getCardDescription() | Retorna a descrição do registro de formulário, para documento do tipo 5. | String |\n| getDocumentPropertyNumber() | Retorna o formulário que foi usado como base para criação do registro de formulário, por isso só tem um valor quando o documento é do tipo 5 (registro de formulário). | int |\n| getDocumentPropertyVersion() | Retorna a versão do formulário em que o registro de formulário foi criado. | int |\n| getPrivateDocument() | Retorna se o documento/pasta está abaixo da pasta particular. | boolean |\n| getPrivateColleagueId() | Se é um documento particular retorna a matricula do usuário onde este documento está alocado. | String |\n| getIndexed() | Retorna se o documento já foi indexado. | boolean |\n| getPriority() | Retorna a prioridade do documento. | int |\n| getUserNotify() | Retorna se notifica os usuários que tenham esse assunto de interesse. | boolean |\n| getExpires() | Retorna se o documento está expirado. | boolean |\n| getVolumeId() | Retorna o volume onde o documento foi publicado, se estiver em branco ele utiliza o volume do pai. | String |\n| getInheritSecurity() | Retorna se herda segurança do pai. | boolean |\n| getUpdateIsoProperties() | Retorna se atualiza as propriedades da cópia controlada. | boolean |\n| getLastModifiedTime() | Retorna a hora da última modificação em milissegundos. | String |\n| getDeleted() | Retorna se o documento está na lixeira. | boolean |\n| getDatasetName() | Retorna o documento do dataset , se o documento é um formulário. | String |\n| getKeyWord() | Retorna as palavras chaves do documento. Cada palavra é separada por vírgula. | String |\n| getImutable() | Retorna se a versão/revisão é inalterável. | boolean |\n| getDraft() | Retorna se o documento está em edição, para documento do tipo “Novo Conteúdo”. | boolean |\n| getInternalVisualizer() | Retorna se utiliza visualizador interno. | boolean |\n| getPhisicalFileSize() | Retorna o tamanho físico do documento principal e anexos. | float |\n| getVersionOption() | Retorna a condição de versionamento do documento: 0 = Será mantida a versão 1 = Será criado nova revisão 2 = Será criado nova versão **Importante lembrar que no momento da criação de um novo documento o valor sempre será 0.** | int |\n\n**Exemplo**\n\n```\nvar doc = getValue(\"WKDocument\");\nlog.info(\"Número do documento: \"+ doc.getDocumentId() + \" - Versão: \"+ doc.getVersion());\n```" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n#### DocumentEditDto\n\nEste objeto representa as propriedades editáveis de um documento, na tabela abaixo consta mais informações sobre ele:\n\n| Função | Descrição da função | Tipo do retorno |\n| --- | --- | --- |\n| setKeyWord | Adiciona Palavras chaves no documento. Cada palavra é separada por vírgula. | void |\n| setExpires | Define se o documento deve expirar | void |\n| setExpirationDate | Define a data de expiração. | void |\n| setValidationStartDate | Define a data a partir da qual o documento poderá ser visualizado. | void |\n\n**Exemplo**\n\n```\nfunction beforeDocumentPublisher() { \n var docEdit = getValue(\"WKDocumentEdit\");\n \n var dataStartValidation = new Date(2022, 0, 1);\n var dataExpiracao = new Date(2022, 11, 31);\n \n docEdit.setKeyWord(\"testing\");\n docEdit.setExpires(true);\n docEdit.setExpirationDate(dataExpiracao);\n docEdit.setValidationStartDate(dataStartValidation);\n}\n```\n\nAtenção\n\nLembrando que no javascript, no construtor new Date, o valor do \"Mês\" começa com o index 0, sendo 0 = Janeiro e 11 = Dezembro, veja outros exemplos [clicando aqui](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date).\n\n#### ApproverDto" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEste objeto representa os aprovadores e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| **Função** | **Descrição da Função** | **Tipo do Retorno** |\n| getDocumentId() | Retorna o número do documento. | int |\n| getVersion() | Retorna o número da versão do documento. | int |\n| getCompanyId() | Retorna o código da empresa em que o documento foi publicado. | Int |\n| getColleagueId() | Retorna a matricula de um usuário ou o código do grupo que está aprovando este documento. É possível saber se vai retornar um usuário ou um grupo pelo tipo de aprovação. | String |\n| getApproverType() | Retorna o tipo da aprovação, onde: 0 à Usuário 1 à Grupo | int |\n| getLevelId() | Retorna o nível de aprovação, no caso de aprovação em níveis. | int |\n\n**Exemplo**\n\n```\nvar listApprover = getValue(\"WKListApprover\");\n\tif(listApprover!=null){\n \tfor(j = 0; j < listApprover.size(); j++) { \n \t if (listApprover.get(j).getColleagueId().equals(\"adm\")){\n throw \"O usuário adm não pode ser aprovadores de documentos\";\n }\n }\n}\n```\n\n        \n\n#### DocumentSecurityConfigDto" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEste objeto representa a segurança de um documento e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getDocumentId() | Retorna o número do documento. | int |\n| getVersion() | Retorna o número da versão do documento. | int |\n| getCompanyId() | Retorna o código da empresa em que o documento foi publicado. | Int |\n| getAttributionValue() | Retorna a matricula de um usuário ou o código do grupo que está na segurança deste documento. É possível saber se vai retornar um usuário ou um grupo pelo tipo da segurança. Obs.: Retorna em branco quando o tipo é todos os usuários. | String |\n| getAttributionType() | Retorna o tipo da segurança, onde: 1 à Usuário; 2 à Grupo; 3 à Todos os Usuários. | int |\n| getPermission() | Retorna se é uma permissão. Obs.: Se não é uma permissão é uma restrição. | boolean |\n| getShowContent() | Retorna se lista o conteúdo. | boolean |\n| getSecurityLevel() | Retorna no nível de permissão/restrição, onde: -1 à sem permissão/restrição (nega acesso); 0 à Leitura; 1 à Gravação; 2 à Modificação; 3 à Total. | int |\n| getSequence() | Retorna a sequência da permissão/restrição. | int |\n| getSecurityVersion() | Retorna se ele utiliza a segurança deste versão nas demais. | boolean |\n\n**Exemplo**\n\n```\nvar listSeg = getValue(\"WKListSecurity\");\nif(listSeg != null){\n for(j = 0; j < listSeg.size(); j++) { \n if (listSeg.get(j).getAttributionValue().equals(\"cvd\")){\n throw \"O usuário cvd não pode estar na segurança de documentos\";\n }\n }\n}\n```\n\n#### RelatedDocumentDto" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEste objeto representa os documentos relacionados e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getDocumentId() | Retorna o número do documento. | int |\n| getVersion() | Retorna o número da versão do documento. | int |\n| getCompanyId() | Retorna o código da empresa em que o documento foi publicado. | int |\n| getRelatedDocumentId() | Retorna o número do documento que está relacionado ao documento publicado. | int |\n\n**Exemplo**\n\n```\nvar listRelated = getValue(\"WKListRelatedDocument\");\n\tif( listRelated != null){\n \t log.info(\"Os seguintes documentos estão relacionados a este documentos: \");\n for(j = 0; j < listRelated.size(); j++) { \n log.info(\"Nr. documento: \"+ listRelated.get(j).getRelatedDocumentId());\n }\n}\n```\n\n#### **ProcessDefinitionVersionDto**" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\nEste objeto representa a definição de um processo e seus atributos. A tabela abaixo apresenta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getCompanyId() | Retorna o código da empresa | Long |\n| getProcessId() | Retorna o código do processo | Long |\n| getProcessDescription() | Retorna a descrição do processo | String |\n| getVersion() | Retorna a versão do processo | Integer |\n| getVersionDescription() | Retorna a descrição da versão do processo | String |\n| getFormId() | Retorna o código do formulário do processo | Integer |\n| getCategoryStructure() | Retorna a categoria do processo | String |\n| getFullCategoryStructure() | Retorna a estrutura completa da categoria do processo | String |\n\n**UserEventVO**\n\nEste objeto representa um usuário e seus atributos, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getId() | Retorna o identificador do usuário | Long |\n| getTenantId() | Retorna o código da empresa | Long |\n| getLocationId() | Retorna o código da localização à qual o usuário pertence | Long |\n| getFirstName() | Retorna o nome do usuário | String |\n| getLastName() | Retorna o sobrenome do usuário | String |\n| getFullName() | Retorna o nome completo do usuário | String |\n| getEmail() | Retorna se lista o conteúdo | String |\n| getLogin() | Retorna o e-mail do usuário | String |\n| getPassword() | Retorna a senha do usuário | String |\n| getIdpId() | Retorna o identificador associado ao fluig Identity | String |\n| getUserCode() | Retorna o código do usuário | String |\n| getUserType() | Retorna o tipo do usuário, onde: 0 - Normal 3 - Aplicativo | Integer |\n| getState() | Retorna o estado do usuário, onde: 0 - Não confirmado 1 - Ativo 2 - Bloqueado 3 - Removido | Integer |\n| getTimeZone() | Retorna o Fuso Horário do usuário | String |\n| getRoles() | Retorna a lista dos códigos dos papéis aos quais o usuário pertence | List |\n| getGroups() | Retorna a lista dos códigos dos grupos aos quais o usuário pertence | List |\n| getData() | Retorna os dados adicionais do usuário | Map |\n| setFirstName(String firstName) | Informa o nome do usuário | void |\n| setLastName(String lastName) | Informa o sobrenome do usuário | void |\n| setFullName(String fullName) | Informa o nome completo do usuário | void |\n| putData(String key, String value) | Adiciona um novo dado adicional ao usuário. Só pode ser utilizado em eventos ***before**.* | void |" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n#### WatchDTO\n\nEste objeto representa as notificações de acompanhamento de comentários e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getEntityId() | Retorna o código do Conteúdo. | String |\n| getUserId() | Retorna o código do usuário. | String |\n| getUserAlias() | Retorna o alias do usuário. | String |\n| getSociableId() | Retorna ocódigo sociable. | String |\n| getCreationDate() | Retorna a data de criação. | String |\n| getLastUpdateDate() | Retorna a data da última atualizaçã. | String |\n| getNumberComments() | Retorna o número de comentários. | String |\n| getNumberLikes() | Retorna o número de apoios. | String |\n| getNumberShares() | Retorna o número de compartilhamentos. | String |\n| getNumberWatchers() | Retorna o número de acompanhamentos. | String |\n| getNumberDenouncements() | Retorna o número de denúncias. | String |\n| getSocialWatchType() | Retorna o tipo (social) | String |\n| getPostAuthor() | Retorna o autor do conteúdo. | String |\n| getTags() | Retorna as tags. | String |\n| getText() | Retorna o texto. | String |\n| getDescription() | Retorna a descrição. | String |\n| getObjectClass() | Retorna a classe do objeto. | String |\n| getObjectId() | Retorna o objectId. | String |\n| getThumbURL() | Retorna a url do thumb | String |\n\n#### SocialPostEventVO" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\n| | | |\n| --- | --- | --- |\n| **SocialPostEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getText() | texto do post | String |\n| getUser() | alias do usuário que está postando | String |\n| getVisibility() | visibilidade do post | String |\n| getPostId() | identificador do post | String |\n| getCreationDate() | data de criação do post | String |\n| getLastUpdateDate() | data de ultima atualização do post | String |\n| getSociables() | objetos sociables relacionado a esse post. Ex: Imagens, Vídeos, Artigos, etc... | List<[SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416)> |\n| getSocial() | objeto social onde o post foi feito. Pode ser timeline de um usuario ou um comunidade | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| **\\***getAttributes() | Atributos do Analytics em formato de Lista de Strings. Limite de 3 itens | List |\n| **\\***getFacts() | Fatos dos atributos do Analytics em formato de Lista de Strings. Limite de 3 itens | List |\n| customData | Mapa em formato JSON onde pode-se persistir dados extras da publicação | Map JSON |\n\n**\\*Somente enviado no evento beforSocialPost e afterSocialPost, esses valores não são persistidos no fluig**\n\n#### **SociableEventVO**" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\n| | | |\n| --- | --- | --- |\n| **SociableEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getId() | identificador do objeto | String |\n| getCreationDate() | data de criação do objeto | String |\n| getLastUpdateDate() | ultima atualização do objeto | String |\n| getNumberLikes() | quantidade de curtidas | String |\n| getNumberShares() | quantidade de compartilhamentos | String |\n| getNumberComments() | quantidade de comentários | String |\n| getNumberDenouncements() | quantidade de denúncias | String |\n| getNumberWatchers() | quantidade de acompanhamentos | String |\n| getTags() | nomes marcadores | String |\n| getUrl() | endereço do objeto | String |\n| getSociableType() | tipo do objeto social | String |\n| getRemoved() | informa se o objeto foi removido | String |\n| \\*getPostAuthor() | retorna o alias do autor da publicação que foi comentada | String |\n| **\\***getText() | retorna o texto da publicação que foi comentada | String |\n| **\\*\\***getDescription() | Nome do objeto comentado | String |\n| **\\*\\***getThumbURL() | url de ícone do objeto comentado. | String |\n| getSocial() | local aonde o comentário foi efetuado | SocialEvent |\n\n**\\*retornados apenas quando o comentário é sobre um post.**\n\n**\\*\\*retornado para os comentários de documentos e etc.**\n\n#### **SocialEventVO**" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\n| | | |\n| --- | --- | --- |\n| **SocialEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getId() | identificador do objeto | String |\n| getCreationDate() | data de criação do objeto | String |\n| getLastUpdateDate() | ultima atualização do objeto | String |\n| getAlias() | apelido do objeto social | String |\n| getName() | nome do objeto social | String |\n| getDescription() | descrição do objeto social | String |\n| getType() | tipo do objeto social | String |\n| getState() | status do objeto social | String |\n| getHidden() | informa se o objeto é oculto | String |\n| getPrivateContent() | informa se o conteúdo é privado | String |\n| getApprovalRequired() | informa se aprovação é requerida | String |\n| getCustomPage() | informação de página customizada | String |\n\n#### **SocialShareEventVO**\n\n| | | |\n| --- | --- | --- |\n| **SocialShareEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSociable() | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| getSocialPlace() | objeto que recebe o compartilhamento | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| getUser() | alias do usuario que compartilha | String |\n| getText() | texto informado no compartilhamento | String |\n| getType() | tipo do objeto | String |\n\n#### **SocialCommentEventVO**\n\n| | | |\n| --- | --- | --- |\n| **SocialCommentEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSociable() | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| getUser() | alias do usuário que comenta | String |\n| getText() | texto informado no comentário | String |\n| getCommentId() | id do comentário | String |\n\n#### SocialDenounceEventVO" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\n| | | |\n| --- | --- | --- |\n| **SocialDenounceEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSociable() | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| getUser() | alias do usuário que comenta | String |\n| getText() | texto informado no comentário | String |\n| getType() | Tipo de denúncia | String |\n\n#### SocialLikeEventVO\n\n| | | |\n| --- | --- | --- |\n| **SocialLikeEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSociable() | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| getUser() | alias do usuário que comenta | String |\n\n#### **SocialCommunityRelationEventVO**\n\n| | | |\n| --- | --- | --- |\n| **SocialCommunityRelationEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSocial() | Social relacionado à comunidade | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| getCommunity() | Social que representa a Comunidade | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n\n#### **SocialFollowEventVO**\n\n| | | |\n| --- | --- | --- |\n| **SocialFollowEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSocial() | Social que seguirá | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n| getFollowed() | Social que está sendo seguido | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=75270416) |\n\n#### **SocialPictureEventVO**" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\n| | | |\n| --- | --- | --- |\n| SocialPictureEventVO | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getLoggedUser() | Alias do usuário autenticado | String |\n| getAlias() | Alias do local aonde se está mudando a imagem (usuário| comunidade) | String |\n| getPath() | Path do diretório onde a imagem foi salva | String |\n| getPictureName() | Nome da imagem salva | String |\n| getWidth() | Largura da imagem | int |\n| getHeight() | Altura da imagem | int |\n\n#### **GenericAlertEventVO**\n\n| | | |\n| --- | --- | --- |\n| **GenericAlertEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| objectId | Id do objeto relacionado | String |\n| objectClass | Classe que identifica o objeto relacionado | String |\n| link | Link que está disponível no objeto. Pode vir nulo nos casos em que não existe um link de acesso | String |\n\n#### **WorkflowTasksVO**" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\n| | | |\n| --- | --- | --- |\n| **WorkflowTasksVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| url | Url destino para tarefas personalizadas | String |\n| code | Código para tarefas personalizadas | String |\n| processId | Código do processo | String |\n| processDescription | Descrição do processo | String |\n| requesterId | Código do usuário de abertura | String |\n| requesterName | Nome do usuário de abertura | String |\n| stateDescription | Descrição da atividade atual | String |\n| colleagueName | Nome do usuário responsável pela tarefa atual | String |\n| dateExpires | Data de expiração | String |\n| attachDescription | Descrição do anexo principal | String |\n| expired | Tarefa expirada? | boolean |\n| know | Usuário já visualizou a tarefa? | boolean |\n| fieldValue1 | Campo do formulário | String |\n| fieldValue2 | Campo do formulário | String |\n| fieldValue3 | Campo do formulário | String |\n| fieldValue4 | Campo do formulário | String |\n| fieldValue5 | Campo do formulário | String |\n| fieldValue6 | Campo do formulário | String |\n| fieldValue7 | Campo do formulário | String |\n| fieldValue8 | Campo do formulário | String |\n| fieldValue9 | Campo do formulário | String |\n| fieldValue10 | Campo do formulário | String |\n| fieldValue11 | Campo do formulário | String |\n| fieldValue12 | Campo do formulário | String |\n| fieldValue13 | Campo do formulário | String |\n| fieldValue14 | Campo do formulário | String |\n| fieldValue15 | Campo do formulário | String |\n\n## Exemplo com usuário de aplicação" }, { "metadata": { "title": "Desenvolvimento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos.md" }, "content": "Desenvolvimento de Eventos\n\n\n---\n\nNesse exemplo, a mensagem \"Post criado via evento\" é postada no mural\n\n```\nfunction beforeSocialPost(companyId, vo) {\n    if (vo.getSocial().getType() == \"USER\" && vo.getUser() != \"admin\") {\n        var consumer = oauthUtil.getNewAPIConsumer(\"my_app_key\", \"my_app_secret\",\n                        \"605da7f2-d087-4f4b-903e-486df9563956\",\n                        \"2b192950-fe0c-4211-a4bf-5962c18432d85c077dfb-aa51-45a0-ab43-822a680070ab\");\n        var userData = JSON.parse(consumer.get(\"/public/social/user/\" + vo.getUser()));\n        if (userData.numberFollowers == 0) {\n            throw \"Voce deve ser seguido por alguem para poder postar em sua timeline.\";\n        }\n    }\n}\n```\n\nExemplo com usuário logado\n\n```\nfunction afterDocumentPublisher(){\n    var doc = getValue(\"WKDocument\");\n    var user = getValue(\"WKUser\");\n \n    var msgPost = \"Novo documento: \"+ doc.getDocumentId() + \" - Versão: \"+ doc.getVersion();\n    log.info(msgPost);\n \n    var jsonContent = \"{\\\"text\\\":\\\"\" + msgPost + \"\\\",\\\"visibility\\\":\\\"PUBLIC\\\"}\";\n    log.info(jsonContent);\n \n    var consumer = oauthUtil.getNewAPIConsumerAsCurrentUser(\"myapp\", \"myappsecret\", \"32718929-568b-4a64-9f67-bbeadf4c1fc3\",\n            \"eff7b746-384b-43ba-be3a-aed14da822a4b8352de0-62be-456e-a0d8-ab5c00a745bc\");\n    consumer.post(\"/public/social/post/create\", jsonContent);\n}\n```\n\n# Atualização do Analytics\n\n---\n\n## Definição\n\nÉ possível enviar dados ao analytics a partir dos eventos de customização.\n\nEsse dados recebidos pelo evento não são persistidos no fluig mas podem ser modificados antes de serem enviados ao Analytics.\n\nEsses valores são transmitidos no objeto SocialPostEventVO\n\n## Exemplo de uso\n\n**Assinatura do método**\n\n```\n analyticsUtil.updatePostData(String postId, String[] attributes, String[] facts);\n```\n\n**Utilização no Evento**\n\n```\nfunction afterSocialPost(companyId, post){\n analyticsUtil.updatePostData(post.getPostId(), post.getAttributes(), post.getFacts());\n}\n```" }, { "metadata": { "title": "Desenvolvimento de Páginas/Widgets (WCM)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=840778342", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM).md" }, "content": "Desenvolvimento de Páginas/Widgets (WCM)\n\n\n---\n\n- [Componentes de Negócio](Desenvolvimento de PáginasWidgets (WCM).md)/Componentes de Negócio.md)\n- [Login Único](Desenvolvimento de PáginasWidgets (WCM).md)/Login Único.md)" }, { "metadata": { "title": "Documentação para desenvolvedores Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=867141925", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig.md" }, "content": "Documentação para desenvolvedores Fluig\n\n\n---\n\nO TOTVS Fluig permite que desenvolvedores criem suas próprias rotinas para criar lista de dados ([Datasets](Desenvolvimento de Datasets/Acessando Datasets.md)), formulários, processos e gerenciem [eventos do Fluig](Desenvolvimento de Eventos.md).\n\nPersonalizar a plataforma Fluig pode ser uma tarefa desafiadora, especialmente devido à sua flexibilidade e diversidade de recursos. Desenvolvedores precisam lidar com múltiplas camadas de tecnologia, desde a criação de formulários avançados até a integração com APIs e serviços externos, o que exige um conhecimento profundo da plataforma e suas possibilidades.\n\nEste guia tem como objetivo facilitar este processo, fornecendo orientações claras, exemplos práticos e as melhores práticas para desenvolvimento e personalização. Nosso papel é simplificar o caminho para que desenvolvedores possam maximizar o potencial da plataforma Fluig, entregando soluções eficientes e alinhadas às necessidades de negócios.\n\nAlém dos materiais contidos aqui, recomendamos aos desenvolvedores os **cursos gratuitos disponíveis na [Academy Fluig](https://academy.fluig.com/)**, que oferecem uma excelente base de aprendizado e ajudam a aprofundar o conhecimento sobre a plataforma.\n\n## [📖 Glossário](https://tdn.totvs.com/pages/viewpage.action?pageId=781872741)\n\nTermos que são usadas em outros pontos da documentação são melhores definidos nesta documentação.\n\n## [🔧 Motor de personalização](https://tdn.totvs.com/pages/viewpage.action?pageId=781871851)\n\nDocumentação onde exploramos mais sobre o nosso motor de personalizações, suas limitações e características.\n\n## [💡Utilitários e Objetos](https://tdn.totvs.com/pages/viewpage.action?pageId=781872430)\n\nDefinições dos objetos, métodos e retornos de métodos com sua sintaxe, explicações e exemplos de uso.\n\n## [🔄 Desenvolvimento de Processos](https://tdn.totvs.com/display/TF/Desenvolvimento+de+Processos)" }, { "metadata": { "title": "Documentação para desenvolvedores Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=867141925", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig.md" }, "content": "Documentação para desenvolvedores Fluig\n\n\nIntrodução e glossário sobre o desenvolvimento de processos, além de explicações sobre o nosso motor de personalização.\n\n## [📋 Formulários](Documentação para desenvolvedores Fluig/Formulários.md)\n\nA entrada de dados principal do TOTVS Fluig. Com formulários os usuários preenchem os dados das solicitações ou cadastram itens que serão usados posteriormente. Permitem aos usuários consultar e utilizar de forma simples mesmo dados que sejam fornecidos por outros sistemas da empresa através do uso de datasets." }, { "metadata": { "title": "Fluig Serviços", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=146181468", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Serviços.md" }, "content": "Fluig Serviços\n\n\n---\n\n[Skills - Profissionais Fluig Serviços](Fluig Serviços/Skills - profissionais fluig Serviços.md)" }, { "metadata": { "title": "Fluig Studio", "source": "https://tdn.totvs.com/display/fluig/Fluig+Studio", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio.md" }, "content": "Fluig Studio\n\n\n---\n\n- [Configuração para uso inicial do Fluig Studio](http://tdn.totvs.com/pages/viewpage.action?pageId=172297237)\n- [Criando um projeto fluig no Studio](http://tdn.totvs.com/display/fluig/Criando+um+projeto+fluig+no+Studio)\n- [Como criar um diagrama no fluig Studio](http://tdn.totvs.com/display/fluig/Como+criar+um+diagrama+no+fluig+Studio)\n- [Importação e Exportação](http://tdn.totvs.com/pages/viewpage.action?pageId=239039127)" }, { "metadata": { "title": "Guia de Estilos", "source": "https://tdn.totvs.com/display/fluig/Guia+de+Estilos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Guia de Estilos.md" }, "content": "Guia de Estilos\n\n\n# Índice\n\n- 1 [Objetivo](#GuiadeEstilos-Objetivo)\n - 1.1 [fluig Style Guide](#GuiadeEstilos-fluigStyleGuide)\n - 1.2 [Vídeos How to](#GuiadeEstilos-VídeosHowto)\n\n# Objetivo\n\n---\n\nEste documento é direcionado a desenvolvedores que desejam criar aplicações/*widgets* internamente ou externamente ao fluig. O fluig possui um Guia de Estilos com os principais componentes do desenvolvimento client-side disponíveis na plataforma.\n\n## fluig Style Guide\n\n---\n\nUm dos elementos mais importantes do processo de criação de identidade visual é a elaboração de um documento com informações concretas sobre cores, tipografia, forma, exemplos de uso, tamanho mínimo e área de reserva do logotipo, etc. O Guia de Estilo Visual é o que garante a consistência e uniformidade da percepção de uma marca. É o que a torna imediatamente reconhecida como uma entidade.\n\nNo fluig, a documentação do fluig Style Guide está disponível em http:///style-guide ou [aqui](http://style.fluig.com).\n\nDisponível a partir do fluig 1.4.\n\n## Vídeos How to\n\n---\n\nAssista\n\nAssista a trilha de vídeos How to: [Desenvolvimento com o fluig Style Guide](https://tdn.totvs.com/pages/viewpage.action?pageId=270925435), antes de criar seus desenvolvimentos na plataforma." }, { "metadata": { "title": "Guia de Propriedades dos Objetos", "source": "https://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Guia de Propriedades dos Objetos.md" }, "content": "Guia de Propriedades dos Objetos" }, { "metadata": { "title": "Guia de Propriedades dos Objetos", "source": "https://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Guia de Propriedades dos Objetos.md" }, "content": "Guia de Propriedades dos Objetos\n\n\n# Índice\n\n- 1 [Objetivo](#GuiadePropriedadesdosObjetos-Objetivo)\n- 2 [Pré-requisitos](#GuiadePropriedadesdosObjetos-Pré-requisitos)\n- 3 [DocumentDto](#GuiadePropriedadesdosObjetos-DocumentDto)\n- 4 [DocumentEditDto](#GuiadePropriedadesdosObjetos-DocumentEditDto)\n- 5 [Attachment](#GuiadePropriedadesdosObjetos-Attachment)\n- 6 [RelatedDocumentDto](#GuiadePropriedadesdosObjetos-RelatedDocumentDto)\n- 7 [DocumentSecurityConfigDto](#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)\n- 8 [ApproverDto](#GuiadePropriedadesdosObjetos-ApproverDto)\n- 9 [ApproverWithLevelDto](#GuiadePropriedadesdosObjetos-ApproverWithLevelDto)\n- 10 [ApprovalLevelDto](#GuiadePropriedadesdosObjetos-ApprovalLevelDto)\n- 11 [ColleagueDto](#GuiadePropriedadesdosObjetos-ColleagueDto)\n- 12 [ProcessAttachmentDto](#GuiadePropriedadesdosObjetos-ProcessAttachmentDto)\n- 13 [KeyValueDto](#GuiadePropriedadesdosObjetos-KeyValueDto)\n- 14 [ProcessTaskAppoimentDto](#GuiadePropriedadesdosObjetos-ProcessTaskAppoimentDto)\n- 15 [AttributionMecanismDto](#GuiadePropriedadesdosObjetos-AttributionMecanismDto)\n- 16 [BusinessPeriodInfoDto](#GuiadePropriedadesdosObjetos-BusinessPeriodInfoDto)\n- 17 [ColleagueReplacementDto](#GuiadePropriedadesdosObjetos-ColleagueReplacementDto)\n- 18 [Signal](#GuiadePropriedadesdosObjetos-Signal)\n- 19 [SignalPK](#GuiadePropriedadesdosObjetos-SignalPK)\n- 20 [DeadLineDto](#GuiadePropriedadesdosObjetos-DeadLineDto)\n- 21 [ProcessDefinitionDto](#GuiadePropriedadesdosObjetos-ProcessDefinitionDto)\n- 22 [ProcessDefinitionVersionDto](#GuiadePropriedadesdosObjetos-ProcessDefinitionVersionDto)\n- 23 [ProcessStateDto](#GuiadePropriedadesdosObjetos-ProcessStateDto)\n- 24 [AvailableUsersDto](#GuiadePropriedadesdosObjetos-AvailableUsersDto)\n- 25 [ProcessHistoryDto](#GuiadePropriedadesdosObjetos-ProcessHistoryDto)\n- 26 [ProcessTaskDto](#GuiadePropriedadesdosObjetos-ProcessTaskDto)\n- 27 [WorkflowTaskDto](#GuiadePropriedadesdosObjetos-WorkflowTaskDto)\n- 28 [WorkflowRoleDto](#GuiadePropriedadesdosObjetos-WorkflowRoleDto)\n- 29 [TaskVODto](#GuiadePropriedadesdosObjetos-TaskVODto)\n- 30 [HomeRequestSummaryDto](#GuiadePropriedadesdosObjetos-HomeRequestSummaryDto)\n- 31 [WorkflowProcessDto](#GuiadePropriedadesdosObjetos-WorkflowProcessDto)\n- 32 [WebServiceMessageArray](#GuiadePropriedadesdosObjetos-WebServiceMessageArray)\n- 33 [CardEventDtoArray](#GuiadePropriedadesdosObjetos-CardEventDtoArray)\n- 34 [CustomFieldsDto](#GuiadePropriedadesdosObjetos-CustomFieldsDto)\n- 35 [DocumentCustomFieldsDto](#GuiadePropriedadesdosObjetos-DocumentCustomFieldsDto)\n- 36 [DocumentApprovementHistoryDto](#GuiadePropriedadesdosObjetos-DocumentApprovementHistoryDto)\n- 37 [DocumentApprovalStatusDto](#GuiadePropriedadesdosObjetos-DocumentApprovalStatusDto)\n- 38 [RelatedDocumentDto](#GuiadePropriedadesdosObjetos-RelatedDocumentDto.1)\n- 39 [WorkflowRoleDto](#GuiadePropriedadesdosObjetos-WorkflowRoleDto.1)\n- 40 [TaskVODto](#GuiadePropriedadesdosObjetos-TaskVODto.1)\n- 41 [HomeRequestSummaryDto](#GuiadePropriedadesdosObjetos-HomeRequestSummaryDto.1)\n- 42 [SearchResultDto](#GuiadePropriedadesdosObjetos-SearchResultDto)\n- 43 [DatasetDto](#GuiadePropriedadesdosObjetos-DatasetDto)\n- 44 [ValuesDto](#GuiadePropriedadesdosObjetos-ValuesDto)\n- 45 [GroupDto](#GuiadePropriedadesdosObjetos-GroupDto)\n- 46 [cardData](#GuiadePropriedadesdosObjetos-cardData)\n\n# Objetivo\n\n---\n\nO objetivo deste documento é descrever as propriedades dos objetos utilizados em múltiplos métodos *webservice*. A utilidade de cada um dos parâmetros pode variar de método para método dependendo da necessidade da propriedade.\n\n# Pré-requisitos\n\n---\n\nPara compreender melhor os conceitos dessa página, é necessário conhecer as funcionalidades da [Utilização de Webservices](Utilização de Webservices.md).\n\n# DocumentDto\n\n---\n\nRepresenta o documento e suas propriedades. A tabela abaixo contém mais informações sobre o objeto:\n\n| | | |\n| --- | --- | --- |\n| **Propriedade** | **Descrição** | **Tipo do objeto** |\n| documentId | Número do documento. | int |\n| version | Número da versão do documento. | int |\n| companyId | Código da empresa em que o documento foi publicado. | Int |\n| UUID | UUID (identificador Único Global) do documento. | String |\n| documentTypeId | Tipo do arquivo físico, se retornar branco ou nulo é porque esse tipo não é conhecido pelo Fluig. | String |\n| languageId | Código do Idioma do documento. | String |\n| iconId | Código do Ícone do documento. | int |\n| topicId | Código do assunto do documento. | int |\n| colleagueId | Matricula do usuário que criou o documento. | String |\n| documentDescription | Descrição do documento. | String |\n| additionalComments | Comentários adicionais do documento. | String |\n| phisicalFile | Nome do arquivo físico atrelado ao documento. | String |\n| createDate | Data de criação. Data de Criação A data de criação é informada automaticamente no evento em que o documento é criado no sistema. | java.util.Date |\n| approvedDate | Data de Aprovação. | java.util.Date |\n| lastModifiedDate | Data da última modificação. Data da última modificação A data da última modificação é informada automaticamente no evento em que o documento sofre algum tipo de alteração, havendo alteração de versão, revisão ou mantendo a versão/revisão. | java.util.Date |\n| documentType | Tipo do documento, onde: 0 = Pasta raiz 1 = Pasta 2 = Documento normal 3 = Documento externo 4 = Formulário 5 = Registro de formulário 7 = Anexo Workflow 8 = Novo Conteúdo 9 = Aplicativo 10 = Relatório | String |\n| expirationDate | Data de expiração. | java.util.Date |\n| parentDocumentId | Número da Pasta/Formulário pai. | int |\n| relatedFiles | String com o nome do arquivo físico principal e anexos. | String |\n| activeVersion | Propriedade que define se a versão é ativa. | boolean |\n| versionDescription | Descrição da versão. | String |\n| downloadEnabled | Propriedade que define se o documento permite Download | boolean |\n| approved | Propriedade que define se o documento está em aprovação. | boolean |\n| validationStartDate | Data a partir da qual o documento poderá ser visualizado. | java.util.Date |\n| publisherId | Matricula do usuário que publicou o documento. | String |\n| cardDescription | Descrição do registro de formulário, para documento do tipo 5. | String |\n| documentPropertyNumber | Formulário que foi usado como base para criação do registro de formulário, por isso só tem um valor quando o documento é do tipo 5 (registro de formulário). | int |\n| documentPropertyVersion | Versão do formulário em que o registro de formulário foi criado. | int |\n| privateDocument | Propriedade que define se o documento/pasta está abaixo da pasta particular. | boolean |\n| privateColleagueId | Se é um documento particular retorna a matricula do usuário onde este documento está alocado. | String |\n| indexed | Propriedade que define se o documento já foi indexado. | boolean |\n| priority | Prioridade do documento. | int |\n| userNotify | Propriedade que define se notifica os usuários que tenham esse assunto de interesse. | boolean |\n| expires | Propriedade que define se o documento está expirado. | boolean |\n| volumeId | Volume onde o documento foi publicado, se estiver em branco ele utiliza o volume do pai. | String |\n| inheritSecurity | Propriedade que define se herda segurança do pai. | boolean |\n| updateIsoProperties | Propriedade que define se atualiza as propriedades da cópia controlada. | boolean |\n| lastModifiedTime | Hora da última modificação em milissegundos. | String |\n| deleted | Propriedade que define se o documento está na lixeira. | boolean |\n| datasetName | Documento do dataset , se o documento é um formulário. | String |\n| keyWord | Palavras chaves do documento. Cada palavra é separada por vírgula. | String |\n| imutable | Propriedade que define se a versão/revisão é inalterável. | boolean |\n| draft | Propriedade que define se o documento está em edição, para documento do tipo “Novo Conteúdo”. | boolean |\n| internalVisualizer | Propriedade que define se utiliza visualizador interno. | boolean |\n| phisicalFileSize | Tamanho físico do documento principal e anexos. | float |\n| versionOption | Condição de versionamento do documento: 0 = Será mantida a versão 1 = Será criado nova revisão 2 = Será criado nova versão Importante lembrar que no momento da criação de um novo documento o valor sempre será 0. | int |\n| inheritApprovers | Herda aprovadores do pai? | boolean |\n| convertDocumentType | Armazenar por longo prazo (Apenas para pasta) | int |\n| notificationDays | Período de Notificação de Expiração | int |\n| quota | Cota (MB) (Apenas para pasta) | int |\n| publicDocument | Compartilhar externamente? | boolean |\n\n# DocumentEditDto\n\n---\n\nEste objeto representa as propriedades editáveis de um documento, na tabela abaixo consta mais informações sobre ele:\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| version | Versão do documento Atenção Essa propriedade somente terá efeito quando for um novo documento e estiver habilitado o [Controle manual de versão inicial](https://tdn.totvs.com/pages/viewpage.action?pageId=234455426). | int |\n| keyWord | Palavras chaves do documento. Cada palavra é separada por vírgula. | String |\n| expires | Propriedade que define se o documento está expirado. | boolean |\n| expirationDate | Data de expiração. | java.util.Date |\n| validationStartDate | Data a partir da qual o documento poderá ser visualizado. | java.util.Date |\n\n# Attachment\n\n---\n\nSão as representações físicas dos anexos que compõem um documento por completo. Suas propriedades representam as informações de um documento específico dentro do grupo que representa o documento como um todo para o GED, que por si só é composto por um anexo principal podendo conter outros anexos complementares.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| fileName | Nome do arquivo físico | String |\n| pathName | Caminho absoluto do arquivo completo na máquina (sem o nome do arquivo em si), caso o arquivo esteja no mesmo local onde está o servidor Fluig | String |\n| fullPatch | Caminho absoluto do arquivo completo na máquina (com o nome do arquivo em si), caso o arquivo esteja no mesmo local onde está o servidor Fluig | String |\n| fileSize | Tamanho do arquivo físico em bytes | String |\n| iconPath | Caminho do ícone representativo do documento, caso vazio aparecerá o ícone padrão | String |\n| attach | Se é anexo do documento, valor true para documentos que não são os principais do documento | Boolean |\n| principal | Se é arquivo principal, mutuamente exclusivo com a propriedade attach | Boolean |\n| descriptor | Propriedade que define se o documento é um descritor | Boolean |\n| editing | Se o anexo está em edição, o padrão é false | Boolean |\n| fileSelected | Arquivos selecionados, apenas para controle, não preencher | [Attachment[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-Attachment) |\n| filecontent | Conteúdo do arquivo em Base64, caso queira que o arquivo seja transferido por stream | byte |\n| mobile | Se o arquivo foi adicionado por um dispositivo mobile | Boolean |\n\n- Objeto Attachment utilizado como parâmetro e retorno para métodos WebService.\n\n# RelatedDocumentDto\n\n---\n\nRepresenta os documentos relacionados com o documento.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| DocumentId | Número do documento | int |\n| version | Versão do documento | int |\n| relatedDocumentId | Número do documento que está sendo relacionado | int |\n| companyId | ID da empresa | long |\n\n# DocumentSecurityConfigDto\n\n---\n\nRepresenta a segurança de um documento e suas propriedades. Na tabela abaixo constam mais informações sobre ele:\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| documentId | Número do documento | int |\n| version | Número da versão do documento | int |\n| companyId | Código da empresa em que o documento foi publicado | int |\n| attributionValue | Matricula de um usuário ou o código do grupo que está na segurança deste documento. É possível saber se vai retornar um usuário ou um grupo pelo tipo da segurança. Obs.: Retorna em branco quando o tipo é todos os usuários | String |\n| attributionType | Tipo da segurança, onde: 1 = Usuário; 2 = Grupo; 3 = Todos os usuários. | int |\n| permission | Propriedade que define se é uma permissão Obs.: Se não é uma permissão, é uma restrição | boolean |\n| showContent | Propriedade que define se lista o documento | boolean |\n| securityLevel | Nível de permissão/restrição onde: -1 = Sem permissão/restrição (nega acesso); 0 = Leitura; 1 = Gravação; 2 = Modificação; 3 = Total. | int |\n| sequence | Sequência de permissão/restrição | int |\n| securityVersion | Propriedade que define se o documento utiliza a segurança desta versão nas demais | boolean |\n\n# ApproverDto\n\n---\n\nRepresenta os aprovadores de um documento ou pasta.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | ID da empresa | long |\n| colleagueId | Matrícula do usuário | String |\n| documentId | Número do documento | int |\n| version | Versão do documento | int |\n| levelId | Nível de aprovação | int |\n| approverType | Tipo de aprovação (0 = Colaboradores / 1 = Grupo) | int |\n\n# ApproverWithLevelDto\n\n---\n\nRepresenta os aprovadores de um documento ou pasta.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | ID da empresa | long |\n| colleagueId | Matrícula do usuário | String |\n| documentId | Número do documento | int |\n| version | Versão do documento | int |\n| levelId | Nível de aprovação | int |\n\n# ApprovalLevelDto\n\n---\n\nRepresenta os níveis de um documento ou pasta.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| levelId | Nível de aprovação | int |\n| levelDescription | Descrição do nível de aprovação | String |\n| approvalMode | Modo de aprovação (1 = OU / 2 = E / 3 = ÚNICO | int |\n\n# ColleagueDto\n\n---\n\nRepresenta as propriedades do usuário. A tabela abaixo contém mais informações sobre o objeto.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | ID da empresa | long |\n| colleagueId | Matrícula do usuário | String |\n| colleagueName | Nome do usuário | String |\n| mail | E-mail do usuário | String |\n| extensionNr | Ramal do usuário | String |\n| currentProject | Projeto do usuário | String |\n| especializationArea | Área de especialização | String |\n| login | Login do usuário | String |\n| passwd | Senha do usuário | String |\n| active | Status do usuário | Boolean |\n| homePage | Depreciado | String |\n| photoPath | Caminho para foto de perfil | String |\n| area1Id | Depreciado | int |\n| area2Id | Depreciado | int |\n| area3Id | Depreciado | int |\n| area4Id | Depreciado | int |\n| area5Id | Depreciado | int |\n| emailHtml | Utiliza o e-mail em html | Boolean |\n| adminUser | Usuário administrador | Boolean |\n| groupId | Grupo de trabalho workflow | String |\n| sessionId | Sessão do usuário | String |\n| defaultLanguage | Idioma padrão de documentos | String |\n| menuConfig | Configuração do menu | int |\n| dialectId | Idioma do usuário | String |\n| gedUser | Usuário GED | Boolean |\n| volumeId | Volume físico | String |\n| colleaguebackground | Depreciado | String |\n| nominalUser | Depreciado | Boolean |\n| guestUser | Depreciado | Boolean |\n| maxPrivateSize | Espaço disponível (Meus Documentos) | Float |\n| usedSpace | Espaço utilizado | Float |\n\n# ProcessAttachmentDto\n\n---\n\nObjeto que representa um anexo de processo, contendo informações sobre a solicitação e sobre o documento o qual representa, bem como os documentos anexados nele próprio. Em resumo é uma representação global de um anexo, constituído por outros subprojetos como suas próprias prioridades que representam os anexos propriamente ditos.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| attachmentSequence | Código sequencial do anexo | int |\n| attachments | Objetos representando os anexos físicos | [Attachment[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-Attachment) |\n| colleagueId | Matrícula do usuário anexando o documento | String |\n| colleagueName | Nome do usuário anexando o documento | String |\n| companyId | Código da empresa | long |\n| crc | *Cyclic Redundancy Check*, calculado automaticamente, não informar | long |\n| createDate | Data de criação do anexo | Date |\n| createDateTimestamp | Data da criação do anexo em milisegundos | long |\n| deleted | Se o arquivo fora deletado dos anexos | Boolean |\n| description | Descrição do anexo | String |\n| documentId | Código do documento no GED | int |\n| documentType | Tipo de documento (2 se é um anexo direto do GED / 7 se é um anexo de processo sem vínculo atual) Utilizar o tipo 7 e publicá-lo após a movimentação caso o deseje no GED | String |\n| fileName | Nome do arquivo físico | String |\n| newAttach | Se é um arquivo físico | String |\n| originalMovementSequence | Código da movimentação na qual o anexo foi inserido | int |\n| permission | Permissões sobre o anexo específico (é recomendado controlar tais permissões pelas propriedades do processo) | String |\n| processInstanceId | Código da solicitação | int |\n| size | Tamanho somado de todos os arquivos em anexo | float |\n| version | Versão do documento | int |\n\n- Objeto ProcessAttachmentDto utilizado como parâmetro e retorno para métodos Webservice.\n\n# KeyValueDto\n\n---\n\nObjeto responsável por informar valores nos campos de formulário.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| key | Valor do parâmetro 'name' definido no campo do formulário | String |\n| value | Valor a ser preenchido no campo definido na propriedade 'key' | String |\n\n# ProcessTaskAppoimentDto\n\n---\n\nObjeto responsável por informar apontamento da atividade de uma solicitação workflow.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | long |\n| processInstanceId | Código da solicitação | int |\n| movimentSequence | Sequencia da movimentação | int |\n| colleagueId | Matrícula do usuário que criou o documento | String |\n| transferenceSequence | Sequencia de transferência da atividade (histórico de movimentações) | int |\n| appoimentDate | Data para o apontamento | Date |\n| appoimentSeconds | Segundos para o apontamento | int |\n| colleagueName | Nome do usuário para o apontamento | String |\n\n# AttributionMecanismDto\n\n---\n\nObjeto responsável por retornar informações de Mecanismo de atribuição.\n\n| Propriedade | Descrição | Tipo do obejto |\n| --- | --- | --- |\n| companyId | Código da empresa | long |\n| attributionMecanismId | Código do mecanismo de atribuição | String |\n| name | Nome do mecanismo de atribuição | String |\n| controlClass | Classe em que o mecanismo de atribuição está referenciado | String |\n| preSelectionClass | Sequencia de transferência da atividade (histórico de movimentações) | String |\n| configurationClass | Sequencia de apontamento | String |\n| description | Descrição do mecanismo de atribuição | String |\n| assignmentType | Tipo do mecanismo de atribuição ( 0 = Inteiro / 1 = Personalizado) | int |\n| attributionMecanismDescription | Descrição do mecanismo de atribuição | String |\n\n# BusinessPeriodInfoDto\n\n---\n\nObjeto responsável por retornar informações de um período de expediente.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| sequence | Código do período: 1 - Manhã 2 - Tarde | int |\n| initialHour | Hora inicial do período | int |\n| finalHour | Hora final do período | int |\n\n# ColleagueReplacementDto\n\n---\n\nObjeto responsável por retornar informações de usuário substituto.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | long |\n| colleagueId | Código do usuário substituído | String |\n| replacementId | Código do usuário substituto | String |\n| validationStartDate | Data inicial da substituição. Exemplo: 2017-08-18T00:00:00-03:00 | Date |\n| viewWorkflowtasks | Substituto dos processos | Boolean |\n| viewGEDTasks | Substituto dos documentos | Boolean |\n\n# Signal\n\n---\n\nObjeto responsável por retornar informações do Sinal.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| sginalPK | Chave primária do Sinal | [SignalPK[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-SignalPK) |\n| description | Descrição do Sinal | String |\n\n# SignalPK\n\n---\n\nObjeto responsável por retornar o PK do Sinal.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | long |\n| signalId | Código do sinal | int |\n\n# DeadLineDto\n\n---\n\nObjeto responsável por retornar Data e Hora de uma atividade.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| date | Data (Tipo String no formato \"yyy-MM-dd\") | String |\n| hora | Hora | int |\n\n# ProcessDefinitionDto\n\n---\n\nObjeto responsável por retornar informações do processo.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | long |\n| processId | Código do processo | String |\n| processDescription | Descrição do processo | String |\n| active | Processo ativo ou não | Boolean |\n\n# ProcessDefinitionVersionDto\n\n---\n\nObjeto responsável por retornar informações da versão do processo.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | long |\n| processId | Código do processo | String |\n| version | Versão do processo | int |\n| versionDescription | Descrição da versão do processo | String |\n| fullCategoryStructure | Categoria completa do processo, incluindo seu código | String |\n| processDescription | Descrição do processo | String |\n| favorite | Se o processo está nos favoritos do usuário | Boolean |\n| mobileReady | Se o processo está disponível no Mobile | Boolean |\n| formId | Código do formulário vinculado ao processo | String |\n| formVersion | Versão do formulário vinculado ao processo | String |\n| initialProcessState | Descrição do processo | [ProcessStateDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessStateDto) |\n| relatedDatasets | Descrição do processo | String[] |\n| counterSign | Se o processo assina digitalmente | Boolean |\n\n# ProcessStateDto\n\n---\n\nObjeto responsável por retornar informações do estado do processo.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | long |\n| sequence | Sequência do processo | int |\n| stateName | Nome do estado do processo | String |\n| stateDescription | Descrição do estado do processo | String |\n| counterSign | Se o processo assina digitalmente | Boolean |\n\n# AvailableUsersDto\n\n---\n\nObjeto responsável por retornar usuários de uma atividade.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| willShowUsers | Utilizado para exibir a tela de seleção de usuários | Boolean |\n| isCollectiveTask | Se a atividade é conjunta | Boolean |\n| users | informações do usuário | [ColleagueDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto) |\n\n# ProcessHistoryDto\n\n---\n\nObjeto responsável por retornar informações do histórico de uma solicitação.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | long |\n| processInstanceId | Número da solicitação | int |\n| movementSequence | Número da movimentação | int |\n| active | Se o processo está ativo | Boolean |\n| movementDate | Data de movimentação | Date |\n| movementHour | Hora de movimentação | String |\n| stateSequence | Sequencia da movimentação | int |\n| subProcessId | Número do subprocesso se disponível | int |\n| threadSequence | Indica se existe atividade paralela no processo. Se existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade da atividade paralelas existentes no processo. | int |\n| previousMovementSequence | Número da movimentação anterior | int |\n| conversionSequence | Sequencia quando a solicitação foi convertida | int |\n| isReturm | Se possui fluxo de retorno | Boolean |\n| labelActivity | Descrição da atividade | String |\n| labelLink | Link da atividade | String |\n| tasks | Atividades | [ProcessTaskDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessTaskDto) |\n\n# ProcessTaskDto\n\n---\n\nObjeto responsável por retornar informações de uma atividade.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | long |\n| processInstanceId | Número da solicitação | int |\n| movementSequence | Número da sequência quando transferido | int |\n| transferredSequence | Número da sequência quando transferido | int |\n| colleagueId | Matrícula do usuário da atividade | String |\n| status | Status da atividade | Boolean |\n| active | Se a atividade está ativa | Boolean |\n| isComplement | Se é um complemento | Boolean |\n| choosedSequence | Sequência escolhida | String |\n| ChoosedColleagueId | Matrícula do usuário escolhido | String |\n| taskObservation | Observação da atividade | String |\n| taskCompletionDate | Data de conclusão da atividade | String |\n| taskCompletionHour | Hora de conclusão da atividade | int |\n| completeColleagueId | Usuário que completou a atividade | String |\n| completeType | Tipo de conclusão: 0 - Gestor 1 - Substituto 2 - Substituto do gestor | int |\n| taskSigned | Se a atividade foi assinada | Boolean |\n| deadlineText | Texto de atraso | String |\n| colleagueName | Nome do usuário | String |\n| historTaskObservation | Histórico de observações na atividade | String |\n| historCompleteColleague | Histórico de conclusões da atividade | String |\n| statusConsult | Status da atividade para consulta | int |\n| canCurrentUserTakeTaks | Se o usuário pode assumir a atividade | Boolean |\n\n# WorkflowTaskDto\n\n---\n\nObjeto responsável por retornar informações da tarefa.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | long |\n| taskId | Código da tarefa | int |\n| owner | dono da tarefa | String |\n| description | Descrição da tarefa | String |\n| deadline | Prazo da tarefa | int |\n| creationDate | Data de criação da tarefa | Date |\n| creationTime | Hora de criação da tarefa | int |\n| taskStatus | Status da tarefa: 0 - Pendente 1 - Pendente de consenso 2 - Completada 3 - Transferida 4 - Cancelada | int |\n| expectedConclusionDate | Data de conclusão experada | Date |\n| actualConclusionDate | Data atual de conclusão | Date |\n| actualConclusionTime | Hora atual de conclusão | int |\n| processInstanceId | Número da solicitação | int |\n| movementSequence | Número da movimentação | int |\n\n# WorkflowRoleDto\n\n---\n\nObjeto responsável por retornar informações do Papel.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| roleId | Código do papel | String |\n| companyId | Código da empresa | long |\n| roleDescription | Descrição do papel | String |\n\n# TaskVODto\n\n---\n\nObjeto responsável por retornar informações da tarefa.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| taskId | Código da tarefa | String |\n| type | Tipo | long |\n| iconset | Ícone | String |\n| state | Estado da tarefa | String |\n| iconPath | Caminho do ícone | String |\n| description | Descrição da tarefa | String |\n| children | Tarefas filhas | [TaskVODto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-TaskVODto) |\n\n# HomeRequestSummaryDto\n\n---\n\nObjeto responsável por retornar os números de pendências do usuário.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| numberOfWorkflowPendingRequests | Quantidade de solicitações iniciadas que estão pendentes | int |\n| numberOfWorkflowUnderDeadlineRequests | Quantidade de solicitações iniciadas que estão no prazo | int |\n| numberOfWorkflowDelavedRequests | Quantidade de solicitações iniciadas que estão atrasadas | int |\n| numberOfOpenRequests | Quantidade de solicitações abertas | int |\n| numberOfPoolGroupRequests | Quantidade de solicitações em Pool para um Grupo | int |\n| numberOfPoolRoleRequests | Quantidade de solicitações em Pool para um Papel | int |\n| numberOfDocumentApprovalPending | Quantidade de documentos pendentes de aprovação | int |\n| numberOfDocumentAwaitingApproval | Quantidade de documentos aguardando aprovação | int |\n| numberOfLearningTasks | Quantidade de Tarefas em aprendizagem | int |\n| replacementId | Matrícula do usuário substituído | String |\n\n# WorkflowProcessDto\n\n---\n\nObjeto responsável por retornar informações do processo Workflow.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | long |\n| processInstanceId | Número da solicitação | int |\n| processId | Código do processo | String |\n| version | Versão do processo | int |\n| requesterId | Matrícula do usuário requisitante | String |\n| requesterName | Nome do usuário requisitante | Stirng |\n| active | Se o processo está ativo | Boolean |\n| attachmentSeqId | Sequência de anexo da atividade | int |\n| processDescription | Matrícula do usuário substituído | String |\n| deadlineDate | Prazo da atividade | Date |\n| deadlineText | Texto de atraso da atividade | String |\n| documentDescription | Descrição do documento | String |\n| colleagueName | Nome do usuário | String |\n| movementSequence | Número de movimento | int |\n| mainAttachmentDocumentId | Código do documento principal | int |\n| mainAttachmentDocumentVersion | Versão do documento principal | int |\n| counterSign | Se o processo assina digitalmente | Boolean |\n| movementHour | Hora da movimentação | String |\n| startupHour | Hora que foi iniciado | String |\n| mobileReady | Se está disponível no mobile | Boolean |\n| canCancel | Se o usuário pode cancelar | Boolean |\n| canTake | Se o usuário pode assumir | Boolean |\n| url | URL de acesso ao processo | String |\n| relatedDatasets | Datasets relacionados ao processo | String[] |\n\n# WebServiceMessageArray\n\n---\n\nObjeto responsável por retornar informações do documento.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | int |\n| documentDescription | Descrição do documento | String |\n| documentId | Código do documento | int |\n| version | Versão do documento | int |\n| webServiceMessage | Mensagem de retorno | String |\n\n# CardEventDtoArray\n\n---\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| eventId | Código do evento | int |\n| eventDescription | Descrição do evento | String |\n| eventVersAnt | Versão anterior do evento | Boolean |\n\n# CustomFieldsDto\n\n---\n\nObjeto responsável por retornar informações do campo personalizado.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | int |\n| customFieldDescription | Descrição do campo personalizado | String |\n| customFieldId | Código do campo personalizado | int |\n\n# DocumentCustomFieldsDto\n\n---\n\nObjeto responsável por retornar informações do documento com campo personalizado.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | int |\n| customFieldDescription | Descrição do campo personalizado | String |\n| customFieldId | Código do campo personalizado | int |\n\n# DocumentApprovementHistoryDto\n\n---\n\nObjeto responsável por retornar Histórico de aprovação de documentos.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| colleagueId | Código do usuário | String |\n| documentVersion | Versão do documento | int |\n| iterationSequence | Sequencia de interação | int |\n| levelId | Nível do ID | int |\n| movementSequence | Sequencia de movimentação | String |\n| observation | Observação | String |\n| signed | Documento assinado | Boolean |\n| status | Status do documento | int |\n\n# DocumentApprovalStatusDto\n\n---\n\nObjeto responsável por retornar informações do Status de aprovação de documentos.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | int |\n| documentId | Código do documento | int |\n| version | Versão do documento | int |\n| status | Status do documento | int |\n\n# RelatedDocumentDto\n\n---\n\nObjeto responsável por retornar informações do Documento relacionado.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| companyId | Código da empresa | int |\n| documentId | Código do documento | int |\n| relatedDocumentId | Código do documento relacionado | int |\n| version | Versão do documento | int |\n\n# WorkflowRoleDto\n\n---\n\nObjeto responsável por retornar informações do Papel.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| roleId | Código do papel | String |\n| companyId | Código da empresa | long |\n| roleDescription | Descrição do papel | String |\n\n# TaskVODto\n\n---\n\nObjeto responsável por retornar informações da Tarefa.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| taskId | Código da tarefa | String |\n| type | Tipo | long |\n| iconset | Ícone | String |\n| state | Estado da tarefa | String |\n| icoPath | Caminho do ícone | String |\n| description | Descrição da tarefa | String |\n| children | Tarefas filhas | [TaskVODto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-TaskVODto.1) |\n\n# HomeRequestSummaryDto\n\n---\n\nObjeto responsável por retornar os números de pendências do usuário.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| numberOfWorkflowPendingRequests | Quantidade de solicitações iniciadas que estão pendentes | int |\n| numberOfWorkflowUnderDeadlineRequest | Quantidade de solicitações iniciadas que estão no prazo | int |\n| numberOfWorkflowDelayedRequests | Quantidade de solicitações iniciadas que estão atrasadas | int |\n| numberOfOpenRequests | Quantidade de solicitações abertas | int |\n| numberOfPoolGroupRequests | Quantidade de solicitações em Pool para um Grupo | int |\n| numberOfPoolRoleRequests | Quantidade de solicitações em Pool para um Papel | int |\n| numberOfDocumentApprovalPending | Quantidade de documentos pendentes de aprovação | int |\n| numberOfDocumentAwaitingApproval | Quantidade de documentos aguardando aprovação | int |\n| numberOfLearningTasks | Quantidade de tarefas de Aprendizagem | int |\n| replacementId | Matrícula do usuário substituído | String |\n\n# SearchResultDto\n\n---\n\nObjeto responsável por retornar informações da busca de documento.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| colleagueId | Matricula do usuário que criou o documento | String |\n| companyId | Código da empresa | int |\n| crc | Crc do documento | long |\n| documentDescription | Nome do documento | String |\n| documentId | Código do documento | int |\n| documentType | Tipo do documento | String |\n| folderName | Nome de pasta | String |\n| iconId | ID do ícone | int |\n| inheritApprovers | Herda aprovadores | Boolean |\n| lastModifiedDate | Última data modificada | Date |\n| parentDocumentId | ID do documento pai | int |\n| phisicalFile | Nome do arquivo de download | String |\n| phisicalFileSize | Tamanho do arquivo | String |\n| privateDocument | Documento privado | Boolean |\n| publisherId | ID do publicador do documento | String |\n| publisherName | Nome do publicador do documento | String |\n| topicId | ID do assunto do documento | int |\n| version | Versão do documento | int |\n\n# DatasetDto\n\n---\n\nObjeto responsável por retornar as colunas e os valores do dataset executado.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| columns | Lista as colunas do dataset | String[] |\n| values | Lista os valores retornados em cada coluna | [ValuesDto](https://tdn.totvs.com/pages/viewpage.action?pageId=226527127)[] |\n\n# ValuesDto\n\n---\n\nObjeto responsável por retornar os valores do dataset executado, referente à cada coluna.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| value | Valor retornado em cada coluna | Object[] |\n\n# GroupDto\n\n---\n\nObjeto responsável por retornar as informações do grupo.\n\n| Propriedade | Descrição | Tipo do objeto |\n| --- | --- | --- |\n| groupDescription | Descrição do grupo | String |\n| groupId | Código do grupo | String |\n| companyId | Código da empresa | long |\n\n# cardData\n\n---\n\nResponsável pelos dados do registro de formulário.\n\n```\n\n \n campo1\n valor do campo id campo1\n \n \n campo2\n valor do campo id campo2\n \n \n column1___1\n valor do campo em um campo múltiplos registros (pai x filho) com id column1 e na primeira linha\n \n \n column1___2\n valor do campo em um campo múltiplos registros (pai x filho) com id column1 e na segunda linha\n \n\n```" }, { "metadata": { "title": "Integrações", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=840778303", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações.md" }, "content": "Integrações\n\n\n---\n\n- [Fluig API](Integrações/Fluig API.md)\n- [Personificação](Integrações/Personificação.md)\n- [Integração de aplicativos externos com o Fluig](Integrações/Integração de aplicativos externos com o Fluig.md)\n- [Integração do TOTVS Fluig com TOTVS iPaas](Integrações/Integração do TOTVS Fluig com TOTVS iPaaS.md)\n- [OAuthCliente (versão java)](Integrações/Fluig API/Acessar API através do cliente OAuth.md)\n- [OAuthCliente (versão javascript)](https://tdn.totvs.com/x/faK4K)\n- [API old](https://api.fluig.com/old/)\n- [API v2](https://api.fluig.com/latest/index.html)\n- [WS](https://181.qafluig.com/services)\n- [Exemplos de utilização do Fluig SDK](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse/web-sdk)\n- [Javadoc for Fluig](https://api.fluig.com/old/sdk/)\n- [Fluig SDK (Fluig API versão javascript)](Integrações/Fluig API/Consumo de serviços na API pública e no componente SDK.md)\n- [FluigClient](Integrações/Fluig API.md)" }, { "metadata": { "title": "Primeiros passos", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos.md" }, "content": "Primeiros passos\n\n\n---\n\n- [Cadastro de serviço](Primeiros passos/Cadastro de serviço.md)\n- [Mecanismo de atribuição](Primeiros passos/Mecanismo de atribuição.md)\n- [Análise de Log](Primeiros passos/Análise de Log.md)" }, { "metadata": { "title": "Principais Mudanças de Front-end - Fluig Voyager 2.0.0", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=976127718", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Principais Mudanças de Front-end - Fluig Voyager 2.0.0.md" }, "content": "Principais Mudanças de Front-end - Fluig Voyager 2.0.0\n\n\n- [Descrição](#PrincipaisMudançasdeFrontendFluigVoyager2.0.0-Descrição)\n- [Migração do Rich Editor](#PrincipaisMudançasdeFrontendFluigVoyager2.0.0-MigraçãodoRichEditor)\n- [Mudanças no Style Guide e CSS](#PrincipaisMudançasdeFrontendFluigVoyager2.0.0-MudançasnoStyleGuideeCSS)\n - [Alterações visuais e de acessibilidade](#PrincipaisMudançasdeFrontendFluigVoyager2.0.0-Alteraçõesvisuaisedeacessibilidade)\n - [Manutenção de estilos legados](#PrincipaisMudançasdeFrontendFluigVoyager2.0.0-Manutençãodeestiloslegados)\n - [Paths descontinuados](#PrincipaisMudançasdeFrontendFluigVoyager2.0.0-Pathsdescontinuados)\n - [Path recomendado](#PrincipaisMudançasdeFrontendFluigVoyager2.0.0-Pathrecomendado)\n - [Iconografia e ícones](#PrincipaisMudançasdeFrontendFluigVoyager2.0.0-Iconografiaeícones)\n- [Menus](#PrincipaisMudançasdeFrontendFluigVoyager2.0.0-Menus)\n- [Mudança de fonte padrão](#PrincipaisMudançasdeFrontendFluigVoyager2.0.0-Mudançadefontepadrão)\n- [Melhorias gerais](#PrincipaisMudançasdeFrontendFluigVoyager2.0.0-Melhoriasgerais)\n\n## Descrição\n\n---\n\nA versão **2.0.0** do produto traz mudanças estruturais e visuais importantes no frontend, com foco em modernização de bibliotecas, otimização de carregamento, reorganização de paths e introdução de novos recursos como classes helpers, variáveis CSS e modo escuro no tema responsivo. \nO objetivo é melhorar desempenho, consistência visual e preparar o produto para evoluções futuras, reduzindo dependências legadas.\n\nImportante:\n\nAlgumas alterações afetam compatibilidade com códigos customizados e temas antigos, exigindo ajustes manuais descritos abaixo.\n\n## Migração do Rich Editor" }, { "metadata": { "title": "Principais Mudanças de Front-end - Fluig Voyager 2.0.0", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=976127718", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Principais Mudanças de Front-end - Fluig Voyager 2.0.0.md" }, "content": "Principais Mudanças de Front-end - Fluig Voyager 2.0.0\n\n\n---\n\nAgora o componente de FLUIGC.richeditor é baseado no plugin **Kendo UI**.\n\n- **Impactos:**\n\n - Variáveis globais `CKEDITOR` e `CKEDITOR_BASEPATH` **não existem mais**.\n - Configurações aplicadas **após** a inicialização **não terão suporte**.\n - Plugins personalizados devem seguir a nova API do `FLUIGC.richeditor`.\n\n**Exemplo de implementação de ação personalizada:**\n\n```\nvar richeditor = FLUIGC.richeditor('docConteudoCK', {\n extraPlugins: 'fluigimage, fluigvideo, printDocument',\n addExternal: [{\n id: 'printDocument',\n title: 'Imprimir documento',\n icon: 'k-i-print',\n callback: function(editor) {\n console.log('Callback do plugin printDocument', editor);\n }\n }]\n});\n```\n\n## Mudanças no Style Guide e CSS\n\n---\n\nAbaixo estão listadas as principais mudanças visuais nessa nova atualização.\n\n### Alterações visuais e de acessibilidade\n\nComo parte da implementação do **Animalia Design System (Animalia DS)**, realizamos ajustes visuais em diversos elementos da interface. Essas alterações têm como objetivo melhorar a **experiência do usuário** e garantir maior aderência às práticas de **acessibilidade**.\n\n- **Tamanhos dos elementos:** botões, campos e demais componentes foram ampliados para facilitar a interação, especialmente em dispositivos móveis e para pessoas com necessidades específicas.\n- **Cores e contrastes:** paleta de cores revisada para assegurar legibilidade e conformidade com recomendações de acessibilidade (WCAG).\n- **Outros ajustes visuais:** espaçamentos, ícones e tipografia foram atualizados para proporcionar uma interface mais consistente, clara e inclusiva.\n\n### Manutenção de estilos legados" }, { "metadata": { "title": "Principais Mudanças de Front-end - Fluig Voyager 2.0.0", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=976127718", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Principais Mudanças de Front-end - Fluig Voyager 2.0.0.md" }, "content": "Principais Mudanças de Front-end - Fluig Voyager 2.0.0\n\n\nPara mitigar impactos em cenários específicos, os estilos visuais da versão **1.8.2 ou inferior** foram preservados em um diretório dedicado. Esses arquivos devem ser utilizados **exclusivamente em formulários** e apenas em casos excepcionais, quando a adoção imediata dos novos padrões do **Animalia Design System** não for viável.\n\n**Arquivos disponíveis em `/old/*`:**\n\n- `/style-guide/css/old/fluig-style-guide.min.css` (Classic)\n- `/style-guide/css/old/fluig-style-guide-flat.min.css` (Flat)\n\nImportante:\n\nO uso desses estilos antigos é **temporário** e não recomendado como solução definitiva. Recomendamos planejar a migração completa para o novo padrão visual o quanto antes.\n\n### Paths descontinuados\n\nAlguns caminhos antigos foram removidos e não estão mais disponíveis, retornando **erro 404**:\n\n- `/style-guide/css/fluig-style-guide.min.css`\n- `/portal/resources/style-guide/css/fluig-style-guide-flat.min.css`\n- `/portal/resources/style-guide/css/fluig-style-guide.min.css`\n\n### Path recomendado\n\nO caminho oficial e suportado para utilização de estilos é:\n\n- `/style-guide/css/fluig-style-guide-flat.min.css`\n\nRecomendação:\n\nUtilize sempre o path acima em em formulários, garantindo compatibilidade com as versões atuais do produto.\n\n### Iconografia e ícones" }, { "metadata": { "title": "Principais Mudanças de Front-end - Fluig Voyager 2.0.0", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=976127718", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Principais Mudanças de Front-end - Fluig Voyager 2.0.0.md" }, "content": "Principais Mudanças de Front-end - Fluig Voyager 2.0.0\n\n\nA utilização de ícones também passou por ajustes com a implementação do **Animalia Design System** no Fluig.\n\n- **Ícones antigos (Fluig Icons):** Os ícones legados (fluigicon) foram movidos para um arquivo separado. Caso ainda sejam utilizados em **formulários**, é necessário importá-los manualmente:\n\n - `/style-guide/css/fluig-icons.min.css`\n- **Nova biblioteca de ícones (Animalia Icons):** O padrão recomendado são os **Animalia Icons** (animaliaicon). Assim como no caso dos ícones legados, em **formulários** eles devem ser importados manualmente:\n\n - `/style-guide/css/animalia-icons.min.css`\n\nObservação:\n\nEssa configuração é exclusiva para formulários. Na plataforma (desenvolvimento de widgets) a importação ocorre automaticamente, não sendo necessário nenhum ajuste adicional.\n\n## Menus\n\n---\n\nOs menus **Liquid** e **Responsive** foram atualizados e agora utilizam ícones da biblioteca **Animalia Icons**.\n\n## Mudança de fonte padrão\n\n---\n\nNo **Tema Responsivo**, a fonte padrão do sistema passou a ser **Lato Regular** (`font-family`).\n\nAtenção:\n\nEssa alteração pode impactar o **espaçamento** e o **alinhamento** em temas customizados. Recomenda-se revisar estilos personalizados após a atualização.\n\n## Melhorias gerais\n\n---\n\nForam aplicadas diversas melhorias de desempenho e organização do código:\n\n- **Otimização de carregamento**\n\n - Inclusão de estilos críticos do sistema com `rel=\"preload\"`\n - Scripts secundários do sistema carregados com `defer`\n- **Novas utilitárias no Style Guide**\n\n - Classes *helpers* adicionais adicionadas no Style Guide. Consulte a [documentação](https://style.fluig.com/css.html#helpers) para mais detalhes.\n - Classes responsivas para **fontes, margens e paddings**, disponível na mesma [documentação](https://style.fluig.com/css.html#helpers).\n - Novas variáveis de **CSS de tema**. Consulte a [documentação de temas](https://style.fluig.com/css.html#themes) para mais detalhes." }, { "metadata": { "title": "Utilização de Webservices", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73084007", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices.md" }, "content": "Utilização de Webservices" }, { "metadata": { "title": "Utilização de Webservices", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73084007", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices.md" }, "content": "Utilização de Webservices\n\n\n# Índice\n\n- 1 [Objetivo](#UtilizaçãodeWebservices-Objetivo)\n- 2 [Pré-requisitos](#UtilizaçãodeWebservices-Pré-requisitos)\n- 3 [Antes de começar](#UtilizaçãodeWebservices-Antesdecomeçar)\n- 4 [Como acessar](#UtilizaçãodeWebservices-Comoacessar)\n- 5 [Segurança](#UtilizaçãodeWebservices-Segurança)\n - 5.1 [Permissão por Web Services e/ou métodos](#UtilizaçãodeWebservices-PermissãoporWebServicese/oumétodos)\n - 5.2 [Personificação](#UtilizaçãodeWebservices-Personificação)\n - 5.3 [Permissões das funções acessadas](#UtilizaçãodeWebservices-Permissõesdasfunçõesacessadas)\n- 6 [Como utilizar os Web Services em softwares terceiros](#UtilizaçãodeWebservices-ComoutilizarosWebServicesemsoftwaresterceiros)\n - 6.1 [Verificando os serviços e chamadas manuais](#UtilizaçãodeWebservices-Verificandoosserviçosechamadasmanuais)\n - 6.2 [Criando rotinas automatizadas](#UtilizaçãodeWebservices-Criandorotinasautomatizadas)\n - 6.2.1 [JDK 11 e superiores](#UtilizaçãodeWebservices-JDK11esuperiores)\n - 6.2.2 [JDK 8 e inferiores](#UtilizaçãodeWebservices-JDK8einferiores)\n - 6.3 [Importando a lib e desenvolvendo sua integração](#UtilizaçãodeWebservices-Importandoalibedesenvolvendosuaintegração)\n- 7 [POST, não PUT](#UtilizaçãodeWebservices-POST,nãoPUT)\n- 8 [Disponibilidade dos Web Services](#UtilizaçãodeWebservices-DisponibilidadedosWebServices)\n- 9 [Como utilizar os Web Services do Fluig no próprio Fluig?](#UtilizaçãodeWebservices-ComoutilizarosWebServicesdoFluignopróprioFluig?)\n - 9.1 [Usando o editor web (sem codificação)](#UtilizaçãodeWebservices-Usandooeditorweb(semcodificação))\n - 9.2 [Codificando](#UtilizaçãodeWebservices-Codificando)\n\n# Objetivo\n\nAlém de algumas APIs REST, o fluig disponibiliza também uma série de Web Services SOAP (Simple Object Access Protocol). Neste documento mostraremos como habilitar ou desabilitar esses serviços, como gerar os stubs para utilizá-los em softwares terceiros e como utilizá-los dentro do próprio fluig.\n\n# Pré-requisitos\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre o fluig\n- Visão geral sobre integração de sistemas\n- Web Services\n\n# Antes de começar\n\nOs Web Services SOAP, apesar de continuarem funcionais, não recebem mais novos serviços nem alterações nos parâmetros de entrada. Caso haja, opte por usar a função correspondente nas APIs REST.\n\n# Como acessar\n\nPara acessar os webservices do TOTVS Fluig Plataforma, é preciso acessar o URL *https:///services*.\n\nNossos serviços estão descritos no formato WSDL (Linguagem de Descrição de Serviços Web)\n\n# Segurança\n\nExistem dois principais dispositivos de segurança para o uso dos Web Services SOAP." }, { "metadata": { "title": "Utilização de Webservices", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73084007", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices.md" }, "content": "Utilização de Webservices\n\n## Permissão por Web Services e/ou métodos\n\nPor padrão, todos os usuários do fluig podem acessar os serviços. Isso facilita integrações e widgets que possam fazer uso dos serviços SOAP. Mas o administrador do sistema, caso queira, pode bloquear o uso dos serviços como um todo ou de alguns métodos. \n\nPor motivos de retrocompatibilidade, é impossível bloquear o acesso dos serviços SOAP a todos os usuários. O fluig entende que se não há ninguém nas permissões é porque o administrador não quer configurar essa permissão, então para bloquear o acesso dos usuários normais ele deve dar permissão apenas a um usuário (o próprio administrador por exemplo);\n\nPara bloquear o acesso a todos os métodos de um serviço, por exemplo, *ECMWorkflowEngineService*, o administrador deve entrar no painel de controle e acessar a opção de permissões. Pesquisar por *ECMWorkflowEngineService*. Irá listar tanto o acesso geral à API *ECMWorkflowEngineService* quanto a cada um dos métodos.\n\nO administrador pode adicionar permissões para ele próprio no serviço geral do *ECMWorkflowEngineService* e isso fará com que nenhum usuário possa acessar os métodos desse serviço. Caso queira liberar um método específico , por exemplo *startProcess*, o administrador pode, mantendo a configuração anterior, acessar as permissões do recurso *ECMWorkflowEngineService.startProcess* adicionar as permissões conforme a sua necessidade.\n\nOu se quiser manter acesso a todos os outros métodos mas bloquear somente um método específico, ele deve manter as permissões gerais do serviço sem nenhuma configuração de permissão, e adicionar o usuário administrador nas permissões do método que deseja que seja bloqueado aos demais usuários.\n\nObservação\n\nAlguns métodos não foram criados para retornar erros. Então alguns métodos podem retornar informações vazias caso o acesso seja negado. Nestes casos, o log pode ser consultado para verificar a negação de acesso ao serviço.\n\n## Personificação" }, { "metadata": { "title": "Utilização de Webservices", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73084007", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices.md" }, "content": "Utilização de Webservices\n\n\nPor lidar com integrações, alguns métodos permitem que o usuário integrador tome uma ação em nome de outro usuário (por exemplo, um serviço terceiro que utiliza um usuário para integrações pode abrir um chamado em nome de um usuário normal do fluig). Você pode limitar os usuários que conseguem tomar ação em nome de outros usuários pelos Web Services entrando no painel de controle e acessando a opção de permissões. Pesquisar por *Personificação*.\n\nObservação\n\nAssim como nas permissões dos Web Services, o fluig entende que se não há ninguém nas permissões é porque o administrador não quer configurar essa permissão, então para bloquear o acesso dos usuários normais ele deve dar permissão apenas a um usuário (o próprio administrador por exemplo)\n\n## Permissões das funções acessadas\n\nIndependente das permissões anteriores, o fluig continua respeitando as permissões inerentes às funções acessadas. Ou seja, para configurar um processo, o usuário precisa ter acesso a página de configurar processos. Para acessar um documento, o usuário precisa ter permissão para visualizar o documento em si.\n\n# Como utilizar os Web Services em softwares terceiros\n\n## Verificando os serviços e chamadas manuais\n\nSe você quer verificar o uso dos serviços ou mesmo fazer uma chamada individual você pode fazê-lo através de um aplicativo qualquer com suporte a requisições do tipo SOAP. Insira a url de um dos serviços disponíveis na url */services* e preencha os dados conforme solicitado pelo aplicativo.\n\n## Criando rotinas automatizadas\n\nO primeiro passo é fazer o download dos *stubs*, que são classes modelos que irão auxiliar no preenchimento dos dados utilizados por cada um dos serviços.\n\n### JDK 11 e superiores" }, { "metadata": { "title": "Utilização de Webservices", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73084007", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices.md" }, "content": "Utilização de Webservices\n\n\nNas versões mais recentes da JDK o utilitário *wsimport* foi removido. Você pode baixar por outras fontes ou utilizar no lugar o Apache CXF () e gerando a biblioteca com os arquivos baixados\n\n```\nwsdl2java -client -d C:\\stubs\\ -classdir C:\\stubs\\ -encoding UTF-8 -compile https:///webdesk/ECMWorkflowEngineService?wsdl\njar -cvf fluig-ws-client.jar C:\\stubs\\*.*\n```\n\n### JDK 8 e inferiores\n\nSe você usa a JDK do java na versão 8 ou inferior, você pode utilizar [este utilitário](https://tdn.totvs.com/download/attachments/73084007/Cliente%20Web%20Service.zip?version=1&modificationDate=1409227893000&api=v2) que disponibilizamos para gerar os stubs de todos os serviços.\n\nOu fazer de forma manual, caso precise apenas de um Web Service específico, usando o comando ***wsimport*** e gerando a biblioteca:\n\n```\nwsimport -d C:\\stubs\\ https:///webdesk/ECMWorkflowEngineService?wsdl\njar -cvf fluig-ws-client.jar C:\\stubs\\*.*\n```\n\n## Importando a lib e desenvolvendo sua integração" }, { "metadata": { "title": "Utilização de Webservices", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73084007", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices.md" }, "content": "Utilização de Webservices\n\n\nApós a geração do arquivo *fluig-ws-client.jar* (conforme descrito nos passos anteriores) você pode desenvolver sua própria API.\n\nSe quiser gerar uma biblioteca para usar dentro do próprio Fluig, ou mesmo alguns exemplos de como utilizar as integrações, você pode consultar nossa documentação\n\nPara saber como ou então aprender como utilizar a biblioteca gerada, [aqui](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse/ws-soap) você encontra um exemplo prático de utilização em artefatos publicados no fluig.\n\n# POST, não PUT\n\nÉ importante salientar que todos os dados enviados (ou não enviados) em um método de alteração são considerados. Se um campo não for enviado, o sistema vai considerar que o valor dele deve ser deixado em branco, nulo ou zerado, conforme o tipo de dado. Então, mesmo que você queira apenas modificar a descrição do arquivo, você deve passar todos os outros dados do documento.\n\n# Disponibilidade dos Web Services\n\nLembre-se que a sua integração pode ocorrer em um momento que o fluig não está no ar. Seja por uma atualização ou regra de economia de energia, esteja preparado nas suas integrações para indisponibilidade do servidor. Ou seja, use try/catch.\n\n# Como utilizar os Web Services do Fluig no próprio Fluig?\n\nVocê pode utilizar os serviços do Fluig no próprio Fluig, da mesma forma que utiliza serviços de terceiros. Para isso, o administrador deve entrar no Painel de Controle e acessar a opção de Serviços. Criar um novo serviço do tipo SOAP, definir um nome (por exemplo *ECMWorkflowEngineService*, este nome será usado depois para referenciar este cadastro), uma descrição para outros identificarem que serviço é este e a URL do serviço (por exemplo, *https:///webdesk/ECMWorkflowEngineService?wsdl*)\n\n## Usando o editor web (sem codificação)" }, { "metadata": { "title": "Utilização de Webservices", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73084007", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices.md" }, "content": "Utilização de Webservices\n\n\nNa configuração de processo, crie ou edite um processo e adicione uma atividade de serviço. Acesse as propriedades dessa atividade e selecione o serviço *ECMWorkflowEngineService* (ou o nome que você utilizou no cadastro) e selecione a operação (por exemplo, *startProcess*).\n\nPreencha os campos que serão utilizados e confirme.\n\n![Exemplo de configuração da atividade de serviço pelo editor web](..\\..\\images\\configura%C3%A7%C3%A3o%20via%20web.png)\n\n## Codificando" }, { "metadata": { "title": "Utilização de Webservices", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73084007", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices.md" }, "content": "Utilização de Webservices\n\n\nVocê também pode fazer a codificação da chamada dos métodos dos serviços, fazendo com quem um *dataset* faça a inicialização da solicitação ou mesmo caso a opção sem codificação não atenda as suas necessidades. Para lhe ajudar, criamos este exemplo: \n\n**Exemplo de integração via codificação**\n\n```\nfunction startProcess() {\n\tvar serviceHelper = ServiceManager.getService(\"ECMWorkflowEngineService\").getBean();\n var serviceLocator = serviceHelper.instantiate(\"com.totvs.technology.ecm.workflow.ws.ECMWorkflowEngineServiceService\");\n var service = serviceLocator.getWorkflowEngineServicePort();\n \n // Lista das matrículas de usuários que irão receber a atividade. Normalmente é um usuário, mas no caso de um consenso podem ser vários\n var colleagueIds = serviceHelper.instantiate('net.java.dev.jaxb.array.StringArray');\n colleagueIds.getItem().add(\"adm\");\n \n // Chama o serviço para iniciar a solicitação e recebe o retorno\n // O retorno do startProcess é um String[][], ou no Soap, um StringArrayArray\n var retornoStartProcess = service.startProcess(\n \t\t'integrador', // matrícula do usuário integrador\n \t\t'9a411f45fcea479ffb839a3ee605c18d', // senha do usuário\n \t\t1, // código da empresa\n \t\t\"processoASerIniciado\", // código do processo\n \t\t2, // código da atividade para qual a solicitação vai ser movimentada\n \t\tcolleagueIds, \n \t\t\"Iniciado via ws\", // Comentário da movimentação\n \t\t'integrador', // Usuário que ficará como o inicializador da solicitação. O usuário integrador precisa ter personificação caso seja um usuário diferente do integrador\n \t\ttrue, // Se vai completar a tarefa inicial (true) ou não, vai apenas salvar a solicitação para gerar um código e preencher o formulário, anexos e comentários\n \t\tserviceHelper.instantiate('com.totvs.technology.ecm.workflow.ws.ProcessAttachmentDtoArray'), // Lista de anexos. Mesmo que não seja enviado nenhum, é necessário enviar a lista vazia\n \t\tserviceHelper.instantiate('net.java.dev.jaxb.array.StringArrayArray'), // Dados do formulário. Mesmo que não tenha formulário ou não seja preenchido, é necessário enviar a lista vazia\n \t\tserviceHelper.instantiate('com.totvs.technology.ecm.workflow.ws.ProcessTaskAppointmentDtoArray'), // Apontamentos da solicitação. Não é mais utilizado, mas por compatibilidade é necessário enviar a lista vazia\n \t\tfalse // Se a movimentação é feita como usuário responsável pela atividade ou como gestor do processo\n\t);\n \n var retorno = stringArrayArrayToSimpleObject(retornoStartProcess);\n \n if (retorno.ERROR) {\n \t// Interrompe a execução ou movimentação e retorna um erro com a resposta do serviço\n \tthrow \"Solicitação não iniciada: \" + retorno.ERROR;\n } else {\n \t// Imprime o código da solicitação criada pelo serviço e depois imprime todos os dados que foram retornados\n \tlog.info(\"Solicitação \" + retorno.iProcess + \" criada com sucesso\");\n \tlog.dir(retorno)\n } \n}\n\n\nfunction stringArrayArrayToSimpleObject(stringArrayArray) {\n\tvar objeto = {};\n\tfor(var i = 0; i < stringArrayArray.getItem().size(); i++) {\n\t\tvar item = stringArrayArray.getItem().get(i).getItem();\n\t\tobjeto[item.get(0)] = item.get(1);\n\t}\n\t\n\treturn objeto;\n}\n```\n\nOu, se preferir um exemplo um pouco maior, mas contendo mais detalhes sobre o que é cada parâmetro e desenvolvido para ser melhor re-utilizável, você pode conferir este exemplo que faz o mesmo que o exemplo anterior\n\n**Exemplo de integração via codificação**\n\n```\n//configure os dados do seu usuário integrador\nvar INTEGRADOR = {\n\tmatricula: 'integrador',\n\tsenha: '9a411f45fcea479ffb839a3ee605c18d',\n\tempresa: 1\n};\n\n// conforme o cadastro do fluig\nvar SERVICOS = {\n\tworkflowEngineService: \"ECMWorkflowEngineService\"\n}\n\n/**\n * Função que cria uma solicitação via Soap no Fluig\n * \n */\nfunction startProcess() {\n var serviceHelper = getECMWorkflowEngineServiceHelper();\n var service = getECMWorkflowEngineService(serviceHelper);\n \n // Nome do processo a ser iniciado\n var processId = \"processoASerIniciado\";\n \n // Atividade para qual será movimentada a solicitação\n var choosedState = 2;\n \n // Lista das matrículas de usuários que irão receber a atividade. Normalmente é um usuário, mas no caso de um consenso podem ser vários\n var colleagueIds = createStringArray(serviceHelper);\n colleagueIds.getItem().add(\"adm\");\n \n // Comentário da movimentação\n var comments = \"Iniciado via ws\";\n \n // Usuário que ficará como o inicializador da solicitação. O usuário integrador precisa ter personificação caso seja um usuário diferente do integrador\n var userId = INTEGRADOR.matricula;\n \n // Se vai completar a tarefa inicial (true) ou não, vai apenas salvar a solicitação para gerar um código e preencher o formulário, anexos e comentários\n var completeTask = true;\n \n // Lista de anexos. Mesmo que não seja enviado nenhum, é necessário enviar a lista vazia\n var attachments = createProcessAttachmentDtoArray(serviceHelper);\n\n // Dados do formulário. Mesmo que não tenha formulário ou não seja preenchido, é necessário enviar a lista vazia\n var cardData = createStringArrayArray(serviceHelper);\n \n // Apontamentos da solicitação. Não é mais utilizado, mas por compatibilidade é necessário enviar a lista vazia\n var appointments = createProcessTaskAppointmentDtoArray(serviceHelper);\n \n // Se a movimentação é feita como usuário responsável pela atividade ou como gestor do processo\n var managerMode = false;\n \n // Chama o serviço para iniciar a solicitação e recebe o retorno\n // O retorno do startProcess é um String[][], ou no Soap, um StringArrayArray\n var retornoStartProcess = service.startProcess(\n \t\tINTEGRADOR.matricula, \n \t\tINTEGRADOR.senha, \n \t\tINTEGRADOR.empresa, \n \t\tprocessId, \n \t\tchoosedState, \n \t\tcolleagueIds, \n \t\tcomments, \n \t\tuserId, \n \t\tcompleteTask, \n \t\tattachments, \n \t\tcardData, \n \t\tappointments, \n \t\tmanagerMode\n\t);\n \n var retorno = stringArrayArrayToSimpleObject(retornoStartProcess);\n \n if (retorno.ERROR) {\n \t// Interrompe a execução ou movimentação e retorna um erro com a resposta do serviço\n \tthrow \"Solicitação não iniciada: \" + retorno.ERROR;\n } else {\n \t// Imprime o código da solicitação criada pelo serviço e depois imprime todos os dados que foram retornados\n \tlog.info(\"Solicitação \" + retorno.iProcess + \" criada com sucesso\");\n \tlog.dir(retorno)\n } \n}\n\nfunction getECMWorkflowEngineServiceHelper() {\n return ServiceManager.getService(SERVICOS.workflowEngineService).getBean();\n}\n\nfunction getECMWorkflowEngineService(serviceHelper) {\n\tvar serviceLocator = serviceHelper.instantiate(\"com.totvs.technology.ecm.workflow.ws.ECMWorkflowEngineServiceService\");\n return serviceLocator.getWorkflowEngineServicePort();\n}\n\n/**\n * Cria uma variável similar ao String[] que é utilizado pelo Soap\n * @param serviceHelper O wsdl que contém o mapeamento da estrutura de um objeto do tipo net.java.dev.jaxb.array.StringArray\n * @returns Um objeto do tipo net.java.dev.jaxb.array.StringArray conforme o mapeamento do wsdl\n */\nfunction createStringArray(serviceHelper) {\n\treturn serviceHelper.instantiate('net.java.dev.jaxb.array.StringArray');\n}\n\n\n/**\n * Cria uma variável similar ao String[][] que é utilizado pelo Soap\n * @param serviceHelper O wsdl que contém o mapeamento da estrutura de um objeto do tipo net.java.dev.jaxb.array.StringArrayArray\n * @returns Um objeto do tipo net.java.dev.jaxb.array.StringArrayArray conforme o mapeamento do wsdl\n */\nfunction createStringArrayArray(serviceHelper) {\n\treturn serviceHelper.instantiate('net.java.dev.jaxb.array.StringArrayArray');\n}\n\n\n/**\n * Cria uma variável similar ao ProcessAttachmentDto[] que é utilizado pelo Soap\n * @param serviceHelper O wsdl que contém o mapeamento da estrutura de um objeto do tipo com.totvs.technology.ecm.workflow.ws.ProcessAttachmentDtoArray\n * @returns Um objeto do tipo com.totvs.technology.ecm.workflow.ws.ProcessAttachmentDtoArray conforme o mapeamento do wsdl\n */\nfunction createProcessAttachmentDtoArray(serviceHelper) {\n\treturn serviceHelper.instantiate('com.totvs.technology.ecm.workflow.ws.ProcessAttachmentDtoArray');\n}\n\n/**\n * Cria uma variável similar ao ProcessTaskAppointmentDto[] que é utilizado pelo Soap. \n * \n * Estes apontamentos não são mais usados, mas como não devemos mexer na assinatura dos métodos Soap para não quebrar os stubs já gerados é obrigatório mandar, ainda que vazio\n * \n * @param serviceHelper O wsdl que contém o mapeamento da estrutura de um objeto do tipo com.totvs.technology.ecm.workflow.ws.ProcessTaskAppointmentDtoArray\n * @returns Um objeto do tipo com.totvs.technology.ecm.workflow.ws.ProcessTaskAppointmentDtoArray conforme o mapeamento do wsdl\n */\nfunction createProcessTaskAppointmentDtoArray(serviceHelper) {\n\treturn serviceHelper.instantiate('com.totvs.technology.ecm.workflow.ws.ProcessTaskAppointmentDtoArray');\n}\n\n/**\n * Transforma um objeto do tipo StringArrayArray (String[][]) em um objeto Javascript\n * \n * \n * campo\n * valor\n * \n * \n * Vira:\n * \n * {'campo': 'valor'}\n * \n * @param stringArrayArray\n * @returns Um objeto do tipo javascript \n */\nfunction stringArrayArrayToSimpleObject(stringArrayArray) {\n\tvar objeto = {};\n\tfor(var i = 0; i < stringArrayArray.getItem().size(); i++) {\n\t\tvar item = stringArrayArray.getItem().get(i).getItem();\n\t\tobjeto[item.get(0)] = item.get(1);\n\t}\n\t\n\treturn objeto;\n}\n```" }, { "metadata": { "title": "GitHub - Exemplos de desenvolvimento", "source": "https://tdn.totvs.com/display/fluig/GitHub+-+Exemplos+de+desenvolvimento", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Aceleradores de desenvolvimento Fluig\\GitHub - Exemplos de desenvolvimento.md" }, "content": "GitHub - Exemplos de desenvolvimento" }, { "metadata": { "title": "GitHub - Exemplos de desenvolvimento", "source": "https://tdn.totvs.com/display/fluig/GitHub+-+Exemplos+de+desenvolvimento", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Aceleradores de desenvolvimento Fluig\\GitHub - Exemplos de desenvolvimento.md" }, "content": "GitHub - Exemplos de desenvolvimento\n\n\n- 1 [O que é GitHub?](#GitHubExemplosdedesenvolvimento-OqueéGitHub?)\n- 2 [Como funciona?](#GitHubExemplosdedesenvolvimento-Comofunciona?)\n- 3 [Qual a diferença entre o Git Samples e o GitHub do Fluig?](#GitHubExemplosdedesenvolvimento-QualadiferençaentreoGitSampleseoGitHubdoFluig?)\n\n# O que é GitHub?\n\n---\n\nO [GitHub](https://github.com/) é uma rede social para desenvolvedores criada com o objetivo primário de compartilhar códigos entre pessoas da área.\n\n# Como funciona?\n\n---\n\nO Github funciona como **repositórios para armazenamento de pastas e arquivos de um projeto**.\n\nNo contexto da plataforma Fluig, você poderá armazenar projetos contendo vários tipos de arquivos: html, css, javascript, documentos de texto, php, pdf, imagens, gráficos, json e muito mais.\n\nNo repositório do GitHub é possível fazer o *download* de conteúdos e contribuir para a melhoria dos projetos existentes de forma comunitária.\n\n# Qual a diferença entre o [Git Samples](https://git.fluig.com/projects/SAMPLES) e o [GitHub](https://github.com/fluig) do Fluig?\n\n---\n\nHá dois ambientes de repositórios do Fluig e cada um deles possui propósito especifico, abaixo listamos as diferenças:\n\n| | **Git Samples** | **GitHub** |\n| --- | --- | --- |\n| Quem usa? | Desenvolvedores Fluig - ***Time Fluig*** | Desenvolvedores Fluig - ***Comunidade*** |\n| O que é publicado? | Widgets, layouts, processos, relatórios BIRT, datasets, formulários, etc | Widgets, layouts, processos, relatórios BIRT, datasets, formulários, etc |\n| Quem pública ou atualiza? | SQUADs Fluig | Desenvolvedores Fluig |\n| Tem garantia? | Sim – faz parte do produto e acompanha as evoluções da plataforma | AS IS – Não há garantia de uso |\n| Propósito | Criado pela equipe Fluig para a comunidade de desenvolvedores usarem como base em seus projetos | Criado para armazenar projetos de utilidade comum entre os desenvolvedores Fluig, além de servir como exemplo para avançar em projetos, podem evoluir a partir da sugestão da comunidade de desenvolvedores |\n| Quem aprova? | Peer review Fluig | Equipe de moderação do GitHub Fluig |\n| Onde geralmente é usado? | Documentações (Fluig Developer) | Fórum, Webinar e Eventos |\n| Quando é atualizado? | Geralmente sincronizado com novidades da plataforma - nova release | A qualquer momento |\n| URL de acesso | | |\n\nImportante!\n\nAlguns exemplos utilizam bibliotecas que estão disponíveis no repositório privado de artefatos do Fluig no Nexus. Por isso, é necessário solicitar as credenciais de acesso ao Nexus para o time de Atendimento Fluig, para que as dependências sejam baixadas corretamente. [Clique aqui](https://tdn.totvs.com/pages/viewpage.action?pageId=870389961) e saiba como solicitar e utilizar as credenciais." }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n\n# Índice\n\n- 1 [Objetivo](#AcessandoDatasets-Objetivo)\n- 2 [Pré-requisitos](#AcessandoDatasets-Pré-requisitos)\n- 3 [Acessando um Dataset](#AcessandoDatasets-AcessandoumDataset)\n - 3.1 [Widgets](#AcessandoDatasets-Widgets)\n - 3.2 [Via pontos de customização](#AcessandoDatasets-eventos-de-formulariosViapontosdecustomização)\n - 3.2.1 [Exemplo:](#AcessandoDatasets-Exemplo:)\n - 3.2.2 [Constraints Avançadas](#AcessandoDatasets-ConstraintsAvançadas)\n - 3.2.3 [Exemplificação de uso de Constraints](#AcessandoDatasets-ExemplificaçãodeusodeConstraints)\n - 3.3 [Nova funcionalidade de pesquisa de informação de datasets](#AcessandoDatasets-Novafuncionalidadedepesquisadeinformaçãodedatasets)\n - 3.4 [Formulários](#AcessandoDatasets-Formulários)\n - 3.4.1 [Via JavaScript em formulário](#AcessandoDatasets-ViaJavaScriptemformulário)\n - 3.4.2 [Via Tags no Formulário](#AcessandoDatasets-ViaTagsnoFormulário)\n - 3.5 [Webservices](#AcessandoDatasets-Webservices)\n - 3.6 [Via DataTable](#AcessandoDatasets-ViaDataTable)\n - 3.7 [Acessar dataset via API](#AcessandoDatasets-AcessardatasetviaAPI)\n - 3.7.1 [Via serviço REST](#AcessandoDatasets-ViaserviçoREST)\n\n# Objetivo\n\n---\n\nUm Dataset pode ser acessado de várias formas: no desenvolvimento de widgets, formulários, *webservices*, eventos globais, eventos de formulários e eventos de processos. \nO objetivo desse guia é mostrar como acessar o Dataset nestes cenários.\n\n# Pré-requisitos\n\n---\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre o TOTVS Fluig Plataforma e sobre o [Desenvolvimento de Datasets](../Desenvolvimento de Datasets.md).\n\nAtenção!\n\nA partir das atualizações **1.6.5 Liquid**, **1.7.0 Lake** e **1.7.1 Crystal Lake**, os *select* passados por *constraint* em dataset serão bloqueados pelo serviço. Orientamos a leitura da documentação [Datasets acessando banco de dados externo](Datasets acessando banco de dados externo.md) que contém um exemplo da correta utilização do procedimento.\n\n# Acessando um *Dataset*\n\n---\n\nVários locais da plataforma podem fazer uso dos dados retornados pelos *Datasets*. Serão apresentadas abaixo as variações na forma de acessá-los ou de manuseá-los." }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n## Widgets\n\nNo desenvolvimento de um widget, é possível acessar dados de *Datasets*, através da linguagem *Javascript*, utilizando a biblioteca *DatasetFactory*.\n\nConsulte a documentação [Integrando widget com formulários/datasets da plataforma](../../Recurso de Páginas e Widgets (WCM).md)/Construção de Widgets e Layouts/Widgets/Como criar um widget que busque conteúdo/Integrando widget com formuláriosdatasets do Fluig Plataforma.md).\n\n## Via pontos de customização" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n\nQuando um *Dataset* é acessado via um ponto de customização como eventos globais, eventos de processos, eventos de formulário ou mesmo em outros *Datasets*, isto é feito através de chamadas JavaScript que serão executadas no lado servidor.\n\nO exemplo abaixo apresenta um exemplo simples de chamada a um *Dataset*:\n\n```\nfunction doTest1() {\n\tvar dataset = DatasetFactory.getDataset(\"group\", null, null, null);\n\treturn dataset.rowsCount;\n}\n```\n\nNo exemplo acima, o código JavaScript faz o acesso ao Dataset interno [*group*](http://tdn.totvs.com/display/fluig/Datasets+internos+fluig#Datasetsinternosfluig-group-Gruposdeusu%C3%A1rios), e retorna a quantidade de linhas disponíveis (rowsCount). O objeto **DatasetFactory** é a \"porta de entrada\" para o acesso a qualquer *Dataset*. Além de permitir a carga de um *Dataset*, ela também permite navegar entre todos os *Datasets* disponíveis no sistema.\n\nO acesso a um *Dataset* é feito através do método **getDataset** do objeto **DatasetFactory**, onde seus parâmetros são:\n\n- **Nome do Dataset:** Nome do Dataset a ser buscado;\n- **Campos:** Array com os campos do Dataset que serão retornados. Caso seja informado null, retorna todos os campos do Dataset;\n- **Constraints:** Array com os condições de busca do Dataset. Caso seja informado null, retorna todos os registros do Dataset.\n- **Ordem:** Array com os campos para ordenação dos registros do Dataset. Caso seja informado null, retorna os registros com a ordenação padrão.\n\nJá para a criação das constraints é utilizado o método **createConstraint**do objeto **DatasetFactory**, onde seus parâmetros são:\n\n- **Campo:** Nome do campo que será filtrado;\n- **Valor Inicial:** Valor inicial da faixa de valores do filtro\n- **Valor Final:** Valor final da faixa de valores do filtro\n- **Tipo:** Tipo da condição, podendo ser: \n - **MUST:** indica que todos os registros do Dataset devem satisfazer a esta condição.\n - **SHOULD:** indica que os registros do Dataset podem ou não atender à condição. Esse tipo é mais comum quando se necessita que um mesmo campo tenha valores A ou B (onde cada um será uma condição de busca com tipo SHOULD).\n - **MUST\\_NOT:** indica que nenhum dos registros pode satisfazer a condição.\n\nApós a criação da constraint, é possível informar que esta será utilizada na consulta em formato de LIKE, ou seja, o valor retornado poderá conter qualquer letra ou sequência de letras no lugar do símbolo '%'. Isso é feito chamando o método setLikeSearch(true) para a constraint que se deseja este comportamento, conforme exemplificado na implementação abaixo, na constraint c5, onde pretende-se retornar todos os registros que NÃO possuam (pois é uma constraint MUST\\_NOT) a palavra \"teste\" na descrição do documento.\n\nExemplo:\n\n```\nfunction doTest2() {\n\t//Monta as constraints para consulta\n\tvar c1 = DatasetFactory.createConstraint(\"activeVersion\", \"true\", \"true\", ConstraintType.MUST);\n\tvar c2 = DatasetFactory.createConstraint(\"publisherId\", \"adm\", \"adm\", ConstraintType.MUST_NOT);\n\tvar c3 = DatasetFactory.createConstraint(\"documentType\", \"1\", \"1\", ConstraintType.SHOULD);\n\tvar c4 = DatasetFactory.createConstraint(\"documentType\", \"2\", \"2\", ConstraintType.SHOULD);\n\tvar c5 = DatasetFactory.createConstraint(\"documentDescription\", \"%teste%\", \"%teste%\", ConstraintType.MUST_NOT);\n c5.setLikeSearch(true);\n var constraints = new Array(c1, c2, c3, c4, c5);\n\t\n\t//Define os campos para ordenação\n\tvar sortingFields = new Array(\"documentPK.documentId\");\n\t\n\t//Busca o dataset\n\tvar dataset = DatasetFactory.getDataset(\"document\", null, constraints, sortingFields);\n\t\n\tfor(var i = 0; i < dataset.rowsCount; i++) {\n\t\tlog.info(dataset.getValue(i, \"documentPK.documentId\"));\n\t}\n}\n```\n\nApós a criação da constraint, utiliza-se a função likeSearch utilizando a biblioteca vcXMLRPC.js, deve ser adicionado mais um parâmetro no método DatasetFactory.createConstraint, e não utilizar o método setLikeSearch(true). Exemplo:\n\n```\nvar c5 = DatasetFactory.createConstraint(\"documentDescription\", \"%teste%\", \"%teste%\", ConstraintType.MUST_NOT, true);\n```\n\nIsto é válido apenas para a utilização da biblioteca vcXMLRPC.js.\n\nAqui é feito o uso de duas constrainsts do tipo SHOULD. A primeira indica que o campo 'documentType' pode retornar os registros do tipo 2. Já a segunda constraint indica que o campo documentDescription pode retornar todos os registros que possuam pelo menos a palavra teste em seu corpo, e isso se deve ao like estar habilitado por meio de \"setLikeSearch(true)\"" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n##### Exemplo:\n\n```\nfunction doTest3() {\n\t//Monta as constraints para consulta\n var c1 = DatasetFactory.createConstraint(\"documentType\", \"2\", \"2\", ConstraintType.SHOULD);\n var c2 = DatasetFactory.createConstraint(\"documentDescription\", \"%teste%\", \"%teste%\", ConstraintType.SHOULD);\n c2.setLikeSearch(true);\n var constraints = new Array(c1, c2);\n\n //Define os campos para ordenação\n var sortingFields = new Array(\"documentPK.documentId\");\n\n //Busca o dataset\n var dataset = DatasetFactory.getDataset(\"document\", null, constraints, sortingFields);\n return dataset;\n}\n```\n\n##### Constraints Avançadas" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n\nExiste uma constraint em especial que é utilizada para limitar o número de registros na consulta SQL chamada de **sqlLimit**. Então é possível definir o número máximo de registros que uma consulta SQL pode retornar, porém o número de registros pode ser menor que o esperado, devido algumas validações que são feitas após o retorno dos dados. Por exemplo: O **sqlLimit** tem um valor 100 e é feita uma consulta em um serviço de dados de uma definição de formulário, esta consulta retornará os 100 registros, porém após isso são executadas validações para verificar se o formulário está ativo e se o usuário corrente tem permissão para visualizar os dados fazendo com que o retorno possa ser menor que 100. Para o **sqlLimit** é utilizada a seguinte sintaxe:\n\n```\n DatasetFactory.createConstraint(\"sqlLimit\", \"10\", \"10\", ConstraintType.MUST);\n```\n\nImportante\n\nO valor considerado no sqlLimit é sempre o **initialValue**, o que for informado no finalValue não será considerado.\n\nExiste outra constraint especial utilizada somente para acesso a Datasets de definições de formulário, ela indica se ao buscar o serviço de dados devem ser retornados APENAS os dados dos formulários da definição de formulário principal. A constraint é a **onlyMainCards** e por padrão seu valor é false, ou seja, são retornados os dados dos formulários da definição de formulário principal e das definições de formulários filhas.\n\n```\nDatasetFactory.createConstraint(\"onlyMainCards\", \"true\", \"true\", ConstraintType.MUST);\n```\n\nObservação\n\nO valor considerado no onlyMainCards é sempre o initialValue, o que for informado no finalValue não será considerado.\n\nExiste ainda, outra constraint especial que é a **checkSecurity** essa constraint é válida somente para Datasets de formulário e quando utilizada, fará o retorno dos registros do formulário validarem a segurança, ou seja, o Dataset retornará somente os registros de formulário que o usuário possua permissão para visualização.\n\n```\nDatasetFactory.createConstraint(\"checkSecurity\", \"true\", \"true\", ConstraintType.MUST);\n```\n\nAtenção\n\nAs constraints são aplicáveis apenas a Datasets internos. Em Datasets avançados, elas podem não ser suportadas, pois os dados provêm de fontes externas. No entanto, é possível implementar filtros na codificação do Dataset, desde que o desenvolvedor tenha preparado o código para aceitar e processar essas restrições, manipulando o objeto retornado para remover informações desnecessárias.\n\nDica\n\nA constraint 'offset' define o ponto de início da pesquisa no dataset, permitindo a implementação de paginação.\n\n```\nDatasetFactory.createConstraint(\"offset\", \"10\", \"10\", ConstraintType.MUST);\n```\n\nA constraint *offset* permite definir quantos registros iniciais devem ser ignorados no resultado da consulta, retornando os próximos registros.\n\nExemplo: Ao usar a constraint *offset* com o valor *10*, os primeiros 10 registros encontrados na consulta serão ignorados, e os próximos registros serão retornados conforme o limite definido." }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n##### Exemplificação de uso de Constraints" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n\nConsidere os valores da tabela abaixo sendo utilizadas como um serviço de dados a partir de uma definição de formulário para exemplificação dos exemplos:\n\n| Código | Nome | Cidade |\n| --- | --- | --- |\n| 1 | Javier Spiva | São Paulo |\n| 2 | Cody Ballow | Rio de Janeiro |\n| 3 | Javier Naramore | São Paulo |\n| 4 | Max Nevius | Rio de Janeiro |\n| 5 | Noemi Roiger | São Paulo |\n| 6 | Lonnie Cadwallader | Rio de Janeiro |\n| 7 | Lorrie Spece | Brasília |\n\nVerifique os exemplos de retorno de dados abaixo:\n\nPara retornar somente as linhas que os códigos estejam entre 1 á 4 usar a seguinte constraint:\n\n```\nvar c1 = DatasetFactory.createConstraint(\"Código\", \"1\", \"4\", ConstraintType.MUST);\n```\n\nRetorno:\n\n| Código | Nome | Cidade |\n| --- | --- | --- |\n| 1 | Javier Spiva | São Paulo |\n| 2 | Cody Ballow | Rio de Janeiro |\n| 3 | Javier Naramore | São Paulo |\n| 4 | Max Nevius | Rio de Janeiro |\n\nPara retornar somente as linhas que os nomes sejam \"Noemi Roiger\", \"Javier Naramore\" e \"Lonnie Cadwallader\" ou que a cidade seja Brasília, usar as seguintes constraints:\n\n```\nvar c1 = DatasetFactory.createConstraint(\"nome\", \"Noemi Roiger\", \"Noemi Roiger\", ConstraintType.SHOULD);\nvar c2 = DatasetFactory.createConstraint(\"nome\", \"Javier Naramore\", \" Javier Naramore\", ConstraintType.SHOULD);\nvar c3 = DatasetFactory.createConstraint(\"nome\", \"Lonnie Cadwallader\", \"Lonnie Cadwallader\", ConstraintType.SHOULD);\nvar c4 = DatasetFactory.createConstraint(\"cidade\", \"Brasília\", \"Brasília\", ConstraintType. SHOULD);\n```\n\nRetorno:\n\n| Código | Nome | Cidade |\n| --- | --- | --- |\n| 3 | Javier Naramore | São Paulo |\n| 5 | Noemi Roiger | São Paulo |\n| 6 | Lonnie Cadwallader | Rio de Janeiro |\n| 7 | Lorrie Spece | Brasília |\n\nPara retornar todas as linhas exceto onde a cidade seja Brasília, usar a seguinte constraint:\n\n```\nvar c1 = DatasetFactory.createConstraint(\"cidade\", \"Brasília\", \"Brasília\", ConstraintType.MUST_NOT);\n```\n\nRetorno:\n\n| Código | Nome | Cidade |\n| --- | --- | --- |\n| 1 | Javier Spiva | São Paulo |\n| 2 | Cody Ballow | Rio de Janeiro |\n| 3 | Javier Naramore | São Paulo |\n| 4 | Max Nevius | Rio de Janeiro |\n| 5 | Noemi Roiger | São Paulo |\n| 6 | Lonnie Cadwallader | Rio de Janeiro |" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n## Nova funcionalidade de pesquisa de informação de datasets" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n\n---\n\nNo exemplo abaixo, o código JavaScript faz o acesso ao Dataset interno **“documents”**, e retorna a quantidade de linhas disponíveis . O objeto datasets é a **\"porta de entrada\"** para o acesso a qualquer Dataset. Além de permitir a carga de um Dataset, ela também permite navegar entre todos os Datasets disponíveis no sistema.\n\n```\nfunction doTest1() {\n    var listDocuments = datasets.get(\"document\").search({});      \n    return listDocuments.length;\n}\n```\n\nO acesso a um Dataset é feito através do método **get** do objeto **dataset**, passando o parâmetro\n\n- **Nome do Dataset:** Nome do Dataset a ser buscado;\n\nNo método **search** é informado os parâmetros que irão compor os filtros, ordenação e limite da busca.\n\n**Campo:** Nome do campo que será filtrado.\n\n- **Value**: Valor a ser filtrado,\n- **Not**: Séria para a mesma lógica de **MUST\\_NOT**, onde não deve satisfazer condição ou valor passado.\n\n- **Like:** Realizar pesquisa para encontrar correspondência com o valor informado.\n\n- **Between:** Esse parâmetro é para realizar a pesquisa entre um valor inicial e final.\n\n- **SHOULD:** Indica que os registros do Dataset podem ou não atender à condição. Esse tipo é mais comum quando se necessita que um mesmo campo tenha valores A ou B (onde cada um será uma condição de busca com tipo **SHOULD**).\n\n**Limit:** Total de registros que irá ser retornado.\n\n**Offset:** Define quantas linhas devem ser puladas antes que os resultados comecem a ser retornados.\n\n**Order:** Especifica a coluna pela qual deseja ordenar os resultados.\n\nExemplo da utilização do **search** com os **filtros, limit e offset**.\n\n```\n var listDocuments = datasets.get(\"document\").search({\n \"documentType\": {\n \"value\": [\"1\", \"2\"],\n \"not\": \"true\",\n \"like\": \"true\",\n \"between\": [\"1\", \"2\"]\n },\n \"order\": [\"documentPK.documentId\"],\n \"limit\": 50, \n \"offset\": 20 \n });\n```\n\nO parâmetro **SHOULD,** deve ser utilizado da seguinte forma.\n\n```\nvar listDocuments = datasets.get(\"document\").search({\n \"documentType\": [\"1\", \"2\"]\n });\n```\n\n**Observação**: Por enquanto é permitido utilizar apenas uma vez o **SHOULD**, não vai ser permitido utilizar para dois tipos diferentes.\n\n**Retorno dos registros.**\n\nO retorno dos registros é feito no formato JSON.\n\nExemplo:\n\n```\n[{\n \"versionDescription\" : \"\",\n \"visualization\" : null,\n \"inheritApprovers\" : false,\n \"imutable\" : null,\n \"downloadEnabled\" : false,\n \"metaListId\" : 0\n}]\n```\n\nPara recuperar os dados e adicionar nas colunas do dataset, é possível recuperar os dados de duas formas\n\n- **[index][“campo”]**, passando a String do campo\n- **[index].campo**, ou pelo objeto.\n\n**Observação:** Para campos que é necessário acessar outros dados, como o id e a versão do documento, vai ser possível recuperar passando a String dentro de uma chave, **“[index][\"documentPK.documentId\"]”.**\n\nNos exemplos a seguir, será mostrado das duas formas.\n\nNo exemplo a seguir é feito uma busca dos documentos com o filtro do tipo **SHOULD,** onde e para retornar os documentos do tipo 1 e 2 **(Pasta e documento).**\n\n```javascript\nvar newDataset = DatasetBuilder.newDataset();\n newDataset.addColumn(\"Document ID\");\n newDataset.addColumn(\"Document version\");\n newDataset.addColumn(\"Document Name\");\n newDataset.addColumn(\"Document Type\");\n\n var listDocuments = datasets.get(\"document\").search({\n \"documentType\": [\"1\", \"2\"]\n });\n\n for(var index = 0; index < listDocuments.length; index++) {\n newDataset.addRow([\n listDocuments[index][\"documentPK.documentId\"], \n listDocuments[index][\"documentPK.version\"],\n listDocuments[index].documentDescription,\n listDocuments[index].documentType\n ]);\n }\n\n return newDataset;\n```\n\n**![](..\\..\\..\\images\\image-2025-11-6_9-35-23.png)**\n\nNo exemplo a seguir, será realizada a pesquisa de documentos para retornar os registros que contenham a palavra **“API”,** utilizando o like e como o limite de cinco registros.\n\n```javascript\nvar newDataset = DatasetBuilder.newDataset();\n newDataset.addColumn(\"Document ID\");\n newDataset.addColumn(\"Document version\");\n newDataset.addColumn(\"Document Name\");\n newDataset.addColumn(\"Document Type\");\n\n var listDocuments = datasets.get(\"document\").search({\n \"documentDescription\": {\n \"value\": \"%API%\",\n \"like\": true\n },\n \"limit\": 5\n });\n\n for(var index = 0; index < listDocuments.length; index++) {\n newDataset.addRow([\n listDocuments[index][\"documentPK.documentId\"], \n listDocuments[index][\"documentPK.version\"],\n listDocuments[index].documentDescription,\n listDocuments[index][\"documentType\"]\n ]);\n }\n\n return newDataset;\n```\n\n![](..\\..\\..\\images\\image-2025-11-6_9-39-59.png)" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n## Formulários\n\nEm formulários, é possível que um ou mais campos possam exibir ou consultar dados de Datasets utilizando Javascript ou tags.\n\n### Via JavaScript em formulário" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n\n---\n\nÉ possível acessar os Datasets via código JavaScript no HTML de uma definição de formulário utilizando a biblioteca **vcXMLRPC.js**para utilização do *DatasetFactory*. Para isto, basta incluir a linha abaixo antes da tag body do HTML:\n\n```\n\n```\n\nImportante\n\nEste modelo de acesso faz com que o Dataset seja transportado do servidor para o cliente, ou seja, o navegador do usuário. Por isso, é importante observar a quantidade de informações que será manuseada, caso contrário pode-se ter problemas de consumo excessivo de banda ou performance.\n\n**Exemplo:**\n\n```\nfunction showNewDatasetFull() {\n\tvar div = document.getElementById(\"datasetDiv\");\n \t\n\t//Busca o dataset\n \ttry {\n \tvar dataset = DatasetFactory.getDataset(\"colleague\");\n \tdiv.innerHTML = showDataset(dataset);\n \t} catch(erro) {\n \t \tdiv.innerHTML = erro;\n \t}\n}\n\nfunction showDataset(dataset) {\n\tvar tabela = \"\";\n \t\n\t//Monta o cabeçalho\n \ttabela += \"\";\n \tfor (var i = 0; i < dataset.columns.length; i++) {\n \ttabela += \"\";\n\t}\n \ttabela += \"\";\n\n \t//Monta os registros \t\n \tfor (var x = 0; x < dataset.values.length; x++) {\n \t\ttabela += \"\";\n \tvar row = dataset.values[x];\n \tfor (var y = 0; y < dataset.columns.length; y++) {\n \t\ttabela += \"\";\n\t\t}\n \ttabela += \"\";\n \t}\n \t\n\ttabela += \"
\" + dataset.columns[i] + \"
\" + row[dataset.columns[y]] + \"
\";\n\treturn tabela;\n}\n```\n\nNo exemplo acima, percebe-se que a forma de se invocar um Dataset é semelhante ao método via pontos de customização, através do DatasetFactory. A função showDataset apresenta um exemplo de código que permite apresentar os dados do Dataset.\n\nAssim como no método via pontos de customização, quando é preciso filtrar um Dataset é preciso criar as constraints que serão utilizadas na busca. Os argumentos utilizados no método getDataset também são os mesmos que apresentados anteriormente:\n\n```\nfunction showNewDatasetPartial() {\n\tvar div = document.getElementById(\"datasetDiv\");\n\t\t\t\n\tvar c1 = DatasetFactory.createConstraint(\"parentDocumentId\", \"5\", \"5\", ConstraintType.MUST);\n\tvar c2 = DatasetFactory.createConstraint(\"documentType\", \"1\", \"1\", ConstraintType.MUST_NOT);\n\tvar c3 = DatasetFactory.createConstraint(\"activeVersion\", \"true\", \"true\", ConstraintType.MUST);\n\tvar constraints = new Array(c1, c2, c3);\n\t\n\t//Define os campos para ordenação\n\tvar fields = new Array(\"documentPK.documentId\", \"documentDescription\", \n\t\t\t\"documentType\", \"publisherId\", \"accessCount\");\n\tvar sortingFields = new Array(\"accessCount\", \"documentDescription\");\n\t\n\t//Busca o dataset\n \ttry {\n \tvar dataset = DatasetFactory.getDataset(\"document\", fields, constraints, sortingFields);\n \tdiv.innerHTML = showDataset(dataset);\n \t} catch(erro) {\n \t \tdiv.innerHTML = erro;\n \t}\n}\n```" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n### Via Tags no Formulário\n\nÉ possível especificar um Dataset em um campo select (combo-box). Quando isto é feito, as opções do combo são automaticamente criadas de acordo com os dados do Dataset. Para isso, é necessário adicionar três propriedades adicionais à tag:\n\n| Propriedade | Descrição |\n| --- | --- |\n| dataset | Determina o Dataset utilizado |\n| datasetkey | Determina qual coluna do Dataset será utilizada como valor do campo |\n| datasetvalue | Determina qual coluna do Dataset será utilizada como rótulo das opções do combo |\n\nNo exemplo abaixo, o campo \"estado\" foi configurado para que as opções do combo sejam criadas a partir do Dataset \"estadosBR\". Como valor do campo será utilizado o campo \"Sigla\", embora para o usuário será apresentado o campo \"Estado\".\n\n| | |\n| --- | --- |\n| 1 | `` |\n\nExemplo\n\nPermitir que o usuário selecione treinamentos utilizando o [dataset de Aprendizado](Datasets internos.md)\n\n## Webservices\n\nA plataforma disponibiliza um [conjunto de WebServices](../Utilização de Webservices.md) que permitem integrar aplicações de terceiros à plataforma. Dentre os serviços disponibilizados, o serviço ECMDatasetService permite fazer o acesso a um Dataset. Para verificar a lista de serviços disponíveis, acesse a URL http://:/webdesk/services.\n\nA forma de uso de um Web Service varia de acordo com a tecnologia utilizada pela aplicação cliente. Consulte a documentação da tecnologia escolhida pra obter detalhes sobre como acessar Web Services.\n\n## Via DataTable" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n\nPara consumir um Dataset dentro de um DataTable, também utilizamos a função DatasetFactory. É necessário incluir a biblioteca **vcXMLRPC.js**no final dos arquivos edit.ftl e view.ftl do *widget* para que seja possível utilizar a função.\n\n```\n\n```\n\nApós configurado o arquivo **vcXMLRPC.js**, edite o arquivo .js do widget chamando o Dataset que desejar consumir. Abaixo segue um exemplo de uma chamada para o consumo do Dataset *colleague*:\n\n```\n\tloadTable: function() {\n\t\tvar that = this;\n\t\tvar datasetReturned = DatasetFactory.getDataset(\"colleague\", null, null, null);\n\t\tif (datasetReturned != null && datasetReturned.values != null && datasetReturned.values.length > 0) {\n\t\t\tvar records = datasetReturned.values;\n\t\t\tfor ( var index in records) {\n\t\t\t\tvar record = records[index];\n\t\t\t\tthat.mydata.push({\n\t\t\t\t\tid: record.userTenantId,\n\t\t\t\t\tname: record.colleagueName,\n\t\t\t\t\temail: record.mail\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthat.myTable = FLUIGC.datatable('#idtable' + \"_\" + that.instanceId, {\n\t\t\tdataRequest: that.mydata,\n\t\t\trenderContent: ['id', 'name', 'email'],\n\t\t\theader: [{\n\t\t\t\t'title': 'Code',\n\t\t\t\t'dataorder': 'name',\n\t\t\t\t'size': 'col-md-4'\n\t\t\t}, {\n\t\t\t\t'title': 'Name',\n\t\t\t\t'standard': true,\n\t\t\t\t'size': 'col-md-4'\n\t\t\t}, {\n\t\t\t\t'title': 'EMAIL',\n\t\t\t\t'size': 'col-md-4',\n\t\t\t\t'dataorder': 'ASC'\n\t\t\t}],\n\t\t\tsearch: {\n\t\t\t\tenabled: false,\n\t\t\t},\n\t\t\tscroll: {\n\t\t\t\ttarget: \".target\",\n\t\t\t\tenabled: true\n\t\t\t},\n\t\t\tactions: {\n\t\t\t\tenabled: false,\n\t\t\t},\n\t\t\tnavButtons: {\n\t\t\t\tenabled: false,\n\t\t\t},\n\t\t\tdraggable: {\n\t\t\t\tenabled: false\n\t\t\t},\n\t\t}, function(err, data) {\n\t\t\tif (err) {\n\t\t\t\tFLUIGC.toast({\n\t\t\t\t\tmessage: err,\n\t\t\t\t\ttype: 'danger'\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tthat.myTable.on('fluig.datatable.loadcomplete', function() {\n\t\t\tif (!that.tableData) {\n\t\t\t\tthat.tableData = that.myTable.getData();\n\t\t\t}\n\t\t});\n\t},\n```\n\nPara um exemplo completo do uso de *widget* com DataTable acesse [*Widget* com DataTable](https://git.fluig.com/projects/SAMPLES/repos/style-guide/browse/style-guide-wcm/widget/exemplo3), lembrando de trocar a function *loadTable* do *widget* pela função *loadTable* do exemplo acima.\n\nPara um exemplo completo do uso de modal com Datable acesse [Modal com DataTable e Dataset](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/form-modal-datatable), lembrando sobre a limitação do datatable, no qual não é possível efetuar paginação pois não possui os recursos de offset e limit." }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n## Acessar dataset via API\n\n### Via serviço REST" }, { "metadata": { "title": "Acessando Datasets", "source": "https://tdn.totvs.com/display/fluig/Acessando+Datasets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Acessando Datasets.md" }, "content": "Acessando Datasets\n\n\n---\n\nDisponibilizamos uma nova forma para acessar os datasets através de API utilizando serviços tipo REST. Para isso apresentamos logo abaixo um exemplo de como realizar essa pesquisa, siga os passos abaixo:\n\nA API que fará a pesquisa é a API Dataset ([servidor\\_fluig]/dataset/swagger-ui/#/Dataset\\_handle/searchDatasetValues)\n\n**datasetId**: Nome do dataset onde será realizado a pesquisa, este é o único parâmetro requerido.\n\n**field**: Campos do dataset que serão retornados, caso não seja passado os valores todos os campos serão retornados.\n\n**offset**: Quantos registros serão “pulados” antes de retornar os valores, esse campo é usado junto com o **limit** para realizar a paginação. Caso o dataset chamado for um dataset avançado, esse parâmetro pode ser acessado como uma *constraint* de nome **offset**.\n\n**limit**: Quantidade máxima de registros que serão retornados na pesquisa. Caso o dataset chamado for um dataset avançado, esse parâmetro pode ser acessado como uma *constraint* de nome **sqlLimit**.\n\nImportante\n\nÉ importante definir o **limit** para evitar uma pesquisa com muitos registros, o que pode resultar em um retorno lento.\n\n**orderby**: Nome do campo onde será feita a ordenação, pode ser adicionado **\\_ASC** ou **\\_DESC** para pesquisar em ordem ascendente e descendente respectivamente.\n\n**constraintsField**: Nome do campo onde será passado o valor para pesquisa. Pode ser passado múltiplos campos mas para cada um deles será preciso passar um valor.\n\n**constraintsInitialValue**: Valor que será usado para realizar o filtro de acordo com o campo passado no parâmetro **constraintsField**. Caso tenha passado mais de um campo para pesquisa será preciso passar os valores na mesma ordem para o filtro ser criado corretamente.\n\n**constraintsFinalValue**: Caso o filtro desejado for uma faixa de valores o parâmetro **constraintsInitialValue** será o valor inicial e **constraintsFinalValue** será o valor final. Caso tenha passado mais de um campo para pesquisa será preciso passar os valores na mesma ordem para o filtro ser criado corretamente. Caso for passado o mesmo valor que o parâmetro **constraintsInitialValue** será feito a pesquisa somente por esse valor ignorando a faixa de valores.\n\n**constraintsType**: Tipo de filtro que será aplicado no campo, os valores permitidos são:\n\n- **MUST**: Se utiliza quando os valores retornados precisam ser iguais ao valor passado na **constraintsInitialValue** e **constraintsFinalValue** para o campo **constraintsField.**\n- **MUST\\_NOT**: Se utiliza quando os valores retornados precisam ser diferentes ao valor passado na **constraintsInitialValue** e **constraintsFinalValue** para o campo **constraintsField.**\n- **SHOULD** : Assim como o **MUST** os valores retornados precisam ser iguais ao valor passado na **constraintsInitialValue** e **constraintsFinalValue** para o campo **constraintsField.** Esse tipo deve ser utilizado quando for feito mais de um filtro para o mesmo campo. **Por exemplo**: Pesquisar todos os colaboradores com o nome Antônio ou João.\n\nCaso tenha passado mais de um campo para pesquisa será preciso passar os valores na mesma ordem para que o filtro seja criado corretamente.\n\n**constraintsLikeSearch**: Valor booleano que determina se os valores nos campos **constraintsInitialValue** e **constraintsFinalValue** podem ser somente parte do valor total caso o booleano seja verdadeiro ou se os \nvalores precisam ser exatos caso o booleano seja falso. Quando o valor for verdadeiro poderá ser usado o símbolo **%** para determinar que será aceito qualquer valor a partir desse ponto, **por exemplo**: se na **constraintsInitialValue** for passado o valor “Anderson%” e o **constraintsLikeSearch** estiver como *true* será retornado todos os valores que comecem com “Anderson”. Caso tenha passado mais de um campo para a pesquisa será preciso passar os valores na mesma ordem para que o filtro seja criado corretamente." }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado" }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n\n# Índice\n\n- 1 [Objetivo](#ConstruçãodoDatasetAvançado-Objetivo)\n- 2 [Pré-requisitos](#ConstruçãodoDatasetAvançado-Pré-requisitos)\n- 3 [Criação de dataset avançado](#ConstruçãodoDatasetAvançado-Criaçãodedatasetavançado)\n - 3.1 [Dataset com valores fixos no código](#ConstruçãodoDatasetAvançado-Datasetcomvaloresfixosnocódigo)\n - 3.2 [Dataset avançado com utilização de constraint](#ConstruçãodoDatasetAvançado-Datasetavançadocomutilizaçãodeconstraint)\n - 3.3 [Dataset avançado com permissionamento](#ConstruçãodoDatasetAvançado-Datasetavançadocompermissionamento)\n - 3.4 [Utilizando zoom composto em Dataset avançado](#ConstruçãodoDatasetAvançado-UtilizandozoomcompostoemDatasetavançado)\n - 3.5 [Dataset avançado de definição de formulário \"pai-filho\"](#ConstruçãodoDatasetAvançado-Datasetavançadodedefiniçãodeformulário\"pai-filho\")\n- 4 [Guia de Referência de Datasets](#ConstruçãodoDatasetAvançado-GuiadeReferênciadeDatasets)\n - 4.1 [Dataset Factory](#ConstruçãodoDatasetAvançado-DatasetFactory)\n - 4.2 [Dataset](#ConstruçãodoDatasetAvançado-Dataset)\n\n# Objetivo\n\n---\n\nEste guia tem o objetivo de apresentar uma introdução para a codificação dos datasets avançados no TOTVS Fluig Plataforma.\n\n# Pré-requisitos\n\n---\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Conhecimento sobre o [Desenvolvimento de Datasets](../Desenvolvimento de Datasets.md)\n- Visão geral sobre codificação JavaScript\n\nAtenção!\n\nA partir das atualizações **1.6.5 Liquid**, **1.7.0 Lake** e **1.7.1 Crystal Lake**, os *select* passados por *constraint* em dataset serão bloqueados pelo serviço. Orientamos a leitura da documentação [Datasets acessando banco de dados externo](Datasets acessando banco de dados externo.md) que contém um exemplo da correta utilização do procedimento.\n\n# Criação de dataset avançado\n\n---\n\nUm dataset avançado é capaz de acessar outros datasets, realizar chamadas a serviços externos ou pode conter valores fixos, codificados conforme a necessidade. Ele é construído a partir de um código-fonte em JavaScript, que pode ser editado na interface disponível no Painel de Controle ou pelo Fluig Studio.\n\nAtenção\n\nPara que um usuário que não é administrador da empresa possa construir datasets via Fluig Studio é necessário que ele possua a permissão \"Configurar Datasets\". Esta permissão pode ser concedida pelo administrador através do item [Permissões](https://tdn.totvs.com/pages/viewpage.action?pageId=234455792) disponível no Painel de Controle da plataforma.\n\nA partir da **atualização 1.6.5**, os administradores do sistema conseguem editar o código fonte do Dataset pela plataforma, acessando a opção \"Editar em modo avançado\", na tela de Datasets no Painel de Controle.\n\nA seguir serão apresentados alguns exemplos para codificação do dataset avançado." }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n## Dataset com valores fixos no código" }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n\n---\n\n```javascript\n function createDataset(fields, constraints, sortFields) {\n\tvar dataset = DatasetBuilder.newDataset();\n\t \n\t//Cria as colunas\n\tdataset.addColumn(\"Sigla\");\n\tdataset.addColumn(\"Estado\");\n\tdataset.addColumn(\"Capital\");\n\tdataset.addColumn(\"Area\");\n\t \n\t//Cria os registros\n\tdataset.addRow(new Array(\"AM\", \"Amazonas\", \"Manaus\", 1570746));\n\tdataset.addRow(new Array(\"PA\", \"Pará\", \"Belém\", 1247690));\n\tdataset.addRow(new Array(\"MT\", \"Mato Grosso\", \"Cuiabá\", 903358));\n\tdataset.addRow(new Array(\"TO\", \"Tocantins\", \"Palmas\", 277621));\n\tdataset.addRow(new Array(\"PI\", \"Piauí\", \"Teresina\", 251529));\n\t\n\treturn dataset;\n}\n```\n\nPara criar um novo Dataset, é utilizado o método **DatasetBuilder.newDataset()**. Utilizando o objeto retornado por este método é possível adicionar as colunas desejadas (método **addColumn**) bem como adicionar linhas (método **addRow**).\n\nNote que a função javascript **createDataset**, que cria o Dataset para consulta, recebe como parâmetros os campos, as constraints e a ordenação. Cabe ao desenvolvedor utilizar estes valores na lógica de implementação do Dataset avançado. Caso seja desconsiderado algum desdes campos, os filtros não serão aplicados. Os parâmetros \"**fields**\" e \"**sortFields**\" são **arrays** de String, que possuem, respectivamente, os nomes dos campos que serão retornados e os nomes dos campos utilizados para ordenação. Já o parâmetro \"**constraints**\" é um array de objetos do tipo **Constraint**, onde cada objeto deste array possui as seguintes propriedades:\n\n| Propriedade | Descrição |\n| --- | --- |\n| fieldName | Nome do campo |\n| initialValue | Valor inicial para filtro neste campo |\n| finalValue | Valor final para filtro neste campo |\n| contraintType | Tipo do filtro deste campo, podendo ter os valores abaixo: **MUST**: O valor informado **precisa** estar nos resultados **SHOULD**: O valor informado **pode** estar ou não nos resultados **MUST\\_NOT**: O valor informado **não pode** estar nos resultados |\n\nAtenção!\n\nAs constraints podem ser utilizadas apenas para Datasets internos. Datasets avançados não aceitam constraints, pelo fato de os dados serem externos, não sendo possível aplicar o filtro em sua origem. Para Datasets avançados o tratamento de filtros deve ser feito na codificação do Dataset, manipulando o objeto retornado e retirando as informações desnecessárias.\n\nPara acessar estas propriedades e analisar os valores de cada item, pode-se utilizar um laço de repetição, conforme implementação abaixo:\n\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar company;\n\tvar initialDate;\n\tvar finalDate;\n\tif (constraints != null) {\n\t\tfor (var i = 0; i < constraints.length; i++) {\n\t\t\tif (constraints[i].fieldName == \"company\") { \n\t\t\t\tcompany = constraints[i].initialValue; \n\t\t\t}\n\t\t\telse if (constraints[i].fieldName == \"date\") { \n\t\t\t\tinitialDate = constraints[i].initialValue; \n\t\t\t\tfinalDate = constraints[i].finalValue; \n\t\t\t}\n\t\t}\n\t}\n\t.\n\t.\n\t.\n}\n```" }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n## Dataset avançado com utilização de constraint" }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n\n---\n\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar dataset = DatasetBuilder.newDataset();\n\tdataset.addColumn(\"DDD\");\n\tdataset.addColumn(\"Fone\");\n\tdataset.addColumn(\"Nome\");\n\t\n\tvar tempDataset = getDefaultValues(); // consulta a fonte de dados do dataset\n\t\t\n\tif(constraints!=null && constraints.length){ //se tiver constraint filtra\n\t\t\n\t\tif(constraints[0].constraintType==ConstraintType.MUST) { // implementação somente para o MUST\n\t\t\t\n\t\t\tfor(var a=0;a<\ttempDataset.length;a++){\n\t\t\t\t// se o valor inicial da constraint for igual ao valor do campo na constraint adiciona a linha\n\t\t\t\tif(constraints[0].initialValue==tempDataset[a][constraints[0].fieldName]){ \n\t\t\t\t\tdataset.addRow(new Array(tempDataset[a][\"DDD\"], tempDataset[a][\"Fone\"],tempDataset[a][\"Nome\"]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else { // se não tiver constraint adiciona todas as linhas\n\t\tfor(var a=0;a<\ttempDataset.length;a++){\n\t\t\tdataset.addRow(new Array(tempDataset[a][\"DDD\"], tempDataset[a][\"Fone\"],tempDataset[a][\"Nome\"]));\n\t\t}\n\t}\n\t\n\treturn dataset;\n}\n\nfunction getDefaultValues(){ // retorna valores default para serem filtrados\n\treturn \t[{\n\t\t\t\tDDD: \"47\",\n\t\t\t\tFone: \"1111-1111\",\n\t\t\t\tNome: \"Marcos\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tDDD: \"47\",\n\t\t\t\tFone: \"2222-2222\",\n\t\t\t\tNome: \"Roberto\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tDDD: \"41\",\n\t\t\t\tFone: \"3333-3333\",\n\t\t\t\tNome: \"Maria\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tDDD: \"31\",\n\t\t\t\tFone: \"4444-4444\",\n\t\t\t\tNome: \"Francisco\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tDDD: \"11\",\n\t\t\t\tFone: \"5555-5555\",\n\t\t\t\tNome: \"Michel\"\n\t\t\t}];\n}\n```\n\nConsulta utilizando a *constraint*:\n\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar c1 = DatasetFactory.createConstraint(\"DDD\", \"47\", \"47\", ConstraintType.MUST);\n\t\n\tvar dataset = DatasetFactory.getDataset(\"exemploFiltro\", null, new Array(c1), null);\n\treturn dataset;\n}\n```\n\nCaso necessário, também é possível obter o código da empresa e do usuário autenticado através do método getValue(), conforme exemplo abaixo:\n\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar companyId = getValue(\"WKCompany\");\n\tvar currentUser = getValue(\"WKUser\");\n\t.\n\t.\n\t.\n}\n```" }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n## Dataset avançado com permissionamento" }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n\n---\n\nAbaixo temos um exemplo de como implementar o permissionamento em datasets avançados.\n\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n var newDataset = DatasetBuilder.newDataset();\n try{ \n var dataset = \"\";\n var filter = [];\n var currentUser = getValue(\"WKUser\"); //Código do usuário logado\n var currentCompany = getValue(\"WKCompany\"); //Código da empresa do usuário logado\n \n var groupCode = \"grupo\"; //Código do grupo que o usuário precisa pertencer para passar na validação.\n dataset = \"colleagueGroup\" //Nome do dataset que pesquisa a relação de grupos e usuários.\n \n filter= [DatasetFactory.createConstraint(\"colleagueGroupPK.companyId\", currentCompany , currentCompany, ConstraintType.MUST), \n DatasetFactory.createConstraint(\"colleagueGroupPK.colleagueId\", currentUser , currentUser, ConstraintType.MUST), \n DatasetFactory.createConstraint(\"colleagueGroupPK.groupId\", groupCode, groupCode, ConstraintType.MUST)]; //Cria o filtro para empresa, usuário e grupo.\n\n /** Codigo para pesquisar por papel ao invés de grupo.\n * \n var roleCode = \"papel\"; //Código do papel que o usuário precisa pertencer para passar na validação.\n dataset = \"workflowColleagueRole\" //Nome do dataset que pesquisa a relação de papéis e usuários.\n \n filter= [DatasetFactory.createConstraint(\"workflowColleagueRolePK.companyId\", currentCompany , currentCompany, ConstraintType.MUST), \n DatasetFactory.createConstraint(\"workflowColleagueRolePK.colleagueId\", currentUser , currentUser, ConstraintType.MUST), \n DatasetFactory.createConstraint(\"workflowColleagueRolePK.roleId\", roleCode, roleCode, ConstraintType.MUST)];\n */\n var validation = DatasetFactory.getDataset(dataset, null, filter, null); //Realiza a chamada do dataset\n \n if(validation.rowsCount==1){ //Se tiver uma linha quer dizer que o usuário logado faz parte do grupo/papel informado\n //Esse retorno é só para informar que passou da validação, mas aqui dentro ficaria o codigo que o usuário tem permissão de acesso.\n newDataset.addColumn(\"SUCCESS\");\n newDataset.addRow([\"ok\"]);\n } else {\n //Esse retorno é só para informar que o usuário não faz parte do grupo/papel. \n newDataset.addColumn(\"ERROR\");\n newDataset.addRow([\"sem permissão\"]);\n }\n \n } catch(e) {\n newDataset.addColumn(\"ERROR\");\n newDataset.addRow([\"chamada incorreta\"]);\n return newDataset; \n }\n return newDataset;\n}\n```\n\nAtenção!\n\nAlguns datasets retornam dados sensíveis, por isso, é altamente recomendado que apenas os usuários responsáveis tenham acesso a esses dados." }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n## Utilizando zoom composto em Dataset avançado" }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n\n---\n\nAtravés do uso de Datasets avançados é possível realizar uma série de buscas compostas.\n\nNo exemplo abaixo, utilizando o método createDataset foi desenvolvida uma busca constituída por mais de um campo da tabela, que recebe o valor informado no campo zoom e em seguida retorna o dataset avançado com os registros encontrados em ambos ou em um único campo da busca. Caso não seja informado nenhum valor, serão retornados todos os registros encontrados no banco.\n\n```javascript\n function createDataset(fields, constraints, sortFields) {\n var c1 = null;\n var c2 = null;\n var filter = null;\n \n if (constraints.length > 0)\n {\n c1 = DatasetFactory.createConstraint(\"mail\", \"%\" + constraints[0].initialValue + \"%\" , \"%\" + constraints[0].finalValue + \"%\", ConstraintType.SHOULD);\n c2 = DatasetFactory.createConstraint(\"mail\", \"%%\", \"%%\", ConstraintType.SHOULD);\n\n\n c1.setLikeSearch(true);\n c2.setLikeSearch(true);\n filter = new Array (c1, c2);\n } \n var dataset = DatasetFactory.getDataset(\"colleague\", null, filter, sortFields);\n \n return dataset;\n}\n```\n\nEm seguida é apresentado a implementação do zoom para tratar os retornos gerados pela busca composta.\n\n**Exemplo 1**\n\n```\n\n```\n\n**Exemplo 1**\n\n```\n\n
\n```" }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n## Dataset avançado de definição de formulário \"pai-filho\"" }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n\n---\n\nPara acessar informações de um \"pai-filho\" de uma definição de formulário pode ser utilizado o WebService \"ECMDatasetService\", um Dataset avançado (Exemplo 1), ou ainda um evento de processo ou definição de formulário (Exemplo 2).\n\n**Exemplo 1**\n\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\t\n\t//Cria as colunas\n\tvar dataset = DatasetBuilder.newDataset();\n\tdataset.addColumn(\"NumFormulario\");\n\tdataset.addColumn(\"Id\");\n\tdataset.addColumn(\"Peca\");\n\tdataset.addColumn(\"Quantidade\");\n\t\n\t//Cria a constraint para buscar os formulários ativos\n\tvar cst = DatasetFactory.createConstraint(\"metadata#active\", true, true, ConstraintType.MUST);\n\tvar constraints = new Array(cst);\n\t\n\tvar datasetPrincipal = DatasetFactory.getDataset(\"dsExemploPaiFilho\", null, constraints, null);\n\t\n\tfor (var i = 0; i < datasetPrincipal.rowsCount; i++) {\n\t\tvar documentId = datasetPrincipal.getValue(i, \"metadata#id\");\n\t\tvar documentVersion = datasetPrincipal.getValue(i, \"metadata#version\");\n\t\t\n\t\t//Cria as constraints para buscar os campos filhos, passando o tablename, número da formulário e versão\n\t\tvar c1 = DatasetFactory.createConstraint(\"tablename\", \"tabelaPecas\" ,\"tabelaPecas\", ConstraintType.MUST);\n\t\tvar c2 = DatasetFactory.createConstraint(\"metadata#id\", documentId, documentId, ConstraintType.MUST);\n\t\tvar c3 = DatasetFactory.createConstraint(\"metadata#version\", documentVersion, documentVersion, ConstraintType.MUST);\n\t\tvar constraintsFilhos = new Array(c1, c2, c3);\n\n\t\t//Busca o dataset\n\t\tvar datasetFilhos = DatasetFactory.getDataset(\"dsExemploPaiFilho\", null, constraintsFilhos, null);\n\n\t\tfor (var j = 0; j < datasetFilhos.rowsCount; j++) {\n\t\t\t//Adiciona os valores nas colunas respectivamente.\n\t\t\tdataset.addRow(new Array(\n\t\t\t\t\tdocumentId,\n\t\t\t\t\tdatasetFilhos.getValue(j, \"wdk_sequence_id\"), \n\t\t\t\t\tdatasetFilhos.getValue(j, \"peca\"), \n\t\t\t\t\tdatasetFilhos.getValue(j, \"qtde\")));\n\t\t}\n\t}\n\t\n\treturn dataset;\n}\n```\n\n**Exemplo 2**\n\n```\nfunction beforeStateEntry(sequenceId) {\n\t\n\tvar user = getValue(\"WKUser\");\n\t\n\t//Cria a constraint para buscar os formulários ativos\n\tvar cst1 = DatasetFactory.createConstraint(\"metadata#active\", true, true, ConstraintType.MUST);\n\t\n\t//É obrigatório informar a constraint userSecurityId para indicar o usuário \n\t//que sera validada a permissão nos formulários\n\tvar cst2 = DatasetFactory.createConstraint(\"userSecurityId\", user, user, ConstraintType.MUST);\n\t\n\tvar constraints = new Array(cst1, cst2);\n\t\n\tvar datasetPrincipal = DatasetFactory.getDataset(\"dsExemploPaiFilho\", null, constraints, null);\n\t\n\tfor (var i = 0; i < datasetPrincipal.rowsCount; i++) {\n\t\tvar documentId = datasetPrincipal.getValue(i, \"metadata#id\");\n\t\tvar documentVersion = datasetPrincipal.getValue(i, \"metadata#version\");\n\t\t\n\t\t//Cria as constraints para buscar os campos filhos, passando o tablename, número da formulário e versão\n\t\tvar c1 = DatasetFactory.createConstraint(\"tablename\", \"tabelaPecas\" ,\"tabelaPecas\", ConstraintType.MUST);\n\t\tvar c2 = DatasetFactory.createConstraint(\"metadata#id\", documentId, documentId, ConstraintType.MUST);\n\t\tvar c3 = DatasetFactory.createConstraint(\"metadata#version\", documentVersion, documentVersion, ConstraintType.MUST);\n\t\t\n\t\t//É obrigatório informar a constraint userSecurityId para indicar o usuário \n\t\t//que sera validada a permissão nos formulários\n\t\tvar c4 = DatasetFactory.createConstraint(\"userSecurityId\", user, user, ConstraintType.MUST);\n\t\t\n\t\tvar constraintsFilhos = new Array(c1, c2, c3, c4);\n\t\t\n\t\t//Busca o dataset\n\t\tvar datasetFilhos = DatasetFactory.getDataset(\"dsExemploPaiFilho\", null, constraintsFilhos, null);\n\t\tfor (var j = 0; j < datasetFilhos.rowsCount; j++) {\n\t\t\t//Utiliza os campos do Dataset. Exibindo como exemplo.\n\t\t\tlog.info(\"CAMPO 1: \" + documentId);\n\t\t\tlog.info(\"CAMPO 2: \" + datasetFilhos.getValue(j, \"wdk_sequence_id\"));\n\t\t\tlog.info(\"CAMPO 3: \" + datasetFilhos.getValue(j, \"peca\"));\n\t\t\tlog.info(\"CAMPO 4: \" + datasetFilhos.getValue(j, \"qtde\"));\n\t\t}\n\t}\n\n}\n```\n\nUtilizando um dos modelos acima, é possível recuperar os valores \"filhos\" dos formulários ativos, ou seja, da última versão criada. Existem alguns parâmetros obrigatórios que devem ser passados através de *constraints*, onde o valor inicial e final devem ser iguais. A forma de recuperar esses valores é opcional. Segue abaixo a nomenclatura **obrigatória** de cada parâmetro:\n\n| Parâmetro | Descrição |\n| --- | --- |\n| tablename | Atributo utilizado para nomear cada **tabela** filha do HTML. Exemplo: ``` \t
``` |\n| metadata#id | Número do formulário. |\n| metadata#version | Número da versão do formulário |\n| userSecurityId | Código do usuário que será validada a permissão no formulário Observação Esse parâmetro não será validado na Visualização de Datasets, visto que nessa opção é um exemplo de visualização dos dados. |\n\nTambém é possível exibir a ordem dos campos filhos, para isso deve-se utilizar o campo **wdk\\_sequence\\_id**, sendo que este não poderá ser utilizado como nome de algum campo do formulário.\n\n# Guia de Referência de Datasets\n\n---" }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n## Dataset Factory\n\n| Retorno | Método e Descrição |\n| --- | --- |\n| SearchConstraint | `createConstraint(java.lang.String field, java.lang.String initialValue, java.lang.String finalValue, ConstraintType type)`  Cria uma nova constraint para a seleção de registros do Dataset. |\n| java.util.List | `getAvailableDatasets()`  Retorna uma lista de todos os Datasets disponíveis no sistema. |\n| DefaultDataset | `getDataset(java.lang.String name, java.lang.String[] fields, SearchConstraint[] constraints, java.lang.String[] order)`  Carrega os dados de um Dataset. |\n\n## Dataset" }, { "metadata": { "title": "Construção do Dataset Avançado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=412888219", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Construção do Dataset Avançado.md" }, "content": "Construção do Dataset Avançado\n\n\n| Retorno | Método e Descrição |\n| --- | --- |\n| void | `addColumn(java.lang.String colName)`  Adiciona uma coluna ao Dataset. |\n| void | `addRow(java.lang.Object[] values)`  Adiciona uma linha ao Dataset. |\n| java.lang.String | `getColumnName(int colNum)`  Retorna o nome de uma coluna do Dataset. |\n| java.lang.String[] | `getColumnsName()`  Retorna um array com os nomes das colunas do Dataset. |\n| int | `getColumnsCount()`  Retorna a quantidade de colunas de um Dataset. |\n| java.util.ArrayList> | `getMap()`  Retorna os valores do Dataset na forma de uma lista contendo mapas, onde cada registro do Dataset corresponde a um mapa com o nome da coluna como chave. |\n| int | `getRowsCount()`  Retorna a quantidade de linhas disponíveis no Dataset. |\n| DefaultDataset | `getSubDataset(java.lang.String field, java.lang.Object value)`  Retorna um subconjunto dos dados do Dataset, na forma de um novo Dataset. |\n| java.lang.Object | `getValue(int row, int col)`  Retorna o valor armazenado no Dataset, na linha e coluna passadas por parâmetro. |\n| java.lang.Object | `getValue(int row, java.lang.String colName)`  Retorna o valor armazenado no Dataset, na linha passada e campo passados por parâmetro. |\n| java.lang.Object[][] | `getValues()`  Retorna todos os valores de um Dataset, na forma de um array bidimensional. |\n| java.sql.ResultSet | `toResultSet()`  Retorna um ResultSet contendo os dados do Dataset. |\n\nDica!\n\nSe tiver dúvidas sobre o desenvolvimento de datasets avançados, não deixe de consultar o nosso **[fórum para DEVs](https://forum.totvs.io/).**" }, { "metadata": { "title": "Dataset Simples", "source": "https://tdn.totvs.com/display/fluig/Dataset+Simples", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Dataset Simples.md" }, "content": "Dataset Simples\n\n\n# Índice\n\n- 1 [Objetivo](#DatasetSimples-Objetivo)\n- 2 [Pré-requisitos](#DatasetSimples-Pré-requisitos)\n- 3 [Criação de datasets simples](#DatasetSimples-Criaçãodedatasetssimples)\n - 3.1 [Cadastro do serviço](#DatasetSimples-Cadastrodoserviço)\n - 3.2 [Configuração do dataset simples](#DatasetSimples-Configuraçãododatasetsimples)\n- 4 [Edição em modo avançado](#DatasetSimples-Ediçãoemmodoavançado)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é demonstrar a criação de um dataset simples, para possibilitar a integração com sistemas terceiros sem qualquer tipo de codificação.\n\n# Pré-requisitos\n\n---\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre o Fluig;\n- Visão geral sobre integração de sistemas.\n\n# Criação de datasets simples\n\n---\n\nA criação de dataset simples está disponível no Painel de Controle do Fluig e consiste em duas etapas: o cadastro do serviço e a configuração do dataset.\n\nAtenção!\n\nApenas os usuários administradores da plataforma têm acesso a essas configurações.\n\n## Cadastro do serviço\n\nPara cadastrar o serviço é necessário conhecer o endereço e o método do Webservice que contém as informações que devem ser trazidas para o TOTVS Fluig Plataforma. É possível cadastrar serviços SOAP, REST ou JDBC, conforme a documentação [Cadastro de serviço](../Primeiros passos/Cadastro de serviço.md).\n\n## Configuração do dataset simples" }, { "metadata": { "title": "Dataset Simples", "source": "https://tdn.totvs.com/display/fluig/Dataset+Simples", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Dataset Simples.md" }, "content": "Dataset Simples\n\n\nApós ter o serviço cadastrado, vamos criar o dataset simples. Acesse a opção **Painel de controle** localize o agrupador **Desenvolvimento** e acione a opção **datasets**. Selecione a opção **Novo dataset** e após selecione **Simples**:\n\n![](..\\..\\..\\images\\image2021-12-8_14-39-16.png)\n\nPreencha os campos para criação do dataset, os campos destacados com um asterisco (**\\***) são de preenchimento obrigatório:\n\n| Campo | Descrição |\n| --- | --- |\n| **Código****\\*** | Código do dataset que será utilizado ao ser chamado em processos por exemplo. |\n| **Descrição****\\*** | Descrição do dataset para poder identificar a funcionalidade do mesmo. |\n| **Serviço****\\*** | Selecionar o serviço que será realizado a integração. |\n| **Operação** | Aqui será selecionado o método ou tabela que serão chamados do serviço. |\n| **Configurar** | Pode ser configurado o limite de resultado (JDBC) e a configuração de autenticação (REST). |\n| **Parâmetro** | Serão informados os parâmetros para buscar os dados conforme a operação selecionada. |\n\n![](..\\..\\..\\images\\image2021-12-8_14-57-30.png)\n\n![](..\\..\\..\\images\\image2021-12-8_14-59-18.png)\n\nO código-fonte gerado nessa interface pode ser utilizado em outros recursos, como eventos de processos ou scripts de tarefa de serviço assíncrono, por exemplo. Bastando neste caso que o desenvolvedor se responsabilize pela forma como o retorno do webservice é tratado. Além disso, o código-fonte dos datasets simples pode ser editado pelo Fluig Studio ou em modo avançado pela própria plataforma, o que automaticamente os transforma em datasets avançados.\n\n**Fique por dentro!**\n\nPara visualizar mais detalhes sobre a criação de datasets, acesse nossas documentações:\n\n- [Datasets](http://tdn.totvs.com/display/HF/Datasets)\n- [Mais ações de datasets](https://tdn.totvs.com/pages/viewpage.action?pageId=400655388)\n- [Sincronização de Datasets](Sincronização de datasets.md)\n- [Desenvolvimento de Datasets](../Desenvolvimento de Datasets.md)\n\n# Edição em modo avançado\n\n---\n\nA interface de edição em modo avançado, disponível a partir da **atualização 1.6.5 - Liquid**, é acessada acionando a edição do dataset na listagem. Essa interface apresenta algumas vantagens em relação à edição pelo Fluig Studio, sendo algumas delas:\n\n- Histórico de versões publicadas, com detalhamento do responsável e possibilidade de restaurar versão antiga;\n- Possibilidade de manter as alterações em rascunho (salvar a edição sem publicá-la);\n- Monitoramento detalhado do serviço relacionado, com o log e a quantidade de requisições efetuadas.\n\nAtenção!\n\nOs datasets podem ser convertidos de **simples** para **avançado**, mas o contrário não pode ser feito: a partir do momento em que um dataset simples for editado em modo avançado, ele passa a ser um dataset avançado, e com isso, não poderá ser novamente editado em modo simples.\n\n![](..\\..\\..\\images\\Dataset%20avan%C3%A7ado.gif)\n\n![](..\\..\\..\\images\\Versionamento.png)\n\n![](..\\..\\..\\images\\Editor.png)\n\n![](..\\..\\..\\images\\Requisi%C3%A7%C3%B5es.png)\n\nFique atento!\n\nEsta documentação é válida a partir da **atualização 1.7.1 - Crystal Lake**. Se você utiliza uma atualização anterior, ela pode conter informações diferentes das quais você vê na sua plataforma." }, { "metadata": { "title": "Datasets acessando banco de dados externo", "source": "https://tdn.totvs.com/display/fluig/Datasets+acessando+banco+de+dados+externo", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets acessando banco de dados externo.md" }, "content": "Datasets acessando banco de dados externo" }, { "metadata": { "title": "Datasets acessando banco de dados externo", "source": "https://tdn.totvs.com/display/fluig/Datasets+acessando+banco+de+dados+externo", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets acessando banco de dados externo.md" }, "content": "Datasets acessando banco de dados externo\n\n\nFique atento!\n\nEsta página é válida para atualizações **1.6** e **superiores** do TOTVS Fluig.\n\n- [Objetivo](#Datasetsacessandobancodedadosexterno-Objetivo)\n- [Datasets acessando banco de dados externo](#Datasetsacessandobancodedadosexterno-Datasetsacessandobancodedadosexterno)\n- [Construindo o dataset para acesso à nova conexão](#Datasetsacessandobancodedadosexterno-Construindoodatasetparaacessoànovaconexão)\n\n# Objetivo\n\n---\n\nO objetivo desse guia é apresentar os procedimentos necessários para criar *datasets* que acessem banco de dados externos ao TOTVS Fluig.\n\nImportante!\n\nA partir da atualização **Liquid (1.6.5)**, os *select* passados por *constraint* em *dataset* serão bloqueados pelo serviço. Abaixo temos um exemplo da correta utilização do procedimento.\n\nAtenção!\n\nAo realizar um desenvolvimento usando o *datasource* da plataforma a partir da **atualização 1.6.5-190514** é indispensável usar o **AppDS** em vez do **FluigDS** ou **FluigDSRO**.\n\n# *Datasets* acessando banco de dados externo\n\n---\n\nPara que seja possível criar um *dataset* que acesse uma base externa à plataforma, é necessário, primeiramente, configurar o serviço JDBC.\n\n- Acesse o TOTVS Fluig com usuário administrador a opção **Painel de controle**, agrupador **Desenvolvimento** e **Serviços**. Selecione a opção **Novo serviço**:\n\n![](..\\..\\..\\images\\image2021-10-11_11-16-45.png)\n\n- Selecione o tipo de serviço JDBC e insira as informações solicitadas:\n - **Nome:**adicione um nome para o serviço que deseja cadastrar.\n - **Descrição:**adicione uma descrição para o serviço.\n - **Driver**: neste campo, será selecionado o *driver* desejado: MySQL, SQL Server ou Oracle. Após a gravação do serviço, o *driver* não pode ser editado.\n - **URL**: informe os dados do servidor de banco de dados.\n - **Usuário**: usuário de acesso ao banco de dados.\n - **Senha**: senha de acesso ao banco de dados.\n\n![](..\\..\\..\\images\\image2021-10-11_11-53-29.png)\n\n- Acionar opção **Salvar.**\n\n**Testando o serviço JDBC**\n\n---\n\nNo serviço criado, selecione a opção **Testar conexão** ![Testar serviço](..\\..\\..\\images\\fluigicon-computernetwork.png) :\n\n![](..\\..\\..\\images\\image2021-10-11_12-7-14.png)\n\n**01.** Edite o arquivo de configuração de acordo com a atualização que você utiliza:\n\n- **a partir da atualização 2.0**: acesse [diretório\\_instalação]/appserver/standalone/configuration e edite o arquivo **standalone.xml**.\n- **para atualizações 1.6 até 1.8.2**: acesse [diretório\\_instalação]/appserver/domain/configuration e edite o arquivo **domain.xml**.\n\n**02.** No arquivo editado (**standalone.xml** ou **domain.xml**), procure pela linha que contém a *tag* ****. Esta *tag* é responsável pelo agrupamento das conexões criadas na aplicação.\n\nA seguir é apresentado um exemplo da *tag* no arquivo:\n\n**Tag datasource**\n\n```\n\n\t\n```\n\nDentro desta *tag* terá uma outra *tag* chamada ****, responsável pelas configurações de uma conexão com um banco de dados.\n\nO exemplo abaixo apresenta o uso da *tag* **** (conexão) criado dentro da primeira *tag* **** (responsável pelo agrupamento das conexões), sendo que seu arquivo já possuirá alguns **** configurados, que são responsáveis pela comunicação com o banco de dados da plataforma.\n\n```\n\n\t\n\t\tjdbc:mysql://localhost:3306/fluig\n\t\tmysqlDriver\n\t\tTRANSACTION_READ_COMMITTED\n\t\t\n\t\t\t10\n\t\t\t20\n\t\t\n\t\t\n\t\t\troot\n\t\t\tadmin\n\t\t\n\t\t\n\t\t\t\n\t\t\ttrue\n\t\t\tfalse\n\t\t\n\t\t\n\t\t\tfalse\n\t\t\n\t\n\t\n \t\t\n \t\tcom.mysql.jdbc.Driver\n \t\n \n\n```\n\nImportante!\n\n**Não orientamos remover** ou **alterar** as conexões (****) **que já existem** no arquivo de configuração editado. Estas conexões são essenciais para o correto funcionamento da plataforma. Somente **as novas conexões** criadas com a finalidade de acesso aos *datasets* podem ser manipuladas.\n\nNo exemplo apresentado, além do *datasource*, existem duas outras *tags* que ficam dentro da estrutura da *tag* **** que são as **** e ****. A *tag* **** é responsável pelo agrupamento das configurações de *driver*. Já a *tag* **** é responsável pela comunicação com o banco de dados. Pode haver uma ou várias configurações de *driver* caso mais de um banco seja acessado (Oracle, MySQL, SQLServer).\n\nImportante!\n\n- O exemplo apresentado tem configurado somente o *driver* para uso do banco de dados MySQL. Se outro banco for utilizado, verifique a configuração do *driver* necessária para seu uso.\n\n- Não remova o *driver* já configurado ou substitua ele por outro. Caso necessário, configure um novo *driver* seguindo a estrutura já descrita.\n\n**03.** Neste caso, para criar um *dataset* que acesse uma determinada base de dados, é necessário acrescentar uma nova conexão **** dentro da *tag* ****.\n\nEXEMPLO \nPara acessar uma base de dados em MySQL cujo nome da base seja **minhabase**, a configuração do novo *datasource* ficará da seguinte forma:\n\n```\n \n\tjdbc:mysql://localhost:3306/minhabase\n\tmysqlDriver\n\t\n\t\t5\n\t\t15\n\t\n\t\n\t\troot\n\t\tadmin\n\t\n\t\n\t\t\n\t\ttrue\n\t\tfalse\n\t\n\t\n\t\t30000\n\t\n\t\n\t\tfalse\n\t\n\n \n```\n\nA partir do código gerado acima, vale destacar`:`\n\n- **jndi-name** = deve seguir a sintaxe \"**[java:/jdbc/](http://java/jdbc/)**\" onde após a / é necessário informar um *alias* para conexão. No exemplo, foi dado o nome de **MeuDataset** ficando \"[java:/jdbc/MeuDataset](http://java/jdbc/MeuDataset)\".\n\n- **pool-name** = usar o mesmo nome dado no *alias* para conexão. No exemplo definimos como **MeuDataset**.\n\n- **** = dentro desta *tag* deve ser informada a conexão com a base de dados, sendo que o exemplo mostra uma conexão com o banco de dados MySQL. Se outro banco for usado, deve ser verificada a forma correta de conexão *datasource* com o banco ao qual se pretende conectar.\n\n- **** = usuário de acesso ao banco de dados.\n\n- **** = senha de acesso ao banco de dados.\n\nImportante!\n\nPara garantir a integridade da base de dados que será acessada, é importante que o usuário configurado para acesso ao banco seja criado com privilégios somente de **leitura**, garantindo assim que nenhum registro possa ser alterado.\n\n**04.** Após criado o *datasource*, salve o arquivo editado e reinicie o serviço do Fluig para que o servidor de aplicação (Wildfly) consiga mapear a nova conexão criada.\n\n# Construindo o *dataset* para acesso à nova conexão\n\n---\n\nNeste tópico será apresentado o código necessário para criar um novo *dataset* com base nos dados da nova conexão. Caso haja dúvidas a respeito da criação de *datasets*, é aconselhável a leitura do tópico [Desenvolvimento de *datasets*](../Desenvolvimento de Datasets.md) antes de continuar esta etapa.\n\nO exemplo abaixo apresenta o acesso ao *datasource* **MeuDataSet** criado anteriormente no arquivo **standalone.xml** (a partir da 2.0) ou **domain.xml** (1.6 até 1.8.2).\n\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar newDataset = DatasetBuilder.newDataset();\n\tlog.info(\"QUERY: \" + myQuery);\n\tvar dataSource = \"/jdbc/MeuDataSet\";\n\tvar ic = new javax.naming.InitialContext();\n\tvar ds = ic.lookup(dataSource);\n\tvar created = false;\n\tvar myQuery = \"select * from pessoas\";\n\ttry {\n\t\tvar conn = ds.getConnection();\n\t\tvar stmt = conn.createStatement();\n\t\tvar rs = stmt.executeQuery(myQuery);\n\t\tvar columnCount = rs.getMetaData().getColumnCount();\n\t\twhile (rs.next()) {\n\t\t\tif (!created) {\n\t\t\t\tfor (var i = 1; i <= columnCount; i++) {\n\t\t\t\t\tnewDataset.addColumn(rs.getMetaData().getColumnName(i));\n\t\t\t\t}\n\t\t\t\tcreated = true;\n\t\t\t}\n\t\t\tvar Arr = new Array();\n\t\t\tfor (var i = 1; i <= columnCount; i++) {\n\t\t\t\tvar obj = rs.getObject(rs.getMetaData().getColumnName(i));\n\t\t\t\tif (null != obj) {\n\t\t\t\t\tArr[i - 1] = rs.getObject(rs.getMetaData().getColumnName(i)).toString();\n\t\t\t\t} else {\n\t\t\t\t\tArr[i - 1] = \"null\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tnewDataset.addRow(Arr);\n\t\t}\n\t} catch (e) {\n\t\tlog.error(\"ERRO==============> \" + e.message);\n\t} finally {\n\t\tif (rs != null) {\n\t\t\trs.close();\n\t\t}\n\t\tif (stmt != null) {\n\t\t\tstmt.close();\n\t\t}\n\t\tif (conn != null) {\n\t\t\tconn.close();\n\t\t}\n\t}\n\treturn newDataset;\n}\n```\n\nA partir do código gerado acima, vale destacar:\n\n- na linha 4 manter todo o código, alterando somente o nome **MeuDataSet** pelo nome dado ao criar seu *datasource*;\n\n- na linha 8 adicionar a *query* para acesso à tabela contida no banco, cuja conexão foi criada.\n\nPara validar o novo *dataset*, consulte o tópico [Visualizando *datasets*](../Desenvolvimento de Datasets.md)." }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\nEm atualização\n\nEm breve todos os datasets internos do TOTVS Fluig Plataforma estarão listados aqui. Aguarde!\n\n- 1 [Objetivo](#Datasetsinternos-Objetivo)\n - 1.1 [Datasets de Aprendizado](#Datasetsinternos-DatasetsdeAprendizado)\n - 1.1.1 [catalogItemDataset - Catálogo de Aprendizado](#Datasetsinternos-catalogItemDataset-CatálogodeAprendizado)\n - 1.1.2 [disciplineItemDataset - Catálogo de Disciplinas](#Datasetsinternos-disciplineItemDataset-CatálogodeDisciplinas)\n - 1.1.3 [enrollmentDataset - Matrículas](#Datasetsinternos-enrollmentDataset-Matrículas)\n - 1.1.4 [enrollmentRequestDataset - Requisições de Matrículas](#Datasetsinternos-enrollmentRequestDataset-RequisiçõesdeMatrículas)\n - 1.1.5 [enrollmentTopicDataset - Execuções em Tópicos](#Datasetsinternos-enrollmentTopicDataset-ExecuçõesemTópicos)\n - 1.1.6 [enrollmentTopicItemDataset - Execuções em Itens de Tópicos](#Datasetsinternos-enrollmentTopicItemDataset-ExecuçõesemItensdeTópicos)\n - 1.1.7 [topicDataset - Tópicos](#Datasetsinternos-topicDataset-Tópicos)\n - 1.1.8 [topicItemDataset - Itens de Tópicos](#Datasetsinternos-topicItemDataset-ItensdeTópicos)\n - 1.1.9 [assessmentDataset - Avaliações](#Datasetsinternos-assessmentDataset-Avaliações)\n - 1.1.10 [assessmentVersionDataset - Versões de Avaliações](#Datasetsinternos-assessmentVersionDataset-VersõesdeAvaliações)\n - 1.1.11 [disciplineClassDataset - Turmas e Turmas Modelo](#Datasetsinternos-disciplineClassDataset-TurmaseTurmasModelo)\n - 1.1.12 [partyScheduledDataset - Usuários agendados em avaliações](#Datasetsinternos-partyScheduledDatasetpartyScheduledDataset-Usuáriosagendadosemavaliações)\n - 1.1.13 [emailScheduledDataset - Emails agendados em avaliações](#Datasetsinternos-emailScheduledDatasetemailScheduledDataset-Emailsagendadosemavaliações)\n - 1.1.14 [assessmentScheduleDataset - Agendamento de avaliações](#Datasetsinternos-assessmentScheduleDataset-Agendamentodeavaliações)\n - 1.1.15 [assessmentApplicationGenericDataset - Execução de avaliações](#Datasetsinternos-assessmentApplicationGenericDataset-Execuçãodeavaliações)\n - 1.1.16 [assessmentApplicationCatalogPreExamDataset - Execução de avaliações de pré-teste](#Datasetsinternos-assessmentApplicationCatalogPreExamDataset-Execuçãodeavaliaçõesdepré-teste)\n - 1.1.17 [assessmentApplicationCatalogReactionExamDataset - Execução de avaliações de reação](#Datasetsinternos-assessmentApplicationCatalogReactionExamDataset-Execuçãodeavaliaçõesdereação)\n - 1.1.18 [contentLogDataset - Execução de conteúdos](#Datasetsinternos-contentLogDataset-Execuçãodeconteúdos)\n - 1.1.19 [enrollmentProgressDetailByTrackDataset - Detalhes de andamento de trilhas](#Datasetsinternos-enrollmentProgressDetailByTrackDataset-Detalhesdeandamentodetrilhas)\n - 1.1.20 [enrollmentProgressDetailByTrainingDataset - Detalhes de andamento de treinamentos](#Datasetsinternos-enrollmentProgressDetailByTrainingDataset-Detalhesdeandamentodetreinamentos)\n - 1.1.21 [assessmentAppQuestionDataset - Dataset de questões aplicadas em uma avaliação](#Datasetsinternos-assessmentAppQuestionDataset-Datasetdequestõesaplicadasemumaavaliação)\n - 1.1.22 [assessmentAppBlockDataset - Dataset de blocos em uma avaliação](#Datasetsinternos-assessmentAppBlockDataset-Datasetdeblocosemumaavaliação)\n - 1.1.23 [assessmentClassApplicationDataset - Dataset de execução de avaliações por turma](#Datasetsinternos-assessmentClassApplicationDataset-Datasetdeexecuçãodeavaliaçõesporturma)\n - 1.1.24 [assessmentApplicationByTrack - Dataset de execução de avaliações por trilha (contendo pré, pós, reação)](#Datasetsinternos-assessmentApplicationByTrack-Datasetdeexecuçãodeavaliaçõesportrilha(contendopré,pós,reação))\n - 1.1.25 [assessmentApplicationByTraining - Dataset de execução de avaliações por treinamento (contendo pré teste, pós teste, avaliação de reação)](#Datasetsinternos-assessmentApplicationByTraining-Datasetdeexecuçãodeavaliaçõesportreinamento(contendopréteste,pósteste,avaliaçãodereação))\n - 1.1.26 [partyDataset - Dataset de entidades do LMS](#Datasetsinternos-partyDataset-DatasetdeentidadesdoLMS)\n - 1.1.27 [classResponsiblesDataset - Dataset de responsáveis por turmas](#Datasetsinternos-classResponsiblesDataset-Datasetderesponsáveisporturmas)\n - 1.1.28 [disciplineResponsiblesDataset - Dataset de responsáveis por disciplinas](#Datasetsinternos-disciplineResponsiblesDataset-Datasetderesponsáveispordisciplinas)\n - 1.2 [Datasets do Social](#Datasetsinternos-DatasetsdoSocial)\n - 1.2.1 [PostDataset - Dataset dos posts publicados](#Datasetsinternos-PostDataset-Datasetdospostspublicados)\n - 1.2.2 [PostObjectDataset - Dataset dos posts e seus respectivos objetos](#Datasetsinternos-PostObjectDataset-Datasetdospostseseusrespectivosobjetos)\n - 1.2.3 [CommentDataset - Dataset dos comentários realizados](#Datasetsinternos-CommentDataset-Datasetdoscomentáriosrealizados)\n - 1.2.4 [CommunityDataset - Dataset das comunidades](#Datasetsinternos-CommunityDataset-Datasetdascomunidades)\n - 1.2.5 [ParticipantDataset - Dataset dos participantes das comunidades](#Datasetsinternos-ParticipantDataset-Datasetdosparticipantesdascomunidades)\n - 1.2.6 [FollowerDataset - Dataset dos usuários que estão seguindo](#Datasetsinternos-FollowerDataset-Datasetdosusuáriosqueestãoseguindo)\n - 1.2.7 [FollowedDataset - Dataset dos usuários que são seguidos](#Datasetsinternos-FollowedDataset-Datasetdosusuáriosquesãoseguidos)\n - 1.3 [Datasets de Documentos](#Datasetsinternos-DatasetsdeDocumentos)\n - 1.3.1 [AccessLog - Log de acesso aos documentos](#Datasetsinternos-AccessLog-Logdeacessoaosdocumentos)\n - 1.3.2 [documentApprovalHistory - Histórico de aprovações do documento](#Datasetsinternos-documentApprovalHistory-Históricodeaprovaçõesdodocumento)\n - 1.3.3 [document - Lista todos os documentos e suas respectivas versões](#Datasetsinternos-document-Listatodososdocumentosesuasrespectivasversões)\n - 1.3.4 [allocatedDocument - Documentos em check-out](#Datasetsinternos-allocatedDocument-Documentosemcheck-out)\n - 1.3.5 [customFields - Campos customizados dos documentos](#Datasetsinternos-customFields-Camposcustomizadosdosdocumentos)\n - 1.3.6 [destinationArea - Área dos documentos](#Datasetsinternos-destinationArea-Áreadosdocumentos)\n - 1.3.7 [documentSecurityConfig - Segurança dos documentos](#Datasetsinternos-documentSecurityConfig-Segurançadosdocumentos)\n - 1.3.8 [knowledge - Conhecimento dos documentos](#Datasetsinternos-knowledge-Conhecimentodosdocumentos)\n - 1.3.9 [topic - Assuntos dos documentos](#Datasetsinternos-topic-Assuntosdosdocumentos)\n - 1.4 [Datasets de Processos](#Datasetsinternos-DatasetsdeProcessos)\n - 1.4.1 [processHistory - Histórico de solicitações workflow](#Datasetsinternos-processHistory-Históricodesolicitaçõesworkflow)\n - 1.4.2 [processTask - Tarefas das solicitações de processos workflow](#Datasetsinternos-processTask-Tarefasdassolicitaçõesdeprocessosworkflow)\n - 1.4.3 [processState - Atividades do processo](#Datasetsinternos-processState-Atividadesdoprocesso)\n - 1.4.4 [workflowProcess - Solicitações de processos](#Datasetsinternos-workflowProcess-Solicitaçõesdeprocessos)\n - 1.4.5 [advancedProcessProperties - Propriedades Avançadas](#Datasetsinternos-advancedProcessProperties-PropriedadesAvançadas)\n - 1.4.6 [businessPeriod -Cadastro de Expediente](#Datasetsinternos-businessPeriod-CadastrodeExpediente)\n - 1.4.7 [globalCalendar - Cadastro de feriados](#Datasetsinternos-globalCalendar-Cadastrodeferiados)\n - 1.4.8 [holiday - Cadastro de feriados](#Datasetsinternos-holiday-Cadastrodeferiados)\n - 1.4.9 [processAttachment - Cadastro de anexos em solicitações](#Datasetsinternos-processAttachment-Cadastrodeanexosemsolicitações)\n - 1.4.10 [processDefinition - Cadastro de processos](#Datasetsinternos-processDefinition-Cadastrodeprocessos)\n - 1.4.11 [processDefinitionVersion - Cadastro de versões de processos](#Datasetsinternos-processDefinitionVersion-Cadastrodeversõesdeprocessos)\n - 1.4.12 [workflowColleagueRole - Listagem de usuários por papéis](#Datasetsinternos-workflowColleagueRole-Listagemdeusuáriosporpapéis)\n - 1.4.13 [workflowRole - Cadastro de papéis](#Datasetsinternos-workflowRole-Cadastrodepapéis)\n - 1.4.14 [attributionMecanism - Mecanismos de Atribuição](#Datasetsinternos-attributionMecanism-MecanismosdeAtribuição)\n - 1.4.15 [FLUIGADHOC - Dados de solicitações Adhoc/Listar Tarefas](#Datasetsinternos-FLUIGADHOC-DadosdesolicitaçõesAdhoc/ListarTarefas)\n - 1.4.16 [FLUIGADHOCPROCESS - Dados das atividades em solicitações Adhoc/Listar Tarefas](#Datasetsinternos-FLUIGADHOCPROCESS-DadosdasatividadesemsolicitaçõesAdhoc/ListarTarefas)\n - 1.5 [Datasets de Arquitetura](#Datasetsinternos-DatasetsdeArquitetura)\n - 1.5.1 [colleague - Usuários da plataforma](#Datasetsinternos-colleague-Usuáriosdaplataforma)\n - 1.5.2 [colleagueGroup - Vinculo dos Usuários aos Grupos](#Datasetsinternos-colleagueGroup-VinculodosUsuáriosaosGrupos)\n - 1.5.3 [group - Grupos de usuários](#Datasetsinternos-group-Gruposdeusuários)\n\n# Objetivo\n\n---\n\nO objetivo deste documento é descrever a utilização de datasets internos da plataforma, mostrar seus campos e respectivos detalhes, disponibilizando exemplos de utilização de cada dataset.\n\nDica!\n\nA partir da **[atualização Lake 1.7.0-200714](https://tdn.totvs.com/x/SGHoI#Atualizações(1.7.0)-200714)** os datasets internos passam a ter controle de permissionamento pelo Painel de controle. Saiba mais na documentação de [Recursos de permissão em APIs e Webservices](https://tdn.totvs.com/pages/viewpage.action?pageId=547233188) para mais detalhes." }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n## Datasets de Aprendizado\n\n---\n\n### *catalogItemDataset* - Catálogo de Aprendizado\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset de catálogo de itens de aprendizado permite consultar os itens do catálogo do tipo Treinamento, Trilha, Pasta ou Link.\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| id | ID do registro | 2007 |\n| parentItemId | ID do item pai | 703 |\n| code | Sigla | \"bancodedados\" |\n| name | Nome | \"Banco de Dados\" |\n| status | Status | *AVAILABLE*, *OBSOLETE**, CLOSING* ou *ARCHIVED* |\n| author | Autor | \"Marcelo Rodrigo\" |\n| cost | Custo | 5 |\n| workload | Carga Horária (em minutos) | 91 |\n| preExam | ID do Pré Exame | 93 |\n| posExam | ID do Pós Exame | 77 |\n| reaction | ID da Avaliação de Reação | 121 |\n| image | Imagem | \"database.png\" |\n| type | Tipo do Item de Catálogo | *com.totvs.elearning.core.catalog.Folder* ou *com.totvs.elearning.core.catalog.Link* ou *com.totvs.elearning.core.catalog.Track* ou *com.totvs.elearning.core.catalog.Training* |\n\n#### Treinamentos associados a uma trilha\n\nSe você deseja localizar treinamentos que estejam associados a uma trilha, você pode usar a constraint idParentTrack para a sua pesquisa.\n\nExemplo: localizando os treinamentos que fazem parte a trilha com o ID de registro 357:\n\n```\nvar constraintOne = DatasetFactory.createConstraint(\"idParentTrack\", \"357\", \"357\", ConstraintType.MUST);\nvar constraints = new Array(constraintOne);\nvar datasetValues = DatasetFactory.getDataset(\"catalogItemDataset\", null, constraints, null);\n```\n\n*Saiba mais [como acessar datasets](http://tdn.totvs.com/display/fluig/Desenvolvimento+de+Datasets#DesenvolvimentodeDatasets-AcessandoumDataset).*\n\n### *disciplineItemDataset* - Catálogo de Disciplinas" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset de catálogo de disciplinas permite consultar os itens do catálogo de disciplinas do tipo Disciplina, Pasta ou Link. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| id | ID do registro | 197 |\n| parentItemId | ID do item pai | 53 |\n| code | Sigla | \"sociologia\" |\n| name | Nome | \"Sociologia Aplicada\" |\n| minimumScoreApprove | Pontuação mínima para aprovação | 75 |\n| type | Tipo do Item de Catálogo | *com.totvs.elearning.core.discipline.Discipline* ou *com.totvs.elearning.core.discipline.DisciplineCatalogItem* ou *com.totvs.elearning.core.discipline.LinkDiscipline* ou *com.totvs.elearning.core.discipline.FolderDiscipline* |\n| workload | Carga Horária (em minutos) | 61 |\n| nameCoordinator | Nome do Coordenador | \"Marcelo\" |\n| lastnameCoordinator | Sobrenome do Coordenador | \"Rodrigo\" |\n| image | Imagem | \"database.png\" |\n\n### *enrollmentDataset* - Matrículas" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset de matrículas permite consultar as matrículas realizadas na área de aprendizado do TOTVS Fluig Plataforma. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| id | ID do registro | 2003 |\n| nameUser | Nome do Usuário | \"Marcelo\" |\n| lastNameUser | Sobrenome do Usuário | \"Rodrigo\" |\n| userfluigId | ID do usuário no TOTVS Fluig Plataforma | 33 |\n| status | [Status da matrícula](https://tdn.totvs.com/pages/viewpage.action?pageId=161350218) | *ENROLLED*, *STARTED, FINISHED, CANCELLED* ou *BLOCKED* |\n| finalStatus | [Status final da matrícula](https://tdn.totvs.com/pages/viewpage.action?pageId=161350218) | *SUCCESSFUL\\_POS\\_TEST, SUCCESSFUL\\_PRE\\_TEST, SUCCESSFUL\\_SCORM, UNSUCCESSFUL\\_POS\\_TEST, UNSUCCESSFUL\\_PRE\\_TEST, UNSUCCESSFUL\\_SCORM, UNSUCCESSFUL\\_EXPIRED, CANCELLED, SUCCESSFUL, UNSUCCESSFUL* ou *WITHOUT\\_ACCESS* |\n| score | Pontuação | 97.00 |\n| enrollmentRequestId | ID da requisição | 91 |\n| dateEnrollment | Data da Matrícula | 2015-06-11T17:05:08.011-03:00 |\n| dateConclusion | Data de Conclusão | 2015-07-14T18:06:09.012-03:00 |\n\n#### Status das Matrículas\n\nUm pouco mais sobre o **status** das matrículas:\n\n| Status | Descritivo |\n| --- | --- |\n| ENROLLED | Estado inicial da matrícula, atribuída no momento que a requisição é aprovada e a respectiva matrícula gerada. |\n| STARTED | Estado que inidica que o usuário iniciou o treinamento / trilha / turma |\n| FINISHED | Estado que indica que o usuário finalizou o treinamento / trilha / turma |\n| CANCELLED | Estado que indica o cancelamento da matrícula |\n| BLOCKED | Estado que indica o bloqueio da matrícula |\n\n#### Status final das Matrículas" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\nUm pouco mais sobre o **status final** das matrículas:\n\n| Status | Descritivo |\n| --- | --- |\n| SUCCESSFUL\\_POS\\_TEST | Estado que indica matrícula concluída com êxito no pós-teste |\n| SUCCESSFUL\\_PRE\\_TEST | Estado que indica matrícula concluída com êxito no pré-teste, não necessitando do restante do treinamento |\n| SUCCESSFUL\\_SCORM | Estado que indica matrícula concluída com êxito em conteúdo SCORM selecionado como critério de aprovação |\n| UNSUCCESSFUL\\_POS\\_TEST | Estado que indica matrícula não obteve êxito na conclusão do pós-teste |\n| UNSUCCESSFUL\\_PRE\\_TEST | Estado que indica matrícula não obteve êxito na conclusão do pré-teste |\n| UNSUCCESSFUL\\_SCORM | Estado que indica matrícula não obteve êxito na conclusão de um conteúdo SCORM selecionado como critério de aprovação |\n| UNSUCCESSFUL\\_EXPIRED | Estado que indica matrícula não obteve êxito na conclusão pois expirou |\n| CANCELLED | Estado que indica matrícula cancelada |\n| SUCCESSFUL | Estado que indica matrícula concluída com êxito em treinamento com uma das seguintes situações: - - Sem pré-teste; - Sem pós-teste; - Em parte de uma turma |\n| UNSUCCESSFUL | Estado que indica matrícula não obteve êxito em treinamento com uma das seguintes situações: - - Sem pré-teste; - Sem pós-teste; - Em parte de uma turma |\n| WITHOUT\\_ACCESS | Estado que indica usuário matriculado em turma ou treinamento, porém sua matrícula expirou sem registro de acesso |\n\n### *enrollmentRequestDataset* - Requisições de Matrículas" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset de requisição de matrículas permite consultar as requisições de matrículas realizadas na área de aprendizado do TOTVS Fluig Plataforma. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| id | ID do Registro | 1999 |\n| classId | ID da Turma | 237 |\n| catalogItemId | ID da Trilha / Treinamento | 561 |\n| enrollmentId | ID da Matrícula | 739 |\n| itemType | Tipo de Matrícula | *NormalClass* ou *Track/Training* |\n| userRequestingId | ID Usuário Requisitante | 571 |\n| userApproverId | ID Usuário Aprovador | 13 |\n| userfluigId | ID do usuário matriculado no TOTVS Fluig Plataforma | 339 |\n| dateRequest | Data da Requisição | 2015-06-11T17:05:08.011-03:00 |\n| status | Status da Requisição | *STANDBY, APPROVED, REPROVED* ou *CANCELLED* |\n\n### ***enrollmentTopicDataset*** - Execuções em Tópicos" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.4 ou superior**\n\nO dataset de execuções em tópicos permite consultar os tópicos executados pelo usuário matriculado. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| topicId | ID do tópico executado | 20159 |\n| topicName | Nome do tópico | \"Tópico Inicial\" |\n| expired | Indica se a execução do tópico já está expirada | true |\n| startDate | Data de inicio da execução do tópico | 2015-08-14T15:09:13.819-03:00 |\n| completionDate | Data de conclusão do tópico | 2015-08-16T11:21:37.001-03:00 |\n| completed | indica se está executado | *true* |\n| topicScoreApprove | indica a pontuação para aprovação no tópico | 70 |\n| score | Pontuação obtida no tópico | 95 |\n| partialScore | indica a pontuação parcial antes da conclusão do tópico | 60 |\n| topicWeight | Peso do tópico | 75 |\n| status | Status da execução do tópico | NOT\\_VIEWED, ACTIVE, SUCCESSFUL\\_FINISHED ou UNSUCCESSFUL\\_FINISHED |\n| enrollmentId | Identificador da matrícula | 5123 |\n| userId | Identificador do usuário | 37 |\n| normalClassId | Identificação da turma que o tópico pertence | 4129 |\n\n##### Tipo de status de Execução do Tópico\n\n| Status | Descritivo |\n| --- | --- |\n| NOT\\_VIEWED | Não visualizado |\n| ACTIVE | Ativo |\n| SUCCESSFUL\\_FINISHED | Finalizado com sucesso |\n| UNSUCCESSFUL\\_FINISHED | Finalizado sem sucesso |\n\n### ***enrollmentTopicItemDataset*** - Execuções em Itens de Tópicos" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.4 ou superior**\n\nO dataset de execuções em itens de tópico permite consultar os itens de tópico executados pelo usuário matriculado. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| enrollmentTopicItemId | Id da execução do item de tópico | 222 |\n| topicId | Id do tópico a que o item pertence | 556 |\n| topicItemId | Id do item de tópico | 487 |\n| enrollmentTopicItemType | Tipo de execução de item de tópico | com.totvs.elearning.core.discipline.ActivityTopicItem com.totvs.elearning.core.discipline.ContentTopicItem com.totvs.elearning.core.discipline.DetachedTopicItem com.totvs.elearning.core.discipline.EnrollableTopicItem com.totvs.elearning.core.discipline.ExamTopicItem com.totvs.elearning.core.discipline.ForumTopicItem com.totvs.elearning.core.discipline.UrlTopicItem |\n| name | Nome do item de tópico | \"Atividade escolar\" |\n| mandatory | Indica se a execução do item de tópico é obrigatória dentro do tópico | true |\n| weight | Peso do item de tópico | 2 |\n| scoreType | Tipo de pontuação do item de tópico | AUTOMATIC MANUAL SCORM EXTERNAL NO\\_SCORE ACTIVITY |\n| score | Pontuação atual na execução do item de tópico | 65 |\n| displayTimestamp | Data e hora da visualização do item de tópico | 2015-08-14T15:09:13.819-03:00 |\n| enrollmentId | Id da matrícula a que o item de tópico está relacionado | 4747 |\n| userId | Id do usuário que está executando o item de tópico | 289 |\n| normalClassId | Id da turma a que o item de tópico está relacionado | 655 |\n\n##### Tipos de Item de Tópico" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n| Status | Descritivo |\n| --- | --- |\n| com.totvs.elearning.core.discipline.ActivityTopicItem | Item de Tópico do tipo Atividade Extraclasse |\n| com.totvs.elearning.core.discipline.ContentTopicItem | Item de Tópico do tipo Conteúdo |\n| com.totvs.elearning.core.discipline.DetachedTopicItem | Item de Tópico do tipo Avulso |\n| com.totvs.elearning.core.discipline.EnrollableTopicItem | Item de Tópico do tipo Treinamento/Trilha |\n| com.totvs.elearning.core.discipline.ExamTopicItem | Item de Tópico do tipo Avaliação |\n| com.totvs.elearning.core.discipline.ForumTopicItem | Item de Tópico do tipo Tópico de Fórum |\n| com.totvs.elearning.core.discipline.UrlTopicItem | Item de Tópico do tipo URL |\n\n##### Tipos de pontuação no Item de Tópico\n\n| Status | Descritivo |\n| --- | --- |\n| AUTOMATIC | Pontuação gerada automaticamente ao acessar Item do Tópico. |\n| MANUAL | Pontuação informada pelo administrador. |\n| SCORM | Pontuação utilizada para sobrescrever a do SCORM. |\n| EXTERNAL | Pontuação enviada pelo sistema externo |\n| NO\\_SCORE | Item que não vale nota no tópico. |\n| ACTIVITY | Pontuação decorrente da entrega de atividade. |\n\n### *topicDataset* - Tópicos" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset de tópicos permite consultar tópicos disponíveis na área de aprendizado do TOTVS Fluig Plataforma. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| id | ID do Registro | 10615 |\n| name | Nome | \"Tópico Inicial\" |\n| estimatedTime | Tempo estimado para finalização (em dias) | 17 |\n| weight | Peso | 3 |\n| scoreApprove | Pontuação para aprovação | 75.00 |\n| disciplineClass\\_id | ID da Turma | 271 |\n| startTopicType | [Tipo de Inicialização](https://tdn.totvs.com/pages/viewpage.action?pageId=161350218) | *NO\\_RULES, AFTER\\_REQUIREMENTS\\_RELEASE, DAYS\\_AFTER\\_REQUIREMENTS\\_RELEASE,* *DAYS\\_AFTER\\_ENROLLMENT\\_RELEASE* ou *MANUAL\\_RELEASE* |\n| noFinishMinimumScore | Permite finalizar sem atingir pontuação mínima | *true* ou *false* |\n| status | Status | *ACTIVE* ou *INACTIVE* |\n\n##### Tipo de inicialização de tópicos\n\nUm pouco mais sobre o **Tipo de Iniciação** de um tópico:\n\n| Status | Descritivo |\n| --- | --- |\n| NO\\_RULES | Inicialização sem regras, sempre liberado. |\n| AFTER\\_REQUIREMENTS\\_RELEASE | Liberação após a conclução dos pré-requisitos. |\n| DAYS\\_AFTER\\_REQUIREMENTS\\_RELEASE | Liberação após *xx dias* após conclusão dos pré-requisitos. |\n| DAYS\\_AFTER\\_ENROLLMENT\\_RELEASE | Liberação após *xx dias* após a matrícula. |\n| MANUAL\\_RELEASE | Liberação manual. |\n\n### *topicItemDataset* - Itens de Tópicos" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset de itens de tópicos permite consultar itens de tópicos disponíveis na área de aprendizado do TOTVS Fluig Plataforma. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| id | ID do Registro | 9321 |\n| type | Tipo | *\"URL\", \"Avaliação\", \"Conteúdo\", \"Treinamento\"* ou *\"Atividade Extraclasse\"* |\n| topicId | ID do Tópico | 175 |\n| name | Nome | \"Atividade em Grupo Especial\" |\n| ordem | Ordem do Item | 7 |\n| weight | Peso | 1 |\n| mandatory | Obrigatório | *true* ou *false* |\n| scoreType | Tipo do Score | *AUTOMATIC, EXTERNAL, ACTIVITY ou MANUAL* |\n| status | Status | *ACTIVE* ou *INACTIVE* |\n\n### *assessmentDataset* - Avaliações" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n\\* **TOTVS Fluig Plataforma****1.5.1 ou superior**\n\nO dataset de avaliações permite consultar as avaliações disponíveis na área de aprendizado do TOTVS Fluig Plataforma. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| id | ID do Registro | 9321 |\n| name | Nome | \"Avaliação de Performance Anual\" |\n| creationDate | Data de Criação | 1981-06-11T18:05:13.017-03:00 |\n| monitored | Avaliação Monitorada | *true* ou *false* |\n| showScores | Exibe pontuação | **true** ou **false** |\n| showApprovalStatus | Exibe status de aprovação | *true* ou *false* |\n| showPerformanceOnQuestions | Exibe performance nas questões | *true* ou *false* |\n| showCorrectAnswers | Exibe alternativas corretas | **true** ou **false** |\n| showConclusionMessage | Exibe mensagem de conclusão | **true** ou **false** |\n| solicitFeedbackEvaluation | Solicita feedback | **true** ou **false** |\n| allowCommentsOnQuestions | Permite comentários nas questões | **true** ou **false** |\n| anonymous | Avaliação anônima | **true** ou **false** |\n| image | Imagem | \"performance-anual.png\" |\n| currentVersionId | ID da versão atual | 31139 |\n| editingVersionId | ID da versão em edição | 31141 |\n| enabled | Status | *ACTIVE* ou *INACTIVE* |\n\n### a*ssessmentVersionDataset* - Versões de Avaliações" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.2 ou superior**\n\nO dataset de versões de avaliações permite consultar as versões de uma avaliação gravadas na área de aprendizado do TOTVS Fluig Plataforma. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| assessmentId | ID da Avaliação | 1999 |\n| assessmentVersionId | ID da Versão da Avaliação | 237 |\n| requiredScore | Índice de Aprovação | 75.00 |\n| minExecutionTime | Tempo mínimo de execução | 1 |\n| maxExecutionTime | Tempo máximo de execução | 85 |\n| allowEssayQuestion | Permite questões dissertativas | *true* ou *false* |\n| status | Status | *CURRENT, OLD,* *EDITING* ou *ANNULLED* |\n\n**Exemplo**\n\n```\nvar assessmentVersions = DatasetFactory.getDataset(\"assessmentVersionDataset\", null, null, null);\n```\n\n### *disciplineClassDataset* - Turmas e Turmas Modelo" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.2 ou superior**\n\nO dataset de Turmas permite consultar Turmas e Turmas Modelo disponíveis na área de aprendizado do TOTVS Fluig Plataforma. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| id | ID do Registro | 3297 |\n| type | Tipo da Turma | *com.totvs.elearning.core.discipline.NormalClass* ou *com.totvs.elearning.core.discipline.TemplateClass* *NormalClass* = Turma *TemplateClass* = Turma Modelo |\n| name | Nome | \"Administração 2015\" |\n| enrollmentInitialDate | Data inicial de matrícula | 2015-08-14T12:00:00-03:00 |\n| enrollmentFinalDate | Data final de matrícula | 2015-08-20T21:00:00-03:00 |\n| classInitialDate | Data inicial da turma | 2015-08-21T19:00:00-03:00 |\n| classFinalDate | Data final da turma | 2015-08-29T22:00:00-03:00 |\n| cost | Custo | 91 |\n| reactionId | ID avaliação de reação | 7513 |\n\n**Exemplo - Somente Turmas**\n\n```\nvar onlyNormalClass = DatasetFactory.createConstraint(\"type\", \"com.totvs.elearning.core.discipline.NormalClass\", \"com.totvs.elearning.core.discipline.NormalClass\", ConstraintType.MUST);\nvar constraints = new Array(onlyNormalClass);\nvar normalClasses = DatasetFactory.getDataset(\"catalogItemDataset\", null, onlyNormalClass, null);\n```\n\n### *partyScheduledDataset* - Usuários agendados em avaliações" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.2 ou superior**\n\nO *dataset* de agendados permite consultar as informações de quais são as Turmas, Disciplinas, Grupos ou Usuários agendados para executar avaliações.\n\nAgendamento externo por email\n\nPara consultar agendamentos externos feitos por emails, utilize o [emailScheduledDataset](https://tdn.totvs.com/pages/viewpage.action?pageId=161350218)\n\nAcompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| assessmentId | ID da avaliação | 525 |\n| type | Tipo do item agendado | *com.totvs.elearning.core.party.PartyClassImpersonator* *com.totvs.elearning.core.party.Group* *com.totvs.elearning.core.party.PartyEveryone* *com.totvs.elearning.core.party.PartyDisciplineImpersonator* *com.totvs.elearning.core.party.User* *PartyClassImpersonator* = uma turma *Group* = grupo de usuários *PartyEveryone* = todos os usuários *PartyDisciplineImpersonator* = disciplina *User* = usuário |\n| partyId | Id do item agendado | 325 |\n| partyName | Nome do item agendado | \"Dirceu Silva\" |\n\n**Exemplo**\n\n```\nvar usersScheduled = DatasetFactory.getDataset(\"partyScheduledDataset\", null, null, null);\n```\n\n### *emailScheduledDataset* - Emails agendados em avaliações\n\n**\\* TOTVS Fluig Plataforma 1.5.4 ou superior**\n\nO *dataset* de agendados permite consultar as informações de emails que foram agendados para uma avaliação.\n\nAgendamento a usuários\n\nPara consultar agendamentos feitos a usuários cadastrados, utilize o [partyScheduledDataset](https://tdn.totvs.com/pages/viewpage.action?pageId=161350218)\n\nAcompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| assessmentId | ID da avaliação | 28021985 |\n| email | Email do agendado | [john.connor@fluig.com](mailto:john.connor@fluig.com) |\n| token | Token do agendado | 525A5C03E4Cb97F0E42A0AE1B50EDB80 |\n\n**Exemplo**\n\n```\nvar emailsScheduled = DatasetFactory.getDataset(\"emailScheduledDataset\", null, null, null);\n```" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n### *assessmentScheduleDataset* - Agendamento de avaliações\n\n**\\* TOTVS Fluig Plataforma 1.5.2 ou superior**\n\nO *dataset* de agendamento permite consultar as informações referentes aos agendamentos realizados . Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| Id | ID do agendamento | 626 |\n| assessmentId | ID da avaliação | 619 |\n| assessmentName | Nome da avaliação | \"Conceitos básicos\" |\n| description | Descrição da avaliação | \"HCT\" |\n| initialDate | Data e hora inicial do agendamento | 2015-04-14T21:00:00-03:00 |\n| finalDate | Data e hora final do agendamento | 2016-01-21T21:00:00-02:00 |\n| status | *Status* do agendamento | CANCELLED, SCHEDULED, DONE |\n\n**Exemplo**\n\n```\nvar scheduleds = DatasetFactory.getDataset(\"assessmentScheduleDataset \", null, null, null);\n```\n\n```\n\n```\n\n### *assessmentApplicationGenericDataset*- Execução de avaliações" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.2 ou superior**\n\nO *dataset* de execução de avaliações permite consultar as informações referentes às execuções de avaliações. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| assessmentId | ID da avaliação | 626 |\n| assessmentName | Nome da avaliação | \"Conceitos básicos\" |\n| userId | ID do usuário | 28 |\n| userName | Nome do usuário que executou a avaliação | \"Dirceu Silva\" |\n| finalScore | Nota final na avaliação | 100.00 |\n| status | *Status* da avaliação | STARTED, FINISHED, PENDING, CANCELLED |\n| approved | Se o usuário foi aprovado na avaliação | *true*, *false* |\n| userEmail | Para agendamentos de avaliação por email | augusto@suaempresa.com |\n| startDate | Data de início da execução da avaliação | 2015-10-06T11:26:56.438-03:00 |\n| finishDate | Data de final da execução da avaliação | 2015-10-06T12:26:56.438-03:00 |\n| requiredScore | Pontuação mínima para aprovação na avaliação | 70.00 |\n| assessmentApplicationId | Id da aplicação da avaliação | 978 |\n\n**Exemplo**\n\n```\nvar applications = DatasetFactory.getDataset(\"assessmentApplicationGenericDataset\", null, null, null);\n```\n\n### *assessmentApplicationCatalogPreExamDataset*- Execução de avaliações de pré-teste" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.3 ou superior**\n\nO *dataset* de execução de avaliações de pré-teste permite consultar as informações referentes às execuções de avaliações em pré-testes. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| enrollmentId | ID da matrícula | 626 |\n| learningId | ID do ítem matriculado | 450 |\n| learningType | Tipo do ítem matriculado (trilha ou treinamento) | *com.totvs.elearning.core.catalog.Training* ou *com.totvs.elearning.core.catalog.Track* *Training* = Treinamento *Track* = Trilha |\n| preExamId | ID da versão da avaliação de pré-teste | 1564 |\n| userId | ID do usuário | 1404 |\n| userName | Nome do usuário | \"Dirceu Silva\" |\n| assessmentApplicationId | ID da execução da avaliação | *1323* |\n| assessmentName | Nome da avaliação | \"Prova - Conhecimentos Gerais I\" |\n| requiredScore | *Score* mínimo | 70.00 |\n| requiredAllQuestions | Necessário responder todas as questões | *true*, *false* |\n| startedTimeStamp | Hora de início | 2015-10-06T11:26:56.438-03:00 |\n| finishedTimeStamp | Hora de fim | 2015-10-13T13:12:23.259-03:00 |\n| finalScore | *Score* final | 80.00 |\n| status | *Status* | STARTED, FINISHED, PENDING, CANCELLED |\n| approved | Aprovado | *true*, *false* |\n\n**Exemplo**\n\n```\nvar applications = DatasetFactory.getDataset(\"assessmentApplicationCatalogPreExamDataset\", null, null, null);\n```\n\n#### Todas as versões da avaliação" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\nSe você deseja visualizar todas as versões da avaliação, você pode usar a constraint allVersions para a sua pesquisa.\n\nExemplo: localizando as aplicações de todas as versões da avaliação:\n\n```\nvar constraintOne = DatasetFactory.createConstraint(\"allversions\", \"true\", \"true\", ConstraintType.MUST);\nvar constraints = new Array(constraintOne);\nvar datasetValues = DatasetFactory.getDataset(\"assessmentApplicationCatalogPreExamDataset\", null, constraints, null);\n```\n\n*assessmentApplicationCatalogPosExamDataset*- Execução de avaliações de pós-teste\n\n**\\* TOTVS Fluig Plataforma 1.5.3 ou superior**\n\nO *dataset* de execução de avaliações de pós-teste permite consultar as informações referentes às execuções de avaliações em pós-testes. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| enrollmentId | ID da matrícula | 626 |\n| learningId | ID do ítem matriculado | 450 |\n| learningType | Tipo do ítem matriculado (trilha ou treinamento) | *com.totvs.elearning.core.catalog.Training* ou *com.totvs.elearning.core.catalog.Track* *Training* = Treinamento *Track* = Trilha |\n| posExamId | ID da versão da avaliação de pós-teste | 1564 |\n| userId | ID do usuário | 1404 |\n| userName | Nome do usuário | \"Dirceu Silva\" |\n| assessmentApplicationId | ID da execução da avaliação | *1323* |\n| assessmentName | Nome da avaliação | \"Prova - Conhecimentos Gerais I\" |\n| requiredScore | *Score* mínimo | 70.00 |\n| requiredAllQuestions | Necessário responder todas as questões | *true*, *false* |\n| startedTimeStamp | Hora de início | 2015-10-06T11:26:56.438-03:00 |\n| finishedTimeStamp | Hora de fim | 2015-10-13T13:12:23.259-03:00 |\n| finalScore | *Score* final | 80.00 |\n| status | *Status* | STARTED, FINISHED, PENDING, CANCELLED |\n| approved | Aprovado | *true*, *false* |\n\n**Exemplo**\n\n```\nvar applications = DatasetFactory.getDataset(\"assessmentApplicationCatalogPosExamDataset\", null, null, null);\n```\n\n#### Todas as versões da avaliação" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\nSe você deseja visualizar todas as versões da avaliação, você pode usar a constraint allVersions para a sua pesquisa.\n\nExemplo: localizando as aplicações de todas as versões da avaliação:\n\n```\nvar constraintOne = DatasetFactory.createConstraint(\"allversions\", \"true\", \"true\", ConstraintType.MUST);\nvar constraints = new Array(constraintOne);\nvar datasetValues = DatasetFactory.getDataset(\"assessmentApplicationCatalogPosExamDataset\", null, constraints, null);\n```\n\n### *assessmentApplicationCatalogReactionExamDataset*- Execução de avaliações de reação\n\n**\\* TOTVS Fluig Plataforma 1.5.3 ou superior**\n\nO *dataset* de execução de avaliações de reação permite consultar as informações referentes às execuções de avaliações de reação. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| enrollmentId | ID da matrícula | 626 |\n| learningId | ID do ítem matriculado (trilha ou treinamento) | 450 |\n| learningType | Tipo do ítem matriculado | *com.totvs.elearning.core.catalog.Training* ou *com.totvs.elearning.core.catalog.Track* *Training* = Treinamento *Track* = Trilha |\n| reactionId | ID da versão da avaliação de reação | 1564 |\n| userId | ID do usuário | 1404 |\n| userName | Nome do usuário | \"Dirceu Silva\" |\n| assessmentApplicationId | ID da execução da avaliação | *1323* |\n| assessmentName | Nome da avaliação | \"Prova - Conhecimentos Gerais I\" |\n| requiredScore | *Score* mínimo | 70.00 |\n| requiredAllQuestions | Necessário responder todas as questões | *true*, *false* |\n| startedTimeStamp | Hora de início | 2015-10-06T11:26:56.438-03:00 |\n| finishedTimeStamp | Hora de fim | 2015-10-13T13:12:23.259-03:00 |\n| finalScore | *Score* final | 80.00 |\n| status | *Status* | STARTED, FINISHED, PENDING, CANCELLED |\n| approved | Aprovado | *true*, *false* |\n\n**Exemplo**\n\n```\nvar applications = DatasetFactory.getDataset(\"assessmentApplicationCatalogReactionExamDataset\", null, null, null);\n```" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n#### Todas as versões da avaliação\n\nSe você deseja visualizar todas as versões da avaliação, você pode usar a constraint allVersions para a sua pesquisa.\n\nExemplo: localizando as aplicações de todas as versões da avaliação:\n\n```\nvar constraintOne = DatasetFactory.createConstraint(\"allversions\", \"true\", \"true\", ConstraintType.MUST);\nvar constraints = new Array(constraintOne);\nvar datasetValues = DatasetFactory.getDataset(\"assessmentApplicationCatalogReactionExamDataset\", null, constraints, null);\n```\n\n### *contentLogDataset*- Execução de conteúdos\n\n**\\* TOTVS Fluig Plataforma 1.5.3 ou superior**\n\nO *dataset* de execução de conteúdos permite consultar as informações referentes às execuções de conteúdos em treinamentos e trilhas. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| enrollmentId | ID da matrícula | 626 |\n| learningId | ID do ítem matriculado (trilha ou treinamento) | 450 |\n| name | Nome do conteúdo | \"Conhecimentos Gerais\" |\n| description | Descrição do conteúdo | *com.totvs.elearning.core.catalog.Training* ou *com.totvs.elearning.core.catalog.Track* *Training* = Treinamento *Track* = Trilha |\n| keyword | Palavras chave | \"conteúdo geral treinamento\" |\n| displayTimeStamp | Hora em que foi acessado | 2015-10-06T11:29:14.044-03:00 |\n| userId | ID do usuário | *1323* |\n| userName | Nome do usuário | \"Dirceu Silva\" |\n\n**Exemplo**\n\n```\nvar contentLogs= DatasetFactory.getDataset(\"contentLogDataset\", null, null, null);\n```\n\n### *enrollmentProgressDetailByTrackDataset*- Detalhes de andamento de trilhas" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.3 ou superior**\n\nO *dataset* de detalhes de andamento de trilhas permite consultar as informações referentes à itens executados nas trilhas. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| enrollmentId | ID da matrícula | 626 |\n| userName | Nome do usuário | \"Dirceu Silva\" |\n| userId | ID do usuário | 458 |\n| status | [Status da matrícula](https://tdn.totvs.com/pages/viewpage.action?pageId=161350218) | *ENROLLED*, *STARTED, FINISHED, CANCELLED* ou *BLOCKED* |\n| finalStatus | [Status final da matrícula](https://tdn.totvs.com/pages/viewpage.action?pageId=161350218) | SUCCESSFUL\\_POS\\_TEST, SUCCESSFUL\\_PRE\\_TEST, SUCCESSFUL\\_SCORM, UNSUCCESSFUL\\_POS\\_TEST, UNSUCCESSFUL\\_PRE\\_TEST, UNSUCCESSFUL\\_SCORM, UNSUCCESSFUL\\_EXPIRED, CANCELLED, SUCCESSFUL, UNSUCCESSFUL ou WITHOUT\\_ACCESS |\n| score | Hora em que foi acessado | 80.00 |\n| enrollmentRequestId | ID do usuário | 1323 |\n| dateEnrollment | Data de matrícula | 2015-10-06T11:25:14.014-03:00 |\n| dateConclusion | Data de conclusão | 2015-10-06T11:29:14.044-03:00 |\n| learningId | ID do item matriculado | 455 |\n| learningType | Tipo do item matriculado | *com.totvs.elearning.core.catalog.Training* ou *com.totvs.elearning.core.catalog.Track* *Training* = Treinamento *Track* = Trilha |\n| trackParentId | ID da trilha pai do treinamento | 554 |\n| learningName | Nome do item matriculado | \"Atualidades I\" |\n\n**Exemplo**\n\n```\nvar results = DatasetFactory.getDataset(\"enrollmentProgressDetailByTrackDataset\", null, null, null);\n```\n\n### *enrollmentProgressDetailByTrainingDataset*- Detalhes de andamento de treinamentos" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.3 ou superior**\n\nO *dataset* de detalhes de andamento de treinamentos permite consultar as informações referentes à itens executados nos treinamentos. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| enrollmentId | ID da matrícula | 626 |\n| progressType | Tipo do item | *PRE\\_EXAM, POS\\_EXAM, REACTION* ou *CONTENT* *PRE\\_EXAM* = Pré Teste *POS\\_EXAM* = Pós Teste *REACTION* = Avaliação de Reação *CONTENT* = Conteúdo |\n| description | Descrição do item | \"Prova - Conhecimentos Gerais I\" |\n| startedTimeStamp | Data e hora de início do item | 2015-10-13T16:01:53.247-03:00 |\n| finishedTimeStamp | Data e hora de fim do item | 2015-10-13T16:02:16.197-03:00 |\n| duration | Tempo de duração em minutos | 10 |\n| status | *Status* | STARTED, FINISHED, PENDING ou CANCELLED |\n| score | *Score* | 40.00 |\n\nObservação\n\nEste dataset **não suporta** as funções ***fields*** e ***limit***, por acumular informações de diversas tabelas. A **ordem** dos registros é **fixa**, sendo sempre por *enrollmentId*, lista todos os registros de: *Pré-testes, Conteúdos, Pós-teste e Avaliação de reação.*\n\n**Exemplo**\n\n```\nvar contentLogs= DatasetFactory.getDataset(\"enrollmentProgressDetailByTrainingDataset\", null, null, null);\n```\n\n*historySkillDataset* - Habilidades por Usuário\n\n**\\* TOTVS Fluig Plataforma 1.5.4 ou superior**\n\nO dataset de habilidades por usuários permite consultar as habilidades que o usuário obteve por meio de execução de trilhas/treinamentos e/ou participação em turmas.\n\nAcompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| skillId | ID da Habilidade | 122 |\n| skillName | Nome da Habilidade | \"Matemática Financeira\" |\n| skillPoints | Pontos que o usuário possui na Habilidade | 2.00 |\n| userId | ID do usuário | 555 |\n| userName | Nome do Usuário | \"André\" |\n| userLastName | Último nome do usuário | \"Felipe\" |" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n### assessmentAppQuestionDataset - Dataset de questões aplicadas em uma avaliação\n\n**\\* TOTVS Fluig Plataforma 1.5.6 ou superior**\n\nO dataset de questões aplicadas em uma avaliação permite consultar detalhes de questões utilizadas em cada execução de uma avaliação, assim como informações sobre a execução em si.\n\nAcompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| assessmentQuestionVersionId | A versão da questão utilizada na execução da avaliação | 1314 |\n| type | Tipo de questão | com.totvs.elearning.core.assessment.ObjectiveQuestion |\n| title | Título da questão | \"Questão objetiva 1\" |\n| topicTitle | Nome da pasta (tópico) em que a questão se encontra | root\\_topic |\n| difficulty | Dificuldade da questão | 3 |\n| totalPoints | Total de pontos obtidos nesta questão na execução da avaliação | 1.00 |\n| isCanceled | Se a versão utilizada na execução da avaliação estava cancelada | true, false |\n| assessmentApplicationId | Id da execução da avaliação | 1248 |\n| appBlockId | Id da aplicação do bloco na avaliação | 1235 |\n| userId | Executor da avaliação. Se vier em branco, a avaliação foi executada via e-mail (agendamento) | 208 |\n\n**Exemplo**\n\n```\nvar contentLogs= DatasetFactory.getDataset(\"assessmentAppQuestionDataset\", null, null, null);\n```\n\n### assessmentAppBlockDataset - Dataset de blocos em uma avaliação" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.6 ou superior**\n\nO dataset de blocos em uma avaliação permite consultar detalhes dos blocos de uma avaliação em cada uma de suas execuções, assim como informações sobre as execuções em si.\n\nAcompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| blockId | A versão do bloco | 1774 |\n| blockName | Nome do bloco | \"bloco 1\" |\n| weight | Peso | 3 |\n| minScore | Mínimo de acertos | 0 |\n| totalPoints | Total de acertos | 3 |\n| userId | Id do usuário que executou a avaliação | 107 |\n| appBlockId | Id da aplicação do bloco na avaliação | true, false |\n| assessmentApplicationId | Id da execução da avaliação | 1248 |\n\n**Exemplo**\n\n```\nvar contentLogs= DatasetFactory.getDataset(\"assessmentAppBlockDataset\", null, null, null);\n```\n\n### assessmentClassApplicationDataset - Dataset de execução de avaliações por turma" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.6 ou superior**\n\nO dataset de execuções de avaliações por turma permite consultar detalhes destas avaliações, como informações sobre a qual item de tópico ela pertence, o status de aprovação, etc.\n\nAcompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| userName | Nome do usuário que executou a avaliação | \"Cleiton Ferreira\" |\n| assessmentName | Nome da avaliação | \"Avaliação Final 1\" |\n| topicName | Nome do tópico | \"Tópico 1\" |\n| startDate | Data de início da execução da avaliação | 2016-01-18T12:51:09.108Z |\n| finishDate | Data de término da execução da avaliação | 2016-01-18T12:53:54.976Z |\n| requiredScore | Nota mínima para ser aprovado na avaliação | 50.00 |\n| finalScore | Nota obtida na avaliação | 77.22 |\n| approved | Se aprovado ou não | true, false |\n| status | Se a avaliação está terminada ou em andamento | STARTED, FINISHED, PENDING, CANCELLED |\n| classId | Id da turma | 2651 |\n| assessmentId | Id da avaliação | 3188 |\n| topicId | Id do tópico | 3033 |\n| assessmentApplicationId | Id da execução da avaliação | 1248 |\n\n**Exemplo**\n\n```\nvar contentLogs= DatasetFactory.getDataset(\"assessmentClassApplicationDataset\", null, null, null);\n```\n\n### assessmentApplicationByTrack - Dataset de execução de avaliações por trilha (contendo pré, pós, reação)" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.6 ou superior**\n\nO dataset de execuções de avaliações por trilha mostra detalhes da execução de avaliações por trilhas\n\nAcompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| userName | Nome do usuário que executou a avaliação | \"Alice Maia\" |\n| assessmentName | Nome da avaliação | \"Prova Final\" |\n| assessmentType | Tipo de avaliação | PRE\\_EXAM, POS\\_EXAM, REACTION |\n| startDate | Data de início da execução da avaliação | 2015-10-07T17:59:35.570-03:00 |\n| finishDate | Data de fim da execução da avaliação | 2015-10-07T17:59:59.339-03:00 |\n| requiredScore | Nota mínima para ser aprovado | 70.00 |\n| finalScore | Nota obtida na avaliação | 77.00 |\n| approved | Aprovado ou não | true, false |\n| assessmentAplicationId | Id da execução da avaliação | 1248 |\n| learningId | Id da trilha | 1234 |\n| learningType | Se é trilha ou treinamento. Funciona como um campo de controle para relatórios | com.totvs.elearning.core.catalog.Track |\n\n**Exemplo**\n\n```\nvar contentLogs= DatasetFactory.getDataset(\"assessmentApplicationByTrack\", null, null, null);\n```\n\n### assessmentApplicationByTraining - Dataset de execução de avaliações por treinamento (contendo pré teste, pós teste, avaliação de reação)" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.6 ou superior**\n\nO dataset de execuções de avaliações por treinamento mostra detalhes da execução de avaliações por treinamentos\n\nAcompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| userName | Nome do usuário que executou a avaliação | \"Alex Navarro\" |\n| assessmentName | Nome da avaliação | \"Prova experimental\" |\n| assessmentType | Tipo de avaliação | PRE\\_EXAM, POS\\_EXAM, REACTION |\n| startDate | Data de início da execução da avaliação | 2015-10-07T17:59:35.570-03:00 |\n| finishDate | Data de fim da execução da avaliação | 2015-10-07T17:59:59.339-03:00 |\n| requiredScore | Nota mínima para ser aprovado | 70.00 |\n| finalScore | Nota obtida na avaliação | 77.00 |\n| approved | Aprovado ou não | true, false |\n| assessmentAplicationId | Id da execução da avaliação | 1248 |\n| learningId | Id da trilha | 1234 |\n| learningType | Se é trilha ou treinamento. Funciona como um campo de controle para relatórios | com.totvs.elearning.core.catalog.Training |\n\n**Exemplo**\n\n```\nvar contentLogs= DatasetFactory.getDataset(\"assessmentApplicationByTraining\", null, null, null);\n```\n\n### partyDataset - Dataset de entidades do LMS" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.6 ou superior**\n\nEste dataset lista entidades LMS que são classificadas com Party.\n\nEle é utilizado por outros datasets para se obter o id de usuários(LMS), grupos(LMS), turmas, disciplinas, empresas ou por todos.\n\nAcompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| id | Id LMS | 104 |\n| fluigId | Id TOTVS Fluig Plataforma | 69033 |\n| name | primeiro nome | \"Pedro\" |\n| lastName | sobrenome | \"Back\" |\n| fullName | nome completo | \"Pedro Back\" |\n| login | login do usuário | \"pedroback\" |\n| email | e-mail do usuário | \"pedroback@mail.com\" |\n| partyType | tipo da entidade LMS | com.totvs.elearning.core.party.User, (Usuário) com.totvs.elearning.core.party.Group, (Grupo) com.totvs.elearning.core.party.PartyClassImpersonator, (Turma) com.totvs.elearning.core.party.PartyDisciplineImpersonator, (Disciplina) com.totvs.elearning.core.party.PartyEveryone, (Tudo) com.totvs.elearning.core.party.PartyTenantImpersonator (Empresa) |\n\n**Exemplo**\n\n```\nvar contentLogs= DatasetFactory.getDataset(\"partyDataset\", null, null, null);\n```\n\n### classResponsiblesDataset - Dataset de responsáveis por turmas\n\n**\\* TOTVS Fluig Plataforma 1.5.6 ou superior**\n\nEste dataset lista os responsáveis por turmas criadas no catálogo de disciplinas e turmas.\n\nAcompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| classId | Id da turma | 104 |\n| className | Nome da turma | \"Matemática - Matutino 01\" |\n| responsibleName | Nome completo do responsável | \"Jorge Batista\" |\n| responsibleId | Id do responsável | 78 |\n| responsibility | Responsabilidade | \"CORRECT\\_ACTIVITIES\" |\n| userId | Id do usuário | 46 |\n| userfluigId | Id do usuário no TOTVS Fluig Plataforma | 435 |\n| disciplineId | Id da disciplina | 216 |\n\n**Exemplo**\n\n```\nvar contentLogs= DatasetFactory.getDataset(\"classResponsiblesDataset\", null, null, null);\n```" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n### disciplineResponsiblesDataset - Dataset de responsáveis por disciplinas\n\n**\\* TOTVS Fluig Plataforma 1.5.6 ou superior**\n\nEste dataset lista os responsáveis por disciplinas criadas no catálogo de disciplinas e turmas.\n\nAcompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| disciplineId | Id da disciplina | 216 |\n| disciplineName | Nome da disciplina | \"Matemática\" |\n| responsibleName | Nome completo do responsável | \"Jorge Batista\" |\n| responsibleId | Id do responsável | 78 |\n| responsibility | Responsabilidade | \"CORRECT\\_ACTIVITIES\" |\n| userId | Id do usuário | 46 |\n| userfluigId | Id do usuário no TOTVS Fluig Plataforma | 435 |\n\n**Exemplo**\n\n```\nvar contentLogs= DatasetFactory.getDataset(\"disciplineResponsibleDatasetBusiness\", null, null, null);\n```\n\nImportante!\n\nA partir da atualização **[1.6.5-190219](http://tdn.totvs.com/pages/viewpage.action?pageId=442961412#Atualiza%C3%A7%C3%B5es(1.6.5)-190219)**, o **LMS** não faz mais parte da plataforma para **novas instalações**.\n\nMas, não se preocupe: se você adquiriu a plataforma com o **LMS incluso**, entre em contato com o [Suporte Fluig](https://suporte.fluig.com/) para que você consiga utiliza-lo normalmente – mesmo após a atualização **1.6.5-190219**. Se você não lembra se o LMS está incluso ou não no seu pacote, consulte sua proposta comercial ou entre em contato com o seu ESN.\n\n## Datasets do Social\n\n---\n\n### PostDataset - Dataset dos posts publicados" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n\\* fluig 1.3.0 ou superior\n\nEste dataset pode ser utilizado para fornecer os posts publicados pelos usuários. Acompanhe a seguir os detalhes dos campos disponíveis:\n\n| Coluna | Descritivo | Exemplo de Valor |\n| --- | --- | --- |\n| postId | Id do post | 3 |\n| creationDate | Data em que o post foi criado | 2015-08-05 10:49:05.0 |\n| lastUpdateDate | Data da última atualização do post | 2015-08-05 10:49:05.0 |\n| numberComments | Número de comentários do post | 2 |\n| numberDenouncemets | Número de denúncias do post | 1 |\n| numberLikes | Número de apoios do post | 2 |\n| numberShares | Número de compartilhamentos do post | 2 |\n| numberWatchers | Número de pessoas que acompanham o post | 2 |\n| isRemoved | Indicador se o post foi removido | 1 - true / 0 - false |\n| url | URL do post | \"/post/rh/153\" |\n| mentions | Número de menções do post | 3 |\n| link | Link contido no post | \"\" |\n| text | Texto do post | \"Bem vindos!\" |\n| customData | Dados customizados do post | {} |\n| type | Tipo do post | Publicação / Compartilhamento |\n| socialId | Id Social de quem realizou o post | 3 |\n| author | Login do autor do post | \"john\" |\n| authorName | Nome do autor do post | \"John Steel\" |\n| linkedObjectId | Id do objeto ligado ao post | 127 |\n| linkedObjectClass | Classe do objeto ligado ao post | \"com.totvs.technology.social.document.33\" |\n| linkedObjectDescription | Descrição do objeto ligado ao post | \"Dunas.jpg\" |\n\n### **PostObjectDataset - Dataset dos posts e seus respectivos objetos**" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n\\* fluig 1.6.2 ou superior\n\nEste dataset pode ser utilizado para fornecer os posts publicados pelos usuários e informações dos seus respectivos objetos. Acompanhe a seguir os detalhes dos campos disponíveis:\n\n| **Coluna** | **Descritivo** | **Exemplo de Valor** |\n| --- | --- | --- |\n| postId | Id do post | 3 |\n| id | Id do objeto | 1 |\n| url | Url de acesso ao objeto | /ecmnavigation?app\\_ecm\\_navigation\\_doc=6&app\\_ecm\\_navigation\\_docVersion=1000 |\n| description | Descrição do objeto | imagem.jpg |\n| customData | Dados customizados do objeto | {} |\n| creationDate | Data em que o objeto foi criado | 2015-08-05 10:49:05.0 |\n| lastUpdateDate | Data da última atualização do objeto | 2015-08-05 10:49:05.0 |\n| numberComments | Número de comentários do objeto | 2 |\n| numberDenouncemets | Número de denúncias do objeto | 1 |\n| numberLikes | Número de apoios do objeto | 2 |\n| numberShares | Número de compartilhamentos do objeto | 2 |\n| numberWatchers | Número de pessoas que acompanham o objeto | 2 |\n| text | Texto do objeto | Novo artigo |\n| authorAlias | Alias do autor do objeto | john |\n| authorName | Nome do autor do objeto | John Steel |\n\n### CommentDataset - Dataset dos comentários realizados" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n\\* fluig 1.3.0 ou superior\n\nEste dataset pode ser utilizado para fornecer os comentários realizados pelos usuários. Acompanhe a seguir os detalhes dos campos disponíveis:\n\n| Coluna | Descritivo | Exemplo de Valor |\n| --- | --- | --- |\n| commentId | Id do post | 3 |\n| creationDate | Data em que o comentário foi criado | 2015-08-05 10:49:05.0 |\n| lastUpdateDate | Data da última atualização do comentário | 2015-08-05 10:49:05.0 |\n| numberDenouncemets | Número de denúncias do comentário | 1 |\n| numberLikes | Número de apoios do comentário | 2 |\n| isRemoved | Indicador se o comentário foi removido | 1 - true / 0 - false |\n| url | URL do conteúdo onde foi realizado o comentário | \"/ecmnavigation?app\\_ecm\\_navigation\\_doc=182&app\\_ecm\\_navigation\\_docVersion=1000\" |\n| commentText | Texto do comentário | \"Boa inciativa!\" |\n| hasMentions | Indicador se existe menção no comentário | 1 - true / 0 - false |\n| link | Link contido no comentário | \"\" |\n| postId | Id Social onde o comentário foi realizado. Nos casos de post será o id do post, para os casos de documentos, vira o id social do documento | 3 |\n| socialId | Id Social de quem realizou o post | 4 |\n| author | Login do autor do comentário | \"john\" |\n| authorName | Nome do autor do comentário | \"John Steel\" |\n\n### CommunityDataset - Dataset das comunidades" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n\\* fluig 1.3.0 ou superior\n\nEste dataset pode ser utilizado para recuperar as comunidades. Acompanhe a seguir os detalhes dos campos disponíveis:\n\n| Coluna | Descritivo | Exemplo de Valor |\n| --- | --- | --- |\n| alias | Alias da comunidade | \"RH\" |\n| creationDate | Data em que o comentário foi criado | 2015-08-05 10:49:05.0 |\n| lastUpdateDate | Data da última atualização do comentário | 2015-08-05 10:49:05.0 |\n| name | Nome da comunidade | \"RH - Plantão\" |\n| description | Descrição da comunidade | \"O canal direto de informações entre a empresa e os funcionários.\" |\n| isApprovalRequired | Indicador se a comunidade precisa de aprovação para participar | True / False |\n| isPrivateContent | Indicador se a comunidade tem conteúdo privado | True / False |\n| isHidden | Indicador se a comunidade é oculta | True / False |\n| isActive | Indicador se a comunidade está ativa | True / False |\n| articleFolder | Id da pasta de artigos da comunidade | 12 |\n| formFolder | Id da pasta de formúlarios da comunidade | 45 |\n| photoFolder | Id da pasta de imagens da comunidade | 32 |\n| documentFolder | Id da pasta de documentos da comunidade | 10 |\n| videoFolder | Id da pasta de videos da comunidade | 9 |\n\n### ParticipantDataset - Dataset dos participantes das comunidades\n\n\\* fluig 1.3.0 ou superior\n\nEste dataset pode ser utilizado para fornecer os usuários que participam das comunidades. Acompanhe a seguir os detalhes dos campos disponíveis:\n\n| Coluna | Descritivo | Exemplo de Valor |\n| --- | --- | --- |\n| communityAlias | Alias da comunidade | \"RH\" |\n| participantAlias | Alias do participante da comunidade | \"john\" |\n| panticipantName | Nome do participante da comunidade | \"John Steel\" |\n| isAdministrator | Indicador se o participante é administrador da comunidade | 1 - true |\n| isModerator | Indicador se o participante é moderador da comunidade | 1 - true |\n\n### FollowerDataset - Dataset dos usuários que estão seguindo" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n\\* fluig 1.3.0 ou superior\n\nEste dataset pode ser utilizado para fornecer os usuários que seguem outros usuários. Acompanhe a seguir os detalhes dos campos disponíveis:\n\n| Coluna | Descritivo | Exemplo de Valor |\n| --- | --- | --- |\n| followerAlias | Alias do seguidor | \"john\" |\n| followedAlias | Alias do seguido | \"ana\" |\n| followerName | Nome do seguidor | \"John Steel\" |\n| followedName | Nome do seguido | \"Anna Smyth\" |\n\n### FollowedDataset - Dataset dos usuários que são seguidos\n\n\\* fluig 1.3.0 ou superior\n\nEste dataset pode ser utilizado para fornecer os usuários que são seguidos por outros usuários. Acompanhe a seguir os detalhes dos campos disponíveis:\n\n| Coluna | Descritivo | Exemplo de Valor |\n| --- | --- | --- |\n| followerAlias | Alias do seguidor | \"john\" |\n| followedAliad**\\*** | Alias do seguido | \"ana\" |\n| followerName | Nome do seguidor | \"John Steel\" |\n| followedName | Nome do seguido | \"Anna Smyth\" |\n\n**\\*Obs**:  O campo followedAliad está documento conforme o retorno do dataset\n\n## Datasets de Documentos\n\n---\n\n### *AccessLog* - *Log* de acesso aos documentos\n\nLista o *log* de acessos aos documentos registrados pela plataforma.\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **AccessLogPK.documentId** | Código do documento | 10903 |\n| **AccessLogPK.accessDate** | Data em que ocorreu o acesso | 2018-08-29 |\n| **AccessLogPK.colleagueId** | Matrícula do usuário | fernando.alves |\n| **AccessLogPK.companyId** | Código da empresa | 102 |\n\n### *documentApprovalHistory* - Histórico de aprovações do documento" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* Atualização 1.4.11 ou superior**\n\n| Coluna | Descritivo | Exemplo de Valor |\n| --- | --- | --- |\n| movementDate | Data de aprovação/reprovação do documento | 2015-04-22T00:00:00-03:00 |\n| movementTime | Hora de aprovação/reprovação do documento | 11:04:06 |\n| observation | Observação ao aprovar/rejeitar o documento | \"Comentário do colaborador\" |\n| colleagueId | Id do colaborador | 0000288 |\n| approvalMovementPK.companyId | Id da empresa | 0000001 |\n| approvalMovementPK.documentId | Id do documento | 10903 |\n| signed | Movimento foi assinado digitalmente | false |\n| approvalMovementPK.version | Versão do documento | 1000 |\n| analised \\* | Se o documento passou por uma aprovação/reprovação manual | true |\n| sendDate | Data em que o documento foi enviado para aprovação | 2015-04-22T00:00:00-03:00 |\n| approvalMovementPK.iterationSequence | Número de sequência da movimentação | 1 |\n| closeIteraction | Se é a última aprovação para que o documento seja publicado | true |\n| approvalMovementPK.levelId | Nível de aprovação | 2 |\n\nAnalised \\*\n\nEste item informa se o aprovador aceitou o item. \n**Exemplo:** Caso seja uma aprovação do tipo 'OU' de dois colaboradores, o colaborador que aprovou o documento terá este campo como **true,** já o segundo que até então não visualizou o documento para aprovar, terá este item como **false**.\n\n### *document* - Lista todos os documentos e suas respectivas versões" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* Atualização 1.0 ou superior**\n\n| **Coluna** | Descritivo | Exemplo de Valor |\n| --- | --- | --- |\n| **lastModifiedTime** | Data da última modificação no documento | 2015-08-14T15:09:13.819-03:00 |\n| **documentType** | Tipo do documento Fique ligado - 1 - Pasta - 2 - Documento normal - 3 - Documento externo - 4 - Formulário - 5 - Registro de formulário - 7 - Anexo Workflow - 8 - Novo conteúdo - 9 - Aplicativo - 10 - Relatório | 1 |\n| **parentDocumentId** | Número do documento pai Fique ligado O id 0 (zero) representa a pasta raíz | 0 |\n| **metaListRecordId** | Sequencia do registro na tabela específica de meta lista Fique ligado Informação válida somente para registros de formulários | 13 |\n| **documentDescription** | Descrição do documento | \"Solicitação de compras\" |\n| **cardDescription** | Campo que corresponde a descrição do formulário Fique ligado Informação válida somente para formulários | num\\_solicitacao |\n| **convertDocumentType** | Tipo de conversão do documento | |\n| **translated** | Propriedade que indica se o documento foi traduzido | true / false |\n| **visualization** | Visualização do documento | |\n| **approved** | Propriedade que indica se o documento foi aprovado ou não | true / false |\n| **pdfRenderEngine** | Propriedade que indica se o documento utiliza o motor de renderização PDF Render | |\n| **mimetype** | Descrição do tipo de mídia | text/html |\n| **relatedFiles** | Relação de arquivos relacionados, incluindo o arquivo principal e anexos | Solicitacao\\_de\\_Compras.html Solicitacao\\_de\\_Compras.js |\n| **expires** | Propriedade que define se o documento está expirado | true / false |\n| **approvalAndOr** | Propriedade que indica se há aprovadores AND e OR | true / false |\n| **priority** | Prioridade do documento | 0 |\n| **downloadEnabled** | Propriedade que indica se o documento está habilitado para download | true / false |\n| **statusArmazLongoPrazo** | Status do armazenamento a longo prazo do documento | |\n| **updateIsoProperties** | Propriedade que indica se atualiza as propriedades da ISO | true / false |\n| **expirationDate** | Data de expiração do documento | 2016-11-16T00:00:00-02:00 |\n| **checkoutFolder** | Propriedade que indica se o documento é a pasta Check-out Fique ligado Informação válida somente para pastas | true / false |\n| **volumeId** | Volume em que o documento pertence | Default |\n| **usedQuota** | Informa o quanto de espaço já foi utilizado na cota disponível (valores em MB) | 1.64712 |\n| **atualizationId** | Propriedade que indica o documento de atualização | 0 |\n| **inheritApprovers** | Propriedade que define se herda aprovações do pai | true / false |\n| **deleted** | Propriedade que indica se o documento está excluido | true / false |\n| **privateDocument** | Propriedade que indica se é um documento privado, ou seja, se está abaixo da pasta Meus Documentos | true / false |\n| **size** | Informa o tamanho do arquivo (valores em MB) | 0.00227165 |\n| **documentTypeId** | Tipo do arquivo físico, se retornar branco ou nulo é porque esse tipo não é conhecido pela plataforma | Contratos |\n| **imutable** | Propriedade que define se a versão/revisão é inalterável | true / false |\n| **datasetName** | O nome do dataset a qual o documento pertence Fique ligado Informação válida somente para formulários | dts\\_form\\_solicitacao\\_de\\_compras |\n| **topicId** | Código do assunto do documento | 1 |\n| **documentPK.documentId** | Número do documento | 82 |\n| **processingBatch** | Propriedade que indica se o documento está ainda em processamento | true / false |\n| **externalDocumentId** | Propriedade que indica se o documento possui alguma relação com um documento externo | |\n| **permissionType** | Tipo de permissão | 0 |\n| **colleagueId** | Matricula do usuário que criou o documento | \"fernando.alves\" |\n| **indexed** | Propriedade que define se o documento já foi indexado | true / false |\n| **phisicalFile** | Nome do arquivo físico atrelado ao documento | Solicitação\\_de\\_Compras.html |\n| **keyWord** | Palavras chaves do documento | \"tag\" |\n| **documentPropertyNumber** | Código do formulário base Fique ligado Informação válida somente para formulários e seus respectivos registros | 80 |\n| **inheritSecurity** | Propriedade que define se herda segurança do pai | true / false |\n| **quota** | Cota atribuída para a pasta (valores em MB) Fique ligado Informação válida somente para pastas | 100 |\n| **additionalComments** | Comentários adicionais do documento | \"Comentário adicional\" |\n| **crc** | *Cyclic Redundancy Check* (identificação do conteúdo do documento) | 1749708947 |\n| **documentPropertyVersion** | Versão do formulário em que o registro de formulário foi criado Fique ligado Informação válida somente para formulários e seus respectivos registros | 1000 |\n| **uUID** | UUID (identificador Único Global) do documento | 313DB013-DBE2-4ADB-BC0D-9BE76EEC1BFB |\n| **documentPK.companyId** | Código da empresa em que o documento foi publicado | 1 |\n| **createDate** | Data de criação do documento | 2016-10-27T00:00:00-02:00 |\n| **activeVersion** | Propriedade que define se a versão é ativa | true / false |\n| **publisherId** | Matricula do usuário que publicou o documento | \"fernando.alves\" |\n| **versionDescription** | Descrição da versão | \"Informações da versão\" |\n| **validationStartDate** | Data a partir da qual o documento poderá ser visualizado | 2016-11-16T00:00:00-02:00 |\n| **metaListId** | Código de qual meta lista o documento pertence Fique ligado Informação válida somente para formulários e seus respectivos registros | 40 |\n| **userNotify** | Propriedade que define se notifica os usuários que tenham esse assunto de interesse | true / false |\n| **approvedDate** | Data de Aprovação | 2016-11-16T00:00:00-02:00 |\n| **privateColleagueId** | Se é um documento particular retorna a matricula do usuário onde este documento está alocado | \"fernando.alves\" |\n| **allowMultiCardsPerUser** | Propriedade que indica se permite muitos formulários por usuário | true / false |\n| **languageId** | Código do Idioma do documento | \"pt\\_BR\" |\n| **siteCode** | Código do volume no qual o documento pertence | \"Fluig\" |\n| **notificationDays** | Periodo, em dias, para notificação de expiração do documento | 40 |\n| **socialDocument** | Documento social | |\n| **restrictionType** | Tipo de restrição | 0 |\n| **draft** | Propriedade que define se o documento está em edição Fique ligado Informação válida somente para \"Novos conteúdos\" | true / false |\n| **onlyActiveRows** | Propriedade que indica se o documento é ativo Fique ligado Informação válida somente para formulários | true / false |\n| **pdfConversionStatus** | Indica o status de conversão do documento para PDF | 0 |\n| **accessCount** | Número de acessos ao documento | 10 |\n| **lastModifiedDate** | Data da última modificação | 2016-11-16T00:00:00-02:00 |\n| **iconId** | Código do Ícone do documento | 67 |\n| **documentPK.version** | Número da versão do documento | 1000 |" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n### *allocatedDocument* - Documentos em check-out\n\nLista os documentos que estão em check-out. Para saber mais sobre o check-out, consulte nossa documentação de usuário [Plataforma ❙ Efetuar check-out do documento](https://tdn.totvs.com/pages/viewpage.action?pageId=235325675).\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **allocatedDocumentPK.companyId** | Código da empresa | 1 |\n| **allocatedDocumentPK.destinationDocument** | Código do documento a ser alterado na pasta particular | 12903 |\n| **allocatedDocumentPK.sourceDocument** | Código do documento original | 10654 |\n| **allocatedDocumentPK.sourceVersion** | Versão do documento original | 1000 |\n| **checkoutDate** | Data em que o check-out do documento foi realizado | 2018-08-29 |\n| **active** | Indica se o documento está ativo | true / false |\n| **colleagueId** | Matrícula do usuário responsável pelo check-out | fernando.alves |\n| **comment** | Comentário realizado no momento do check-out | Vou editar porque... |\n| **checkoutTime** | Hora em que o check-out do documento foi realizado | 165723 |\n| **checkoutAllowed** | Fique ligado Campo depreciado | |\n| **checkinDate** | Fique ligado Campo depreciado | |\n| **checkinTime** | Fique ligado Campo depreciado | |\n\n### *customFields* - Campos customizados dos documentos\n\nLista os [Plataforma ❙ Campos customizados](https://tdn.totvs.com/pages/viewpage.action?pageId=234455265) dos documentos.\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **customFieldsPK.customFieldId** | Código do campo customizado | 1 |\n| **customFieldDescription** | Descrição do campo customizado | Quantidade de páginas |\n| **customFieldsPK.companyId** | Código da empresa | 102 |\n| **alwaysShow** | Indica se está habilitado para mostrar em todos os documentos | true / false |\n\n### *destinationArea* - Área dos documentos" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\nLista as [Áreas](https://tdn.totvs.com/pages/viewpage.action?pageId=234455235) cadastradas para os documentos.\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **areaDescription** | Descrição da área do documento | Administrativo |\n| **managerId** | Matrícula do responsável pela área | fernando.alves |\n| **destinationAreaPK.companyId** | Código da empresa | 102 |\n| **destinationAreaPK.areaId** | Código da área do documento | 1 |\n| **userId** | Fique ligado Campo depreciado | |\n| **executionServerId** | Fique ligado Campo depreciado | |\n\n### *documentSecurityConfig* - Segurança dos documentos" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\nRetorna a configuração de [segurança](https://tdn.totvs.com/pages/viewpage.action?pageId=243008857) dos documentos.\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **attributionValue** | Valor do atributo de segurança | 6kopfwg3gyubqq1444419140949 |\n| **documentSecurityConfigPK.documentId** | Código do documento | 10903 |\n| **downloadEnabled** | Indica se está habilitado o download do documento | true / false |\n| **showContent** | Indica se está habilitada a visualização do conteúdo do documento | true / false |\n| **documentSecurityConfigPK.companyId** | Código da empresa | 102 |\n| **permission** | Indica se o documento tem permissão | true / false |\n| **securityLevel** | Nível de permissão de acesso ao documento Fique ligado Os níveis são: **-1** - Sem Permissão, **0** - L (Leitura), **1** - G (Gravação), **2** - M (Modificação) ou **3** - T (Total) | 3 |\n| **inheritOriginSecurity** | Propriedade que define se herda segurança | true / false |\n| **documentSecurityConfigPK.sequence** | Sequência de prioridade do registro da segurança | 1 |\n| **inheritSecurity** | Propriedade que define se herda segurança | true / false |\n| **documentSecurityConfigPK.version** | Versão do documento | 1000 |\n| **attributionType** | Define a atribuição da segurança. Fique ligado Os tipos são: **1** - Colaborador,  **2** - Grupo, ou **all** - Todos | 1 |\n| **securityVersion** | Fique ligado Campo depreciado | |\n\n### *knowledge* - Conhecimento dos documentos" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\nRetorna as visualizações dos documentos, indicando quando foi realizada a primeira e a última visualização.\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **knowledgePK.companyId** | Código da empresa | 102 |\n| **knowledgePK.documentId** | Código do documento | 10903 |\n| **knowledgePK.version** | Versão do documento | 1000 |\n| **knowledgePK.colleagueId** | Matrícula do usuário que visualizou o documento | fernando.alves |\n| **firstView** | Primeira visualização (tempo em formato Long) | 1444839211480 |\n| **lastView** | Última visualização (tempo em formato Long) | 1530553535848 |\n| **lastViewedTime** | Fique ligado Campo depreciado | |\n| **lastViewed** | Fique ligado Campo depreciado | |\n| **knowledgeDate** | Fique ligado Campo depreciado | |\n| **versionDescription** | Fique ligado Campo depreciado | |\n\n### *topic* - Assuntos dos documentos\n\nLista os [assuntos](https://tdn.totvs.com/pages/viewpage.action?pageId=234455255) dos documentos.\n\n| **Coluna** | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **updateEmail** | Indica se está habilitada a notificação de atualização do assunto | true / false |\n| **topicPK.topicId** | Código do assunto | 1 |\n| **removeEmail** | Indica se está habilitada a notificação de eliminação do assunto | true / false |\n| **description** | Descrição do assunto | Eventos |\n| **mandatory** | Indica se o assunto é obrigatório | true / false |\n| **topicPK.companyId** | Código da empresa | 102 |\n\n## Datasets de Processos\n\n---\n\n### *processHistory* - Histórico de solicitações *workflow*" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* fluig 1.0 ou superior**\n\nO *dataset* de histórico de processos permite consultar os dados de uma solicitação em andamento, finalizada ou cancelada de processos cadastrados. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **companyId** | Código da empresa. | 102 |\n| **processInstanceId** | Número da solicitação. | 24254 |\n| **movementSequence** | Corresponde a quantidade de movimentações da solicitação *workflow* corrente. | 2 |\n| **active** | *Status* da atividade. Qual atividade está ativa no momento. | 0 ou *false*; 1 ou *true*; |\n| **movementDate** | Data que foi feita a movimentação da atividade. Depreciado: A informação foi unificada com a hora no campo **movementDatetime** | 2015-08-22 |\n| **movementHour** | Hora exata em que a atividade foi movimentada. Depreciado: A informação foi unificada com a data no campo **movementDatetime** | 11:41:23 |\n| **movementDatetime** | Data e hora que foi feita a movimentação da atividade | 2022-12-05T11:40:34Z |\n| **stateSequence** | Código da atividade que foi movimentada. | 4 |\n| **subProcessId** | Código do subprocesso. | 0 |\n| **threadSequence** | Número da *Thread* de movimentação. Irá variar quando ocorrer alguns paralelismos na solicitação *workflow*. Ex.: processos com Fork/Join. | int |\n| **previousMovementSequence** | Qual fluxo foi movimentado no passo anterior. | 5 |\n| **conversionSequence** | Informa se a solicitação *workflow* foi convertida. Se o valor for igual a “0” (zero), esta solicitação nunca foi convertida até o presente momento. | int |\n| **automaticLink** | Define se o fluxo para a atividade é automático ou se necessita ser movimentado pelo usuário. | 0 ou *false*; 1 ou *true*; |\n| **returnLink** | Permite retornar para a atividade de origem do fluxo. | 0 ou *false*; 1 ou *true*; |\n\n### *processTask* - Tarefas das solicitações de processos *workflow*" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* fluig 1.0 ou superior**\n\nO *dataset* de tarefas das solicitações de processos permite consultar dados das tarefas de uma solicitação. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **processTask.companyId** | Código da empresa. | 102 |\n| **processTask.processInstanceId** | Número da solicitação. | 24254 |\n| **processTask.movementSequence** | Corresponde a quantidade de movimentações da solicitação *workflow* corrente. | 2 |\n| **choosedColleagueId** | Código da matrícula do responsável escolhido para a tarefa. | adm |\n| **choosedSequence** | Numero da atividade. | Número interno exemplo 6 |\n| **status** | *Status* da atividade. Estado em que ela se encontra. | 0 - Não completada; 1 - Em consenso 2 - Completa 3 - Transferida 4 - Cancelada |\n| **active** | Informa se a tarefa está ativa ou não. | 0 ou *false*; 1 ou *true*; |\n| **taskObservation** | Mostra os complementos adicionados na tarefa. | \"Registrado documento\" Fique ligado A partir da [Atualização 1.5.0](https://tdn.totvs.com/pages/viewpage.action?pageId=184781872), para resgatar os complementos de uma tarefa, devem ser utilizados os métodos da API Pública ([WorkflowRest](https://api.fluig.com/resource_WorkflowRest.html)) . Caso exista algum projeto ou desenvolvimento anterior à esta atualização, que utilizem o campo taskObservation - integrações, por exemplo - é necessário importar o dataset [ProcessTaskCustom](http://tdn.totvs.com/display/fluig/Datasets+internos+fluig?preview=%2F161350218%2F244911778%2FProcessTaskCustom.js). Este dataset está preparado para retornar os dados do campo taskObservation da forma antiga, com a diferença que, caso haja mais de um complemento na mesma tarefa, eles serão separados utilizando o caractere \\n. |\n| **noticeExpirationRequisitionerDate** | Caso esteja marcada a opção de notificar expiração da tarefa para o requisitante, registra a data de notificação. | 2015-08-22 |\n| **noticeExpirationRequisitionerHour** | Caso esteja marcada a opção de notificar expiração da tarefa para o requisitante, registra a hora de notificação. | em milisegundos |\n| **noticeExpirationAuthorityDate** | Caso esteja marcada a opção de notificar expiração da tarefa para o responsável, registra a data de notificação. | 2015-08-22 |\n| **noticeExpirationAuthorityHour** | Caso esteja marcada a opção de notificar expiração da tarefa para o responsável, registra a hora de notificação. | Em milisegundos |\n| **noticeExpirationManagerDate** | Caso esteja marcada a opção de notificar expiração da tarefa para o gestor, registra a data de notificação. | 2015-08-22 |\n| **noticeExpirationManagerHour** | Caso esteja marcada a opção de notificar expiração da tarefa para o gestor, registra a data de notificação. | Em milisegundos |\n| **taskCompletionDate** | Mostra a data de conclusão de uma tarefa. | 2017-06-02T00:00:00-03:00 Fique ligado A partir da atualização 1.6.1, esta coluna será substituída por **assignEndDate e **endDate.**** |\n| **taskCompletionHour** | Mostra a hora de conclusão de uma tarefa. | 40533 Fique ligado A partir da atualização 1.6.1, esta coluna será substituída por **assignEndDate e **endDate.**** |\n| **initialTermDate** | Caso configurado no processo, mostra a data de início a contar para conclusão da tarefa. | 2017-06-01T00:00:00-03:00 Fique ligado A partir da atualização 1.6.1, esta coluna será substituída por **startDate** e ****assignDate********.**** |\n| **initialTermHour** | Caso configurado no processo, mostra a hora de início a contar para conclusão da tarefa. | 51661 Fique ligado A partir da atualização 1.6.1, esta coluna será substituída por **startDate** e ****assignDate********.**** |\n| **deadlineDate** | Caso configurado no processo, mostra a data final para conclusão da tarefa. | 2017-06-02T00:00:00-03:00 Fique ligado A partir da atualização 1.6.1, esta coluna será substituída por **deadline******.**** |\n| **deadlineHour** | Caso configurado no processo, mostra a hora final para conclusão da tarefa. | 40533 Fique ligado A partir da atualização 1.6.1, esta coluna será substituída por **deadline******.**** |\n| **closureStatus** | Marca o status da tarefa, se está em aberto (0) ou se foi finalizada no prazo (1), dentro do tempo de aviso de expiração (2) ou após expirada (3) | int de 0 a 3. Em aberto - 0; Finalizada no prazo - 1; Aviso de expiração - 2; Expirada - 3. |\n| **startDate** | Indica a data e hora que foi movimentado para a atividade. Transferências não modificam esta data. | 2017-06-02T11:15:32-03:00 |\n| **assignDate** | Indica a data e hora que foi criada a tarefa. Ao transferir uma atividade, a hora da transferência é associada aqui. | 2017-06-02T11:15:32-03:00 |\n| **assignEndDate** | Indica data e hora que a tarefa foi concluída ou transferida pelo responsável. | 2017-06-02T11:15:32-03:00 **1** - Uma tarefa que foi transferida e depois concluída, o assignEndDate vai marcar a data da transferência e a endDate vai marcar a data da conclusão. **2** - Em uma tarefa em consenso, quando  um responsável tomou sua decisão vai gravar no assignEndDate, quando o consenso foi atingido, vai gravar na endDate. **3** - Em uma tarefa simples, onde apenas um usuário movimentou, os dois campos terão o mesmo valor. |\n| **endDate** | Indica data e hora que a atividade foi concluída em todas as situações, não somente pelo responsável. Exemplo, consenso, múltiplas transferências. | 2017-06-02T11:15:33-03:00 **1** - Uma tarefa que foi transferida e depois concluída, o assignEndDate vai marcar a data da transferência e a endDate vai marcar a data da conclusão. **2** - Em uma tarefa em consenso, quando  um responsável tomou sua decisão vai gravar no assignEndDate, quando o consenso foi atingido, vai gravar na endDate. **3** - Em uma tarefa simples, onde apenas um usuário movimentou, os dois campos terão o mesmo valor. |\n| **warningDate** | Indica a data e hora em que a tarefa passa a ser considerada em alerta. | 2017-06-02T11:15:32-03:00 |\n| **deadline** | Indica a data e hora de expiração da atividade. | 2017-06-02T11:15:32-03:00 |\n| **completeColleagueId** | | |" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n### processState - Atividades do processo" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* fluig 1.5.1 ou superior**\n\nO *dataset* de atividades do processo permite identificar as configurações de uma atividade. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| **notifyRequistionerFollowUp** | Se atividade notifica requisitante quando solicitação a abre. | *true*e *false* |\n| **joint** | Se atividade é uma atividade conjunta. | *true*e *false* |\n| **digitalSignature** | Se atividade solicita assinatura digital para ser movimentada. | *true*e *false* |\n| **forecastedEffort** | Esforço previsto indicado no cadastro da atividade em segundos. | 1000 |\n| **executionType** | Tipo de execução da atividade caso for uma atividade de serviço. | 0 - Manual (modelo antigo) 1 - Posterior à abertura 2 - Imediata à abertura |\n| **frequenceRequisitionerTime** | Frequência entre as notificações de atraso para o requisitante em segundos. | 1000 |\n| **transferAttachments** | Se a atividade transfere anexos da solicitação principal para a nova solicitação caso for uma atividade de sub processo. | *true*e *false* |\n| **cancelSubProcess** | Se permite cancelar solicitação pai com uma sub solicitação aberta caso a atividade marcada seja de sub processo que originou aquela solicitação. | *true*e *false* |\n| **notifyManagerDelay** | Se notifica gestor do processo no caso da atividade estar em atraso. | *true*e *false* |\n| **positionX** | Posição vertical da atividade no desenho do processo. | 100 |\n| **positionY** | Posição horizontal da atividade no desenho do processo. | 100 |\n| **notifyAuthorityFollowUp** | Se atividade notifica responsável quando solicitação a abre. | *true*e *false* |\n| **processStatePk.sequence** | Identificador da sequência da atividade. | 4 |\n| **stateName** | Nome da atividade. | AtividadeTeste |\n| **join** | Se atividade é um JOIN (junção de ramificações partindo de uma atividade de tipo FORK). | *true*e *false* |\n| **noticeExpirationAuthorityTime** | Tempo após prazo expirado para o responsável ser notificado em segundos. | 1000 |\n| **subProcessId** | Identificador do sub processo atrelado a esta atividade caso esta seja uma atividade de sub processo. | PROCESSO\\_A |\n| **formFolder** | Pasta no GED onde se encontra formulário, depreciado, pois não há separação de formulários por atividades. | |\n| **notifyAuthorityDelay** | Se a atividade notifica responsável caso esteja atrasada. | *true*e *false* |\n| **engineAllocationConfiguration** | Configuração, em XML, do mecanismo de atribuição do responsável para essa atividade. | 3 First |\n| **inhibitTransfer** | Se a atividade não permite apresentar a opção de transferir para outro responsável. | *true*e *false* |\n| **counterSign** | Se atividade exige que o usuário coloque sua senha para que possa ser movimentada. | *true*e *false* |\n| **subProcess** | Se a atividade é um sub processo, depreciado, não é populado em momento algum. | |\n| **noticeExpirationRequisitionerTime** | Tempo em segundos após prazo expirado para o requisitante ser notificado. | 1000 |\n| **processStatePk.version** | Versão do processo a qual esta atividade pertence. | 2 |\n| **stateDescription** | Descrição da atividade. | AtividadeTeste |\n| **agreementPercentage** | Percentual de aceitação para uma atividade conjunta ser movimentada. | 75 |\n| **forecastedEffortType** | Como atividade deve controlar esforço previsto. | 0 - Não controla 1 - Esforço Estimado / Previsto 2 - Apontamento de Horas 3 - Tempo de Conclusão |\n| **noticeExpirationManagerTime** | Tempo em segundos após prazo expirado para o gestor ser notificado. | 1000 |\n| **deadlineTime** | Prazo da atividade em segundos. | 1000 |\n| **initialState** | Se atividade é uma atividade inicial. | *true*e *false* |\n| **allowanceManagerTime** | Tempo de tolerância até o primeiro aviso de atividade atrasada para o gestor em segundos. | 1000 |\n| **stateType** | Tipo da atividade. Utilizado pelo modelador Web. | 0 - Atividade comum / simples 1 - Atividade automática / Gateways 2 - Atividade de sub processo 3 - Fork 4 - Join |\n| **engineAllocationId** | Identificador do mecanismo de atribuição utilizado para esta atividade. | Executor Atividade |\n| **selectColleague** | Se atividade exige ou não a seleção de usuários caso haja múltipla seleção. | *true*e *false* |\n| **deadlineFieldName** | Identificador do campo de formulário responsável por atribuir prazo caso este seja o formato da atividade. | textbox\\_0 |\n| **allowanceRequistionerTime** | Tempo de tolerância até o primeiro aviso de atividade atrasada para o requisitante em segundos. | 1000 |\n| **processStatePK.processId** | Identificador do processo ao qual esta atividade pertence. | PROCESSO\\_B |\n| **parentSequence** | Atividade a qual esta está anexada, apenas utilizado para o evento de captura de erro em relação a atividade de serviço. | 3 |\n| **frequenceManagerTime** | Tempo em segundos de frequência entre as notificações de atraso para o gestor. | 1000 |\n| **periodId** | Identificador do expediente caso este seja diferente da solicitação como um todo para esta atividade em específico. | Default |\n| **allowanceAuthorityTime** | Tempo de tolerância até o primeiro aviso de atividade atrasada para o responsável em segundos. | 1000 |\n| **automatic** | Se a atividade é automática / gateway. | *true*e *false* |\n| **bpmnType** | Tipo BPMN da atividade, utilizado pelo Studio ao processar desenhos de processo. | 10 - Início normal 11 - Início por mensagem (não utilizado) 12 - Início por timer 13 - Início por timer condicional 14 - Início por sinal 15 - Início por múltiplo paralelo (não utilizado) 16 - Início por evento múltiplo (não utilizado) 30 - Evento intermediário normal 31 - Evento intermediário por mensagem (não utilizado) 32 - Evento intermediário por timer 33 - Evento intermediário de escala (não utilizado) 34 - Evento intermediário de compensação (não utilizado) 35 - Evento intermediário de timer condicional 36 - Evento intermediário de ligação 37 - Evento intermediário de sinal 38 - Evento intermediário múltiplo paralelo (não utilizado) 39 - Evento intermediário de evento múltiplo (não utilizado) 40 - Evento intermediário de recepção de mensagem (não utilizado) 41 - Evento intermediário de recepção de sinal 42 - Evento intermediário de recepção de ligação 43 - Evento intermediário de erro 60 - Evento de finalização normal 61 - Evento de finalização por mensagem (não utilizado) 62 - Evento de finalização de escala (não utilizado) 63 - Evento de finalização por erro 64 - Evento de finalização de sinal 65 - Evento de finalização por cancelamento 66 - Evento de finalização múltiplo (não utilizado) 67 - Evento de finalização de compensação (não utilizado) 68 - Evento de finalização imediata 80 - Atividade simples 81 - Atividade de usuário 82 - Atividade de serviço 83 - Atividade de recepção 84 - Atividade de e-mail 85 - Atividade manual 86 - Atividade de regra de negócio 87 - Atividade de script 100 - Sub processo 101 - Ad Hoc 120 - Automática exclusiva 121 - Automática inclusiva 122 - Evento Gateway (não utilizado) 123 - Evento Gateway Exclusivo (não utilizado) 124 - Evento Gateway Paralelo (não utilizado) 125 - Gateway Complexo (não utilizado) 126 - Fork 127 - Join 140 - Sem laço (não utilizado) 141 - Laço padrão (não utilizado) 142 - Laço paralelo (não utilizado) |\n| **fork** | Se a atividade é um Gateway que inicia paralelismo, na base ver stateType. | *true*e *false* |\n| **notifyManagerFollowUp** | Se atividade notifica gestor quando solicitação a abre. | *true*e *false* |\n| **processStatePK.companyId** | Código da empresa a qual processo pertence. | 1 |\n| **frequenceAuthorityTime** | Frequência entre as notificações de atraso para o responsável em segundos. | 1000 |\n| **instruction** | Descrição das instruções da atividade. | Texto |\n| **signalId** | Identificador do sinal que é disparado ou recebido caso a atividade seja um emissor ou receptor de sinal respectivamente. | 3 |\n| **notifyRequisitionerDelay** | Se notifica requisitante do processo no caso da atividade estar em atraso. | *true*e *false* |" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n### *workflowProcess*- Solicitações de processos" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* fluig 1.5.1 ou superior**\n\nO *dataset* de solicitações de processos permite buscar dados sobre solicitações em andamento ou fechadas. Acompanhe a seguir os detalhes:\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **workflowProcessPK.processInstanceId** | Código da solicitação. | 102 |\n| **attachmentSeqId** | Código sequencial do anexo onde está localizado o registro de formulário do processo. | 1 |\n| **cardIndexDocumentId** | Código do documento que representa o formulário com o qual o processo está relacionado. | 15 |\n| **startDateProcessFromHistory** | Data da primeira movimentação segundo o primeiro registro em HISTOR\\_PROCES, variável transiente, descontinuada e não populada, utilizar startDateProcess. | |\n| **expired** | Indica se a última atividade aberta da solicitação está atrasada. Variável transiente, descontinuada e não populada. Tratamentos de SLA devem ser feitos via api /process-management/api/v2. | |\n| **workflowProcessPK.companyId** | Código da empresa. | 1 |\n| **closureStatus** | Código de finalização do processo dependendo do SLA da solicitação como um todo (não por atividade). | 0 - Aberta 1 - No Prazo 2 - Em Aviso 3 - Em Atraso |\n| **processId** | Código do processo. | PROCESSO\\_A |\n| **startDateProcess** | Data de início da solicitação. | 2017-06-02T11:15:32-03:00 |\n| **cardDocumentId** | Código do documento que representa o registro de formulário vinculado a solicitação. | 550 |\n| **periodId** | Código do expediente do processo no momento em que a solicitação foi aberta. | Default |\n| **totalWarning** | Tempo em segundos total entre início da data de aviso e fim do prazo da solicitação. | 1280 |\n| **requesterId** | Código da matrícula do usuário que abriu a solicitação. | user |\n| **sourceProcess** | Código da solicitação que originou esta caso seja um sub processo. | PROCESSO\\_B |\n| **totalDeadline** | Tempo em segundos do início da solicitação até a data do prazo. | 1560 |\n| **notifyDelay** | Se a solicitação avisa em caso de atraso. | *true* ou *false* |\n| **endDateProcess** | Data de encerramento da solicitação. | 2017-06-02T11:15:32-03:00 |\n| **active** | Se a solicitação está ativa. | *true* ou *false* |\n| **sourceThreadSequence** | Código da ramificação onde está a atividade de sub processo que originou essa solicitação caso ela seja proveniente de uma outra solicitação. | 0 |\n| **version** | Código da versão do processo que originou esta solicitação. | 3 |\n| **uUID** | Identificador interno único da solicitação gerado pelo sistema. | CA9E4715-B7E2-4BB9-BACE-26EFCBC33299 |\n| **totalRuntime** | Tempo em segundos considerando expediente entre a abertura e o encerramento da solicitação | 1100 |\n| **deadlineDate** | Data de prazo da solicitação como um todo. | 2017-06-02T11:15:32-03:00 |\n| **warningDateProcess** | Data de aviso da solicitação. | 2017-06-02T11:15:32-03:00 |\n| **status** | Código do status da solicitação. | 0 - Aberto 1 - Cancelado 2 - Finalizado |" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n### advancedProcessProperties - Propriedades Avançadas\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset advancedProcessProperties permite que se consulte as propriedades avançadas dos processos\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| advancedProcessPropertiesPK.propertyId | Nome do atributo | pastaDoDocumento |\n| propertieValue | Valor do atributo | 54 |\n| advancedProcessPropertiesPK.processId | Código do processo | PROCESSO\\_A |\n| advancedProcessPropertiesPK.companyId | Código da empresa | 1 |\n| advancedProcessPropertiesPK.version | Versão do processo | 2 |\n\n### businessPeriod -Cadastro de Expediente\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset businessPeriod permite que se consulte os expedientes cadastrado no fluig\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| businessPeriodPK.weekDay | Dia da Semana | 1 - Domingo 2 - Segunda-feira 3 - Terça-feira 4 - Quarta-feira 5 - Quinta-feira 6 - Sexta-feira 7 - Sábado |\n| businessPeriodPK.companyId | Código da empresa | 1 |\n| businessPeriodPK.sequence | Sequencial de ordem do horário no dia Fique ligado Se um exediente vai das **8h00 até 12h00** e das **13h30 até 17h00**, a primeira parte (das 8h às 12h) vai ser o sequencial 1 e a segunda (13h30 até 17h) sequencial 2 | 2 |\n| initialHour | Horário de início em segundos Fique ligado Usando o exemplo anterior, **8h** vai ser **28800**(8 \\* 60 \\* 60), e **13h30** será **48600**(13 \\* 60 \\* 60 + 30 \\*60). | 28800 |\n| businessPeriodPK.periodId | Código do Expediente | Default |\n| finalHour | Horário de final em segundos Fique ligado Usando o exemplo anterior, **12h** vai ser **43200**(12 \\* 60 \\* 60), e **17h** será **61200**(17 \\* 60 \\* 60). | 43200 |\n\n### globalCalendar - Cadastro de feriados" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset globalCalendar permite que se consulte os feriados cadastrados no fluig. Este dataset está **depreciado** a partir da 1.6.2 e não deve mais ser utilizado. Utilize o dataset **holiday**.\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| holidayDay | Dia do feriado | 7 |\n| holidayYear | Ano do feriado | 2022 0 (caso seja um feriado recorrente, ou seja, anual) |\n| holidayMonth | Mês do feriado | 1 - Janeiro 2 - Fevereiro ... |\n| globalCalendarPK.holidayCalendarId | Descrição do feriado | Independência do Brasil |\n| globalCalendarPK.companyId | Código da empresa | 1 |\n| dayFormatted | Data do feriado | 07-09-2022 (Formato dd-mm-aaaa) No caso de feriado recorrente, virá o ano conforme o que foi cadastrado, não 0. |\n\n### holiday - Cadastro de feriados\n\n**\\* TOTVS Fluig Plataforma 1.6.2 ou superior**\n\nO dataset holiday permite que se consulte os feriados cadastrados no fluig.\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| companyId | Código da empresa | 1 |\n| holidayDay | Dia do feriado | 7 |\n| holidayYear | Ano do feriado | 2022 0 (caso seja um feriado recorrente, ou seja, anual) |\n| holidayMonth | Mês do feriado | 1 - Janeiro 2 - Fevereiro ... |\n| id | Código do feriado atribuído pela plataforma | 1 |\n| holidayCalendarId | Descrição do feriado | Independência do Brasil |\n| dayFormatted | Data do feriado | 07-09-2022 (Formato dd-mm-aaaa) No caso de feriado recorrente, virá o ano conforme o que foi cadastrado, não 0. |\n\n### processAttachment - Cadastro de anexos em solicitações" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset processAttachment permite que se consulte os anexos de processos **incluindo**formulários da solicitação.\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| processAttachmentPK.companyId | Código da empresa | 1 |\n| version | Versão do anexo/formulário | 1000 |\n| fieldValue1...fieldValue15 | Campos auxiliares para filtro na central de tarefas. Estes campos persistem os dados do formulário conforme definido nos campos de filtro na configuração do processo | 2022-01-18 Opção 1 123 Nome |\n| colleagueId | Matrícula do usuário | adm |\n| attachedDate | Data do anexo | 2022-01-12T10:56:07-03:00 |\n| processAttachmentPK.processInstanceId | Número da solicitação | 2 |\n| originalMovementSquence | Sequencial da movimentação que identifica em que momento da solicitação o anexo foi adicionado | 3 |\n| processAttachmentPK.attachmentSequence | Sequencial de inclusão do anexo | 4 |\n| documentId | Número do documento | 8996 |\n| originalThreadSequence | Número da *Thread* de movimentação em que o anexo foi adicionado | 0 |\n\n### processDefinition - Cadastro de processos" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset processDefinition permite que se consulte o cadastro de processos.\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| uniqueCardVersion | Versão única de formulário | true false |\n| periodId | Código do expediente | Default |\n| deadlineTime | Prazo de conclusão da solicitação em ms | 18000 (5 minutos) |\n| warningDeadlineTime | Prazo para entrar em alerta do prazo conclusão da solicitação em ms | 10800 (3 minutos) |\n| processDefinitionPK.processId | Código do processo | PROCESSO\\_A |\n| baseDay | *Depreciado.*Não é mais utilizado. | 0 |\n| notifyManagerComplements | Notifica gestor quando um complemento ou anexo for adicionado na solicitação | true false |\n| active | Processo ativo ou inativo | true false |\n| notifyRequisitionerComplements | Notifica requisitante quando um complemento ou anexo for adicionado na solicitação | true false |\n| managerEngineAllocationId | Código do mecanismo de atribuição do gestor do processo | Usuário Grupo |\n| processDefinitionPK.companyId | Código da empresa | 1 |\n| keyWord | Tags do processo | tag1 tag2 |\n| publicProcess | Mostra se o processo está como público | true false |\n| baseMonth | *Depreciado.*Não é mais utilizado. | 0 |\n| instruction | Instrução de processos | Texto contendo instruções do processo |\n| processDescription | Descrição do processo | Processo de Compras |\n| volumeId | Código do volume | Default |\n| complementsLevel | Configuração dos usuários que podem anexar e adicionar observações na solicitação quando não está sob sua responsabilidade | 0 - Não configurado 1 - Solicitante, responsável(eis) por atividade e gestor 2 -  Todos os participantes do processo e gestor 3 - Todos os usuários |\n| managerEngineAllocationConfiguration | Configuração do mecanismo de atribuição do gestor do processo | adm |\n| snapshotFrequency | *Depreciado.*Não é mais utilizado. | 0 |\n| categoryId | Categoria do processo | Compras |\n| notifyAuthorityComplements | Notifica responsável quando um complemento ou anexo for adicionado na solicitação | true false |" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n### processDefinitionVersion - Cadastro de versões de processos\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset processDefinitionVersion permite que se consulte as versões dos processos.\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| formId | Código do formulário | 0 - Caso não tenha formulário 192 |\n| versionDescription | Descrição da versão | Nova Versão |\n| controlsAttachmentsSecurity | Indica se a segurança de anexo está habilitada | true false |\n| bpmnVersion | Controle indicativo se utiliza componentes não suportados na versão web | (em branco) - Caso seja criado pela web 1 - Caso seja criado pelo studio mas é suportado via web 2 - Caso seja criado pelo studio e não é suportado via web |\n| active | Versão ativo ou inativa | |\n| processDefinitionVersionPK.processId | Código do processo | PROCESSO\\_A |\n| categoryStructure | *Depreciado.*Não é mais utilizado. | (em branco) |\n| editionMode | Indica se o processo está em edição | true false |\n| fullCategoryStructure | *Depreciado.*Não é mais utilizado. | (em branco) |\n| counterSign | Exige confirmação de senha na movimentação de todas as atividades | true false |\n| inheritFormSecurity | Registros de formulário herdam segurança | true false |\n| processDefinitionVersionPK.companyId | Código da empresa | 1 |\n| blockedVersion | *Depreciado.*Não é mais utilizado. | false |\n| processDiagram | SVG do diagrama | |\n| processDefinitionVersionPK.version | Versão do processo | 3 |\n| updateAttachmentsVersion | Atualiza anexos | true false |\n\n### workflowColleagueRole - Listagem de usuários por papéis" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset workflowColleagueRole permite que se consulte os usuários presentes em cada papel cadastrado.\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| workflowColleagueRolePK.companyId | Código da empresa | 1 |\n| workflowColleagueRolePK.colleagueId | Matricula do usuário | adm |\n| workflowColleagueRolePK.roleId | Código do papel | Comprador |\n\n### workflowRole - Cadastro de papéis\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset workflowRole permite que se consulte os papéis cadastrados no fluig.\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| roleDescription | Nome do papel | Compradores da Empresa |\n| workflowRolePK.companyId | Código da Empresa | 1 |\n| workflowRolePK.roleId | Código do papel | Comprador |\n\n### *attributionMecanism* - Mecanismos de Atribuição\n\nLista todos os mecanismos de atribuição cadastrados na plataforma.\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **attributionMecanismPK.attributionMecanismId** | Código do mecanismo | Associado |\n| **name** | Nome do mecanismo | Atribuição por Associação |\n| **description** | Descrição do mecanismo | Permite compor lógicas complexas de atribuição |\n| **attributionMecanismPK.companyId** | Código da empresa | 1 |\n\n### FLUIGADHOC - Dados de solicitações Adhoc/Listar Tarefas" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset FLUIGADHOC permite que se consulte os dados do formulário FLUIGADHOC que é utilizado pelo processo Listar Tarefas, padrão do fluig.\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| metadata#id | Código do registro de formulário | 5 |\n| metadata#parent\\_id | Código do formulário | 3 |\n| metadata#version | Versão do registro do formulário | 1000 |\n| metadata#card\\_index\\_id | Código do formulário | 2 |\n| metadata#card\\_index\\_version | Versão do formulário | 1000 |\n| metadata#active | Registro ativo | true false |\n| cardid | Código do formulário | 2 |\n| companyId | Código da empresa | 1 |\n| detail | Campo \"Descrição\" no formulário | Tarefas adicionadas |\n| documentid | Código do registro de formulário | 5 |\n| dueDate | Campo \"Prazo de conclusão\" no formulário | 15/01/2022 (dd/mm/yyyy) |\n| id | Código sequencial dos registros desse formulário | 1 |\n| meeting | Campo \"Nome\" no formulário | Tarefas |\n| meetingDate | Campo \"Data\" no formulário | 12/01/2022 (dd/mm/yyyy) |\n| qtativ | Campo oculto no formulário que indica a quantidade de atividades adicionadas | 1 |\n| tableid | Campo usado para diferenciar tabela pai x filho nos formulário quando existe | principal (Principal é quando não é um registro de uma tabela pai x filho) |\n| version | Versão do registro de formulário | 1000 |\n\n### FLUIGADHOCPROCESS - Dados das atividades em solicitações Adhoc/Listar Tarefas" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\n**\\* TOTVS Fluig Plataforma 1.5.1 ou superior**\n\nO dataset FLUIGADHOCPROCES permite que se consulte os dados das atividades criadas a partir de um processo listar tarefas ou adhoc.\n\n| Coluna | Descritivo | Valor de exemplo |\n| --- | --- | --- |\n| metadata#id | Código do registro de formulário | 6 |\n| metadata#parent\\_id | Código do formulário | 4 |\n| metadata#version | Versão do registro do formulário | 1000 |\n| metadata#card\\_index\\_id | Código do formulário | 4 |\n| metadata#card\\_index\\_version | Versão do formulário | 1000 |\n| metadata#active | Registro ativo | true false |\n| activity | Campo \"Ação\" no formulário | Assinar documento |\n| adHocDescription | Campo \"Descrição\" no formulário pai do processo Listar Tarefas | Tarefas adicionadas |\n| cardid | Código do formulário | 4 |\n| companyid | Código da empresa | 1 |\n| deadline | Prazo de Conclusão da atividade | 15/01/2022 (dd/mm/yyyy) |\n| Código da empresa | ID do Documento | 1 |\n| id | Código sequencial dos registros desse formulário | 1 |\n| observation | Observação incluída na conclusão da atividade | Documento Assinado |\n| opening | Data da criação da tarefa | 12/01/2022 16:12:17 (dd/mm/yyyy hh:MM:ss) |\n| request | Código da solicitação que gerou esse registro | 1 |\n| requestDescription | Descrição do processo que gerou essa atividade | Listar Tarefas |\n| requestText | Ao encerrar a atividade, a concatenação do código da solicitação que gerou o registro e a descrição do processo | 1 - Listar Tarefas |\n| requester | Usuário que criou a tarefa | adm |\n| tableid | Campo usado para diferenciar tabela pai x filho nos formulário quando existe | principal (Principal é quando não é um registro de uma tabela pai x filho) |\n| taskStatus | Status da atividade atual | 0 - Em andamento 1 - Concluída 2 - Rejeitada |\n| version | Versão do registro de formulário | 1000 |\n\n## Datasets de Arquitetura\n\n---\n\n### *colleague* - Usuários da plataforma" }, { "metadata": { "title": "Datasets internos", "source": "https://tdn.totvs.com/display/fluig/Datasets+internos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Datasets internos.md" }, "content": "Datasets internos\n\n\nLista todos os usuários cadastrados na plataforma\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **colleaguePK.companyId** | Código da empresa | 102 |\n| **colleaguePK.colleagueId** | Matrícula do usuário | fernando.alves |\n| **colleagueName** | Nome do usuário | Fernando Alves |\n| **mail** | E-mail do usuário | [fernando@alves.com.br](mailto:fernando@alves.com.br) |\n| **login** | Login do usuário para acesso à plataforma | fernando.alves |\n| **active** | Indica se o usuário está ativo | true / false |\n| **adminUser** | Indica se o usuário é administrador da plataforma | true / false |\n| **defaultLanguage** | Idioma padrão dos documentos | pt\\_BR |\n| **volumeId** | Volume físico do usuário | Default |\n| **maxPrivateSize** | Cota máxima de armazenamento do usuáiro | 0 |\n| **currentProject** | Projetos do usuário | Vendas digitais |\n| **extensionNr** | Número do ramal do usuário | |\n| **especializationArea** | Especialização do usuário | Marketing digital |\n| **groupId** | Código do grupo de trabalho workflow ao qual o usuário está vinculado | 1 |\n| **userTenantId** | Código do usuário | 1 |\n| **emailHtml** | Fique ligado Campo depreciado | |\n\n### *colleagueGroup* - Vinculo dos Usuários aos Grupos\n\nLista os usuários que estão vinculados aos grupos\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **colleagueGroupPK.companyId** | Código da empresa | 102 |\n| **colleagueGroupPK.colleagueId** | Matrícula do usuário | fernando.alves |\n| **colleagueGroupPK.groupId** | Código do grupo | 1 |\n\n### *group* - Grupos de usuários\n\nLista todos os grupos cadastrados na plataforma.\n\n| Coluna | Descritivo | Valor de Exemplo |\n| --- | --- | --- |\n| **groupDescription** | Descrição do grupo | Desenvolvedores |\n| **groupPK.companyId** | Código da empresa | 102 |\n| **groupPK.groupId** | Código do grupo | 1 |" }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets" }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n\nAtenção!\n\nEste recurso está disponível a partir da **atualização 1.5.5** do TOTVS Fluig Plataforma.\n\n- 1 [Conceito](#Sincronizaçãodedatasets-Conceito)\n - 1.1 [Exemplificando](#Sincronizaçãodedatasets-Exemplificando)\n- 2 [Sincronização de Datasets](#Sincronizaçãodedatasets-SincronizaçãodeDatasets)\n- 3 [Tipos de sincronização de datasets](#Sincronizaçãodedatasets-Tiposdesincronizaçãodedatasets)\n- 4 [Desenvolvendo um dataset com sincronização jornalizada](#Sincronizaçãodedatasets-Desenvolvendoumdatasetcomsincronizaçãojornalizada)\n - 4.1 [Definindo a estrutura do dataset](#Sincronizaçãodedatasets-Definindoaestruturadodataset)\n - 4.2 [Sincronização de informações](#Sincronizaçãodedatasets-Sincronizaçãodeinformações)\n - 4.2.1 [Como funciona a sincronização das informações](#Sincronizaçãodedatasets-Comofuncionaasincronizaçãodasinformações)\n - 4.3 [Cache de dados no mobile](#Sincronizaçãodedatasets-Cachededadosnomobile)\n- 5 [Acessando um Dataset com sincronização](#Sincronizaçãodedatasets-AcessandoumDatasetcomsincronização)\n- 6 [Configurando a sincronização de datasets](#Sincronizaçãodedatasets-Configurandoasincronizaçãodedatasets)\n - 6.1 [Configurando comportamento de acesso a datasets em dispositivos mobile](#Sincronizaçãodedatasets-Configurandocomportamentodeacessoadatasetsemdispositivosmobile)\n - 6.2 [Configurando sincronização de dados para o servidor da plataforma](#Sincronizaçãodedatasets-Configurandosincronizaçãodedadosparaoservidordaplataforma)\n - 6.3 [Apagar dados](#Sincronizaçãodedatasets-Apagardados)\n - 6.4 [Editar agendamentos](#Sincronizaçãodedatasets-Editaragendamentos)\n - 6.5 [Consultando dataset](#Sincronizaçãodedatasets-Consultandodataset)\n\nAtenção!\n\nA partir das atualizações **1.6.5 Liquid**, **1.7.0 Lake** e **1.7.1 Crystal Lake**, os *select* passados por *constraint* em dataset serão bloqueados pelo serviço. Orientamos a leitura da documentação [Datasets acessando banco de dados externo](Datasets acessando banco de dados externo.md) que contém um exemplo da correta utilização do procedimento.\n\n# Conceito\n\n---\n\nA sincronização de datasets tem como objetivo reduzir o número de acessos a serviços de dados fornecidos por produtos externos à plataforma TOTVS Fluig. É uma prática comum trazer dados de sistemas externos para complementar informações do formulário de um processo ou realizar validações em eventos com base nas informações retornadas por este dataset." }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n## Exemplificando" }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n\nEm um exemplo mais específico, vamos supor que o usuário precisa informar no formulário de seu processo o centro de custo e que a lista dos centros de custo válidos está disponível em um sistema externo. Para que este usuário consiga informar um centro de custo válido, será necessário:\n\n1. o usuário acessar o campo com pesquisas, através de um formulário;\n2. esse campo solicita informações para o dataset;\n3. o dataset, quando executado através da plataforma, faz acesso ao serviço de dados do sistema externo.\n\nSe este workflow possuir uma média de cinco mil aberturas de processo por dia, teremos pelo menos cinco mil acessos a este sistema externo que, em muitos casos, acaba retornando sempre as mesmas informações ou tendo uma variação muito pequena de informações entre uma consulta e outra.\n\nO desenho abaixo ilustra como funciona o ciclo de acesso do usuário a uma informação externa à plataforma.\n\n![](..\\..\\..\\images\\image2015-11-18%20155335.png)\n\n**Figura 1 - Ciclo de acesso do usuário a uma informação externa à plataforma**\n\nContudo, como tratam-se de sistemas externos não é possível garantir tanto a performance quanto a disponibilidade desses serviços de dados. Eventuais problemas de performance ou disponibilidade impactarão o desempenho da plataforma TOTVS Fluig e podem até mesmo inviabilizar o uso de determinado processo workflow.\n\n# Sincronização de Datasets\n\n---\n\nNo modelo de dados sincronizados, por meio de uma tarefa agendada é possível realizar a consulta do sistema externo e copia os dados retornados para uma tabela espelho criada dentro do banco de dados da plataforma.\n\n![](..\\..\\..\\images\\image2015-11-18%20165020.png)\n\n**Figura 2 - Tarefa agendada para consulta ao sistema externo**\n\nUma vez que a primeira sincronização tenha sido concluída com sucesso, todas as consultas realizadas neste dataset não irão mais consultar o sistema externo, mas sim a tabela que foi espelhada pela tarefa agendada. Em nosso cenário hipotético caso o administrador do sistema opte por agendar a tarefa que atualiza a lista de centros de custo uma vez por dia. Após a sincronização a performance e a disponibilidade do sistema externo não afetarão mais a performance da plataforma e dos sistemas workflow.\n\nObservação\n\nA Sincronização de datasets em tabelas da plataforma não pode ser utilizada em datasets do tipo **interno**.\n\n# Tipos de sincronização de datasets\n\n---\n\nAtenção!\n\nPara que a sincronização de datasets ocorra corretamente, é necessário que a chave do banco seja configurada antes da sincronização para que não duplique os resultados. Essa configuração pode ser feita via tela no Painel de controle, selecionar a opção *[Plataforma ❙ Datasets](https://tdn.totvs.com/pages/viewpage.action?pageId=235598394) > Escolher o dataset a ser sincronizado > Editar dataset > Tabela > Configurar > Campo chave para a tabela.*\n\nOu via código passando o *setKey* na function *defineStructure*.\n\nExistem três tipos de sincronização com datasets:\n\n- **Sincronização Comum:** Este tipo de sincronização pode ser feita com qualquer dataset já implementado na plataforma. Neste modelo de sincronização toda vez que a tarefa agendada de sincronização de datasets for executada será criada uma nova tabela e todos os registros retornados pelo método *createDataset* serão copiados para esta nova tabela. A tabela anterior será removida do banco. Esse modelo não é recomendado para datasets que retornam muitos registros.\n- **Sincronização Jornalizada:** Este tipo de sincronização permite a atualização e cópia incremental de registros de acordo com o retorno do método *onSync* do dataset. Através do método *defineStructure* é possível definir de forma mais detalhada quais são os campos da tabela bem como seus tipos. Também é possível criar índices e uma chave principal para obter ainda mais performance durante as consultas aos dados do *dataset.* No método *OnSync* é possível determinar quais são as linhas novas a serem adicionadas na tabela como na sincronização comum. Com os métodos *updateRow* e *deleteRow* através da configuração da chave é possível atualizar registros já existentes bem como eliminar registros. Esse modelo é o recomendado para situações em que há uma grande quantidade de dados.\n- **Sincronização mobile:** Este modelo de sincronização pode ser utilizado com qualquer dataset, seja ele sincronizado no servidor ou não, e permite a cópia local dos registros de um dataset em um dispositivo mobile que sincronize de forma offline com a plataforma. Os prazos de sincronização são configurados no aplicativo fluig Mobile.\n\n Atenção\n\n Novos dados criados em dispositivos móveis, quando utilizando o modo offline, só estarão disponíveis para consulta em outros formulários depois que o aplicativo móvel passar por um processo de sincronização com o servidor da plataforma. Para entender mais sobre este processo, acesse nesta página o passo [Configurando sincronização de datasets](https://tdn.totvs.com/pages/viewpage.action?pageId=212899013).\n\n# Desenvolvendo um dataset com sincronização jornalizada\n\n---" }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n### Definindo a estrutura do dataset" }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n\nPara definir a estrutura de um dataset jornalizado é necessário definir a estrutura fixa da tabela no código do dataset. Para isso no código do dataset deverá ser criado o método *defineStructure*.\n\nExclusivamente dentro desta função estão disponíveis os seguintes métodos para definição da tabela:\n\n| Retorno | Método | Descrição |\n| --- | --- |\n| AddColumn | `AddColumn(String field, DatasetFieldType type)` Cria um campo na tabela com o nome e tipo informados. O nome sempre deve ser informado em caracteres maiúsculos. O tipo de campo pode ser omitido e neste caso o campo será criado com o tipo String. Os tipos disponíveis são: `DatasetFieldType.NUMBER` `DatasetFieldType.DATE` `DatasetFieldType.BOOLEAN` `DatasetFieldType.STRING` `DatasetFieldType.TEXT` |\n| setKey | `setKey(Object[] fields)`  Determina quais são os campos chaves para o dataset. No banco de dados será criado um índice utilizando os campos informados neste método. Esses campos serão utilizados na localização dos registros para atualização ou remoção das linhas através dos métodos *updateRow* e *deleteRow*. Importante informar apenas campos que foram previamente definidos com a função *addColumn*. Devem ser informados em caracteres maiúsculos. |\n| addIndex | `addIndex(Object[] fields)`  Permite adicionar mais índices para obtenção de maior performance nas consultas do dataset. Devem ser informados em caracteres maiúsculos. Atenção! Bancos de dados Oracle possuem limitação de tamanho para chaves. Caso o número de caracteres ultrapasse o limite permitido, poderá ocorrer o erro **“ORA-01450: maximum key length (6397) exceeded”**. Considere essa restrição ao definir campos e estruturas, a fim de evitar falhas de criação ou atualização no banco de dados. |\n\nQuando um campo é definido como **chave** (*setKey*) o mesmo é definido automaticamente como **índice**. Neste caso, o campo não poderá ser utilizado para criação de um índice único, entretanto é permitido utilizar em um índice composto.\n\nNo exemplo abaixo o campo 'CE\\_CODIGO' foi configurado como chave, portanto não pode ser utilizado como índice único 'addIndex(\"CE\\_CODIGO\")'. Não há impedimento, porém, se usar em um índice composto, como está sendo utilizado no exemplo 'addIndex([ \"CE\\_CODIGO\", \"CE\\_LOJA\", \"CE\\_NUMTIT\" ])'.\n\n**Exemplo:**\n\n```\nfunction defineStructure() {\n\taddColumn(\"CE_CODIGO\", DatasetFieldType.NUMBER);\n\taddColumn(\"CE_LOJA\");\n\taddColumn(\"CE_NUMTIT\", DatasetFieldType.NUMBER);\n\taddColumn(\"CE_PARCELA\");\n\taddColumn(\"CE_PEFIXO\");\n\taddColumn(\"CE_TIPO\");\n\taddColumn(\"CE_VALOR\", DatasetFieldType.NUMBER);\n\taddColumn(\"CE_INSS\");\n\taddColumn(\"CE_ISS\");\n\taddColumn(\"CE_IRRF\");\n\taddColumn(\"DT_TITULO\", DatasetFieldType.DATE);\n\taddColumn(\"CE_PIS\");\n\taddColumn(\"CE_COFINS\");\n\taddColumn(\"LOGICO\", DatasetFieldType.BOOLEAN);\n\tsetKey([ \"CE_CODIGO\", \"CE_NUMTIT\" ]);\n\taddIndex([ \"CE_CODIGO\" ]);\n\taddIndex([ \"CE_CODIGO\", \"CE_LOJA\", \"CE_NUMTIT\" ]);\n}\n```\n\nImportante\n\n- A função *defineStructure* é obrigatória para configuração do dataset *offline*. Dentro do *defineStructure,* os nomes informados nos métodos coluna (*addColumn*), chave (*setKey*) e índice (*addIndex*) devem ser sempre em maiúsculo. Para visualizar os exemplos [clique aqui.](https://tdn.totvs.com/pages/viewpage.action?pageId=315906495)\n\n- O tipo de campo DatasetFieldType.TEXT foi introduzido na atualização 1.6.1 da plataforma. Este tipo foi desenvolvido especificamente para sincronização de datasets em ambientes que utilizam o banco de dados Oracle, onde o tipo DatasetFieldType.STRING é limitado a apenas 255 caracteres. O tipo de campo TEXT em Oracle suporta até 4000 caracteres. Em ambientes MySQL e SQL Server, não há distinção no comportamento dos tipos TEXT e STRING.\n\n- Na atualização do dataset, caso ocorra qualquer alteração neste método que indique alteração da estrutura da tabela, ocorrerá o drop da tabela antiga e todos os dados anteriores a esta alteração serão perdidos. A alteração de estrutura da tabela ocorrerá na próxima execução da tarefa agendada de sincronização do dataset.\n- Lembre-se que os nomes das colunas dos datasets serão os nomes das colunas criadas em banco. Lembre-se de considerar as regras de nomenclatura de campos do seu banco. Não utilizar espaços em branco no nome ou caracteres especiais como (!@#$%-+=, etc) ou palavras reservadas do banco. Caso utilize a nomenclatura não permitida, não será possível sincronizar os dados na tabela.\n- Não definir um campo com o nome ID. Internamente a sincronização cria um campo com este nome para fins de paginação e gerenciamento de registros. Ao criar uma metalista com este nome ocorrerá um erro de campo duplicado ao tentar criar a tabela de sincronização.\n\n- Os comandos AddIndex e AddKey não irão gerar índices nas tabelas de bancos de dados SQL Server. Os comandos podem ser implementados no código do porém os índices de tabela deverão ser criados via ferramenta de administração do banco. Os campos informados no comando addKey serão utilizados como campos para controle de registros duplicados e nas operação de adição, remoção e modificação de registros." }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n### Sincronização de informações" }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n\nPara a transferência de dados do dataset para a tabela, deverá ser definida a função *onSync* que será chamada a cada execução da tarefa agendada.\n\nPara que a sincronização aconteça deve ser criada uma tarefa no [Plataforma ❙ Agendador de tarefas](https://tdn.totvs.com/pages/viewpage.action?pageId=234455387) com o tipo 'Sincronização de dataset', selecionando qual dataset deverá ser sincronizado e em que período.\n\nDentro da função *onSync* deverá ser criado um objeto do tipo dataset onde as novas linhas deverão ser adicionadas pelo método *addRow* e linhas a serem atualizadas ou removidas pelos métodos *updateRow* e *deleteRow*, respectivamente.\n\nOs métodos *updateRow* e *deleteRow* recebem uma lista de objetos que são os valores das linhas (da mesma forma que já ocorre com o método *addRow*).\n\n**Exemplo:**\n\n```javascript\nfunction onSync(lastSyncDate) {\n\tvar dataset = DatasetBuilder.newDataset();\n\tvar integracao = ServiceManager.getService('FLUIG3');\n\tvar serviceLocator = integracao\n\t\t\t.instantiate('pkgWkfSolicPagamento.FLUIGLocator');\n\tvar service = serviceLocator.getFLUIGSOAP();\n\tvar cdEmp = 1; // código empresa pagadora\n\tvar cdFilial = 0; // todas as filiais\n\tvar cdTitulo = 0; // todos os titulos\n\tvar cdPrefixo = \"\"\n\tvar cnpj = 0; // cnpj fornecedor\n\tvar codForn = 0; // cod universal para todos os fornecedores\n\tvar lojaForn = 0; // loja fornecedor\n\t// Invocando o servico passando a data da ultima sincronização com a plataforma.\n\t// O webservice foi preparado para trazer apenas os dados desde a ultima\n\t// sincronização.\n\tvar retorno = service.CONSPAG(cdEmp, cdFilial, cdTitulo, cdPrefixo, cnpj,\n\t\t\tcodForn.toString(), lojaForn.toString(), lastSyncDate);\n\tvar arrayListaTitulo = retorno.getLISTACPAG();\n\tfor (var i = 0; i < arrayListaTitulo.length; i++) {\n\t\tvar r = arrayListaTitulo[i];\n\t\tif (r.getCE_TIPO() == \"ADD\") {\n\t\t\tdataset.addRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r\n\t\t\t\t\t.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r\n\t\t\t\t\t.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r\n\t\t\t\t\t.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r\n\t\t\t\t\t.getCE_PIS(), r.getCE_COFINS()));\n\t\t} else if (r.getCE_TIPO() == \"MOD\") {\n\t\t\t\n\t\t\tdataset.updateRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r\n\t\t\t\t\t.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r\n\t\t\t\t\t.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r\n\t\t\t\t\t.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r\n\t\t\t\t\t.getCE_PIS(), r.getCE_COFINS()));\n\t\t\t\n\t\t} else if (r.getCE_TIPO() == \"DEL\") {\n\t\t\t\n\t\t\tdataset.deleteRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r\n\t\t\t\t\t.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r\n\t\t\t\t\t.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r\n\t\t\t\t\t.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r\n\t\t\t\t\t.getCE_PIS(), r.getCE_COFINS()));\n\t\t\t\n\t\t} else {\n\t\t\t// Estado do registro é desconhecido no cache \n\t\t\tdataset.addOrUpdateRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r\n\t\t\t\t\t.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r\n\t\t\t\t\t.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r\n\t\t\t\t\t.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r\n\t\t\t\t\t.getCE_PIS(), r.getCE_COFINS()));\n\t\t\t\n\t\t\t\n\t\t}\n\t}\n\n\treturn dataset;\n}\n```\n\nQuando for necessário salvar no banco os dados do código, o corpo do método deve ser preenchido como abaixo.\n\n```javascript\nfunction onSync(lastSyncDate) {\n\tvar dataset = DatasetBuilder.newDataset();\n\tdataset.addRow(new Array(2256, \"SÃO PAULO\", 1058, \"6\", \"ESPORTE\"));\n dataset.addRow(new Array(1874, \"RECIFE\", 1258, \"1247690\", \"2\", \"CALÇADOS\"));\n dataset.addRow(new Array(1205, \"RIO DE JANEIRO\", 2594, \"10\", \"MOVEIS\"));\n dataset.addRow(new Array(985, \"FLORIANOPOLIS\", 2269, \"10\", , \"ELETRONICOS\"));\n\n\treturn dataset;\n}\n```" }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n#### Como funciona a sincronização das informações\n\nA forma como os dados são inseridos na base de dados é gerida pela plataforma TOTVS Fluig e desta forma o momento em que os registros são inseridos, editados ou excluídos no código do dataset, não é exatamente o mesmo momento em que, na prática, essas operações serão realizadas. Com isso, a importância em saber como funciona a sincronização e gravação de informações do dataset para tabelas de banco de dados é de utilidade geral.\n\nAo executar os métodos *createDataset* ou *OnSync* nas tarefas de sincronização a plataforma irá montar inicialmente em memória quatro coleções de registros que serão alimentadas de acordo com o comando utilizado pelo desenvolvedor.\n\n| | |\n| --- | --- |\n| **Coleção** | **Método** |\n| Registros novos | addRow |\n| Eliminados | deleteRow |\n| Modificados | updateRow |\n| Modificados ou Criados | addOrUpdateRow |\n\nCom as coleções montadas, a ordem que a plataforma utiliza para fazer a efetivação no banco é a seguinte.\n\n| | |\n| --- | --- |\n| **1** | Registros eliminados |\n| **2** | Linhas alteradas |\n| **3** | Linhas alteradas ou criadas |\n| **4** | Novas linhas |\n\nIsso é necessário para que as alterações e efetivações de registros no banco sejam gerenciadas pela plataforma, afim de garantir melhor performance e obter um tempo reduzido na sincronização de informações.\n\n### Cache de dados no mobile" }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n\nQuando se tem em mente um dispositivo móvel, imediatamente surge a questão do espaço ocupado por uma aplicação. A função onMobileSync é chamada apenas durante a atualização de um dataset *offline* já existente. \n\nEste método serve para que os dados já sincronizados através do método onSync sejam ainda mais restritos adicionando uma nova *constraint*, por exemplo, ou definindo que somente algumas das colunas do dataset estejam disponíveis *offline* no dispositivo, evitando uso desnecessário de armazenamento.\n\nQuando o aplicativo realiza a primeira sincronização, ao fazer o carregamento inicial dos dados, esta função não será executada.\n\nEsta função recebe o usuário autenticado no dispositivo como parâmetro e deve retornar um objeto contendo as colunas a salvar, filtros e ordenação específicos para a Sincronização Mobile, conforme exemplo abaixo. Lembre-se de que todas as colunas informadas no código devem estar em caracteres maiúsculos.\n\n**Exemplo:**\n\n```\n function onMobileSync(user) {\n\tvar sortFields = new Array();\n\tvar constraintTitulo1 = DatasetFactory.createConstraint('CE_CODIGO',\n\t\t\t'1', '1', ConstraintType.MUST);\n\tvar constraints = new Array(constraintTitulo1);\n\t\t\n\tvar colunastitulo = new Array('CE_CODIGO', 'CE_LOJA', 'CE_NUMTIT', 'CE_PARCELA',\n\t\t\t'CE_PARCELA');\n\tvar result = {\n\t\t'fields' : colunastitulo,\n\t\t'constraints' : constraints,\n\t\t'sortFields' : sortFields\n\t};\n\treturn result;\n}\n```\n\n# Acessando um Dataset com sincronização\n\n---\n\nO acesso a datasets sincronizados, seja ele jornalizado ou não, permanece exatamente igual ao [acesso de qualquer dataset](Acessando Datasets.md), não sendo necessário passar nenhum parâmetro extra.\n\n# Configurando a sincronização de datasets\n\n---\n\nA partir da **atualização 1.6.2**o Painel de controle disponibiliza a opção **Datasets**, com uma listagem de todos os datasets cadastrados na plataforma. Nessa tela é possível:\n\n- Ligar ou desligar a sincronização de datasets em tabelas do servidor.\n- Ligar ou desligar cache de informações de datasets em dispositivos mobile.\n- Editar agendamentos para os datasets sincronizados.\n- Consultar o dataset - consulta do código fonte do dataset.\n- Consultar os dados do dataset\n- Apagar todos os dados - Permite apagar os dados sincronizados para reiniciar a sincronização.\n\n![](..\\..\\..\\images\\Painel-Controle-Dataset.png)\n\n**Figura 3 - Tela de dataset na atualização 1.6.5**" }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n### Configurando comportamento de acesso a datasets em dispositivos mobile\n\nÉ possível definir como será o comportamento do dispositivo mobile para realização do cache de informações, bem como o acesso a essas informações de acordo com o estado do dispositivo. Para isso, acione o link da coluna ***Offline mobile***.\n\n![](..\\..\\..\\images\\image2015-11-19%20152016.png)**Figura 4 - Tela de Comportamento Mobile do dataset**\n\nNesta tela temos as seguintes opções:\n\n- **Utilizar cache em dispositivos móveis:** Define se o dataset terá ou não cache em dispositivos móveis.\n- **Tempo de expiração do cache mobile:** Determina o período em que o cache será considerado válido desde a ultima sincronização de dispositivo.\n- **Não utilizar cache quando o dispositivo móvel estive online:** Determina se o dispositivo consultará os dados do cache do dataset mesmo que o dispositivo esteja online através de redes wifi ou 3g/4g.\n\nUtilize os botão salvar para confirmar as alterações.\n\n### Configurando sincronização de dados para o servidor da plataforma\n\nPara definir que determinado dataset irá sincronizar as linhas obtidas para dentro de uma tabela da plataforma, é preciso clicar no link da coluna **Sincronização**, que abre a tela abaixo.\n\n![](..\\..\\..\\images\\Sincronizar.png)\n\n**Figura 5 - Tela de Sincronização do dataset com o servidor**\n\nA opção **Sincronizar com o servidor?** irá ativar o modo de sincronia de dados no servidor.\n\nAo desligar a sincronização de um dataset que estava sendo sincronizado e jornalizado, lembre-se que as tabelas que abrigam os dados e as tarefas de sincronização serão removidas e que, por consequência, todos os dados sincronizados até aquele momento serão perdidos. Com a sincronização desligada, os dados que serão listados para este dataset são os dados obtidos pelo método *createDataset*.\n\n### Apagar dados" }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n\nEssa opção permite ao administrador remover a tabela que contém os dados sincronizados com o servidor. É importante notar que os dados não serão apagados imediatamente após a confirmação da mensagem, e sim, na próxima execução da tarefa de sincronização. A próxima tarefa de sincronização criará uma nova tabela gravando os dados daquela execução. A tabela que abrigava os dados antes da ordem de eliminação de dados será removida junto com seus registros.\n\nPara apagar os dados, é preciso acionar o link da coluna **Sincronização**, que abre a tela de Sincronização (Figura 5), e então acionar a opção **Apagar dados**.\n\n### Editar agendamentos\n\nApós definir que determinado dataset é sincronizado no servidor da plataforma, é preciso agendar pelo menos uma execução da tarefa de sincronia do dataset. Para acessar essa opção, é preciso acionar o link da coluna **Sincronização**, que abre a tela de Sincronização (Figura 5), e acionar a opção **Editar agendamento**.\n\n![](..\\..\\..\\images\\image2015-11-19%20155143.png)\n\n**Figura 6 - Tela de configuração do agendamento da sincronização**\n\nNesta tela deverão ser preenchidos obrigatoriamente os seguintes campos:\n\n- **Descrição:** Descrição obrigatória que irá identificar a tarefa na lista de tarefa agendadas.\n- **Tipo:** Tipo da tarefa (o valor sincronização de datasets virá selecionado por padrão).\n- **Dataset:** O dataset que será sincronizado (o dataset selecionado na tela anterior virá selecionado por padrão) .\n\nAs outras informações se referem a frequência e horário de execução da tarefa e segue o mesmo padrão dos outros tipos de tarefa agendada existentes. Para mais informações, consulte a documentação de usuário do [Plataforma ❙ Agendador de tarefas](https://tdn.totvs.com/pages/viewpage.action?pageId=234455387).\n\n### Consultando dataset" }, { "metadata": { "title": "Sincronização de datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=212899013", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Sincronização de datasets.md" }, "content": "Sincronização de datasets\n\n\nEssa opção possibilita a consulta dos resultados do dataset no banco de dados da plataforma. Qualquer tipo de dataset pode ser consultado, mesmo aqueles que não tenham sincronização.\n\nPara realizar a consulta, acione o ícone ![barras horizontais](../../../images/fluigicon-list-dropdown%20(1).png).png) presente na coluna **Mais ações** e, em seguida, a opção **Consultar**.\n\n![](..\\..\\..\\images\\Image%2022.jpg)\n\n**Figura 7 - Consulta aos dados do dataset**" }, { "metadata": { "title": "Vínculo de datasets a componentes", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=894373725", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Vínculo de datasets a componentes.md" }, "content": "Vínculo de datasets a componentes\n\n\n# Índice\n\n- 1 [Evolução](#Vínculodedatasetsacomponentes-Evolução)\n- 2 [Desenvolvimento atual](#Vínculodedatasetsacomponentes-Desenvolvimentoatual)\n- 3 [Criação de dataset](#Vínculodedatasetsacomponentes-Criaçãodedataset)\n- 4 [Desenvolvimento de componentes com Dataset](#Vínculodedatasetsacomponentes-DesenvolvimentodecomponentescomDataset)\n - 4.1 [Declarando dependência](#Vínculodedatasetsacomponentes-Declarandodependência)\n- 5 [Desativando um dataset](#Vínculodedatasetsacomponentes-Desativandoumdataset)\n- 6 [Desativando um componente](#Vínculodedatasetsacomponentes-Desativandoumcomponente)\n- 7 [Atualizando conteúdo de um dataset](#Vínculodedatasetsacomponentes-Atualizandoconteúdodeumdataset)\n - 7.1 [Outros bloqueios](#Vínculodedatasetsacomponentes-Outrosbloqueios)\n- 8 [Depreciação de um dataset](#Vínculodedatasetsacomponentes-Depreciaçãodeumdataset)\n- 9 [Exclusão de um componente](#Vínculodedatasetsacomponentes-Exclusãodeumcomponente)\n\n---\n\nA central de componentes é utilizada para importar componentes e extensões de widgets suportadas na plataforma permitindo baixar ou importar componentes que podem ser ativados ou inativados quando necessário. \n\nO controle é realizado por empresa, na qual essa pode assumir um widget ativo, enquantooutra empresa pode compartilhar esse widget desativado. Por exemplo, o Analytics Component, pode estar desativado para a empresa **01** enquanto encontra-se ativado para a empresa **02**.\n\nSaiba mais\n\nConfira mais detalhes sobre a Central de componentes [**aqui**](https://tdn.totvs.com/x/Ck32Dw).\n\n## Evolução\n\n---\n\nCom o objetivo de ampliar a capacidade de um componente, será possível criar datasets através do *deploy* de um componente, garantindo sua integridade e segurança.\n\nOs datasets criados serão dependentes do componente, impossibilitando que sejam desativados, ocasionando assim divergências onde quer que estejam sendo utilizados.\n\n## Desenvolvimento atual" }, { "metadata": { "title": "Vínculo de datasets a componentes", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=894373725", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Vínculo de datasets a componentes.md" }, "content": "Vínculo de datasets a componentes\n\n\n---\n\nO desenvolvimento de apps pode ser realizado de diversas formas, porém é fornecido um modelo de projeto no qual sua estrutura auxilia na criação de apps, o projeto **[sample-component](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/sample-component).**\n\nNa próxima seção, utilizaremos ele para exemplificar como se dará esta nova forma de desenvolvimento que irá possibilitar o vínculo de datasets.\n\n## Criação de dataset\n\n---\n\nHoje, em um componente já existe a possibilidade de criar e personalizar, widgets, temas, layouts e páginas.\n\nA partir deste novo recurso, será possível a criação de datasets para que sejam utilizados dentro da plataforma das diversas formas já conhecidas, criando integrações, auxiliando em processos, facilitando preenchimento formulários, entre outros recursos.\n\nSaiba mais\n\nConfira mais detalhes sobre desenvolvimento de datasets [**aqui**](../Desenvolvimento de Datasets.md).\n\n## Desenvolvimento de componentes com Dataset\n\n---\n\nPara ter um dataset vinculado a um componente, basta realizar algumas adições simples no código do seu componente, como recomendado, estaremos utilizando o projeto do **sample-component** como exemplo.\n\n### Declarando dependência" }, { "metadata": { "title": "Vínculo de datasets a componentes", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=894373725", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Vínculo de datasets a componentes.md" }, "content": "Vínculo de datasets a componentes\n\n\n---\n\nTodo componente deve conter um arquivo **component.xml** onde nele é declarado diversos atributos do componente. Para que um dataset seja vinculado, basta criar uma nova tag denominada ****, onde dentro da tag será adicionado as informações do seu dataset conforme exemplo abaixo:\n\n```\n\n\t\n\t\tTOTVS_customers\n\t\tdependencyFiles/datasets/dataset.js\n\t\tdataset\n\t\n\n\t\n\t\tTOTVS_orders\n\t\tdependencyFiles/datasets/orders.js\n\t\tdataset\n\t\n\n```\n\n**Detalhando as tags**\n\n- **code**: Código do dataset que será criado.\n\nImportante\n\nCom o objetivo de não haver conflitos com datasets previamente cadastrados ou de outros desenvolvimentos, é recomendado utilizar o prefixo: *nomeEmpresa\\_Componente\\_FuncaoDataset*\n\n- **file:** Local onde se encontra o código do dataset.\n\n![](..\\..\\..\\images\\trava%20de%20dataset.png)\n\n- **resourceType:** Tipo do recurso que está sendo vinculado ao componente, único valor possível neste desenvolvimento é o “**dataset**”\n\nImportante\n\nUm dataset pode ser associado somente a um único componente, caso haja mais de um componente, a tag **** não poderá ser repetida, por isso sempre use a sugestão do prefixo ***nomeEmpresa\\_Componente\\_FuncaoDataset*** e tenha o código original do dataset em ambos os componentes.\n\nApós essas configurações, basta realizar o deploy do arquivo **.ear** como de costume na central de componentes. Após receber a notificação de que o aplicativo foi instalado, basta ativá-lo na central de componentes.\n\nUma vez ativado, os datasets serão listados na página de **Datasets**. O ícone ![](../../../images/flaticon-info%20(1).png).png) ficará ao lado do menu de ações, na listagem de dataset informando quando um dataset está vinculado a um componente, ao passar o mouse no indicativo apresentado, poderá ser verificado a qual componente o dataset pertence.\n\n![](..\\..\\..\\images\\datasets%20e%20componentes.png)" }, { "metadata": { "title": "Vínculo de datasets a componentes", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=894373725", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Vínculo de datasets a componentes.md" }, "content": "Vínculo de datasets a componentes\n\n## Desativando um dataset\n\n---\n\nDatasets criados a partir de um componente terão inicialmente um vínculo ao componente e só serão desativados, caso o componente seja desativado. Caso contrário não será possível fazer a desativação.\n\nO vínculo de um dataset pode ser retirado excluindo do arquivo **componente.xml** a tag “dependency” referente ao dataset e sendo atualizado pela central de componentes - tornando assim, possível a desativação do dataset. Para criar novamente o vínculo, basta inserir a informação no arquivo.\n\nDatasets pré-existentes na plataforma não poderão ser vinculados a um componente.\n\n## Desativando um componente\n\n---\n\nAtravés da central de componentes é possível realizar a desativação de um componente, caso este possua datasets vinculados a ele. Uma modal informando quais datasets estão vinculados será exibida, conforme imagem abaixo.\n\n![](..\\..\\..\\images\\desativar%20componente.png)\n\nAo desativar um componente, o dataset vinculado ao mesmo também será desativado. Ao ativá-lo novamente o dataset também será reativado. Caso o dataset tenha tido seu vínculo removido, esse comportamento não será aplicado.\n\n## Atualizando conteúdo de um dataset" }, { "metadata": { "title": "Vínculo de datasets a componentes", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=894373725", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Datasets\\Vínculo de datasets a componentes.md" }, "content": "Vínculo de datasets a componentes\n\n\n---\n\nPara atualizar o conteúdo de um dataset que seja dependente de um componente, basta que seu código seja modificado no arquivo físico e um novo pacote para atualização seja gerado.  Faça os passos abaixo na central de componentes:\n\n**01.** Realize o upload do arquivo **.ear** atualizado.\n\n**02.** Na visualização de dataset dependentes pela central de componentes, clique em **Atualizar ou Criar Datasets**. Essa visualização pode ser acessada através do ícone ![](../../../images/flaticon-info%20(1).png).png).\n\nDatasets que precisam ser atualizados são identificados pela cor amarela, como na imagem abaixo.\n\n![](..\\..\\..\\images\\datasets%20vinculados.png)\n\nIsso fará com que o dataset da empresa atual seja atualizado, caso existam outras empresas o administrador destas deverá realizar apenas o passo de número (02).\n\n### Outros bloqueios\n\n---\n\nAlém do bloqueio da desativação de um **dataset dependente de um aplicativo**, o usuário da plataforma não poderá:\n\n- Editar um dataset (Exportação estará travada)\n- Visualizar histórico de versão\n- Restaurar versão de um  dataset\n- Visualizar seu código\n- Importar\n\nApenas a função de consultar ficará operante.\n\n## Depreciação de um dataset\n\n---\n\nCaso haja um dataset com código específico que não será mais usado na plataforma e não seja possível atualizar o seu código, uma nova dependência deve ser criada com um novo code que seja único.\n\n## Exclusão de um componente\n\n---\n\nCaso o arquivo físico do componente **(sample-component.ear)** seja deletado do diretório de instalação do fluig **(../appserver/apps)** o *undeploy* será feito e todos os datasets serão removidos da base de dados, mantendo a regra de todos os outros recursos hoje, widget, temas e layouts." }, { "metadata": { "title": "Acompanhamento de Eventos", "source": "https://tdn.totvs.com/display/fluig/Acompanhamento+de+Eventos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Acompanhamento de Eventos.md" }, "content": "Acompanhamento de Eventos\n\n\nA partir deste recurso é possível acompanhar a execução dos eventos pelo novo componente *loading*. Com este acompanhamento, é possível apresentar mensagens para o usuário tomar conhecimento das rotinas que estão sendo executadas quando a solicitação é encaminhada para a próxima atividade. Este também pode ser muito útil para o desenvolvedor identificar pontos de baixa performance nos desenvolvimentos realizados sob a plataforma.\n\nPara a utilização deste recurso, basta utilizar o trecho loading.setMessage(String message) na implementação do evento, conforme exemplo no trecho de código abaixo:\n\n```\nfunction validateForm(form){\n loading.setMessage(\"Validando campos de formulário\");\n \n if(form.getValue('nome') == null || form.getValue('nome') == '') {\n throw \"Campo nome não está preenchido\";\n }\n \n loading.setMessage(\"\");\n}\n```\n\nAssim, durante a execução deste evento, a mensagem definida na sua implementação será exibida na tela para o usuário acompanhar, conforme imagem abaixo:\n\n![](..\\..\\..\\images\\image2015-3-4%20155723.png)\n\nAtenção\n\n- Para o correto funcionamento deste método, o serviço do Real Time deve estar iniciado.\n- Se não levar um tempo considerável no processamento após a atribuição da mensagem, não é possível visualizar o carregamento e a mensagem.\n- Por padrão, todos os eventos executados são informados em tela, como por exemplo: \"Executando validateForms\", \"Executando afterStateEntry\" ou \"Executando createDataset\", mesmo se atribuída uma mensagem usando este método.\n\nVeja o exemplo disponível no [repositório do fluig](https://git.fluig.com/projects/SAMPLES). Utilize o arquivo **[workflow-loading](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse/workflow-loading)**." }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\n# Índice\n\n- 1 [Objetivo](#EventosdeDocumentos-Objetivo)\n- 2 [Pré-requisitos](#EventosdeDocumentos-Pré-requisitos)\n- 3 [Eventos globais JavaScript](#EventosdeDocumentos-EventosglobaisJavaScript)\n - 3.1 [AddDocumentConvertionExt](#EventosdeDocumentos-AddDocumentConvertionExt)\n - 3.2 [ValidateUpload](#EventosdeDocumentos-ValidateUpload)\n - 3.3 [ValidateCustomMetadata](#EventosdeDocumentos-ValidateCustomMetadata)\n - 3.4 [BeforeDocumentPublisher](#EventosdeDocumentos-BeforeDocumentPublisher)\n - 3.5 [AfterDocumentPublisher](#EventosdeDocumentos-AfterDocumentPublisher)\n - 3.6 [BeforeDocumentRemove](#EventosdeDocumentos-BeforeDocumentRemove)\n - 3.7 [AfterDocumentRemove](#EventosdeDocumentos-AfterDocumentRemove)\n - 3.8 [BeforeDocumentRestore](#EventosdeDocumentos-BeforeDocumentRestore)\n - 3.9 [AfterDocumentRestore](#EventosdeDocumentos-AfterDocumentRestore)\n - 3.10 [BeforeDocumentRemovePermanently](#EventosdeDocumentos-BeforeDocumentRemovePermanently)\n - 3.11 [AfterDocumentRemovePermanently](#EventosdeDocumentos-AfterDocumentRemovePermanently)\n - 3.12 [BeforeDocumentViewer](#EventosdeDocumentos-BeforeDocumentViewer)\n - 3.13 [BeforeDownloadContent](#EventosdeDocumentos-BeforeDownloadContent)\n - 3.14 [AfterSaveCard](#EventosdeDocumentos-AfterSaveCard)\n - 3.15 [AfterDeleteCard](#EventosdeDocumentos-AfterDeleteCard)\n - 3.16 [onApplyDocumentPrintProperties](#EventosdeDocumentos-onApplyDocumentPrintProperties)\n - 3.17 [onApplyDocumentProtocolProperties](#EventosdeDocumentos-onApplyDocumentProtocolProperties)\n - 3.18 [onApplyDocumentPublishProperties](#EventosdeDocumentos-onApplyDocumentPublishProperties)\n- 4 [Desenvolvimento de Eventos JMS](#EventosdeDocumentos-DesenvolvimentodeEventosJMS)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos do TOTVS Fluig Plataforma que desejam manipular os eventos de documentos. O objetivo é apresentar o seu funcionamento e a descrição dos campos utilizados.\n\n# Pré-requisitos\n\n---\n\nConhecer o conceito e as orientações sobre o [Desenvolvimento de Eventos](../Desenvolvimento de Eventos.md).\n\n# Eventos globais JavaScript\n\n---\n\nOs eventos de documentos são um conjunto de scripts carregados pela API de Documentos, os quais são desenvolvidos utilizando JavaScript e são chamados durante a execução de ação em Documentos ou em momentos específicos de interação em Documentos." }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n### AddDocumentConvertionExt\n\nEste evento permite personalizar a conversão de documento realizada pelo TOTVS Fluig Plataforma. Mais informações sobre ele podem ser encontradas no guia [Conversores de Documentos](http://tdn.totvs.com/display/fluig/Conversores+de+Documentos).\n\n### ValidateUpload" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nA partir da versão: 1.8.1- **[Silver Mist](https://tdn.totvs.com/x/hCFzL)**\n\nEste evento sempre é disparado antes de realizar upload de arquivo para a plataforma, seja por API Rest, Soap/Webservices ou FTP. Através dele é possível validar o MIMEType ou Extensão do arquivo que está sendo feito upload e poder bloquear. O evento não recebe parâmetros, porém temos acesso à função getValue.\n\n**Exemplo:**\n\n```\nfunction validateUpload() {\n\t// Exemplo de implementação\n\n\t// CompanyId da empresa\n\tvar companyId = getValue(\"WKCompany\");\n\n\t// Nome do arquivo com extensão\n\tvar fileName = getValue(\"WKFileName\");\n\n\t// Tamanho do arquivo em bytes\n\tvar fileSize = getValue(\"WKFileSize\");\n\n\t// Caminho absoluto do arquivo\n\tvar filePath = getValue(\"WKFilePath\");\n\n\t// MimeType dos bytes do arquivo, ou seja, independente da extensão\n\tvar fileMimeType = getValue(\"WKFileMimeType\");\n\n\t// UserId do usuário que está realizando o upload\n\tvar userId = getValue(\"WKUser\");\n\n\t// A maioria dos mimetypes executáveis começam com \"application/x-\"\n\tif (fileMimeType.indexOf(\"application/x-\") !== -1) {\n\n\t\t// Porém alguns tipos começam também com \"application/x-\", como por exemplo: .rar ou .7zip. Então caso deseja permití-los, pode ser feito assim:\n\t\tif (fileMimeType.indexOf(\"application/x-rar-compressed\") !== -1 || fileMimeType.indexOf(\"application/x-7z-compressed\") !== -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tthrowsIfBlocked();\n\t}\n\n\t// Podemos bloquear qualquer outro mimetype, por exemplo:\n\tif (fileMimeType.indexOf(\"application/octet-stream\") !== -1 || fileMimeType.indexOf(\"application/exe\") !== -1) {\n\t\tthrowsIfBlocked();\n\t}\n\n // Podemos bloquear também pela extensão do arquivo\n if (fileName.match(/.*\\.(sh|exe|msi|bat|app)/i)){\n throwsIfBlocked();\n }\n\n\t// Função usada para logar uma mensagem no log do servidor e retornar o erro na tela\n\tfunction throwsIfBlocked() {\n\t\tlog.warn(\"Usuário: '\" + userId + \"' da Empresa: '\" + companyId + \"' tentou realizar o upload \"\n\t\t\t\t+ \"do Arquivo '\" + fileName + \"' com o Mimetype: '\" + fileMimeType + \"' e foi impedido!\");\n\n\t\tthrow \"Este formato de documento não está de acordo com as políticas de segurança e portanto não será permitida sua publicação na plataforma.\";\n\t}\n}\n```\n\nSão disponibilizadas algumas propriedades referentes ao arquivo que está sendo feito upload através do método *getValue*.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKCompany | Código da Empresa | int |\n| WKFileName | Nome do arquivo com extensão | String |\n| WKFileSize | Tamanho do arquivo em bytes | long |\n| WKFilePath | Caminho absoluto do arquivo | String |\n| WKFileMimeType | MimeType dos bytes do arquivo, ou seja, independente da extensão | String |\n| WKUser | Usuário logado | String |" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n### ValidateCustomMetadata" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento sempre é disparado antes de salvar os valores dos campos customizados de um documento, tanto na publicação como edição. Através dele é possível alterar ou validar os valores dos campos customizados dos metadados de um documento. O evento recebe como parâmetro uma referência aos campos customizados.\n\n**Exemplo:**\n\n```\nfunction validateCustomMetadata(fields){\n}\n```\n\nNo contexto deste evento a variável *fields* pode ser usada para consultar ou modificar os valores dos campos customizados de um documento. Não permitindo adicionar novos campos. \nPara inserir novos campos em um documento existe varias maneiras disponíveis.\n\n- Pela herança da pasta pai.\n- No cadastro de Campos Customizados, marcando a opção **Mostrar em todos documentos** ou da forma padrão.\n- Através do *WebService CustomFieldsService*.\n- Na edição dos metadados do documento, pelo usuário.\n\nPara consultar o valor de um campo customizado neste evento, utiliza-se o *fields.getValue* passando como parâmetro o código do campo desejado. Retornando *null*, caso o campo não esteja disponível para este documento.\n\n**Exemplo:**\n\n```\nfunction validateCustomMetadata (fields){\n log.info(\"Valor do Campo 1: \" + fields.getValue(\"campo1\"));\n}\n```\n\nJá para realizar a edição utiliza-se o *fields.setValue*, passando como parâmetro, primeiro o nome do campo, em seguida o valor.\n\n**Exemplo:**\n\n```\nfunction validateCustomMetadata (fields){\n fields.setValue(\"campo1\",\"Valor para o Campo 1\");\n}\n```\n\nAlem dos valores dos campos customizados disponibilizamos algumas informações do documento que está sendo criado ou editado, porém somente para consulta através do método *getValue*.\n\n| | |\n| --- | --- |\n| WKUser | Código do usuário |\n| WKCompany | Número da empresa |\n| WKNumParentDocument | Número da pasta pai |\n| WKDocumentType | Tipo do documento |\n| WKDocumentTypeId | ID do tipo de documento |\n| WKPrivateDocument | Se o documento esta sendo publicado na pasta particular (true/false) |\n| WKNumAcess | Número de acessos |\n| WKComments | Comentários do documento |\n| WKAuthor | Código do autor do documento |\n| WKCreateDate | Data de criação do documento |\n| WKDescription | Descrição do documento |\n| WKNumDocument | Número do documento |\n| WKNumVersion | Número da versão do documento |\n| WKExpirationDate | Data de expiração do documento |\n| WKExpires | Documento expira? (true/false) |\n| WKFileSize | Tamanho do documento em bytes |\n| WKKeyWord | Palavras chaves do documento |\n| WKVolume | Volume do documento |\n| WKSubject | Assunto relacionado ao documento |\n\nVeja o exemplo em nosso repositório [aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse).\n\n**Exemplo:**\n\n```\nfunction validateCustomMetadata (fields){\n log.info(\"Usuário: \" + getValue(\"WKUser \"));\n}\n```\n\nAs exceções podem ser tratadas utilizando o comando *throw*. Este comando retornará uma mensagem ao usuário ao tentar salvar o documento.\n\n**Exemplo:**\n\n```\nfunction validateCustomMetadata (fields){\n if( fields.getValue(\"campo1\") == \"Area 1\"){\n throw \"TRATAMENTO DA EXCEÇÃO\";\n }\n}\n```" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n### BeforeDocumentPublisher" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nUtilizado quando é preciso fazer validação customizada nas propriedades da tela de publicação/edição de documentos antes de salva-lo no banco de dados. Dentre todas as propriedades da tela de publicação/edição de documentos não serão tratados os campos customizados, pois já existe um evento que trata esta situação.\n\nSão disponibilizadas algumas propriedades referentes ao documento que está sendo criado ou editado, porém somente para consulta através do método *getValue*.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKDocument | Objeto do Documento | [DocumentDto](https://tdn.totvs.com/x/EIl8B#DesenvolvimentodeEventos-DocumentDto) |\n| WKDocumentEdit | Objeto do Documento | [DocumentEditDto](https://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentEditDto) |\n| WKSubject | Descrição do Assunto do documento | String |\n| WKListApprover | Lista dos Aprovadores do documento | List<[ApproverDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApproverDto)> |\n| WKListSecurity | Lista com a segurança do documento | List<[DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)> |\n| WKListRelatedDocument | Lista com os documentos relacionados ao documento | List<[RelatedDocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-RelatedDocumentDto)> |\n| WKState | Estado da ação: PUBLISH ou MODIFY | String |\n| WKUser | Usuário logado | String |\n| WKCompany | Código da Empresa | int |\n\nO produto retorna *null* quando for necessário pegar umas das propriedades do documento que não exista.\n\nPor exemplo: Nem todos os documentos publicados tem aprovador, logo a variável *WKListApprover* só terá informações quando realmente existirem aprovadores na publicação.\n\n**Exemplos de implementação:**\n\nÉ possível usar vários objetos e fazer validações e é muito comum validar permissões específicas ao negócio do cliente e não permitir a inclusão do documento.\n\nNo exemplo abaixo, o trecho de código está mostrando todos os possíveis atributos, declara os possíveis objetos, exibe no log algumas informações desses objetos, depois verifica os aprovadores, validando que não pode conter um usuário administrador como aprovador e exibe todos documentos relacionados.\n\n```\nfunction beforeDocumentPublisher(){\n \n var doc = getValue(\"WKDocument\");\n var subject = getValue(\"WKSubject\");\n var listApprover = getValue(\"WKListApprover\");\n var listSeg = getValue(\"WKListSecurity\");\n var listRelated = getValue(\"WKListRelatedDocument\");\n var state = getValue(\"WKState\");\n var user = getValue(\"WKUser\");\n var company = getValue(\"WKCompany\");\n \n \n log.info(\"Usuário Logado: \" + user);\n \n \n log.info(\"Empresa: \" + company);\n \n log.info(\"Número do documento: \"+ doc.getDocumentId() + \" - Versão: \"+ doc.getVersion());\n \n if(listApprover!=null){\n for(j = 0; j < listApprover.size(); j++) { \n if (listApprover.get(j).getColleagueId().equals(\"adm\")){\n throw \"O usuário adm não pode ser aprovador de documentos\";\n }\n }\n }\n \n \n if(listSeg != null){\n for(j = 0; j < listSeg.size(); j++) { \n if (listSeg.get(j).getAttributionValue().equals(\"cvd\")){\n throw \"O usuário cvd não pode estar na segurança de documentos\";\n }\n }\n }\n \n \n if( listRelated != null){\n log.info(\"Os seguintes documentos estão relacionados a este documentos: \");\n for(j = 0; j < listRelated.size(); j++) { \n log.info(\"Nr. documento: \"+ listRelated.get(j).getRelatedDocumentId());\n }\n }\n log.info(\"Assunto: \" + subject);\n log.info(\"Estado: \" + state);\n}\n```\n\nExemplo de evento que impede o usuário de publicar um documento com descrição repetida em uma determinada pasta.\n\n```\nfunction beforeDocumentPublisher() {\n\t// Exemplo de evento que impede o usuário de publicar um documento com descrição\n // repetida em uma determinada pasta levando em consideração também se o documento esta na lixeira.\n\t// caso não queira considerar a lixeira é só remover a validação da mesma, porem o documento poderá\n\t// ser restaurando da lixeira para pasta duplicando assim o nome do arquivo.\n\n\n var state = getValue(\"WKState\");\n\n\n if (state == \"PUBLISH\") {\n\n var doc = getValue(\"WKDocument\");\n\n // Faz validações apenas se o documento estiver sendo publicado na pasta selecionada (trocar o \"6\" pelo numero da pasta desejada)\n // Valida também se o documento esta sendo publicado como novo opção (getVersionOption), caso seja somente alteração ou seja, nova revisão ou versão passa\n if (doc.getParentDocumentId() == 6 && doc.getVersionOption() == 0) {\n\n \t //###############################################################################################\n //documentos ativos\n\n // Reduz o retorno de registros para reduzir impacto em performance.\n var constraintDocument1 = DatasetFactory.createConstraint(\n 'sqlLimit', '0', '1', ConstraintType.MUST);\n\n // Passando código da pasta pai para o Dataset\n var constraintDocument2 = DatasetFactory.createConstraint(\n 'parentDocumentId', doc.getParentDocumentId(), doc\n .getParentDocumentId(), ConstraintType.MUST);\n\n // Consultando apenas registros de documentos ativos.\n var constraintDocument3 = DatasetFactory.createConstraint(\n 'activeVersion', 'true', 'true', ConstraintType.MUST);\n\n // Consultando apenas nos documentos que não foram removidos.\n var constraintDocument4 = DatasetFactory.createConstraint(\n 'deleted', 'false', 'false', ConstraintType.MUST);\n\n // Consultando documentos que tenham a mesma descrição informada na\n // publicação\n var constraintDocument5 = DatasetFactory.createConstraint(\n 'documentDescription', doc.getDocumentDescription(), doc\n .getDocumentDescription(), ConstraintType.MUST);\n\n var datasetDocumentActive = DatasetFactory.getDataset('document', null,\n new Array(constraintDocument1, constraintDocument2,\n constraintDocument3, constraintDocument4,\n constraintDocument5), null);\n\n\n //###############################################################################################\n //Considera o documento que esta na lixeira\n\n // Consultando apenas registros de documentos inativos.\n constraintDocument3 = DatasetFactory.createConstraint(\n 'activeVersion', 'false', 'false', ConstraintType.MUST);\n\n // Consultando apenas nos documentos que foram removidos.\n constraintDocument4 = DatasetFactory.createConstraint(\n 'deleted', 'true', 'true', ConstraintType.MUST);\n\n\n var datasetDocumentDeleted = DatasetFactory.getDataset('document', null,\n new Array(constraintDocument1, constraintDocument2,\n constraintDocument3, constraintDocument4,\n constraintDocument5), null);\n\n\n var isExistDoc = datasetDocumentActive != null && datasetDocumentActive.rowsCount > 0\n && (datasetDocumentActive.getValue(0, \"documentDescription\") == doc.getDocumentDescription());\n\n var isExistDocDeleted = datasetDocumentDeleted != null && datasetDocumentDeleted.rowsCount > 0\n && (datasetDocumentDeleted.getValue(0, \"documentDescription\") == doc.getDocumentDescription());\n\n\n if (isExistDoc || isExistDocDeleted) {\n throw \"Já existe um documento com a mesma descrição informada\";\n }\n\n }\n }\n}\n```\n\nExemplo de como tornar o campo 'Descrição/Versão/Revisão' de preenchimento obrigatório, apresentado no momento do check-in do documento.\n\n```\nfunction beforeDocumentPublisher() {\n\n var doc = getValue(\"WKDocument\");\n\n // Verifica se a descrição da versão não está preenchida\n if (doc.getVersionDescription() == \"\") {\n log.info(\"### Documento: \" + doc.getDocumentId() + \" - Versão: \" + doc.getVersion() + \" não está com a Descrição da Versão preenchida!\");\n\n // Informa somente o numero do documento de origem, para o caso de checkin com nova versao/revisao\n var constraintDocument1 = DatasetFactory.createConstraint('allocatedDocumentPK.sourceDocument', doc.getDocumentId(), doc .getDocumentId(), ConstraintType.MUST);\n // Instanciando o dataset\n var datasetDocument = DatasetFactory.getDataset('allocatedDocument', null, new Array(constraintDocument1), null); \n // Verifica se o documento esta em checkout/checkin e exibe a mensagem\n if (datasetDocument.rowsCount > 0) {\n throw \"Para efetuar o checkin é necessário informar a Descrição da Versão!\";\n }\n }\n}\n```\n\nExemplo de uso do parâmetro WKDocumentEdit no evento, para que seja possível atualizar o campo keyWord do documento.\n\n```\nfunction beforeDocumentPublisher() {\n var doc = getValue(\"WKDocument\");\n log.info(\"KeyWord Atual: \" + doc.getKeyWord());\n\n var docEdit = getValue(\"WKDocumentEdit\");\n docEdit.setKeyWord(\"Novo\");\n log.info(\"KeyWord Novo: \" + docEdit.getKeyWord());\n}\n```\n\nExemplo de como impedir a publicação pela extensão do arquivo físico.\n\n```\nfunction beforeDocumentPublisher(){\n var doc = getValue(\"WKDocument\");\n var ext = [\".exe\",\".reg\"];\n\n for (var i = 0; i < ext.length; i++) {\n if (doc.getPhisicalFile().endsWith(ext[i])) { \n throw \"Desculpe, este tipo de arquivo não é permitido por razões de segurança\"; \n }\n }\n}\n```\n\nExemplo de uso do parâmetro WKDocumentEdit no evento para que seja possível controlar as propriedades version, validationStartDate e expirationDate do documento.\n\n```\nfunction beforeDocumentPublisher() {\n var doc = getValue(\"WKDocument\");\n\n log.info(\"DocumentId Atual: \" + doc.getDocumentId());\n log.info(\"Version Atual: \" + doc.getVersion());\n log.info(\"DocumentType Atual: \" + doc.getDocumentType());\n log.info(\"ValidationStartDate Atual: \" + doc.getValidationStartDate());\n log.info(\"ExpirationDate Atual: \" + doc.getExpirationDate());\n\n // Quando documento é novo e o tipo de documento é Documento normal.\n if (doc.getDocumentId() == 0 && doc.getDocumentType() == \"2\") {\n\t var docEdit = getValue(\"WKDocumentEdit\");\n\n\t docEdit.setVersion(3);\n\t log.info(\"Version Novo: \" + docEdit.getVersion());\n\t \n\t docEdit.setValidationStartDate(stringToDate(\"26/05/2023 00:00:00\"));\n\t log.info(\"ValidationStartDate Novo: \" + docEdit.getValidationStartDate());\n\t \n\t docEdit.setExpirationDate(stringToDate(\"27/05/2023 16:50:30\"));\n\t log.info(\"ExpirationDate Novo: \" + docEdit.getExpirationDate());\n }\n \n function stringToDate(dateString){\n var format = new java.text.SimpleDateFormat(\"dd/MM/yyyy HH:mm:ss\");\n return format.parse(dateString); \n }\n}\n```" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n### **AfterDocumentPublisher**\n\nUtilizado quando é preciso fazer alguma manipulação customizada nas propriedades da tela de publicação/edição de documentos depois que ele foi salvo no banco de dados. Dentre todas as propriedades da tela de publicação/edição de documentos não serão tratados os campos customizados.\n\n**Exemplo:**\n\n```\nfunction afterDocumentPublisher(){\n}\n```\n\nAs propriedades recuperadas através do método *getValue*() são as mesmas do eventos *beforeDocumentPublisher* e a forma de manipulação das propriedades pode ser vista no exemplo do evento *beforeDocumentPublisher*.\n\n### BeforeDocumentRemove" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento é executado antes do documento ir para a lixeira.\n\n**Exemplo:**\n\n```\nfunction beforeDocumentRemove() {\n\n //Exemplo implementação\n\n var doc = getValue(\"WKDocument\");\n var subject = getValue(\"WKSubject\");\n var listApprover = getValue(\"WKListApprover\");\n var listSeg = getValue(\"WKListSecurity\");\n var listRelated = getValue(\"WKListRelatedDocument\");\n var user = getValue(\"WKUser\");\n var company = getValue(\"WKCompany\");\n\n log.info(\"Usuário Logado: \" + user);\n log.info(\"Empresa: \" + company);\n\n log.info(\"Número do documento: \" + doc.getDocumentId() + \" - Versão: \"\n + doc.getVersion());\n\n if (listRelated != null) {\n log.info(\"Os seguintes documentos estão relacionados a este documentos: \");\n for (j = 0; j < listRelated.size(); j++) {\n log.info(\"Nr. documento: \" + listRelated.get(j).getRelatedDocumentId());\n }\n }\n log.info(\"Assunto: \" + subject);\n}\n```\n\nSão disponibilizadas algumas propriedades referentes ao documento que está removido, porém somente para consulta através do método *getValue*.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKDocument | Objeto do Documento | [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto) |\n| WKSubject | Descrição do Assunto do documento | String |\n| WKListApprover | Lista dos Aprovadores do documento | List<[ApproverDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApproverDto)> |\n| WKListSecurity | Lista com a segurança do documento | List<[DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)> |\n| WKListRelatedDocument | Lista com os documentos relacionados ao documento | List<[RelatedDocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-RelatedDocumentDto)> |\n| WKState | Estado da ação: PUBLISH ou MODIFY | String |\n| WKUser | Usuário logado | String |\n| WKCompany | Código da Empresa | int |" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n### AfterDocumentRemove" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento é executado logo após o documento ir para a lixeira.\n\n**Exemplo:**\n\n```\nfunction afterDocumentRemove() {\n\n //Exemplo implementação\n\n var doc = getValue(\"WKDocument\");\n var subject = getValue(\"WKSubject\");\n var listApprover = getValue(\"WKListApprover\");\n var listSeg = getValue(\"WKListSecurity\");\n var listRelated = getValue(\"WKListRelatedDocument\");\n var user = getValue(\"WKUser\");\n var company = getValue(\"WKCompany\");\n\n log.info(\"Usuário Logado: \" + user);\n log.info(\"Empresa: \" + company);\n\n log.info(\"Número do documento: \" + doc.getDocumentId() + \" - Versão: \"\n + doc.getVersion());\n\n if (listRelated != null) {\n log.info(\"Os seguintes documentos estão relacionados a este documentos: \");\n for (j = 0; j < listRelated.size(); j++) {\n log.info(\"Nr. documento: \" + listRelated.get(j).getRelatedDocumentId());\n }\n }\n log.info(\"Assunto: \" + subject);\n}\n```\n\nSão disponibilizadas algumas propriedades referentes ao documento que foi removido, porém somente para consulta através do método *getValue*.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKDocument | Objeto do Documento | [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto) |\n| WKSubject | Descrição do Assunto do documento | String |\n| WKListApprover | Lista dos Aprovadores do documento | List<[ApproverDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApproverDto)> |\n| WKListSecurity | Lista com a segurança do documento | List <[DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)> |\n| WKListRelatedDocument | Lista com os documentos relacionados ao documento | List<[RelatedDocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-RelatedDocumentDto)> |\n| WKState | Estado da ação: PUBLISH ou MODIFY | String |\n| WKUser | Usuário logado | String |\n| WKCompany | Código da Empresa | int |" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n### BeforeDocumentRestore\n\nEste evento é executado antes do documento ser restaurado da lixeira.\n\n**Exemplo:**\n\n```\nfunction beforeDocumentRestore() {\n\n //Exemplo implementação\n\n var doc = getValue(\"WKDocument\");\n var subject = getValue(\"WKSubject\");\n var listApprover = getValue(\"WKListApprover\");\n var listSeg = getValue(\"WKListSecurity\");\n var listRelated = getValue(\"WKListRelatedDocument\");\n var user = getValue(\"WKUser\");\n var company = getValue(\"WKCompany\");\n\n log.info(\"Usuário Logado: \" + user);\n log.info(\"Empresa: \" + company);\n\n log.info(\"Número do documento: \" + doc.getDocumentId() + \" - Versão: \"\n + doc.getVersion());\n\n log.info(\"Assunto: \" + subject);\n}\n```\n\nSão disponibilizadas algumas propriedades referentes ao documento que está sendo restaurado, porém somente para consulta através do método *getValue*.\n\n| Propriedade | Descrção | Tipo |\n| --- | --- | --- |\n| WKUser | Código do usuário | String |\n| WKCompany | Número da empresa | int |\n| WKDocument | Objeto do Documento | [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto) |\n| WKUserLocale | Idioma do Usuário logado | String |\n| WKSubject | Assunto do documento | String |\n\n### AfterDocumentRestore" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento é executado logo após o documento ser restaurado da lixeira.\n\n**Exemplo:**\n\n```\nfunction afterDocumentRestore() {\n\n //Exemplo implementação\n\n var doc = getValue(\"WKDocument\");\n var subject = getValue(\"WKSubject\");\n var listApprover = getValue(\"WKListApprover\");\n var listSeg = getValue(\"WKListSecurity\");\n var listRelated = getValue(\"WKListRelatedDocument\");\n var user = getValue(\"WKUser\");\n var company = getValue(\"WKCompany\");\n\n log.info(\"Usuário Logado: \" + user);\n log.info(\"Empresa: \" + company);\n\n log.info(\"Número do documento: \" + doc.getDocumentId() + \" - Versão: \"\n + doc.getVersion());\n\n log.info(\"Assunto: \" + subject);\n}\n```\n\nSão disponibilizadas algumas propriedades referentes ao documento que foi restaurado, porém somente para consulta através do método *getValue*.\n\n| Propriedade | Descrção | Tipo |\n| --- | --- | --- |\n| WKUser | Código do usuário | String |\n| WKCompany | Número da empresa | int |\n| WKDocument | Objeto do Documento | [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto) |\n| WKUserLocale | Idioma do Usuário logado | String |\n| WKSubject | Assunto do documento | String |\n\n### BeforeDocumentRemovePermanently" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento é executado antes do documento ser excluído permanentemente\n\n**Exemplo:**\n\n```\nfunction beforeDocumentRemovePermanently() {\n\n //Exemplo implementação\n\n var doc = getValue(\"WKDocument\");\n var user = getValue(\"WKUser\");\n var company = getValue(\"WKCompany\");\n\n log.info(\"Usuário Logado: \" + user);\n log.info(\"Empresa: \" + company);\n\n log.info(\"Número do documento: \" + doc.getDocumentId() + \" - Versão: \"\n + doc.getVersion());\n}\n```\n\nSão disponibilizadas algumas propriedades referentes ao documento que está sendo excluído permanentemente, porém somente para consulta através do método *getValue*.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKUser | Código do usuário | String |\n| WKCompany | Número da empresa | int |\n| WKDocument | Objeto do Documento | [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto) |\n| WKUserLocale | Idioma do Usuário logado | String |\n\n### **AfterDocumentRemovePermanently**" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento é executado logo após o documento ser excluído permanentemente.\n\n**Exemplo:**\n\n```\nfunction afterDocumentRemovePermanently() {\n\n //Exemplo implementação\n\n var doc = getValue(\"WKDocument\");\n var user = getValue(\"WKUser\");\n var company = getValue(\"WKCompany\");\n\n log.info(\"Usuário Logado: \" + user);\n log.info(\"Empresa: \" + company);\n\n log.info(\"Número do documento: \" + doc.getDocumentId() + \" - Versão: \"\n + doc.getVersion());\n}\n```\n\nSão disponibilizadas algumas propriedades referentes ao documento que foi excluído permanentemente, porém somente para consulta através do método *getValue*.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKUser | Código do usuário | String |\n| WKCompany | Número da empresa | int |\n| WKDocument | Objeto do Documento | [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto) |\n| WKUserLocale | Idioma do Usuário logado | String |\n\n### BeforeDocumentViewer" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento é utilizado quando é preciso fazer validação customizada antes da visualização de algum documento.\n\n**Exemplo:**\n\n```\nfunction beforeDocumentViewer (){\n}\n```\n\nSão disponibilizadas algumas propriedades referentes ao documento que está sendo visualizado, porém somente para consulta através do método *getValue*.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKDocument | Objeto do Documento | [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto) |\n| WKUser | Usuário logado | String |\n| WKCompany | Código da Empresa | int |\n\n**Exemplo:**\n\n```\nfunction beforeDocumentViewer(){\n \n \n var doc = getValue(\"WKDocument\");\n var company = getValue(\"WKCompany\");\n var ds\n \n try {\n var c1 = DatasetFactory.createConstraint( \"allocatedDocumentPK.companyId\", company, company, ConstraintType.MUST);\n var c2 = DatasetFactory.createConstraint( \"allocatedDocumentPK.sourceDocument\", doc.getDocumentId(), doc.getDocumentId(), ConstraintType.MUST);\n var c3 = DatasetFactory.createConstraint( \"allocatedDocumentPK.sourceVersion\", doc.getVersion(), doc.getVersion(), ConstraintType.MUST);\n var c4 = DatasetFactory.createConstraint(\"active\", \"true\",\"true\", ConstraintType.MUST);\n var constraints = new Array(c1, c2, c3, c4);\n ds = DatasetFactory.getDataset(\"allocatedDocument\", null, constraints, null);\n \n \n }catch (e) {\n log.error(\"Erro ao tentar recuperar o documento em check-out: \" + e.message);\n }\n \n \n if(ds!=null && ds.rowsCount>0){ \n throw \"Este documento está em check-out e não pode ser visualizado. Foi gerado o documento \" + ds.getValue(0,\"allocatedDocumentPK.destinationDocument\") + \" que está sob responsabilidade do usuário com matrícula \"+ ds.getValue(0,\"colleagueId\");\n }\n}\n```\n\nVeja o exemplo (**event-document-expiration-date-validation**) no [repositorio do TOTVS Fluig Plataforma](https://git.fluig.com/projects/SAMPLES) clicando [aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/event-document-expiration-date-validation)." }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n### **BeforeDownloadContent**\n\nEste evento é utilizado quando é preciso fazer validação customizada antes do download de algum documento.\n\n**Exemplo:**\n\n```\nfunction beforeDownloadContent (documentId){\n}\n```\n\nSão disponibilizadas algumas propriedades referentes ao documento que está sendo visualizado, porém somente para consulta através do método *getValue*.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKDocument | Objeto do Documento | [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto) |\n| WKSubject | Descrição do Assunto do documento | String |\n| WKUserLocale | Idioma do Usuário logado | String |\n| WKUser | Usuário logado | String |\n| WKCompany | Código da Empresa | int |\n\n**Exemplo:**\n\n```\nfunction beforeDownloadContent(documentId) {\n var companyId = getValue(\"WKCompany\");\n var c1 = DatasetFactory.createConstraint( \"documentPK.documentId\", documentId, documentId, ConstraintType.MUST);\n var c2 = DatasetFactory.createConstraint( \"documentPK.companyId\", companyId, companyId, ConstraintType.MUST);\n var constraints = new Array(c1, c2);\n var ds = DatasetFactory.getDataset(\"document\", null, constraints, null);\n if (ds != null && ds.rowsCount > 0) {\n var parent = ds.getValue(0, \"parentDocumentId\");\n if (parent == 43) {\n throw \"Download não permitido!\";\n }\n }\n}\n```\n\n### AfterSaveCard" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento é utilizado quando ao criar/salvar os dados de um registro de formulário pela Navegação de Documentos ou por movimentações *Workflow* se deseja salvar os dados do registro de formulário de uma forma externa. Por exemplo, ao criar um registro de formulário, enviar os dados do mesmo para um *Webservice* de outro produto.\n\n**Exemplo:**\n\n```\nfunction afterSaveCard(companyId, formId, cardId, versionId, cardData){\n}\n```\n\nSendo os parâmetros:\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| formId | Código do Formulário | int |\n| cardId | Código do Registro de Formulário | int |\n| versionId | Versão do Registro de Formulário | int |\n| cardData | Dados do Registro de Formulário | Hashmap |\n\n**Exemplo:**\n\n```\nfunction afterSaveCard(companyId, formId, cardId, versionId, cardData){ \n var custom = ServiceManager.getService(\"CustomCard\"); \n var serviceHelper = custom.getBean(); \n var serviceLocator = serviceHelper.instantiate(\"com.totvs.technology.webdesk.forms.service.custom.CustomCardServiceLocator\"); \n var service = serviceLocator.getCustomCardPort();\n \n var ar = new Array(); \n var it = cardData.keySet().iterator(); \n while (it.hasNext()) { \n var key = it.next(); \n var field1 = serviceHelper.instantiate(\"com.totvs.technology.webdesk.forms.service.custom.CardKeyValue\"); \n \n field1.setKey(key); \n field1.setValue( cardData.get(key)); \n log.info('>' + key + ': ' + cardData.get(key)); \n \n ar.push(field1); \n } \n \n var resultArr = serviceHelper.instantiate(\"com.totvs.technology.webdesk.forms.service.custom.CardKeyValueArray\"); \n resultArr.setItem(ar); \n service.create(companyId, formId, cardId, versionId, resultArr); \n}\n```\n\n### AfterDeleteCard" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento é utilizado como complemento do evento *afterSaveCard*. É chamado toda vez que um formulário ou um registro de formulário é eliminado da lixeira.\n\n**Exemplo:**\n\n```\nfunction afterSaveCard(companyId, formId, cardId, versionId, cardData){\n}\n```\n\nSendo os parâmetros:\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| cardId | Código do Registro de Formulário | int |\n\n**Exemplo:**\n\n```\nfunction afterDeleteCard(companyId,cardId){ \n var custom = ServiceManager.getService(\"CustomCard\"); \n var serviceHelper = custom.getBean();\n \n var serviceLocator = serviceHelper.instantiate(\"com.totvs.technology.webdesk.forms.service.custom.CustomCardServiceLocator\"); \n \n var service = serviceLocator.getCustomCardPort(); \n \n log.info(\"########## carregou serviço CustomCard\"); \n service.deleteCard(companyId, cardId); \n}\n```\n\n### onApplyDocumentPrintProperties" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento é chamado ao realizar a impressão de documentos que utilizam variáveis de cópia controlada. Onde será possível alterar ou obter o valor das variáveis disponibilizadas para este evento que podem ser consultadas em [Impressão de Cópia controlada](http://tdn.totvs.com/x/F5MbCQ).\n\nÉ necessário que a opção **Atualiza propriedades de cópia controlada?** esteja habilitada nas propriedades do documento.\n\n**Exemplo:**\n\n```\nfunction onApplyDocumentPrintProperties(fields) {\n // Exemplo implementação\n log.info(fields.get(\"Document.PrintedDocument.Copies\"));//consultando o valor da variável \n fields.put(\"Document.PrintedDocument.Copies\", \"2\");//alterando o valor da variável\n}\n```\n\nSão disponibilizados os seguintes parâmetros de consulta:\n\n| Parâmetro | Descrição |\n| --- | --- |\n| WKUser | Usuário logado |\n| WKUserLocale | Local do usuário |\n| WKCompany | Id do tenant atual |\n| WKNumAcess | Número de acessos ao documento |\n| WKComments | Comentários do documento |\n| WKAuthor | Autor do documento |\n| WKCreateDate | Data de criação do documento |\n| WKDescription | Descrição do documento |\n| WKNumDocument | Número do documento |\n| WKNumParentDocument | Número do documento pai |\n| WKNumVersion | Numero da versão |\n| WKDocumentType | Tipo do documento |\n| WKExpirationDate | Data de expiração do documento |\n| WKExpires | Se documento expira ou não |\n| WKFileSize | Tamanho do documento |\n| WKKeyWord | Palavras chave do documento |\n| WKDocumentTypeId | Id do tipo do documento |\n| WKPrivateDocument | Indica se é documento privado |\n| WKSubject | Assunto do documento |\n| WKVolume | Id do volume do documento |\n\nPropriedades que são atualizadas quando o documento é **visualizado**:\n\n| Variável | Descrição | Formato |\n| --- | --- | --- |\n| Document.LevelN.ApproverM\\* | --- | |\n| Document.Author | Autor do documento | Matricula - Nome do autor |\n| Document.Comments | Comentários do documento | Texto |\n| Document.ID | Código do documento | Número |\n| Document.FirstVersionDate | Data da primeira versão | DD/MM/YYYY |\n| Document.LastUpdateDate | Data da última atualização | DD/MM/YYYY |\n| Document.CreationDate | Data de criação do documento | DD/MM/YYYY |\n| Document.ExpiresOn | Data de expiração do documento | DD/MM/YYYY |\n| Document.ApprovedOn | Data que o documento foi aprovado | DD/MM/YYYY |\n| Document.VersionDescription | Descrição da Versão/Revisão | Texto |\n| Document.Description | Descrição do documento | Texto |\n| Document.Active | Documento ativo | true ou false |\n| Document.Author.ID | Matricula do autor do documento | número |\n| Document.Publisher.ID | Matricula do publicador do documento | Número |\n| Document.Author.Name | Nome do autor do documento | Texto |\n| Document.Publisher.Name | Nome do publicador do documento | Texto |\n| Document.Approvers1 | Primeiro aprovador do nível 1 | Nome do aprovador |\n| Document.Publisher | Publicador do documento | Matricula - Nome do publicador |\n| Document.Revision | Revisão do documento | Número da Revisão |\n| Document.ApproversN | Segundo aprovador do nível 1 | Nome do aprovador |\n| Document.Tag | Tags do documento | Texto |\n| Document.Version | Versão do documento | Versão,Revisão |" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n### onApplyDocumentProtocolProperties" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento é chamado ao realizar a impressão com documento de protocolo. Onde será possível alterar ou obter o valor das variáveis disponibilizadas para este evento que podem ser consultadas em [Impressão de Cópia controlada](http://tdn.totvs.com/x/F5MbCQ).\n\n**Exemplo:**\n\n```\nfunction onApplyDocumentProtocolProperties(fields) {\n // Exemplo implementação \n log.info(fields.get(\"Document.PrintedDocument.Description\"));//consultando o valor da variável \n fields.put(\"Document.PrintedDocument.Description\", \"Descrição do documento\");//alterando o valor da variável\n}\n```\n\nSão disponibilizados os seguintes parâmetros de consulta:\n\n| Parâmetro | Descrição |\n| --- | --- |\n| WKUser | Usuário logado |\n| WKUserLocale | Local do usuário |\n| WKCompany | Id do tenant atual |\n| WKNumAcess | Número de acessos ao documento |\n| WKComments | Comentários do documento |\n| WKAuthor | Autor do documento |\n| WKCreateDate | Data de criação do documento |\n| WKDescription | Descrição do documento |\n| WKNumDocument | Número do documento |\n| WKNumParentDocument | Número do documento pai |\n| WKNumVersion | Numero da versão |\n| WKDocumentType | Tipo do documento |\n| WKExpirationDate | Data de expiração do documento |\n| WKExpires | Se documento expira ou não |\n| WKFileSize | Tamanho do documento |\n| WKKeyWord | Palavras chave do documento |\n| WKDocumentTypeId | Id do tipo do documento |\n| WKPrivateDocument | Indica se é documento privado |\n| WKSubject | Assunto do documento |\n| WKVolume | Id do volume do documento |\n\nPropriedades que são atualizadas quando o documento **protocolo** é **impresso:**\n\n| Variável | Descrição |\n| --- | --- |\n| Document.PrintDate | Data da impressão |\n| Document.PrintRequester | Requisitante/Solicitante |\n| Document.PrintedDocument.AreaResponsible | Responsável pela área |\n| Document.PrintedDocument.Description | Descrição do documento |\n| Document.PrintedDocument.Comments | Comentários do documento |\n| Document.PrintedDocument.VersionDescription | Descrição da Versão/Revisão |\n| Document.PrintedDocument.Tag | Tags do documento |\n| Document.DocumentNrDocumento | Número do documento |\n| Document.PrintedDocument.Version | Versão do documento |\n| Document.PrintedDocument.Revision | Revisão do documento |\n| Document.DestinationArea | Área |\n| Document.PrintedDocument.Publisher | Publicador do documento |\n| Document.PrintedDocument.VersionDescription1 | Descrição da versão do documento |\n| Document.PrintedDocument.VersionDescription2 | Continuação da descrição da versão do documento |\n| Document.PrintedDocument.VersionDescription3 | Continuação da descrição da versão do documento |" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n### onApplyDocumentPublishProperties" }, { "metadata": { "title": "Eventos de Documentos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos.md" }, "content": "Eventos de Documentos\n\n\nEste evento é chamado na publicação ou alteração de documentos. Onde será possível alterar ou obter o valor das variáveis disponibilizadas para este evento que podem ser consultadas em [Impressão de Cópia controlada](http://tdn.totvs.com/x/F5MbCQ).\n\n**Exemplo:**\n\n```\nfunction onApplyDocumentPublishProperties(fields) {\n // Exemplo implementação \n log.info(fields.get(\"Document.Author \"));//consultando o valor da variável\n fields.put(\"Document.Author\", \"Autor do Documento\");//alterando o valor da variável\n}\n```\n\nSão disponibilizados os seguintes parâmetros de consulta:\n\n| Parâmetro | Descrição |\n| --- | --- |\n| WKUser | Usuário logado |\n| WKUserLocale | Local do usuário |\n| WKCompany | Id do tenant atual |\n| WKNumAcess | Número de acessos ao documento |\n| WKComments | Comentários do documento |\n| WKAuthor | Autor do documento |\n| WKCreateDate | Data de criação do documento |\n| WKDescription | Descrição do documento |\n| WKNumDocument | Número do documento |\n| WKNumParentDocument | Número do documento pai |\n| WKNumVersion | Numero da versão |\n| WKDocumentType | Tipo do documento |\n| WKExpirationDate | Data de expiração do documento |\n| WKExpires | Se documento expira ou não |\n| WKFileSize | Tamanho do documento |\n| WKKeyWord | Palavras chave do documento |\n| WKDocumentTypeId | Id do tipo do documento |\n| WKPrivateDocument | Indica se é documento privado |\n| WKSubject | Assunto do documento |\n| WKVolume | Id do volume do documento |\n\nPropriedades que são atualizadas quando o documento é **visualizado**:\n\n| Variável | Descrição | Formato |\n| --- | --- | --- |\n| Document.LevelN.ApproverM\\* | --- | |\n| Document.Author | Autor do documento | Matricula - Nome do autor |\n| Document.Comments | Comentários do documento | Texto |\n| Document.ID | Código do documento | Número |\n| Document.FirstVersionDate | Data da primeira versão | DD/MM/YYYY |\n| Document.LastUpdateDate | Data da última atualização | DD/MM/YYYY |\n| Document.CreationDate | Data de criação do documento | DD/MM/YYYY |\n| Document.ExpiresOn | Data de expiração do documento | DD/MM/YYYY |\n| Document.ApprovedOn | Data que o documento foi aprovado | DD/MM/YYYY |\n| Document.VersionDescription | Descrição da Versão/Revisão | Texto |\n| Document.Description | Descrição do documento | Texto |\n| Document.Active | Documento ativo | true ou false |\n| Document.Author.ID | Matricula do autor do documento | número |\n| Document.Publisher.ID | Matricula do publicador do documento | Número |\n| Document.Author.Name | Nome do autor do documento | Texto |\n| Document.Publisher.Name | Nome do publicador do documento | Texto |\n| Document.Approvers1 | Primeiro aprovador do nível 1 | Nome do aprovador |\n| Document.Publisher | Publicador do documento | Matricula - Nome do publicador |\n| Document.Revision | Revisão do documento | Número da Revisão |\n| Document.ApproversN | Segundo aprovador do nível 1 | Nome do aprovador |\n| Document.Tag | Tags do documento | Texto |\n| Document.Version | Versão do documento | Versão,Revisão |\n\n# Desenvolvimento de Eventos JMS\n\n---\n\nO TOTVS Fluig Plataforma suporta o desenvolvimento de eventos JMS, permitindo criar procedimentos de auditoria com base nas informações fornecidas pelo produto. O JMS (Java Message Service) é uma API Java™ que provê uma conexão assíncrona entre aplicações por meio de troca de mensagens.\n\nO produto dispara um tipo de mensagem JMS personalizável, o **wdkDocument**. O **wdkDocument** será acionado quando houver manipulação nos documentos da plataforma.\n\nPara a aplicação receber a mensagem com as informações do documento, a classe tem que estender o *MessageListener* e ter a seguinte linha:\n\n```\n@MessageDriven(mappedName = \"custom/DocumentListener\", activationConfig = {\n@ActivationConfigProperty(propertyName = \"destinationType\", propertyValue = \"javax.jms.Topic\"),\n@ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"topic/wdkDocument\")})\n```\n\nO objeto de retorno será um *MapMessage* que conterá os seguintes parâmetros:\n\n- **event (String):** Informa qual o tipo de evento que foi efetuado com o documento, conforme a tabela abaixo:\n\n| Evento | Descrição |\n| --- | --- |\n| PUBLISH | Um novo documento publicado |\n| MODIFY | Documento é modificado |\n| DELETE | Documento é excluído da base de dados |\n| SENDRECYCLE | Documento é enviado para lixeira |\n| DELETEFOLDER | Uma pasta é excluída da base de dados |\n| EXTERNALCONVERTION | Documento com conversão customizada |\n| CONVERTIONLONGTERM | Documento convertido para longo prazo |\n| MOVE | Um ou mais documento ou pastas foram movidos de uma pasta para outra |\n| RESTORERECYCLE | Restaura documentos e pastas da Lixeira |\n\n- **companyId (Integer):** Código da empresa em que o documento foi manipulado.\n- **colleagueId (String):** Usuário que efetuou a ação.\n- **documentId (Integer):** Código do documento que sofreu a ação.\n- **version (Integer):** Número da versão do documento.\n- **lhasCreatedDocument (Boolean):** Informa se criou o documento.\n- **IhasIncreasedVersion (Boolean):** Informa se foi incrementada a versão.\n- **changedApproval (Boolean):** Informa se o aprovador foi modificado.\n- **documento (byte[ ]):** Array de bytes com o documento e suas propriedades." }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n\n## Índice" }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n\n- 1 [Objetivo](#EventosdeFormulário-Objetivo)\n- 2 [Pré-requisitos](#EventosdeFormulário-Pré-requisitos)\n- 3 [Como criar eventos de formulário](#EventosdeFormulário-Comocriareventosdeformulário)\n- 4 [LOGs](#EventosdeFormulário-LOGs)\n - 4.1 [log.info](#EventosdeFormulário-log.info)\n - 4.2 [log.warn](#EventosdeFormulário-log.warn)\n - 4.3 [log.debug](#EventosdeFormulário-log.debug)\n - 4.4 [log.error](#EventosdeFormulário-log.error)\n - 4.5 [log.dir](#EventosdeFormulário-log.dir)\n- 5 [Eventos](#EventosdeFormulário-Eventos)\n - 5.1 [beforeProcessing](#EventosdeFormulário-beforeProcessing)\n - 5.2 [displayFields](#EventosdeFormulário-displayFields)\n - 5.3 [enableFields](#EventosdeFormulário-enableFields)\n - 5.3.1 [Protegendo campos desabilitados](#EventosdeFormulário-Protegendocamposdesabilitados)\n - 5.4 [inputFields](#EventosdeFormulário-inputFields)\n - 5.5 [validateForm](#EventosdeFormulário-validateForm)\n - 5.6 [afterSaveNew](#EventosdeFormulário-afterSaveNew)\n - 5.7 [afterProcessing](#EventosdeFormulário-afterProcessing)\n - 5.8 [beforeMovementOptions](#EventosdeFormulário-beforeMovementOptions)\n - 5.9 [beforeSendValidate](#EventosdeFormulário-beforeSendValidate)\n - 5.10 [setEnable](#EventosdeFormulário-setEnable)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é descrever os eventos de formulários avançados no fluig, abordando criar validações e manipulações do seu formulário.\n\n# Pré-requisitos\n\n---\n\nAntes de iniciar, é importante que leia a documentação sobre [Desenvolvimento de Formulários](../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários.md) e, durante a leitura você vai sentir a necessidade de entender um pouco mais sobre o parâmetro *form* ([FormController](../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md))\n\n# Como criar eventos de formulário\n\n---\n\nApós a criação de uma definição de formulário é possível realizar a criação de scripts para customização. O eventos para formulários são criados conforme passos a seguir:\n\n- Para a criação de um script de formulário no fluig, na visão *Explorador de pacotes* *(Package Explorer)* deve-se acessar a pasta *forms* do projeto fluig, clicar com o botão direito e no menu acessar *Novo (New) > Outras (Other).*\n\n ![](..\\..\\..\\images\\formulario%20fluig.png)\n\n**Figura 5 - Criação de script evento da definição de formulário.**\n\n- Abra a pasta Fluig e selecione a opção *Script Fluig* e clique no botão *Avançar* *(Next > )*.![](..\\..\\..\\images\\scrpt%20fluig.png)\n\n**Figura 6 - Criação de script evento da definição de formulário.**\n\n- Selecione o tipo e clique em *Avançar (Next >)*.\n\n![](..\\..\\..\\images\\novo%20script.png)\n\n- Nesta tela é necessário informar os campos pertinentes ao evento que se deseja adicionar e clicar no botão**Concluir**.\n\nApós a criação de uma definição de formulário é possível realizar a criação de scripts para customização. O eventos para formulários são criados conforme os passos abaixo.\n\n- Para a criação de um script de formulário no Fluig, na visão **Explorador de pacotes (Package Explorer)** deve-se acessar a pasta forms do projeto fluig, clicar com o botão direito e no menu acessar **Novo (New) > Outras (Other)**.\n- Abra a pasta Fluig, selecione a opção **Script Fluig** e clique no botão **Avançar (Next >)**.\n- Selecione o tipo e clique em **Avançar (Next >)**.\n\n![](..\\..\\..\\images\\image2013-9-23%20104152.png)\n\n**Figura 7 - Criação de script evento da definição de formulário.**\n\n- No exemplo selecionamos o evento *validateForm*, e o relacionamos a definição de formulário *form\\_exemplo\\_fluig*.\n\n![](..\\..\\..\\images\\image2013-9-23%20104323.png)\n\n**Figura 8 - Criação de script evento da definição de formulário.**\n\n- Ao concluir a estrutura principal do método estará disponível no editor.\n\n![](..\\..\\..\\images\\image2013-9-23%20104438.png)\n\n**Figura 9 - Criação de script evento da definição de formulário.**\n\n- Configure seu script. Para entender mais sobre os eventos e algumas dicas continue lendo essa documentação\n\n![](..\\..\\..\\images\\image2013-9-23%20104556.png)\n\n**Figura 10 - Criação de script evento da definição de formulário.**\n\n# LOGs\n\n---\n\nUma das funções mais importantes para entender o que está acontecendo no código e rastreamento futuro é o log. Tanto em eventos de formulário, eventos de processo, datasets, o fluig permite fazer log em quatro níveis:" }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n## log.info\n\nUsado para apresentar alguma mensagem de rastreamento do código ou dos campos\n\n```\nlog.info(“Testando o log info”);\n```\n\n```\nlog.info(“O campo código contém o valor: ” + form.getValue(\"codigo\"));\n```\n\n## log.warn\n\n---\n\nUsado para indicar algum ponto de atenção ou problema eminente no código\n\n```\nif (form.getValue(\"codigo\") == \"\") {\n log.warn(“O campo código está em branco e pode apresentar problemas com as integrações”);\n}\n```\n\n## log.debug\n\n---\n\nOs logs, se não usados com moderação, podem mais atrapalhar do que ajudar. Por isso, caso necessário, algumas informações podem ser utilizadas como debug, que são ativas somente quando o usuário realmente ver elas\n\n```\nlog.debug(\"verificando o conteúdo do campo código\")\nif (form.getValue(\"codigo\") == \"\") {\n log.debug(\"o campo código está em branco\");\n} else {\n log.debug(\"o campo código está preenchido: \" + form.getValue(\"codigo\"));\n}\n```\n\n## log.error\n\n---\n\nUsado para imprimir um log de erro\n\n```\nif (form.getValue(\"codigo\") == \"\") {\n log.error(\"O campo código não foi preenchido\");\n throw \"Preencha o campo código\";\n}\n```\n\n## log.dir\n\n---\n\nEste log não é um tipo diferente, na verdade é um log.info turbinado. Serve para fazer o log de objetos mais complexos que simples strings\n\n```\nvar objeto = {'codigo': form.getValue(\"codigo\"), 'nome': form.getValue(\"nome\")};\nlog.dir(objeto);\n```\n\n# Eventos\n\n---\n\nOs eventos de formulários são um conjunto de scripts carregados pela API de Formulários, os quais são desenvolvidos utilizando Javascript e são chamados durante a execução de ação em formulários ou em momentos específicos de interação em formulários.\n\n## beforeProcessing" }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n\n---\n\nEsse evento é o primeiro a ser disparado. Ocorre antes de qualquer outro evento da definição de formulário. O evento recebe como parâmetro um objeto do tipo [FormController](../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md).\n\nNeste contexto, o FormControler deve ser usado apenas para consulta de dados, alterações nos dados não serão persistidas.\n\n```\nfunction beforeProcessing(form){\n}\n```\n\nNo contexto deste evento a variável *form* pode ser usada somente para consulta aos campos da definição de formulário, seus valores e estado de apresentação.\n\n## displayFields" }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n\n---\n\nEsse evento é disparado no momento em que os objetos do formulário são apresentados. O evento recebe como parâmetro um objeto do tipo [FormController](../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md) e um parâmetro *customHTML* que serve para personalizar e inserir dados diretamente do servidor no formulário.\n\nEsse evento pode ser utilizado para alterar os valores a serem apresentados no campo do formulário e é o único que permite a alteração antes da renderização. Para isto basta usar o seguinte procedimento:\n\n**Ao modificar um registro, preenche o campo com o valor 1**\n\n```javascript\nfunction displayFields(form, customHTML) {\n if ( form.getFormMode() == “MOD” ) {\n form.setValue('RNC_colab_abertura', new java.lang.Integer(1));\n }\n}\n```\n\nVocê pode também ocultar campos pelo nome ou pelo id:\n\n```javascript\nfunction displayFields(form, customHTML) { \n form.setVisible(\"campoA\", false);\n form.setVisibleById(\"linha___1\", false);\n}\n```\n\nOutras funções interessantes que podem ser usados neste evento são:\n\n- Para visualizar o formulário no formato original com os campos desabilitados, deve-se utilizar o método *setShowDisabledFields*.\n\n- Para habilitar ou desabilitar o botão de excluir nas linhas do formulário filho, que por padrão é habilitado, deve-se utilizar o método *setHideDeleteButton*.\n\n- Para ocultar o os botões*Imprimir*e *Imprimir em nova Janela*,deve-se utilizar o método *setHidePrintLink*.\n\n| Sem customizações | Com customização |\n| --- | --- |\n| | ```function displayFields(form, customHTML) { form.setShowDisabledFields(true); form.setHidePrintLink(true); } ``` |\n| comdelete.png | ``` function displayFields(form, customHTML) { form.setHideDeleteButton(false); } ``` |\n\nFormulário funcional com exemplos de utilização de***setVisible*,***setVisibleById***, setHideDeleteButton e setHidePrintLink****:****\n\n**Formulário - Clique para expandir** Expandir origem\n\n```\n\n\n \n \n \n\n\n
\n
\n

Ao Salvar escolha o que ocultar ao salvar o formulário

\n

\n

\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n


\n
\n

\n

Tabela de registros

\n \n \n \n \n \n \n \n \n \n \n \n \n \n
NM
\n

\n

\n Lorem Ipsum: Proin eget purus non mauris vehicula aliquam vitae sed est\n
\n
\n
\n\n\n```javascript\n\n**displayFields.js - Clique para expandir** Expandir origem\n\n```\n function displayFields(form,customHTML){\n var ocultarTodaTabela = form.getValue(\"ocultarTabela\") == \"on\"; // Ocultar toda tabela\n var ocultarCampoA = form.getValue(\"ocultarCampoA\") == \"on\"; // Ocultar campo A\n var ocultarCampoN1 = form.getValue(\"ocultarCampoN1\") == \"on\"; // Ocultar campo N da primeira linha\n var ocultarCampoM2 = form.getValue(\"ocultarCampoM2\") == \"on\"; // Ocultar campo M da segunda linha\n var ocultarLinha1 = form.getValue(\"ocultarLinha1\") == \"on\"; // Ocultar linha 1\n var ocultarExclusao = form.getValue(\"ocultarExclusao\") == \"on\"; // Ocultar botão de excluir\n var ocultarImpressao = form.getValue(\"ocultarImpressao\") == \"on\"; // Ocultar botão de imprimir\n var ocultarLoremIpsum = form.getValue(\"ocultarLoremIpsum\") == \"on\"; // Ocultar a div Lorem Ipsum\n if ( ocultarTodaTabela ) {\n form.setVisibleById(\"minhaTabela\", false); // bloqueia o campo, tabela ou div cujo id seja \"minhaTabela\"\n }\n if ( ocultarCampoA ) {\n form.setVisible(\"campoA\", false); // bloqueia o campo com name \"campoA\"\n }\n if ( ocultarCampoN1 ) {\n form.setVisible(\"campoN___1\", false); // bloqueia o campo com name \"campoN___1\"\n }\n if ( ocultarCampoM2 ) {\n form.setVisible(\"campoM___2\", false); // bloqueia o campo com name \"campoM___2\"\n }\n if ( ocultarLinha1 ) {\n form.setVisibleById(\"linha___1\", false); // bloqueia o campo, tabela ou div cujo id seja \"linha___1\"\n }\n if ( ocultarLoremIpsum ) {\n form.setVisibleById(\"loremIpsum\", false); // bloqueia o campo, tabela ou div cujo id seja \"loremIpsum\"\n }\n if ( ocultarExclusao ) {\n form.setHideDeleteButton(true); // bloqueia o botão de exclusão de linha\n }\n if ( ocultarImpressao ) {\n form.setHidePrintLink(true); // bloqueia botão de imprimir\n }\n}\n```javascript\n\nConforme explicado, o *customHTML* permite personalizar o formulário diretamente pelo método displayFields. Este exemplo, adaptado dos nos [Exemplos Avançados](../../Recurso de Processos (BPM).md)/Desenvolvimento de Workflow/Exemplos avançados.md), mostra como usar o displayFields para, no formulário, ter acesso ao modo de visualização, código do solicitante e número da atividade. Além de preencher alguns campos da solicitação com a data atual e o nome do solicitante:\n\n```\nfunction displayFields(form,customHTML){\n // getValue(\"WKNumState\"); -> Número da atividade atual de acordo com o diagrama\n var numeroAtividadeAtual = getValue(\"WKNumState\");\n\n /*\n * form.getFormMode();\n * ADD - Momento inicial do formulário antes de iniciar e/ou salvar o processo\n * MOD - Momento a qual os campos estão editavéis para o usuário modificar após iniciar e/ou salvar o processo\n * VIEW - Modo de visualização do formulário\n */\n var modoDeVisualizacaoDoFormulario = form.getFormMode();\n\n // getValue(\"WKUser\"); -> Retorno o código do usuário logado\n var codigoSolicitante = getValue(\"WKUser\");\n\n if (modoDeVisualizacaoDoFormulario != \"VIEW\") {\n if (numeroAtividadeAtual == Atividades.ZERO || numeroAtividadeAtual == Atividades.INICIO) { //Antes do processo ser iniciado ou salvo o número da primera ativade é 0\n form.setValue(\"codigoSolicitante\", codigoSolicitante);\n form.setValue(\"nomeSolicitante\", buscaNomeDeUsuarioPeloIdentificador(codigoSolicitante));\n form.setValue(\"dataSolicitacao\", retornaDataAtual());\n }\n }\n\n // Exemplo de injeção de javascript pelo evento de formulário displayFields\n customHTML.append(\"\");\n}\n\n/**\n* Função para retornar a data atual\n* @returns data atual\n*/\nfunction retornaDataAtual() {\n return (new java.text.SimpleDateFormat('dd/MM/yyyy')).format(new Date());\n}\n\n/**\n*\n* @param {*} codigoSolicitante\n* @returns retorno o nome do usuário\n*/\nfunction buscaNomeDeUsuarioPeloIdentificador(codigoSolicitante) {\n var constraint = DatasetFactory.createConstraint(\"colleaguePK.colleagueId\", codigoSolicitante , codigoSolicitante, ConstraintType.MUST);\n var dataset = DatasetFactory.getDataset(\"colleague\", null, [constraint], null);\n\n return dataset.getValue(0, \"colleagueName\");\n}\n```javascript\n\nPara que os dados sejam carregados e apresentados em tela, principalmente em dispositivos *mobile*, é necessário chamar as funções que irão carregá-los dentro de uma estrutura de *read*.\n\nA invocação dos métodos que irão popular o formulário deve estar contida dentro de uma chamada $(function(), garantindo assim o carregamento dos arquivos exigidos pelo formulário antes das funções.\n\nPor exemplo, deseja-se carregar dados de produtos em um formulário. Para que isto ocorra, foi criada uma função *loadProdutos()* que irá preencher um *grid* inserido no formulário HTML. Neste caso a chamada desta função dentro do *displayFields* ficaria:\n\n```\ncustomHTML.append('');\n```\n\nMas, exceto em situações onde há mais coisas no *customHTML* que justifiquem isso, o mais recomendado é que você faça isso dentro dos próprios scripts javascript do formulário" }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n## enableFields" }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n\n---\n\nEsse evento é disparado no momento em que os objetos do formulário são habilitados. O evento recebe como parâmetro um objeto do tipo [FormController](../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md).\n\n**Exemplo de como tornar campo desativado conforme o modo do formulário**\n\n```\n function enableFields(form) {\n if ( form.getFormMode() != 'ADD' ){ \n form.setEnabled(\"rnc_area\",false);\n form.setEnabled(\"rnc_tipo_ocorrencia\",false);\n }\n}\n```\n\nOutra forma de desabilitar os campos é utilizando comandos JavaScript implementados diretamente em funções do formulário. Porém, neste caso, não é permitido utilizar a propriedade *disabled*, pois os campos não serão gravados ao salvar o registro de formulário. Para esta situação, deve-se utilizar a propriedade *readonly* conforme exemplo abaixo:\n\n```\ndocument.forms['nomeForm'].nomeCampo.setAttribute('readonly',true);\n```\n\nFique atento!\n\nMesmo utilizando a função **setEnable**, ainda existe a possibilidade de algum usuário conseguir visualizar informações do campo formulário oculto, utilizando de recursos como a ferramenta de inspeção de código dos navegadores.\n\nAtenção\n\nAo utilizar o evento *enableFields* para proteger os campos, é adicionado o caractere underline (\\_) nas propriedade **name** e **id**. Com isso as manipulações via JavaScript puro ou pela biblioteca *jQuery* não terão efeitos, devido a alteração destas propriedades:\n\nExemplo enableFields.js:\n\n```\nfunction enableFields(form) {\n var atividade = parseInt(getValue('WKNumState'));\n \n if(atividade == 0 || atividade == 4){\n form.setEnabled('loginsolicitante', false);\n }\n \n if(atividade == 5){\n form.setEnabled('nomesolicitante', false);\n }\n}\n```\n\nHTML:\n\n```\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n```\n\nResultado no navegador/console, onde o campo ***loginsolicitante** agora é \\_**loginsolicitante*** e o campo **nomesolicitante** permanece igual, pois a lógica implementada indica que será bloqueado na próxima movimentação:\n\n![](..\\..\\..\\images\\001.png)" }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n### **Protegendo campos desabilitados**\n\nAo proteger um campo desabilitado, ele não terá o seu valor alterado no registro de formulário. Para isso, informe o valor true para o parâmetro *protect* do método *setEnabled* conforme o exemplo abaixo:\n\n```\n function enableFields(form) { \n if ( form.getFormMode() != 'ADD' ){ \n form.setEnabled(\"rnc_cod_ocorrencia\",false, true);\n }\n}\n```\n\nTambém é possível utilizar o método *setEnhancedSecurityHiddenInputs*, que faz com que todos os campos desabilitados pelo método *setEnabled* fiquem protegidos:\n\n```\nfunction enableFields(form) { \n if ( form.getFormMode() != 'ADD' ){ \n\t\tform.setEnhancedSecurityHiddenInputs(true); \n form.setEnabled(\"rnc_cod_ocorrencia\",false);\n }\n}\n```\n\nAtenção!\n\nO método *setEnhancedSecurityHiddenInputs* só protegerá campos desabilitados após a sua execução no evento e quando o formulário estiver no contexto de uma execução de processo.\n\n## inputFields" }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n\n---\n\nEsse evento é disparado no momento em que os dados do formulário são passados para a BO responsável por formulário do fluig. O evento recebe como parâmetro uma referência ao formulário da definição de formulário. \n\n**Exemplo:**\n\n```\nfunction inputFields(form){\n}\n```\n\nAtenção!\n\nO evento *inputFields* não foi criado para ser utilizado na \"Movimentação em Bloco\", seu foco é o tratamento de campos que vem do navegador.\n\nEsse evento é disparado no momento em que os dados do formulário são passados para a BO responsável por formulário do fluig. O evento recebe como parâmetro um objeto do tipo [FormController](../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md). \n\nO getValue não é utilizado em evento de formulário inputFields.\n\nEste evento pode ser usado para que as datas persistidas por formulários customizados sejam salvas corretamente. Hoje no sistema as datas salvas através de formulários pelo navegador Chrome tem o padrão americano (yyyy-mm-dd), enquanto as datas nos demais navegadores tem o padrão brasileiro (dd/mm/yyyy). Para empresas que utilizam múltiplos navegadores e querem que os dados de data estejam padronizados, recomendamos a utilização do evento *inputFields* com o seguinte trecho de código.\n\n**Código para Datas**\n\n```\nfunction inputFields(form) { \n var regEx = /^\\d{4}-\\d{2}-\\d{2}$/; \n\n if (form.getValue(\"dt_solicitacao\").match(regEx)) { \n var split = form.getValue(\"dt_solicitacao\").split('-'); \n form.setValue(\"dt_solicitacao\", split[2] + '-' + split[1] + '-' + split[0]); \n } \n}\n```\n\n## validateForm" }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n\n---\n\nEsse evento é disparado antes da gravação dos dados do formulário. O evento recebe como parâmetro um objeto do tipo [FormController](../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md).\n\nEle é utilizado para fazer validações nos campos.\n\n**Exemplo da validação do campo de formulário**\n\n```\nfunction validateForm(form) {\n if (form.getValue('RNC_colab_abertura') == null){\n throw \"O colaborador de abertura não foi informado\";\n } \n}\n```\n\n**Exemplo da validação do campo de formulário com mensagem com quebra de linha**\n\n```\nfunction validateForm(form) {\n if (form.getValue('RNC_colab_abertura') == null){\n throw \"O colaborador de abertura não foi informado\\nFavor preencher o campo e tentar novamente\";\n } \n}\n```\n\n## afterSaveNew\n\n---\n\nEsse evento é disparado após a criação de um formulário. O evento recebe como parâmetro um objeto do tipo [FormController](../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md).\n\nEste evento pode ser feito para criar algum tipo de log ou disparar algum evento:\n\n**Exemplo de uso para imprimir log**\n\n```\nfunction afterSaveNew(form) {\n log.info(\"Colaborador de abertura: \" + form.getValue(\"RNC_colab_abertura\"));\n}\n```\n\n## afterProcessing\n\n---\n\nEste é último evento disparado no formulário. O evento recebe como parâmetro um objeto do tipo [FormController](../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md).\n\nNeste contexto, o FormControler deve ser usado apenas para consulta de dados, alterações nos dados não serão persistidas. Assim como o *afterSaveNew* pode ser usado para log ou disparo de algum tipo de evento.\n\n```\nfunction afterProcessing(form){\n}\n```\n\n## beforeMovementOptions" }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n\n---\n\nDiferentemente dos outros eventos que precisam de um script próprio e são executados no servidor, este evento acontece ao clicar em \"enviar\" no navegador antes de abrir a tela de movimentação. Por isso, esse código deve ser implementado em um arquivo javascript vinculado ao formulário html. Ele recebe o parâmetro da atividade atual e é muito útil para algumas validações de campos antes mesmo de ser enviado para o servidor.\n\n**Exemplo de implementação em um arquivo.js**\n\n```\n var beforeMovementOptions = function(numState) {\n if (document.form.codigo.value == '') {\n throw (\"Erro: O código não foi preenchido\");\n }\n return true;\n }\n```\n\nFique atento!\n\nEste método só é executado caso haja a abertura da tela de movimentação, o que leva em consideração se há mais de uma atividade destino ou o mecanismo de atribuição da próxima tarefa. E também não é considerada em movimentações via api, ou diretamente no formulário pela navegação de documento. Utilize o validateForm em conjunto com esse método para garantir a integridade das validações\n\n## beforeSendValidate" }, { "metadata": { "title": "Eventos de Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270924158", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário.md" }, "content": "Eventos de Formulário\n\n\n---\n\nAssim como beforeMovementOptions, este evento acontece ao clicar em \"enviar\" no navegador para executar a movimentação em si. Ou seja, depois do *beforeMovementOptions* e independente da tela de seleção de atividade/usuário destino.\n\nEsse código deve ser implementado em um arquivo javascript vinculado ao formulário html. Ele recebe o parâmetro da atividade atual e da atividade destino (ou seja, pra qual atividade está sendo enviado essa solicitação) e é muito útil para algumas validações de campos antes mesmo de ser enviado para o servidor.\n\nOcorre antes da solicitação ser movimentada, após já ter sido selecionada a atividade destino o usuário e demais informações necessárias à solicitação.\n\n**Exemplo de implementação em um arquivo.js**\n\n```\n var beforeSendValidate = function(numState, nextState) {\n if (numState == 1 && nextState == 2 && document.form.codigo.value == '') {\n throw (\"Erro: Para movimentar para a atividade 2, o código deve ser preenchido\");\n }\n return true;\n }\n```\n\n## setEnable\n\n---\n\nEste evento está depreciado e não é mais utilizado." }, { "metadata": { "title": "Eventos de Notificação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=200906235", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Notificação.md" }, "content": "Eventos de Notificação\n\n\n# Índice\n\n- 1 [Objetivo](#EventosdeNotificação-Objetivo)\n- 2 [Pré-requisitos](#EventosdeNotificação-Pré-requisitos)\n- 3 [Eventos](#EventosdeNotificação-Eventos)\n - 3.1 [Passos de implementação](#EventosdeNotificação-Passosdeimplementação)\n\n# Objetivo\n\n---\n\nNeste guia será apresentada a configuração de um *widget* desenvolvido sobre a plataforma e um evento de notificação.\n\n# Pré-requisitos\n\n---\n\nConhecimento prévio em determinados pontos, sendo estes:\n\n- Visão geral sobre a plataforma fluig\n- [Desenvolvimento de eventos](../Desenvolvimento de Eventos.md)\n\n# Eventos\n\n---\n\nNo repositório [samples](http://git.fluig.com/projects/SAMPLES) está disponível o [sample-notification-event](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/event-notification) que contém o projeto [poster-custom-priority](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/event-notification/poster-custom-priority).\n\nEsse projeto disponibiliza um *widget* desenvolvido sobre a plataforma para postagem, definindo a notificação, um *dataset* personalizado que é utilizado no *widget* e um evento *beforeSendNotification* que considera o campo metadata da notificação para definir a nova prioridade da notificação.\n\nVale observar que a notificação não tem sua prioridade alterada automaticamente apenas enviando um parâmetro no *customData*, é preciso personalizar o evento *beforeSendNotification* para isso.\n\n## Passos de implementação" }, { "metadata": { "title": "Eventos de Notificação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=200906235", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Notificação.md" }, "content": "Eventos de Notificação\n\n\n---\n\nA seguir são apresentados os passos para implementar essa customização:\n\n- Faça o *download* do projeto [poster-custom-priority](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/event-notification/poster-custom-priority). \n\n ![](..\\..\\..\\images\\sample%20download.png)\n\n**Figura 1 - *Download* do projeto**\n\n- Importe o projeto para o TDS.\n\n![](..\\..\\..\\images\\import%20tds.png)\n\n**Figura 2 - Importação do projeto**\n\n- Exporte o evento *beforeSendNotification*.\n\n![](..\\..\\..\\images\\TDS%20EVENTO.png)\n\n**Figura 3 - Exportação do evento**\n\n- Exporte o *dataset* comunidadesPoster. \n Obs.: o nome do *dataset* na exportação deve ser **comunidadesPoster**. \n **![](..\\..\\..\\images\\TDS%20DATASET.png)**\n\n**Figura 4 - Exportação do *dataset***\n\n- Exporte o *widget* **custom\\_poster**.  \n Obs.: o **custom\\_poster** não é uma extensão da *socialposter*. \n **![](..\\..\\..\\images\\WIDGET%20TDS.png)**\n\n**Figura 5 - Exportação do *widget***\n\n- Edite a página de uma comunidade e adicione o **custom\\_poster** nela, removendo o *widget* de publicação antiga.\n\n![](..\\..\\..\\images\\custom%20na%20comunidade.png)\n\n**Figura 6 - Inclusão do *widget* na página**\n\n- Realize uma publicação selecionando a prioridade **Não enviar**.  \n Obs.: nesse caso não deve ser gerada nenhuma notificação, caso a prioridade escolhida seja alta, é possível verificar pela [API pública](http://api.fluig.com/resource_AlertServiceRest.html#path__alert_service_findAll.html) se a prioridade foi alterada. \n \n ![](..\\..\\..\\images\\nao%20enviar%20.png)\n\n**Figura 7 - Nova publicação**" }, { "metadata": { "title": "Eventos de Processos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos.md" }, "content": "Eventos de Processos" }, { "metadata": { "title": "Eventos de Processos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos.md" }, "content": "Eventos de Processos\n\n\n- 1 [Eventos](#EventosdeProcessos-Eventos)\n - 1.1 [afterReleaseProcessVersion](#EventosdeProcessos-afterReleaseProcessVersion)\n - 1.2 [afterReleaseVersion](#EventosdeProcessos-afterReleaseVersion)\n - 1.3 [beforeStateEntry](#EventosdeProcessos-beforeStateEntry)\n - 1.4 [beforeTaskCreate](#EventosdeProcessos-beforeTaskCreate)\n - 1.5 [afterTaskCreate](#EventosdeProcessos-afterTaskCreate)\n - 1.6 [afterStateEntry](#EventosdeProcessos-afterStateEntry)\n - 1.7 [beforeSendData](#EventosdeProcessos-beforeSendData)\n - 1.8 [validateAvailableStates](#EventosdeProcessos-validateAvailableStates)\n - 1.9 [beforeTaskSave](#EventosdeProcessos-beforeTaskSave)\n - 1.10 [afterProcessCreate](#EventosdeProcessos-afterProcessCreate)\n - 1.11 [beforeTaskComplete](#EventosdeProcessos-beforeTaskComplete)\n - 1.12 [afterTaskComplete](#EventosdeProcessos-afterTaskComplete)\n - 1.13 [beforeStateLeave](#EventosdeProcessos-beforeStateLeave)\n - 1.14 [afterStateLeave](#EventosdeProcessos-afterStateLeave)\n - 1.15 [onNotify](#EventosdeProcessos-onNotify)\n - 1.16 [checkComplementsPermission](#EventosdeProcessos-checkComplementsPermission)\n - 1.17 [subProcessCreated](#EventosdeProcessos-subProcessCreated)\n - 1.18 [afterProcessFinish](#EventosdeProcessos-afterProcessFinish)\n - 1.19 [beforeCancelProcess](#EventosdeProcessos-beforeCancelProcess)\n - 1.20 [afterCancelProcess](#EventosdeProcessos-afterCancelProcess)\n- 2 [Eventos de Formulário Pai Filho](#EventosdeProcessos-EventosdeFormulárioPaiFilho)\n - 2.1 [getChildrenFromTable](#EventosdeProcessos-getChildrenFromTable)\n - 2.2 [getChildrenIndexes](#EventosdeProcessos-getChildrenIndexes)\n- 3 [Eventos nas etapas dos processos](#EventosdeProcessos-Eventosnasetapasdosprocessos)\n - 3.1 [Liberar nova versão do processo](#EventosdeProcessos-Liberarnovaversãodoprocesso)\n - 3.2 [Salvar nova solicitação](#EventosdeProcessos-Salvarnovasolicitação)\n - 3.3 [Criar nova solicitação](#EventosdeProcessos-Criarnovasolicitação)\n - 3.4 [Visualizar solicitação](#EventosdeProcessos-Visualizarsolicitação)\n - 3.5 [Salvar solicitação](#EventosdeProcessos-Salvarsolicitação)\n - 3.6 [Movimentar solicitação](#EventosdeProcessos-Movimentarsolicitação)\n - 3.7 [Movimentar para subprocesso](#EventosdeProcessos-Movimentarparasubprocesso)\n - 3.8 [Finalizar solicitação](#EventosdeProcessos-Finalizarsolicitação)\n - 3.9 [Cancelar solicitação](#EventosdeProcessos-Cancelarsolicitação)\n\n# Eventos\n\n---\n\nOs eventos de um processo são um conjunto de *scripts* carregados pela API de *workflow*. Tais *scripts* são desenvolvidos com o uso da linguagem JavaScript e chamados ao longo da execução do processo em momentos predeterminados, como por exemplo a criação da solicitação do processo ou a entrada em uma nova atividade.\n\nA implementação dos eventos do processo é realizada pelo fluig Studio, sendo necessário já existir um projeto fluig com pelo menos um diagrama de processo.\n\nPara criar um novo evento do processo, clicar com o botão direito do *mouse* no projeto, acessar a opção *New* e, em seguida, a opção *Other*. No assistente aberto, selecionar a opção **\"*Script* evento *workflow*\",** presente na pasta fluig, e clicar no botão *Next*. Na nova tela, selecionar qual o evento que será criado e relacionar ele a um processo já existente. Para finalizar, clicar no botão *Finish*:\n\n \n\n![](..\\..\\..\\images\\evento-processo.png)" }, { "metadata": { "title": "Eventos de Processos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos.md" }, "content": "Eventos de Processos\n\n### afterReleaseProcessVersion\n\n---\n\nEvento disparado após a criação ou modificação nas configurações de um determinado processo.\n\nAtenção\n\nCaso o processo possua o evento \"afterReleaseVersion\" implementado, este evento global será desconsiderado na liberação de novas versões do processo em questão\n\n- Abaixo segue um exemplo de como implementar esse evento:\n\n```\nfunction afterReleaseProcessVersion(processXML){\n var pdv = getValue(\"ProcessDefinitionVersionDto\");\n var processInfo = \"\\n### Nova versão de processo liberada: ###\";\n processInfo += \"\\n User: \" + getValue(\"WKUser\"); \n processInfo += \"\\n processDescription: \" + pdv.getProcessDescription();\n processInfo += \"\\n processId: \" + pdv.getProcessId();\n processInfo += \"\\n version: \" + pdv.getVersion();\n log.info(processInfo + \"\\n\");\n}\n```\n\nSão disponibilizadas algumas propriedades referentes ao processo que esta sendo liberado, porém somente para consulta através do método getValue.\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| WKCompany | Código da empresa | long |\n| WKUser | Usuário logado | String |\n| ```ProcessDefinitionVersion ``` | Objeto com propriedades da versão do processo alterada | ``` ProcessDefinitionVersionDto ``` |\n\n### afterReleaseVersion\n\n---\n\nOcorre após a liberação de uma versão do processo.\n\n**Parâmetro:**\n\n| Descrição | Tipo |\n| --- | --- |\n| XML com a definição do processo | string |\n\n### beforeStateEntry" }, { "metadata": { "title": "Eventos de Processos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos.md" }, "content": "Eventos de Processos\n\n\n---\n\nOcorre antes da entrada em uma nova atividade.\n\nDica\n\nUtilize este evento para realizar validações que ocasionalmente possam resultar no bloqueio da movimentação do processo. Para suspender a movimentação e exibir uma mensagem de alerta para o usuário, utilize o comando 'throw', conforme exemplo abaixo:\n\nthrow \"Erro ao movimentar solicitação\";\n\nEste evento não retorna erros para a tela naturalmente. Caso ocorra um erro durante a execução do afterStateEntry, ele será ignorado. Se o mesmo erro resultar no encerramento da transação (por exemplo, causando o timeout de transação ou uma exceção que force Rollback) a mensagem de transação abortada será apresentada em tela ao invés do erro esperado.\n\n**Parâmetro:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Sequência da atividade | Integer |\n\n### beforeTaskCreate\n\n---\n\nOcorre antes que o usuário receba uma tarefa.\n\n```\nfunction beforeTaskCreate(colleagueId){\n \n // Impede que um determinado usuário assuma a tarefa\n if(colleagueId == \"Administrador2\" && getValue(\"takeTask\") == true) { \n throw \"Você não pode assumir esta tarefa\"; \n }\n}\n```\n\nEste evento não retorna erros para a tela naturalmente. Caso ocorra um erro durante a execução do afterStateEntry, ele será ignorado. Se o mesmo erro resultar no encerramento da transação (por exemplo, causando o timeout de transação ou uma exceção que force Rollback) a mensagem de transação abortada será apresentada em tela ao invés do erro esperado.\n\n**Parâmetro:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Matrícula do usuário | string |\n\n### afterTaskCreate\n\n---\n\nOcorre após o usuário receber uma tarefa.\n\n**Parâmetro:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Matrícula do usuário | string |\n\n### afterStateEntry" }, { "metadata": { "title": "Eventos de Processos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos.md" }, "content": "Eventos de Processos\n\n\n---\n\nOcorre após a entrada em uma nova atividade.\n\nEste evento não retorna erros para a tela naturalmente. Caso ocorra um erro durante a execução do afterStateEntry, ele será ignorado. Se o mesmo erro resultar no encerramento da transação (por exemplo, causando o timeout de transação ou uma exceção que force Rollback) a mensagem de transação abortada será apresentada em tela ao invés do erro esperado.\n\n**Parâmetro:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Sequência da atividade | Integer |\n\n**Exemplo - chamada do Dataset com varredura por colunas:**\n\n```\nvar datasetReturned = DatasetFactory.getDataset(\"Formuláriodelocal6\", null, null, null);\n\nlog.info(\"===============COLUNAS=======================\");\n\nlog.info(\"===============NOME COLUNAS=======================\");\n\nfor (var j = 0; j < datasetReturned.rowsCount; j++) {\n\ntry {\n\nlog.info(\"******** COLUMN ---->\" + datasetReturned.getColumnName(j));\n } catch (e) {\nlog.info(\"EEEEEEEEEEEEEEEEEE ->\" + e);\n }\n\n}\n```\n\n### beforeSendData\n\n---\n\nÉ o último evento a ser executado. Possui integração com Analytics, podendo enviar dados específicos de processos Workflow.\n\nEste evento não deve possuir lógicas desenvolvidas diretamente nele, pois o importador de dados do Analytics não interpreta lógicas (if e else, por exemplo) fazendo com que estas lógicas complexas não sejam processadas\n\nTodas as lógicas necessárias devem ser feitas nos eventos de processo, como BeforeStateEntry, deixando os valores que serão enviados para o Analytics corretos antes do envio.\n\nPara maiores detalhes sobre a utilização desse evento, acesse [Guia de Implementação Fluig Analytics](http://tdn.totvs.com/pages/viewpage.action?pageId=107381593#GuiadeImplantaçãoFluigAnalytics-EnviodosDados).\n\n### validateAvailableStates" }, { "metadata": { "title": "Eventos de Processos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos.md" }, "content": "Eventos de Processos\n\n\n---\n\nOcorre após montada a lista de tarefas disponíveis para o usuário a partir da tarefa atual.\n\n**Exemplo:**\n\n```\nfunction validateAvailableStates(iCurrentState, stateList) {\n // Código: 1 - Descrição: Atividade inicial\n // Código: 2 - Descrição: Atividade ordem 3\n // Código: 3 - Descrição: Atividade ordem 2\n // Código: 4 - Descrição: Atividade ordem 1\n \n // stateList atual: [2,3,4]\n \n var stateArray = new Array();\n \n if (iCurrentState == 1) {\n stateList.clear();\n stateArray.push(4,3,2);\n }\n \n stateArray.forEach(function(code) {\n stateList.add(new java.lang.Integer(code));\n });\n \n // stateList reordenado: [4,3,2]\n return stateList;\n}\n```\n\n**Parâmetro:**\n\n| Tipo | Descrição | Tipo |\n| --- | --- | --- |\n| iCurrentState | Sequência da atividade atual | Integer |\n| stateList | Lista das sequências das atividades | List |\n\n### beforeTaskSave\n\n---\n\nOcorre antes de salvar as informações selecionadas pelo usuário.\n\nEste evento não retorna erros para a tela naturalmente. Caso ocorra um erro durante a execução do afterStateEntry, ele será ignorado. Se o mesmo erro resultar no encerramento da transação (por exemplo, causando o timeout de transação ou uma exceção que force Rollback) a mensagem de transação abortada será apresentada em tela ao invés do erro esperado.\n\n**Parâmetros:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Usuário corrente | string |\n| Sequência da próxima atividade | Integer |\n| Lista de usuários destino | List |\n\n### afterProcessCreate\n\n---\n\nOcorre logo após a criação de um novo processo.\n\n**Parâmetro:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Número do novo processo | Integer |\n\n### beforeTaskComplete" }, { "metadata": { "title": "Eventos de Processos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos.md" }, "content": "Eventos de Processos\n\n\n---\n\nOcorre antes que o usuário complete uma tarefa, porém as informações de próxima tarefa e usuários destino já foram salvas.\n\nObservação\n\nDiferente dos demais eventos do tipo before, este evento não dispara suas validações ao servidor, fazendo com que o sistema não pare a movimentação da atividade quando o mesmo lança uma exceção.\n\n**Parâmetros:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Usuário corrente | string |\n| Seqüência da próxima atividade | Integer |\n| Lista de usuários destino | List |\n\n### afterTaskComplete\n\n---\n\nOcorre após o usuário completar uma tarefa, porém as informações de próxima tarefa e usuários destino já foram salvas.\n\n**Parâmetros:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Usuário corrente | string |\n| Seqüência da próxima atividade | Integer |\n| Lista de usuários destino | List |\n\n### beforeStateLeave\n\n---\n\nOcorre antes da saída de uma atividade.\n\n**Parâmetro:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Seqüência da atividade | Integer |\n\n### afterStateLeave\n\n---\n\nOcorre após a saída de uma atividade.\n\n**Parâmetro:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Seqüência da atividade | Integer |\n\n### onNotify\n\n---\n\nSe refere a um evento global que ocorre após a movimentação da solicitação e antes de enviar as notificações.\n\nPara mais detalhes consulte a página [Desenvolvimento de eventos - On Notify](http://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos#DesenvolvimentodeEventos-OnNotify).\n\n### checkComplementsPermission" }, { "metadata": { "title": "Eventos de Processos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos.md" }, "content": "Eventos de Processos\n\n\n---\n\nAtravés dele é possível determinar se o usuário corrente do processo poderá ou não adicionar complementos mesmo com permissionamento ligado na modelagem do processo. Este evento possui acesso a todas as propriedades dos processos workflow (quando disponíveis) bem como acesso a hAPI, FLUIG e seus métodos.\n\nO exemplo abaixo irá procurar o usuário corrente no dataset de colleagueGroups. Caso o usuário não esteja neste grupo não será possível para este usuário adicionar complementos extras.\n\n```\nfunction checkComplementsPermission() {\n var user = getValue(\"WKUser\");\n var company = getValue(\"WKCompany\");\n var group = \"Auditoras\";\n var Id = DatasetFactory.createConstraint('colleagueGroupPK.colleagueId',\n user, user, ConstraintType.MUST);\n var group = DatasetFactory.createConstraint('colleagueGroupPK.groupId',\n group, group, ConstraintType.MUST);\n var company = DatasetFactory.createConstraint('colleagueGroupPK.companyId',\n company, company, ConstraintType.MUST);\n var colleagueGroup = DatasetFactory.getDataset('colleagueGroup', null,\n new Array(Id, group, company), null);\n if (colleagueGroup != null && colleagueGroup.getRowsCount() == 1) {\n return true;\n } else {\n return false\n }\n \n}\n```\n\nAtenção\n\n- Este evento não será executado na abertura de solicitação. O evento não impede o responsável de adicionar anexos e observações antes mesmo da solicitação ser aberta (possuir código de solicitação).\n- O evento checkComplementsPermission não permite oferecer permissões adicionais na edição de complementos em relação as permissões definidas na configuração do processo. Por este é evento é possível apenas restringir mais especificamente as permissões de adição de complementos. Se via configuração do processo determinado usuário não consegue adicionar anexos não é possível que este evento forneça permissão para este usuário.\n\n### subProcessCreated" }, { "metadata": { "title": "Eventos de Processos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos.md" }, "content": "Eventos de Processos\n\n\n---\n\nOcorre quando um sub-processo é criado.\n\n**Parâmetro:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Número do sub-processo | Integer |\n\n### afterProcessFinish\n\n---\n\nOcorre após finalizada a solicitação.\n\n**Parâmetro:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Número do processo | Integer |\n\n### beforeCancelProcess\n\n---\n\nOcorre antes do cancelamento da solicitação.\n\n**Parâmetros:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Usuário corrente | string |\n| Número do processo | Integer |\n\n### afterCancelProcess\n\n---\n\nOcorre após o cancelamento da solicitação. É recomendado não disparar exceções neste método, pois o cancelamento já foi realizado.\n\n**Parâmetros:**\n\n| Descrição | Tipo |\n| --- | --- |\n| Usuário corrente | string |\n| Número do processo | Integer |\n\n# Eventos de Formulário Pai Filho\n\n---\n\n### **getChildrenFromTable**\n\n---\n\nEsse evento retorna um mapa com todos os campos filhos de um Pai Filho a partir do seu *tablename*.\n\n### **getChildrenIndexes**\n\n---\n\nEsse evento retorna os índices dos registros (linhas) contidos em um Pai Filho a partir do seu *tablename*.\n\nQuando utilizado em processos será necessário acessar a hAPI.\n\n**Exemplo**:\n\n```\nvar indexes = hAPI.getChildrenIndexes(\"itens\");\n var total = 0;\n for (var i = 0; i < indexes.length; i++) {\n var fieldValue = parseInt(hAPI.getCardValue(\"descricao___\" + indexes[i]));\n if (isNaN(fieldValue)){\n fieldValue = 0;\n }\n total = total + fieldValue;\n }\n```\n\nSaiba mais\n\nImportante ressaltar que só será possível recuperar os dados após salvo, ou seja, somente nos eventos After.\n\nPara saber mais detalhes sobre os eventos de formulário Pai Filho, acesse a documentação [Eventos de Formulário](http://tdn.totvs.com/x/fvklE).\n\n# Eventos nas etapas dos processos\n\n### Liberar nova versão do processo\n\n---\n\nQuando liberar uma nova versão do processo configurado, o evento executado será:\n\n- afterReleaseVersion\n\n![](..\\..\\..\\images\\image2016-12-26%20143513.png)\n\n### Salvar nova solicitação" }, { "metadata": { "title": "Eventos de Processos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos.md" }, "content": "Eventos de Processos\n\n\n---\n\nQuando iniciar uma solicitação pelo menu Processos, é evento executado será:\n\n- validateAvailableState\n\nAcionando o botão Salvar da solicitação, os eventos executados são:\n\n- beforeStateEntry\n- beforeTaskCreate\n- afterTaskCreate\n- afterStateEntry\n- beforeSendData\n- validateAvailableStates\n- beforeTaskSave\n- afterTaskSave\n- afterProcessCreate\n\n![](..\\..\\..\\images\\image2016-12-26%20161215.png)\n\n### Criar nova solicitação\n\n---\n\nQuando iniciar uma solicitação pelo menu Processos, é evento executado será:\n\n- validateAvailableStates\n\nApós criada a solicitação e acionado o botão Enviar, os eventos executados serão:\n\n- beforeStateEntry\n- beforeTaskCreate\n- afterTaskCreate\n- afterStateEntry\n- beforeSendData\n- validateAvailableStates\n- beforeTaskSave\n- afterTaskSave\n- beforeTaskComplete\n- afterTaskComplete\n- beforeStateLeave\n- afterStateLeave\n- afterProcessCreate\n- onNotify\n\n![](..\\..\\..\\images\\image2016-12-26%20164615.png)\n\n### Visualizar solicitação\n\n---\n\nQuando acessar a Central de Tarefas, abrir uma solicitação já iniciada, os eventos executados serão:\n\n- validateAvailableStates\n- checkComplementsPermission\n\n### Salvar solicitação\n\n---\n\nQuando acionar o botão Salvar a solicitação, os eventos executados serão:\n\n- validateAvailableStates\n- beforeTaskSave\n- afterTaskSave\n\n![](..\\..\\..\\images\\image2016-12-27%2095732.png)\n\n### Movimentar solicitação\n\n---\n\nQuando movimentar a solicitação acionando o botão Enviar, os eventos executados serão:\n\n- validateAvailableStates\n- beforeTaskSave\n- afterTaskSave\n- beforeTaskComplete\n- afterTaskComplete\n- beforeStateLeave\n- afterStateLeave\n- beforeStateEntry\n- beforeTaskCreate\n- afterTaskCreate\n- afterStateEntry\n- beforeSendData\n- onNotify\n\n![](..\\..\\..\\images\\image2016-12-27%20102425.png)\n\n### Movimentar para subprocesso" }, { "metadata": { "title": "Eventos de Processos", "source": "https://tdn.totvs.com/display/fluig/Eventos+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos.md" }, "content": "Eventos de Processos\n\n\n---\n\nQuando movimentar a solicitação para subprocesso acionando o botão Enviar, os eventos executados serão:\n\n- validateAvailableStates\n- beforeTaskSave\n- afterTaskSave\n- beforeTaskComplete\n- afterTaskComplete\n- beforeStateLeave\n- afterStateLeave\n- beforeStateEntry\n- subProcessCreated\n- afterStateEntry\n- BeforeSendData\n- onNotify\n\n![](..\\..\\..\\images\\image2016-12-27%20103258.png)\n\n### Finalizar solicitação\n\n---\n\nQuando finalizar a solicitação acionando o botão Enviar, os eventos executados serão:\n\n- validateAvailableStates\n- beforeTaskSave\n- afterTaskSave\n- beforeTaskComplete\n- afterTaskComplete\n- beforeStateLeave\n- afterStateLeave\n- beforeStateEntry\n- afterStateEntry\n- afterProcessFinish\n- beforeSendData\n\n![](..\\..\\..\\images\\image2016-12-27%2010401.png)\n\n### Cancelar solicitação\n\n---\n\nQuando usuário acessar solicitação já iniciada na Central de Tarefas para Cancelamento, o evento executado será:\n\n- checkComplementsPermissions.\n\nQuando acionar o botão Cancelar Solicitação, os eventos executados serão:\n\n- beforeCancelProcess\n- afterCancelProcess\n- beforeSendData\n- onNotify\n\n![](..\\..\\..\\images\\image2016-12-27%20111017.png)" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\n- [Desenvolvimento de Eventos](#EventosGlobais-DesenvolvimentodeEventos)\n - [Eventos do tipo Before](#EventosGlobais-EventosdotipoBefore)\n - [Eventos do tipo After](#EventosGlobais-EventosdotipoAfter)\n- [Eventos Gerais Disponíveis](#EventosGlobais-EventosGeraisDisponíveis)\n- [Objetos utilizados nos eventos](#EventosGlobais-Objetosutilizadosnoseventos)\n - [Exemplo com usuário de aplicação](#EventosGlobais-Exemplocomusuáriodeaplicação)\n- [Atualização do Analytics](#EventosGlobais-AtualizaçãodoAnalytics)\n - [Exemplo de uso](#EventosGlobais-Exemplodeuso)\n\n---\n\nDiferentemente dos eventos de processo, documentos ou formulários — que são executados apenas para um item específico — os **eventos globais** são acionados sempre que uma ação geral é realizada na plataforma. Eles são executados automaticamente antes ou depois da ocorrência de determinadas ações, como aprovação de documentos, movimentação de processos ou publicação de comentários.\n\nEsses eventos podem ser personalizados por meio do [Motor de personalização do Fluig](../Documentação para desenvolvedores Fluig/Desenvolvimento de Processos/Motor de personalização/Motor de personalização Rhino.md) e permitem tratar ações tanto antes ***(before)*** quanto depois ***(after)*** da execução do evento.\n\n### SocialPostEventVO" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nVeja o exemplo em nosso repositório [aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse).\n\n# Desenvolvimento de Eventos\n\n---\n\nO desenvolvimento de eventos é realizado pela criação de scripts na linguagem “JavaScript”. O código de implementação de cada script é armazenado em banco de dados e dispensa o uso de quaisquer outros arquivos, como por exemplo, “custom.p”.\n\nAtenção\n\nPara que um usuário que não é administrador da empresa possa criar, importar, editar e remover eventos globais é necessário que ele possua a permissão **Configurar Eventos Globais**. Esta permissão pode ser concedida pelo administrador através do item **Permissões** disponível no agrupador **Pessoas** do **Painel de Controle**.\n\nSaiba como realizar esse procedimento [clicando aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=269431799).\n\nOs desenvolvimentos sobre a plataforma são feitos pelo administrador, a partir do Fluig Studio.\n\n**01.** Em Projeto Fluig, clique com o botão direito sobre a pasta ***events***e em seguida ***Novo** -> **Evento Global fluig*** conforme a imagem abaixo.\n\n![](..\\..\\..\\images\\image2013-9-19%20152928.png)\n\n**Figura 1 - Criação de evento - fluig Studio.**\n\n**02.** Em seguida informe o **Servidor** e **Nome** do Evento que será adicionado. Uma tela para edição do evento será aberta, conforme a imagem abaixo:\n\n![](..\\..\\..\\images\\image2013-9-19%20153341.png)\n\n**Figura 2 - Criação de evento - fluig Studio.**\n\nÉ possível observar também que o arquivo .js foi adicionado na pasta *events* do projeto.\n\nO Fluig permite utilizar o log de execução nos eventos desenvolvidos sobre a plataforma. Através da variável global **log** é possível obter o feedback da execução de cada evento. Existem quatro níveis de log, são eles:\n\n- **ERROR:** apresentação de erros.\n- **DEBUG:** depurar a execução.\n- **WARN:** informar possível problema de execução.\n- **INFO:** apresentação de mensagens.\n\nA apresentação de cada um dos tipos de log está condicionada a configuração do servidor de aplicação.\n\nEXEMPLO\n\n![](..\\..\\..\\images\\seta-direita.png) No servidor de aplicação, por padrão, as mensagens do tipo **info** e **warn** são apresentadas no console do servidor e as do tipo debug, error são apresentadas no arquivo de log. Abaixo um exemplo de uso do log em script:\n\n```\nlog.info(\"Testando o log info\");\n```\n\nTeríamos no console do servidor a mensagem “**Testando o log info**”.\n\nAtenção\n\n- A maioria dos eventos utiliza o parâmetro **WKUser** para identificar o usuário responsável pela ação. Quando é utilizada a funcionalidade de **substituto** (em que um usuário pode atuar em nome de outro), o valor retornado em **WKUser** será sempre o usuário que está efetivamente logado no sistema no momento da ação.\n\nEXEMPLO \nAna definiu Bruno como seu substituto. Ao acessar o sistema, Bruno realiza uma ação em nome de Ana. Nesse caso, os eventos que utilizam **WKUser** irão retornar o código do usuário **Bruno**, e não o de Ana.\n\n- Em todos os eventos, é possível realizar chamadas aos serviços disponíveis na API pública. Para saber como utilizá-la nesse contexto, consulte o nosso [guia de consumo da API pública em eventos](../Integrações/Fluig API/Consumo de serviços na API pública e no componente SDK.md)." }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n## Eventos do tipo **Before**\n\n---\n\nDe forma geral, os eventos do tipo **before** são executados antes que a ação que os disparou seja efetivada. Com isso, é possível filtrar os dados que serão processados ou até mesmo impedir que a ação seja concluída.\n\nPara bloquear a ação, basta lançar uma **Exception** contendo uma mensagem de texto, que será exibida ao usuário no formato de *toast*.\n\nEXEMPLO\n\n**Estrutura do Evento**\n\n```\n throw \"Você não pode efetuar esta ação após as 18 horas.\"\n```\n\n## Eventos do tipo **After**\n\n---\n\nOs eventos do tipo **after** são executados somente após a ação ser efetivada e não exercem influência sobre ela. Isso significa que qualquer alteração realizada nos parâmetros recebidos dentro do evento **não será refletida** nos dados já persistidos pela ação.\n\nOutra característica importante desse tipo de evento é que **não devem lançar exceções**. Caso uma exceção seja lançada, ela será ignorada pelo sistema e não produzirá nenhum efeito prático.\n\n# Eventos Gerais Disponíveis\n\n---\n\nA seguir serão detalhados os eventos gerais disponíveis no Fluig. Eventos que podem ser disparados sem exclusividade de atividades específicas.\n\n### DisplayCentralTasks" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEste evento é disparado sempre antes de ser exibida a central de tarefas. Através dele é possível inserir, alterar ou remover os links da central de tarefas. O evento recebe como parâmetro um **LinkedHashMap** com os links disponíveis na central de tarefas.\n\n- Exemplo adicionando um link customizado ao final dos itens da central de tarefas:\n\n```\nfunction displayCentralTasks (links){\nlinks.put(\"Fluig\",\"http://www.fluig.com\");\n}\n```\n\n- Exemplos alterando a ordem de exibição dos links padrões e adicionando três novos, um no início e dois ao final:\n\n```\nfunction displayCentralTasks (links){\n\tvar _links = new java.util.LinkedHashMap();\n\t_links.put(\"Fluig\",\"http://www.fluig.com\"); \n var it = links.keySet().iterator();\n while (it.hasNext()) { \n var key = it.next();\n _links.put(key, links.get(key));\n\t} \n\t_links.put(\"Fluig - DEV\" ,\"http://dev.fluig.com\");\n\t_links.put(\"Google\",\"http://www.google.com.br/search?sourceid=chrome&ie=UTF-8&q=\" + getValue(\"WKUser\"));\n\n\tlinks.clear();\n\tlinks.putAll(_links);\n}\n```\n\nDisponibilizamos algumas informações sobre o usuário e a empresa, porém somente para consulta através do método getValue.\n\n| | |\n| --- | --- |\n| WKUser | Código do usuário |\n| WKCompany | Número da empresa |\n\n**Exemplo**\n\n```\nfunction displayCentralTasks (links){\nlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```\n\n### DisplayCustomMetadata" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEste evento é disparado sempre antes de ser exibidos os campos customizados de um documento, tanto na publicação como edição. Através dele é possível sugerir valores iniciais para campos customizados dos metadados de um documento. O evento recebe como parâmetro uma referência aos campos customizados.\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n}\n```\n\nNo contexto deste evento a variável fields pode ser usada para consultar ou modificar os valores dos campos customizados de um documento. Não permitindo adicionar novos campos.\n\nPara inserir novos campos em um documento existe diversos maneiras disponíveis.\n\n- Pela herança da pasta pai.\n- No cadastro de Campos Customizados, marcando a opção *Mostrar em todos documentos* ou da forma padrão.\n- Através do WebService CustomFieldsService.\n- Na edição dos metadados do documento, pelo usuário.\n\nPara consultar o valor de um campo customizado neste evento, utiliza-se o fields.getValue passando como parâmetro o código do campo desejado. Retornando “null”, casso o campo não esteja disponível para este documento.\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n\tlog.info(\"Valor do Campo 1: \" + fields.getValue(\"campo1\"));\n}\n```\n\nJá pra a edição utiliza-se o fields.setValue, passando como parâmetro, primeiro o nome do campo, em seguida o valor.\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n\tfields.setValue(\"campo1\",\"Valor para o Campo 1\");\n}\n```\n\nAlem dos valores dos campos customizados disponibilizamos algumas informações do documento que está sendo criado ou editado, porém somente para consulta através do método getValue.\n\n| | |\n| --- | --- |\n| WKUser | Código do usuário |\n| WKCompany | Número da empresa |\n| WKNumParentDocument | Número da pasta pai |\n| WKDocumentType | Tipo do documento |\n| WKPrivateDocument | Se o documento esta sendo publicado na pasta particular (true/false) |\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n\tlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n### BeforeWatchContent\n\nUtilizado quando ao acompanhar algum conteúdo se deseja recuperar informações do registro e usar antes da ação de \"acompanhar\". Por exemplo, ao acompanhar um documento, é possível recuperar suas informações e usá-las em um dataset.\n\n**Exemplo**\n\n```\nfunction beforeWatchContent(companyId, watchDTO){\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| companyId | Código da Empresa | int |\n| watchDTO | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction beforeWatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"DOCUMENT\"){\n\t\tvar objClass = \"com.totvs.technology.social.document.6\";\n\t\tvar objClass = watchDTO.getObjectClass();\n\t\tvar patt = new RegExp( /\\d+/) ; \n\t\tvar documentId = patt.exec(objClass) ;\n\t\tvar documentVersion = watchDTO.getObjectId();\n\t\tvar doc = getValue(\"WKDocument\"); \n\t\tvar company = companyId; \n\t\tvar ds ;\n\t\ttry { \n\t\t\tvar c1 = DatasetFactory.createConstraint( \"allocatedDocumentPK.companyId\", company, company, ConstraintType.MUST); \n\t\t\tvar c2 = DatasetFactory.createConstraint(\"allocatedDocumentPK.sourceDocument\",documentId,documentId, ConstraintType.MUST); \n\t\t\tvar c3 = DatasetFactory.createConstraint(\"allocatedDocumentPK.sourceVersion\", documentVersion,documentVersion, ConstraintType.MUST); \n\t\t\tvar c4 = DatasetFactory.createConstraint(\"active\", \"true\",\"true\",ConstraintType.MUST); \n\t\t\tvar constraints = new Array(c1, c2, c3, c4); \n\t\t\t\n\t\t\tds = DatasetFactory.getDataset(\"allocatedDocument\", null, constraints, null); \n\t\t}catch (e) {\n\t\t\tlog.error(\"Erro ao tentar recuperar o documento em CheckOut: \" + e.message); \n\t\t} \n\t \n\t\tif(ds!=null && ds.rowsCount>0){ \n\t\t throw \"Sua solicitação de notificação foi negada, pois o documento está em checkout.\" ; \n\t\t}\n\t}\n}\n```\n\n### AfterWatchContent" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nUtilizado quando ao acompanhar algum conteúdo se deseja recuperar informações do registro e usar após a ação de \"acompanhar\". Por exemplo, ao acompanhar um post, é possível recuperar suas informações e usá-las para informar o usuário sobre o autor do post.\n\n**Exemplo**\n\n```\nfunction afterWatchContent(companyId, watchDTO){\t\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| companyId | Código da Empresa | int |\n| watchDTO | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction afterWatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"POST\"){\n\t\tthrow \"O usuário \"+watchDTO.getUserAlias()+\" vai ser notificado sobre o post \" + watchDTO.getText() + \" do autor \" + watchDTO.getPostAuthor() ;\n\t}\n}\n```\n\n### BeforeUnwatchContent\n\nUtilizado quando ao deixar de acompanhar algum conteúdo se deseja recuperar informações do registro e usar antes da ação de \"deixar de acompanhar\". Por exemplo, ao tentar deixar de acompanhar uma comunidade, é possível decidir se o usuário pode deixar de acompanhá-la.\n\n**Exemplo**\n\n```\nfunction beforeUnwatchContent(companyId, watchDTO){\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| companyId | Código da Empresa | int |\n| watchDTO | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction beforeUnwatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"COMMUNITY\"){\n\t\t\n\t\tthrow \"Você não pode deixar de ser notificado sobre a comunidade \" + watchDTO.getDescription() ;\n\t}\n}\n```\n\n### AfterUnwatchContent" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nUtilizado quando ao deixar de acompanhar algum conteúdo se deseja recuperar informações do registro e usar após a ação de \"deixar de acompanhar\". Por exemplo, ao deixar de acompanhar um post, é possível recuperar suas informações e informar o usuário que aquele post possui muitos seguidores.\n\n**Exemplo**\n\n```\nfunction afterUnwatchContent(companyId, watchDTO){\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| companyId | Código da Empresa | int |\n| watchDTO | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction afterUnwatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"POST\" && watchDTO.getNumberWatchers() < 3 ){\n\t\tlog.erro(\"O post \\\"\" + watchDTO.getText() + \"\\\" do autor \" + watchDTO.getPostAuthor() + \" deixou de ser polemico\" )\n\t}\n}\n```\n\n### beforeCreateUser" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEvento disparado antes da criação de um novo usuário. Pode ser utilizado quando for necessário realizar validações no usuário antes da sua criação ou adicionar dados adicionais programaticamente.\n\n```\nfunction beforeCreateUser(user) {\n}\n```\n\nSomente os atributos firstName, lastName, fullName podem ser modificados. Para adicionar dados adicionais para o usuário deve ser utilizado o método **addData** do UserEventVO.\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| user | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n\n- Exemplo de implementação:\n\n```\nfunction beforeCreateUser(user) {\n\t// Verifica se a senha informada atende os requisitos mínimos\n\tvar passwordPattern = \"((?=.*\\\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,16})\";\n\tif (!user.getPassword().matches(passwordPattern)) {\n\t\tthrow \"A senha do usuário não atendeu os requisitos mínimos!\";\n\t}\n\n\t// Adiciona um dado adicional ao usuário informando a sua data de criação\n\tvar dateFormat = new java.text.SimpleDateFormat(\"dd/MM/yyyy HH:mm:ss\");\n\tuser.putData(\"CreationDate\", dateFormat.format(new Date()));\n}\n```\n\n### afterCreateUser" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEvento disparado depois da criação de um novo usuário. Pode ser utilizado quando for necessário realizar alguma rotina com o usuário criado, como exemplo a criação de recursos adicionais para o usuário.\n\n```\nfunction afterCreateUser(user) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| user | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n\n- Exemplo de implementação:\n\n```\nfunction afterCreateUser(user) {\n\t// Instância um cliente da API pública do Fluig. O usuário aplicativo utilizado\n\t// precisa ser um administrador do Fluig\n\t// Documentação para criar usuário aplicativo: http://tdn.totvs.com/x/KAFlDw\n\tvar consumer = oauthUtil.getNewAPIConsumer(\n\t\t\t\"e3fe3d72-bfcc-4552-8c9b-93c66531dab9\", //Consumer Key do OAuth App\n\t\t\t\"6bd0591b-73d8-4a9e-a161-d54dd92d3172-5a21991e-453f-4ea1-b80c-f42d4c57759d\", //Consumer Secret do OAuth App\n\t\t\t\"11a419dd-0c8a-4388-bd32-d66319bd750b\", //Access Token do Usuário Aplicativo\n\t\t\t\"fd2b53a4-b43d-4118-9725-68abaa1b41a9ee584784-73b2-454b-942f-5e07ad114234\"); //Token Secret do Usuário Aplicativo\n\n\t// Adiciona o usuário criado na comunidade RH através da utilização do método \n\t// addParticipants do serviço de comunidades da API Pública\n\t// Alterar a comunidade RH para a comunidade que deseja realizar a ação em seu ambiente\n\tvar postJson = '{\"communityAlias\": \"RH\", \"userAliases\": [\"' + user.getLogin() + '\"]}';\n\tconsumer.post(\"/public/social/community/addParticipants\", postJson);\n}\n```\n\n### beforeUpdateUser" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEvento disparado antes da atualização de um usuário. Pode ser utilizado quando for necessário realizar validações no usuário antes da sua atualização ou adicionar dados adicionais programaticamente.\n\n```\nfunction beforeUpdateUser(user) {\n}\n```\n\nSomente os atributos firstName, lastName, fullName podem ser modificados. Para adicionar dados adicionais para o usuário deve ser utilizado o método **addData** do UserEventVO.\n\nPara verificar se a senha do usuário foi alterada basta utilizar o método **getPassword**, onde caso seja retornado algum valor significa que a senha foi alterada. Já para verificar se a atualização do usuário foi realizada por ele próprio, através da edição de perfil, é necessário comparar o login do usuário recebido como parâmetro, através do método **getLogin** com o login do usuário corrente, resgatado através da chamada **getValue(\"WKUser\")**, onde caso sejam iguais significa que a atualização foi realizada pelo próprio usuário.\n\nEXEMPLO\n\n```\n// Verifica se foi alterada a senha do usuário\nif (user.getPassword() != null) {\n\tdoSomething();\n}\n \n// Verifica se a atualização do usuário foi realizada por ele próprio\nif (user.getLogin().equals(getValue(\"WKUser\"))) {\n\tdoSomething();\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| user | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n\n- Exemplo de implementação:\n\n```\nfunction beforeUpdateUser(user) {\n\t// Verifica se foi alterada a senha do usuário\n\tif (user.getPassword() != null) {\n\t\t// Caso a senha tenha sido alterada verifica se ela atende os requisitos mínimos\n\t\tvar passwordPattern = \"((?=.*\\\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,16})\";\n\t\tif (!user.getPassword().matches(passwordPattern)) {\n\t\t\tthrow \"A senha do usuário não atendeu os requisitos mínimos!\";\n\t\t}\n\t}\n\n\t// Adiciona um dado adicional ao usuário informando a última data de atualização\n\tvar dateFormat = new java.text.SimpleDateFormat(\"dd/MM/yyyy HH:mm:ss\");\n\tuser.putData(\"LastUpdateDate\", dateFormat.format(new Date()));\n}\n```" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n### afterUpdateUser\n\nEvento disparado depois da atualização de um usuário, ou após a gravação de uma nova senha, pelo recurso de reset de senha da [tela de login](https://tdn.totvs.com/pages/viewpage.action?pageId=389547065).\n\nO evento *afterUpdateUser* será disparado no reset de senha pela tela de login a partir da **atualização 1.6.5 ou superior**.\n\nEsse evento pode ser utilizado quando for necessário realizar alguma rotina com o usuário atualizado, como exemplo a atualização de recursos adicionais do usuário.\n\n```\nfunction afterUpdateUser(user) {\n}\n```\n\nPara verificar se a senha do usuário foi alterada basta utilizar o método **getPassword**, onde caso seja retornado algum valor significa que a senha foi alterada. Já para verificar se a atualização do usuário foi realizada por ele próprio, através da edição de perfil, é necessário comparar o login do usuário recebido como parâmetro, através do método **getLogin** com o login do usuário corrente, resgatado através da chamada **getValue(\"WKUser\")**, onde caso sejam iguais significa que a atualização foi realizada pelo próprio usuário.\n\nEXEMPLO\n\n```\n// Verifica se foi alterada a senha do usuário\nif (user.getPassword() != null) {\n\tdoSomething();\n}\n \n// Verifica se a atualização do usuário foi realizada por ele próprio\nif (user.getLogin().equals(getValue(\"WKUser\"))) {\n\tdoSomething();\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| user | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n\n- Exemplo de implementação:\n\n```\nfunction afterUpdateUser(user) {\n\tlog.info(\"O usuário \" + user.getFullName() + \" foi alterado.\");\n}\n```\n\n### beforeDeactivateUser" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEvento disparado antes da desativação de um usuário. Pode ser utilizado quando for necessário realizar validações no usuário antes da sua desativação.\n\n```\nfunction beforeDeactivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário a ser desativado | String |\n\n- Exemplo de implementação:\n\n```\nfunction beforeDeactivateUser(login) {\n\t// Instância um cliente da API pública do Fluig. O usuário aplicativo utilizado\n\t// precisa ser um administrador do Fluig\n\tvar consumer = oauthUtil.getNewAPIConsumer(\n\t\t\t\"e3fe3d72-bfcc-4552-8c9b-93c66531dab9\", \n\t\t\t\"6bd0591b-73d8-4a9e-a161-d54dd92d3172-5a21991e-453f-4ea1-b80c-f42d4c57759d\",\n\t\t\t\"11a419dd-0c8a-4388-bd32-d66319bd750b\",\n\t\t\t\"fd2b53a4-b43d-4118-9725-68abaa1b41a9ee584784-73b2-454b-942f-5e07ad114234\");\n\n\t// Verifica se o usuário que esta sendo desativado é moderador de alguma comunidade. \n\tvar moderateCommunities = [];\n\tvar communities = JSON.parse(consumer.get(\"/public/social/community/listCommunities\")).content;\n\tfor (var i in communities) {\n\t\tvar isModerator = JSON.parse(consumer.get(\"/public/social/community/isCommunityModerator/\" \n\t\t\t\t+ communities[i].alias + \"/\" + login)).content;\n\t\tif (isModerator) {\n\t\t\tmoderateCommunities.push(communities[i].name);\n\t\t}\n\t}\n\n\t// Caso o usuário seja moderador de alguma comunidade lança uma exceção informando que\n\t// o usuário é moderador de comunidades e não pode ser desativado\n\tif (moderateCommunities.length > 0) {\n\t\tthrow \"O usuário \" + login + \" não pode ser desativado por ser moderador nas comunidades: \" \n\t\t\t\t+ moderateCommunities.join(\", \") + \".\";\n\t}\n}\n```\n\n### afterDeactivateUser" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEvento disparado depois da desativação de um usuário. Pode ser utilizado quando for necessário realizar alguma rotina com o usuário desativado.\n\n```\nfunction afterDeactivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário desativado | String |\n\n- Exemplo de implementação:\n\n```\nfunction afterDeactivateUser(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\tservice.deactivateUser(login);\n\n\tlog.info(\"O usuário \" + login + \" foi desativado no serviço customizado.\");\n}\n```\n\n### beforeActivateUser\n\nEvento disparado antes da ativação de um usuário. Pode ser utilizado quando for necessário realizar validações no usuário antes da sua ativação.\n\n```\nfunction beforeActivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário a ser ativado | String |\n\n- Exemplo de implementação:\n\n```\nfunction beforeActivateUser(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\n // Caso o usuário esteja desativado no serviço customizado lança uma exceção informando\n\t// que o usuário está desativado no serviço customizado e não pode ser ativado no Fluig\n if (service.isDeactivatedUser(login)) {\n\t\tthrow \"O usuário \" + login + \" está desativado no serviço customizado e não pode ser ativado!\";\n }\n}\n```\n\n### afterActivateUser" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEvento disparado depois da ativação de um usuário. Pode ser utilizado quando for necessário realizar alguma rotina com o usuário ativado.\n\n```\nfunction afterActivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário ativado | String |\n\n- Exemplo de implementação:\n\n```\nfunction afterActivateUser(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\tservice.activateUser(login);\n\n\tlog.info(\"O usuário \" + login + \" foi ativado no serviço customizado.\");\n}\n```\n\n### beforeLogin" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEvento disparado antes do login de um usuário. Pode ser utilizado quando for necessário realizar validações antes do usuário ser autenticado no fluig, possibilitando o cancelamento do login caso seja lançada uma exceção através do evento.\n\nAtenção!\n\nO uso indevido do evento *beforeLogin* pode ocasionar inconsistência no login da plataforma, fazendo com que o usuário não consiga mais logar. Recomendamos atenção ao utilizar este evento.\n\n```\nfunction beforeLogin(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário | String |\n\n- Exemplo de implementação:\n\n```\nfunction beforeLogin(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\n\t// Caso o usuário esteja bloqueado pelo serviço customizado lança uma exceção informando\n\t// que o usuário está desativado no serviço customizado e cancela o login no Fluig\n if (service.isBlockedUser(login)) {\n\t\tthrow \"O usuário \" + login + \" está desativado no serviço customizado\";\n }\n}\n```\n\n### afterLogin" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEvento disparado após o login de um usuário. Pode ser utilizado quando for necessário realizar alguma rotina  quando o usuário é autenticado no fluig.\n\n```\nfunction afterLogin(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário | String |\n\n- Exemplo de implementação:\n\n```\nfunction afterLogin(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n service.addUserSession(login);\n}\n```\n\nO evento **afterLogin** funciona mesmo com a autenticação via Identity. O DesktopSSO ou a autenticação automática não interfere na execução do evento, porque ele é executado depois do login não importando como é feito.\n\n### onLoginError" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEvento disparado quando ocorrer um erro de login de um usuário. Este erro pode ser por login e senha inválidos ou usuário inativo. Pode ser utilizado quando for necessário realizar alguma rotina quando ocorrer um erro de login ou apresentar uma mensagem personalizada para o usuário.\n\n```\nfunction onLoginError(login, errorCause) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário | String |\n| errorCause | Motivo do erro de login, onde: 0 - Login e senha inválidos 1 - Usuário inativo | Integer |\n\n- Exemplo de implementação:\n\n```\nfunction onLoginError(login, errorCause) {\n\t// Verifica se a causa de erro foi senha inválida (0 - Senha inválida, 1 - Usuário inativo)\n\tif (errorCause == 0) {\n\t\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\t\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n\t var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n\t var service = serviceLocator.getCustomServicePort();\n\t \n\t service.registerLoginAttempt(login);\n\t \n\t // Utiliza o serviço customizado para verificar quantas tentativas de login o usuário já\n\t // realizou. Caso tenha ultrapassado 3 tentativas bloqueia o usuário neste serviço \n\t // customizad e lança uma exceção informando ao usuário que ele foi bloqueado.\n\t var loginAttempts = service.checkLoginAttempts(login);\n\t if (loginAttempts > 3) {\n\t \tservice.blockUser(login);\n\t \tthrow \"Seu usuário foi bloqueado por ultrapassar 3 tentativas de login\"\n\t } else {\n\t \tthrow \"Tentativa de login \" + loginAttempts + \" de 3\"\n\t }\n\t}\n}\n```\n\n### onLogout" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEvento disparado quando o usuário realizar logout. Pode ser utilizado quando for necessário realizar alguma rotina quando o usuário realiza o logout no portal através da opção Sair.\n\n```\nfunction onLogout(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| login | Login do usuário | String |\n\n- Exemplo de implementação:\n\n```\nfunction onLogout(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n service.removeUserSession(login);\n \n log.info(\"Usuário \" + login + \" efetuou logout\");\n}\n```\n\n### onNotify" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nPara interferir no envio de uma notificação padrão do fluig, deve ser utilizado o evento global *onNotify*, que é disparado no momento em que qualquer notificação do fluig é enviada. Nesse evento, podem ser feitas alterações como, por exemplo, adicionar outros destinatários ao e-mail, modificar os valores dos parâmetros utilizados no template de e-mail, etc.\n\nAbaixo temos um exemplo de como implementar este evento:\n\n```\nfunction onNotify(subject, receivers, template, params) {\n if (template == \"TPLDOCUMENT_APPROVAL_PENDING\") {\n receivers.add(\"usuario@dominio.com\");\n }\n}\n```\n\nAtenção\n\n**Recomenda-se** validar o template utilizando a comparação direta **template == \"TPLDOCUMENT\\_APPROVAL\\_PENDING\"**, em vez da função `match()`.\n\nEssa abordagem evita redundâncias na customização, pois o `match()` pode retornar verdadeiro para mais de um template em determinados casos, como ocorre com `TPLNEW_TASK` e `TPLNEW_TASK_POOL_GROUP`.\n\nA partir da versão Fluig 1.5.13 o fluigAPI estárá habilitado para este evento.\n\nO evento onNotify está disponível na lista de eventos globais. Ao selecionar esse evento na lista de eventos disponíveis, a assinatura da função acima já será preenchida automaticamente. Este evento disponibiliza os seguintes parâmetros:\n\n| Parâmetro | Descrição |\n| --- | --- |\n| subject | É o assunto do e-mail. A alteração desta variável irá implicar que todos os usuários recebam o e-mail com o novo assunto configurado. Exemplo de utilização: **subject.add(\"ASSUNTO\");** |\n| receivers | Lista de e-mails destinatários. Também é possível adicionar outros e-mails, de usuários que não participam do processo. Inclusive, podem ser adicionados e-mails de usuários que não estão cadastrados no fluig, caso seja necessário notificar uma pessoa que não tenha acesso ao sistema. |\n| template | Permite validar qual tipo de e-mail está sendo enviado (por exemplo, template de documento em aprovação, documento expirando, etc). Com base nessa variável podemos distinguir quais e-mails queremos customizar. É recomendável que sempre seja verificado o código do template, para evitar que ocorram alterações em outros tipos de e-mail, que não necessitariam de customização. |\n| params | É um mapa de dados que permite alterar/incluir parâmetros para que sejam apresentados no e-mail. O nome dos parâmetros informados nesse mapa devem ser os mesmos que são utilizados dentro do arquivo de template. |\n\nNo exemplo que foi apresentado acima é validado se o template se refere ao *\"TPLDOCUMENT\\_APPROVAL\\_PENDING\"* (que corresponde a documento pendente de aprovação). Em caso positivo, um novo e-mail será adicionado na lista de destinatários. Ou seja, além do responsável pela aprovação, outra pessoa será notificada, recebendo uma cópia do e-mail. Como está sendo validado o código do template, os demais tipos de e-mail não serão afetados.\n\nOs templates podem ser consultados dentro do diretório do volume, em: *\\templates\\tplmail*. Se for necessário adicionar algum parâmetro no e-mail padrão, os templates podem ser editados diretamente nesse diretório.\n\nImportante\n\n- O evento global onNotify possui bind de variáveis para acesso à log, datasetManager, DatasetFactory, DatasetBuilder, ConstraintType e ServiceManager.\n- Recomenda-se verificar a lista de parâmetros (params) recebida antes de utilizá-los, pois estes variam de acordo com o template utilizado.\n- Quando um workflow possuir evento onNotify, o evento global onNotify será ignorado para os e-mails daquele processo.\n- É imprescindível a validação pelo código do template antes de qualquer implementação, pois TODOS os e-mails passarão por esta customização quando o evento estiver registrado.\n\nDica\n\nQuando o evento onNotify for utilizado como evento global, é necessário informar uma constraint extra informando o usuário para fixar as permissões, já que o evento onNotify não é executado por nenhum usuário mas sim pelo sistema. Vale lembrar ainda que quando for utilizar algum dataset interno do fluig, é necessário tambem informar uma constraint.\n\nEXEMPLO\n\nvar constraintUser = DatasetFactory.createConstraint(\"userSecurityId\", \"nome\\_do\\_usuario\", \"nome\\_do\\_usuario\", ConstraintType.MUST);" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n### beforeSendNotification" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEvento disparado antes do envio de uma notificação ao usuário. Pode ser utilizado quando for necessário adicionar alguma informação à nota ou alterar a prioridade de uma notificação, possibilitando o cancelamento do envio da notificação caso seja definida uma prioridade através do evento.\n\nObservação\n\nPor questões de segurança, somente os campos *priority* e *note* podem ser alterados. Outras alterações não serão consideradas.\n\nImportante\n\nCaso seja lançada uma exceção através do evento a notificação não será enviada, mas esse não é o modo correto de cancelar o envio. Definir o campo *priority* como \"NONE\" impede que a notificação seja enviada sem a necessidade de lançar exceção.\n\n- Abaixo segue um exemplo de como implementar esse evento:\n\n```\nfunction beforeSendNotification(notification) {\n if (notification.eventType == \"DENOUNCED_CONTENT\") {\n notification.priority = \"NONE\";\n }\n if (notification.eventType == \"DOCUMENT_APPROVED\") {\n notification.priority = \"NORMAL\";\n }\n if (notification.eventType == \"DOCUMENT_REPROVED\") {\n notification.priority = \"HIGH\";\n }\n if (notification.eventType == \"LIKE\") {\n notification.priority = \"LOW\";\n }\n}\n```\n\nSão disponibilizadas algumas propriedades referentes à notificação que está sendo enviada.\n\n| | | |\n| --- | --- | --- |\n| **Propriedade** | **Descrição** | **Tipo** |\n| aliasSender | Alias de quem enviou a notificação. Pode vir nulo nos casos em que a notificação é enviada pelo sistema. | String |\n| aliasReceiver | Alias de quem vai receber a notificação. | String |\n| place | Lugar onde foi feita a ação que gerou a notificação. Pode vir nulo quando não for um lugar socializavel. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| object | Objeto sobre o qual foi feita a ação que gerou o alerta. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| eventType | Tipo do evento que gerou a notificação. | String |\n| metadata | Metadados da notificação. | Hashmap |\n| priority | Prioridade da notificação. Valores válidos:  NONE, LOW, NORMAL, HIGH. | String |\n| note | Nota enviada junto à notificação. | String |\n\nVeja o exemplo (**event-notification**) no repositório do fluig clicando [aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/event-notification)." }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n### afterSendNotification\n\nEvento disparado após o envio de uma notificação ao usuário. Pode ser utilizado quando for necessário registrar alguma informação, para auditoria, por exemplo.\n\n- Abaixo segue um exemplo de como implementar esse evento:\n\n```\nfunction afterSendNotification(notification){\n\t\tlog.info(\"notification as send for \" + notification.aliasReceiver);\n}\n```\n\nSão disponibilizadas algumas propriedades referentes à notificação que foi  enviada.\n\n| | | |\n| --- | --- | --- |\n| **Propriedade** | **Descrição** | **Tipo** |\n| aliasSender | Alias de quem enviou a notificação. Pode vir nulo nos casos em que a notificação é enviada pelo sistema. | String |\n| aliasReceiver | Alias de quem vai receber a notificação. | String |\n| place | Lugar onde foi feita a ação que gerou a notificação. Pode vir nulo quando não for um lugar socializavel. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| object | Objeto sobre o qual foi feita a ação que gerou o alerta. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| eventType | Tipo do evento que gerou a notificação. | String |\n| metadata | Metadados da notificação. | Hashmap |\n| priority | Prioridade da notificação. | String |\n| note | Nota enviada junto à notificação. | String |\n\nVeja o exemplo (**event-notification**) no [repositório do fluig](http://tdn.totvs.com/display/fluig/htt) clicando [aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/event-notification).\n\n### onDisplayTasks" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEste evento é disparado antes de serem exibidas as tarefas das aba \"Tarefas a concluir\" , \"Minhas solicitações\", \"Tarefas em pool\", \"Tarefas em consenso\" e \"Minhas tarefas sob gerência\" na central de tarefas. Através dele é possível inserir, alterar ou remover itens da central de tarefas. O evento recebe como parâmetro uma lista de [WorkflowTasksVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) das tarefas existentes.\n\n- Exemplo adicionando, editando e removendo uma tarefa personalizada ao final da lista de tarefas:\n\n```\nfunction onDisplayTasks(tasks) {\n\t// Adiciona uma tarefa customizada\n\tvar newTask = new WorkflowTasksVO();\n\tnewTask.setCode(\"TOTVS\");\n\tnewTask.setUrl(\"http://www.totvs.com\");\n\tnewTask.setProcessDescription(\"Nova Tarefa\");\n\tnewTask.setRequesterName(\"João da Silva\");\n\tnewTask.setStateDescription(\"Atividade 1\");\n\tnewTask.setColleagueName(\"Ana Maria\");\n\tnewTask.setStartDateProcess(\"07/09/2025\");\n\tnewTask.setDateExpires(\"07/10/2025\");\n\ttasks.add(newTask);\n\n\tfor (var i = 0; i < tasks.size(); i++) {\n\t\t// Remove a solicitação com o id 1\n\t\tif (tasks.get(i).getProcessInstanceId() == 1) {\n\t\t\ttasks.remove(i);\n\t\t\ti--; // Necessário para não pular um item após a remoção\n\t\t} else {\n\t\t\t// Altera a descrição de todos os processos para \"Nova Tarefa alterada\"\n\t\t\ttasks.get(i).setProcessDescription(\"Nova Tarefa alterada\");\n\t\t}\n\t}\n```\n\nDisponibilizamos algumas informações para consulta através do método getValue.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKUser | Código do usuário logado. | String |\n| WKUserLocale | Idioma do usuário logado. | String |\n| WKCompany | Número da empresa. | Int |\n| taskUserId | Código do usuário substituído, em caso de visualização da central como substituto. Nos demais casos retorna o usuário logado. | String |\n| taskType | Indicador do tipo de tarefas que estão sendo exibidas, “open” tarefas a concluir e “requests” para minhas solicitações. | String |\n| filter | Filtros utilizados. | Map |\n| order | Ordenação aplicada. | String |\n| maxResult | Número de resultados por página. | Int |\n| page | Número da página atual. | Int |\n| taskId | Em caso de pool,  quando o taskType for pool, o taskId trará uma string contendo o tipo no caso ‘Role’ para papel ou ‘Group‘ para grupo e seu código. Exemplo: ‘Pool:Role:admin’ para um pool do papel ‘admin’. | String |\n\n**Exemplo**\n\n```\nfunction onDisplayTasks(links){\nlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n### onDisplayTasksSummary\n\nEste evento é disparado antes de serem exibidos os contadores das abas e gráficos da central de tarefas e widgets de BPM. Através dele é possível alterar números de tarefas pendentes de cada tipo.\n\n- Exemplo alterando o número de tarefas abertas e no prazo:\n\n```\nfunction onDisplayTasksSummary(resumeTasks) {\n\tresumeTasks.openTasks=20;\n}\n```\n\nO objeto recebido como parâmetro contém:\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| expiredTasks | Solicitações atrasadas. | Int |\n| openTasks | Solicitações no prazo. | Int |\n| myRequests | Minhas solicitações. | Int |\n| toApprover | Aprovação de documentos pendentes. | Int |\n| myDocuments | Documentos aguardando aprovação. | Int |\n| checkout | Documento em checkout. | Int |\n| learningTasks | Atividades de Aprendizado. | Int |\n\n```\nfunction onDisplayTasksSummary(resumeTasks) {\n\tresumeTasks.expiredTasks=10;\n\tresumeTasks.openTasks=20;\n\tresumeTasks.myRequests=30;\n\tresumeTasks.toApprover=40;\n\tresumeTasks.myDocuments=50;\n\tresumeTasks.checkout=60;\n\tresumeTasks.learningTasks=70;\n}\n```\n\nDisponibilizamos algumas informações para consulta através do método getValue.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| WKUser | Código do usuário logado. | String |\n| WKUserLocale | Idioma do usuário logado. | String |\n| WKCompany | Número da empresa. | Int |\n| taskUserId | Código do usuário substituído, em caso de visualização da central como substituto. Nos demais casos retorna o usuário logado. | String |\n\n**Exemplo**\n\n```\nfunction onDisplayTasks(links){\nlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```\n\n# Objetos utilizados nos eventos\n\n---\n\nExistem alguns objetos disponibilizados pelo produto que são utilizados nos eventos, nas próximas sessões eles serão explicados seus métodos e seus retornos.\n\n### DocumentDto" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEste objeto representa o documento e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getDocumentId() | Retorna o número do documento. | int |\n| getVersion() | Retorna o número da versão do documento. | int |\n| getCompanyId() | Retorna o código da empresa em que o documento foi publicado. | Int |\n| getUUID() | Retorna o UUID (identificador Único Global) do documento. | String |\n| getDocumentTypeId() | Retorna o tipo do arquivo físico, se retornar branco ou nulo é porque esse tipo não é conhecido pelo fluig. | String |\n| getLanguageId() | Retorna o código do Idioma do documento. | String |\n| getIconId() | Retorna o código do Ícone do documento. | int |\n| getTopicId() | Retorna o código do assunto do documento. | int |\n| getColleagueId() | Retorna a matricula do usuário que criou o documento. | String |\n| getDocumentDescription() | Retorna a descrição do documento. | String |\n| getAdditionalComments() | Retorna os comentários adicionais do documento. | String |\n| getPhisicalFile() | Retorna o nome do arquivo físico atrelado ao documento. | String |\n| getCreateDate() | Retorna a data de criação. | java.util.Date |\n| getApprovedDate() | Retorna a data de Aprovação. | java.util.Date |\n| getLastModifiedDate() | Retorna a Data da última modificação. | java.util.Date |\n| getDocumentType() | Retorna o tipo do documento, onde: 0 à Pasta raiz 1 à Pasta 2 à Documento normal 3 à Documento externo 4 à Formulário 5 à Registro de formulário 7 à Anexo Workflow 8 à Novo Conteúdo 9 à Aplicativo 10 à Relatório portal à Site portalPage à Página de Site | String |\n| getExpirationDate() | Retorna a data de expiração. | java.util.Date |\n| getParentDocumentId() | Retorna o número da Pasta/Formulário pai | int |\n| getRelatedFiles() | String com o nome do arquivo físico principal e anexos. | String |\n| getActiveVersion() | Retorna se a versão é ativa. | boolean |\n| getVersionDescription() | Retorna a descrição da versão. | String |\n| getDownloadEnabled() | Retorna se o documento permite Download | boolean |\n| getApproved() | Retorna se o documento está em aprovação. | boolean |\n| getValidationStartDate() | Retorna a partir de que data em que o documento poderá ser visualizado. | java.util.Date |\n| getPublisherId() | Retorna a matricula do usuário que publicou o documento. | String |\n| getCardDescription() | Retorna a descrição do registro de formulário, para documento do tipo 5. | String |\n| getDocumentPropertyNumber() | Retorna o formulário que foi usado como base para criação do registro de formulário, por isso só tem um valor quando o documento é do tipo 5 (registro de formulário). | int |\n| getDocumentPropertyVersion() | Retorna a versão do formulário em que o registro de formulário foi criado. | int |\n| getPrivateDocument() | Retorna se o documento/pasta está abaixo da pasta particular. | boolean |\n| getPrivateColleagueId() | Se é um documento particular retorna a matricula do usuário onde este documento está alocado. | String |\n| getIndexed() | Retorna se o documento já foi indexado. | boolean |\n| getPriority() | Retorna a prioridade do documento. | int |\n| getUserNotify() | Retorna se notifica os usuários que tenham esse assunto de interesse. | boolean |\n| getExpires() | Retorna se o documento está expirado. | boolean |\n| getVolumeId() | Retorna o volume onde o documento foi publicado, se estiver em branco ele utiliza o volume do pai. | String |\n| getInheritSecurity() | Retorna se herda segurança do pai. | boolean |\n| getUpdateIsoProperties() | Retorna se atualiza as propriedades da cópia controlada. | boolean |\n| getLastModifiedTime() | Retorna a hora da última modificação em milissegundos. | String |\n| getDeleted() | Retorna se o documento está na lixeira. | boolean |\n| getDatasetName() | Retorna o documento do dataset , se o documento é um formulário. | String |\n| getKeyWord() | Retorna as palavras chaves do documento. Cada palavra é separada por vírgula. | String |\n| getImutable() | Retorna se a versão/revisão é inalterável. | boolean |\n| getDraft() | Retorna se o documento está em edição, para documento do tipo “Novo Conteúdo”. | boolean |\n| getInternalVisualizer() | Retorna se utiliza visualizador interno. | boolean |\n| getPhisicalFileSize() | Retorna o tamanho físico do documento principal e anexos. | float |\n| getVersionOption() | Retorna a condição de versionamento do documento: 0 = Será mantida a versão 1 = Será criado nova revisão 2 = Será criado nova versão Importante lembrar que no momento da criação de um novo documento o valor sempre será 0. | int |\n\n**Exemplo**\n\n```\nvar doc = getValue(\"WKDocument\");\nlog.info(\"Número do documento: \"+ doc.getDocumentId() + \" - Versão: \"+ doc.getVersion());\n```" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n### DocumentEditDto\n\nEste objeto representa as propriedades editáveis de um documento, na tabela abaixo consta mais informações sobre ele:\n\n| Função | Descrição da função | Tipo do retorno |\n| --- | --- | --- |\n| setKeyWord | Adiciona Palavras chaves no documento. Cada palavra é separada por vírgula. | void |\n| setExpires | Define se o documento deve expirar | void |\n| setExpirationDate | Define a data de expiração. | void |\n| setValidationStartDate | Define a data a partir da qual o documento poderá ser visualizado. | void |\n\n**Exemplo**\n\n```\nfunction beforeDocumentPublisher() { \n var docEdit = getValue(\"WKDocumentEdit\");\n \n var dataStartValidation = new Date(2022, 0, 1);\n var dataExpiracao = new Date(2022, 11, 31);\n \n docEdit.setKeyWord(\"testing\");\n docEdit.setExpires(true);\n docEdit.setExpirationDate(dataExpiracao);\n docEdit.setValidationStartDate(dataStartValidation);\n}\n```\n\nAtenção\n\nLembrando que no javascript, no construtor new Date, o valor do \"Mês\" começa com o index 0, sendo 0 = Janeiro e 11 = Dezembro, veja outros exemplos [clicando aqui](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date).\n\n### ApproverDto" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEste objeto representa os aprovadores e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| **Função** | **Descrição da Função** | **Tipo do Retorno** |\n| getDocumentId() | Retorna o número do documento. | int |\n| getVersion() | Retorna o número da versão do documento. | int |\n| getCompanyId() | Retorna o código da empresa em que o documento foi publicado. | Int |\n| getColleagueId() | Retorna a matricula de um usuário ou o código do grupo que está aprovando este documento. É possível saber se vai retornar um usuário ou um grupo pelo tipo de aprovação. | String |\n| getApproverType() | Retorna o tipo da aprovação, onde: 0 à Usuário 1 à Grupo | int |\n| getLevelId() | Retorna o nível de aprovação, no caso de aprovação em níveis. | int |\n\n**Exemplo**\n\n```\nvar listApprover = getValue(\"WKListApprover\");\n\tif(listApprover!=null){\n \tfor(j = 0; j < listApprover.size(); j++) { \n \t if (listApprover.get(j).getColleagueId().equals(\"adm\")){\n throw \"O usuário adm não pode ser aprovadores de documentos\";\n }\n }\n}\n```\n\n        \n\n### DocumentSecurityConfigDto" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEste objeto representa a segurança de um documento e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getDocumentId() | Retorna o número do documento. | int |\n| getVersion() | Retorna o número da versão do documento. | int |\n| getCompanyId() | Retorna o código da empresa em que o documento foi publicado. | Int |\n| getAttributionValue() | Retorna a matricula de um usuário ou o código do grupo que está na segurança deste documento. É possível saber se vai retornar um usuário ou um grupo pelo tipo da segurança. Obs.: Retorna em branco quando o tipo é todos os usuários. | String |\n| getAttributionType() | Retorna o tipo da segurança, onde: 1 à Usuário; 2 à Grupo; 3 à Todos os Usuários. | int |\n| getPermission() | Retorna se é uma permissão. Obs.: Se não é uma permissão é uma restrição. | boolean |\n| getShowContent() | Retorna se lista o conteúdo. | boolean |\n| getSecurityLevel() | Retorna no nível de permissão/restrição, onde: -1 à sem permissão/restrição (nega acesso); 0 à Leitura; 1 à Gravação; 2 à Modificação; 3 à Total. | int |\n| getSequence() | Retorna a sequência da permissão/restrição. | int |\n| getSecurityVersion() | Retorna se ele utiliza a segurança deste versão nas demais. | boolean |\n\n**Exemplo**\n\n```\nvar listSeg = getValue(\"WKListSecurity\");\nif(listSeg != null){\n for(j = 0; j < listSeg.size(); j++) { \n if (listSeg.get(j).getAttributionValue().equals(\"cvd\")){\n throw \"O usuário cvd não pode estar na segurança de documentos\";\n }\n }\n}\n```\n\n### RelatedDocumentDto" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEste objeto representa os documentos relacionados e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getDocumentId() | Retorna o número do documento. | int |\n| getVersion() | Retorna o número da versão do documento. | int |\n| getCompanyId() | Retorna o código da empresa em que o documento foi publicado. | int |\n| getRelatedDocumentId() | Retorna o número do documento que está relacionado ao documento publicado. | int |\n\n**Exemplo**\n\n```\nvar listRelated = getValue(\"WKListRelatedDocument\");\n\tif( listRelated != null){\n \t log.info(\"Os seguintes documentos estão relacionados a este documentos: \");\n for(j = 0; j < listRelated.size(); j++) { \n log.info(\"Nr. documento: \"+ listRelated.get(j).getRelatedDocumentId());\n }\n}\n```\n\n### ProcessDefinitionVersionDto\n\nEste objeto representa a definição de um processo e seus atributos. A tabela abaixo apresenta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getCompanyId() | Retorna o código da empresa | Long |\n| getProcessId() | Retorna o código do processo | Long |\n| getProcessDescription() | Retorna a descrição do processo | String |\n| getVersion() | Retorna a versão do processo | Integer |\n| getVersionDescription() | Retorna a descrição da versão do processo | String |\n| getFormId() | Retorna o código do formulário do processo | Integer |\n| getCategoryStructure() | Retorna a categoria do processo | String |\n| getFullCategoryStructure() | Retorna a estrutura completa da categoria do processo | String |\n\n### UserEventVO" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEste objeto representa um usuário e seus atributos, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getId() | Retorna o identificador do usuário | Long |\n| getTenantId() | Retorna o código da empresa | Long |\n| getLocationId() | Retorna o código da localização à qual o usuário pertence | Long |\n| getFirstName() | Retorna o nome do usuário | String |\n| getLastName() | Retorna o sobrenome do usuário | String |\n| getFullName() | Retorna o nome completo do usuário | String |\n| getEmail() | Retorna se lista o conteúdo | String |\n| getLogin() | Retorna o e-mail do usuário | String |\n| getPassword() | Retorna a senha do usuário | String |\n| getIdpId() | Retorna o identificador associado ao fluig Identity | String |\n| getUserCode() | Retorna o código do usuário | String |\n| getUserType() | Retorna o tipo do usuário, onde: 0 - Normal 3 - Aplicativo | Integer |\n| getState() | Retorna o estado do usuário, onde: 0 - Não confirmado 1 - Ativo 2 - Bloqueado 3 - Removido | Integer |\n| getTimeZone() | Retorna o Fuso Horário do usuário | String |\n| getRoles() | Retorna a lista dos códigos dos papéis aos quais o usuário pertence | List |\n| getGroups() | Retorna a lista dos códigos dos grupos aos quais o usuário pertence | List |\n| getData() | Retorna os dados adicionais do usuário | Map |\n| setFirstName(String firstName) | Informa o nome do usuário | void |\n| setLastName(String lastName) | Informa o sobrenome do usuário | void |\n| setFullName(String fullName) | Informa o nome completo do usuário | void |\n| putData(String key, String value) | Adiciona um novo dado adicional ao usuário. Só pode ser utilizado em eventos ***before**.* | void |\n\n### WatchDTO" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\nEste objeto representa as notificações de acompanhamento de comentários e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| getEntityId() | Retorna o código do Conteúdo. | String |\n| getUserId() | Retorna o código do usuário. | String |\n| getUserAlias() | Retorna o alias do usuário. | String |\n| getSociableId() | Retorna ocódigo sociable. | String |\n| getCreationDate() | Retorna a data de criação. | String |\n| getLastUpdateDate() | Retorna a data da última atualizaçã. | String |\n| getNumberComments() | Retorna o número de comentários. | String |\n| getNumberLikes() | Retorna o número de apoios. | String |\n| getNumberShares() | Retorna o número de compartilhamentos. | String |\n| getNumberWatchers() | Retorna o número de acompanhamentos. | String |\n| getNumberDenouncements() | Retorna o número de denúncias. | String |\n| getSocialWatchType() | Retorna o tipo (social) | String |\n| getPostAuthor() | Retorna o autor do conteúdo. | String |\n| getTags() | Retorna as tags. | String |\n| getText() | Retorna o texto. | String |\n| getDescription() | Retorna a descrição. | String |\n| getObjectClass() | Retorna a classe do objeto. | String |\n| getObjectId() | Retorna o objectId. | String |\n| getThumbURL() | Retorna a url do thumb | String |\n\n### SocialPostEventVO" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| **SocialPostEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getText() | texto do post | String |\n| getUser() | alias do usuário que está postando | String |\n| getVisibility() | visibilidade do post | String |\n| getPostId() | identificador do post | String |\n| getCreationDate() | data de criação do post | String |\n| getLastUpdateDate() | data de ultima atualização do post | String |\n| getSociables() | objetos sociables relacionado a esse post. Ex: Imagens, Vídeos, Artigos, etc... | List<[SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474)> |\n| getSocial() | objeto social onde o post foi feito. Pode ser timeline de um usuario ou um comunidade | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| **\\***getAttributes() | Atributos do Analytics em formato de Lista de Strings. Limite de 3 itens | List |\n| **\\***getFacts() | Fatos dos atributos do Analytics em formato de Lista de Strings. Limite de 3 itens | List |\n| customData | Mapa em formato JSON onde pode-se persistir dados extras da publicação | Map JSON |\n\n**\\***  Somente enviado no evento beforSocialPost e afterSocialPost, esses valores não são persistidos no Fluig\n\n### SociableEventVO" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| **SociableEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getId() | identificador do objeto | String |\n| getCreationDate() | data de criação do objeto | String |\n| getLastUpdateDate() | ultima atualização do objeto | String |\n| getNumberLikes() | quantidade de curtidas | String |\n| getNumberShares() | quantidade de compartilhamentos | String |\n| getNumberComments() | quantidade de comentários | String |\n| getNumberDenouncements() | quantidade de denúncias | String |\n| getNumberWatchers() | quantidade de acompanhamentos | String |\n| getTags() | nomes marcadores | String |\n| getUrl() | endereço do objeto | String |\n| getSociableType() | tipo do objeto social | String |\n| getRemoved() | informa se o objeto foi removido | String |\n| \\*getPostAuthor() | retorna o alias do autor da publicação que foi comentada | String |\n| **\\***getText() | retorna o texto da publicação que foi comentada | String |\n| **\\*\\***getDescription() | Nome do objeto comentado | String |\n| **\\*\\***getThumbURL() | url de ícone do objeto comentado. | String |\n| getSocial() | local aonde o comentário foi efetuado | SocialEvent |\n\n**\\*** Retornados apenas quando o comentário é sobre um post.\n\n**\\*\\*** Retornado para os comentários de documentos e etc.\n\n### SocialEventVO" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| **SocialEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getId() | identificador do objeto | String |\n| getCreationDate() | data de criação do objeto | String |\n| getLastUpdateDate() | ultima atualização do objeto | String |\n| getAlias() | apelido do objeto social | String |\n| getName() | nome do objeto social | String |\n| getDescription() | descrição do objeto social | String |\n| getType() | tipo do objeto social | String |\n| getState() | status do objeto social | String |\n| getHidden() | informa se o objeto é oculto | String |\n| getPrivateContent() | informa se o conteúdo é privado | String |\n| getApprovalRequired() | informa se aprovação é requerida | String |\n| getCustomPage() | informação de página customizada | String |\n\n### SocialShareEventVO\n\n| | | |\n| --- | --- | --- |\n| **SocialShareEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSociable() | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| getSocialPlace() | objeto que recebe o compartilhamento | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| getUser() | alias do usuario que compartilha | String |\n| getText() | texto informado no compartilhamento | String |\n| getType() | tipo do objeto | String |\n\n### SocialCommentEventVO\n\n| | | |\n| --- | --- | --- |\n| **SocialCommentEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSociable() | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| getUser() | alias do usuário que comenta | String |\n| getText() | texto informado no comentário | String |\n| getCommentId() | id do comentário | String |\n\n### SocialDenounceEventVO" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| **SocialDenounceEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSociable() | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| getUser() | alias do usuário que comenta | String |\n| getText() | texto informado no comentário | String |\n| getType() | Tipo de denúncia | String |\n\n### SocialLikeEventVO\n\n| | | |\n| --- | --- | --- |\n| **SocialLikeEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSociable() | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| getUser() | alias do usuário que comenta | String |\n\n### SocialCommunityRelationEventVO\n\n| | | |\n| --- | --- | --- |\n| **SocialCommunityRelationEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSocial() | Social relacionado à comunidade | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| getCommunity() | Social que representa a Comunidade | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n\n### SocialFollowEventVO\n\n| | | |\n| --- | --- | --- |\n| **SocialFollowEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getSocial() | Social que seguirá | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n| getFollowed() | Social que está sendo seguido | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022376474) |\n\n### SocialPictureEventVO" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| SocialPictureEventVO | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| getLoggedUser() | Alias do usuário autenticado | String |\n| getAlias() | Alias do local aonde se está mudando a imagem (usuário| comunidade) | String |\n| getPath() | Path do diretório onde a imagem foi salva | String |\n| getPictureName() | Nome da imagem salva | String |\n| getWidth() | Largura da imagem | int |\n| getHeight() | Altura da imagem | int |\n\n### GenericAlertEventVO\n\n| | | |\n| --- | --- | --- |\n| **GenericAlertEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| objectId | Id do objeto relacionado | String |\n| objectClass | Classe que identifica o objeto relacionado | String |\n| link | Link que está disponível no objeto. Pode vir nulo nos casos em que não existe um link de acesso | String |\n\n### WorkflowTasksVO" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| **WorkflowTasksVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| url | Url destino para tarefas personalizadas | String |\n| code | Código para tarefas personalizadas | String |\n| processId | Código do processo | String |\n| processDescription | Descrição do processo | String |\n| requesterId | Código do usuário de abertura | String |\n| requesterName | Nome do usuário de abertura | String |\n| stateDescription | Descrição da atividade atual | String |\n| colleagueName | Nome do usuário responsável pela tarefa atual | String |\n| dateExpires | Data de expiração | String |\n| attachDescription | Descrição do anexo principal | String |\n| expired | Tarefa expirada? | boolean |\n| know | Usuário já visualizou a tarefa? | boolean |\n| fieldValue1 | Campo do formulário | String |\n| fieldValue2 | Campo do formulário | String |\n| fieldValue3 | Campo do formulário | String |\n| fieldValue4 | Campo do formulário | String |\n| fieldValue5 | Campo do formulário | String |\n| fieldValue6 | Campo do formulário | String |\n| fieldValue7 | Campo do formulário | String |\n| fieldValue8 | Campo do formulário | String |\n| fieldValue9 | Campo do formulário | String |\n| fieldValue10 | Campo do formulário | String |\n| fieldValue11 | Campo do formulário | String |\n| fieldValue12 | Campo do formulário | String |\n| fieldValue13 | Campo do formulário | String |\n| fieldValue14 | Campo do formulário | String |\n| fieldValue15 | Campo do formulário | String |\n\n## Exemplo com usuário de aplicação" }, { "metadata": { "title": "Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais.md" }, "content": "Eventos Globais\n\n\n---\n\nNeste exemplo, a mensagem **Post criado via evento** é postada no mural\n\n```\nfunction beforeSocialPost(companyId, vo) {\n    if (vo.getSocial().getType() == \"USER\" && vo.getUser() != \"admin\") {\n        var consumer = oauthUtil.getNewAPIConsumer(\"my_app_key\", \"my_app_secret\",\n                        \"605da7f2-d087-4f4b-903e-486df9563956\",\n                        \"2b192950-fe0c-4211-a4bf-5962c18432d85c077dfb-aa51-45a0-ab43-822a680070ab\");\n        var userData = JSON.parse(consumer.get(\"/public/social/user/\" + vo.getUser()));\n        if (userData.numberFollowers == 0) {\n            throw \"Voce deve ser seguido por alguem para poder postar em sua timeline.\";\n        }\n    }\n}\n```\n\nExemplo com usuário logado\n\n---\n\n```\nfunction afterDocumentPublisher(){\n    var doc = getValue(\"WKDocument\");\n    var user = getValue(\"WKUser\");\n \n    var msgPost = \"Novo documento: \"+ doc.getDocumentId() + \" - Versão: \"+ doc.getVersion();\n    log.info(msgPost);\n \n    var jsonContent = \"{\\\"text\\\":\\\"\" + msgPost + \"\\\",\\\"visibility\\\":\\\"PUBLIC\\\"}\";\n    log.info(jsonContent);\n \n    var consumer = oauthUtil.getNewAPIConsumerAsCurrentUser(\"myapp\", \"myappsecret\", \"32718929-568b-4a64-9f67-bbeadf4c1fc3\",\n            \"eff7b746-384b-43ba-be3a-aed14da822a4b8352de0-62be-456e-a0d8-ab5c00a745bc\");\n    consumer.post(\"/public/social/post/create\", jsonContent);\n}\n```\n\n# Atualização do Analytics\n\n---\n\n**Definição**\n\nÉ possível enviar dados ao analytics a partir dos eventos de customização. Esse dados recebidos pelo evento não são persistidos no fluig mas podem ser modificados antes de serem enviados ao Analytics. Esses valores são transmitidos no objeto SocialPostEventVO\n\n## Exemplo de uso\n\n**Assinatura do método**\n\n```\n analyticsUtil.updatePostData(String postId, String[] attributes, String[] facts);\n```\n\n**Utilização no Evento**\n\n```\nfunction afterSocialPost(companyId, post){\n analyticsUtil.updatePostData(post.getPostId(), post.getAttributes(), post.getFacts());\n}\n```" }, { "metadata": { "title": "Tratamento de exceções", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270921008", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Tratamento de exceções.md" }, "content": "Tratamento de exceções\n\n\nAs exceções podem ser tratadas nos seguintes eventos: *beforeStateEntry, beforeTaskSave* e *beforeCancelProcess*. O tratamento de exceção no evento *beforeStateEntry* pode ser utilizado na inicialização de solicitações, pois ele impede que a solicitação seja iniciada. Em contrapartida o tratamento de exceção no evento *beforeTaskSave* pode ser utilizado somente se a solicitação já estiver inicializada.\n\nAbaixo é apresentado os modelos para utilização em cada um dos eventos:\n\n```\nfunction beforeStateEntry(sequenceId) {\n\tvar activity = getValue(\"WKNumState\");\n\tif (activity == 0 || activity == 1) {\n\t\t//Outra condição.\n\t\tthrow \"TRATAMENTO DE EXCEÇÃO\";\n\t}\n}\n\nfunction beforeTaskSave(colleagueId, nextSequenceId, userList) {\n\tvar activity = getValue(\"WKNumState\");\n\tif (activity != 0 && activity != 1) {\n\t\t//Outra condição\n\t\tthrow \"TRATAMENTO DE EXCEÇÃO\";\n\t}\n}\n\nfunction beforeCancelProcess(colleagueId, processId) {\n\t//Condição.\n\tthrow \"TRATAMENTO DE EXCEÇÃO\";\n}\n```\n\nÉ possível consultar o campo Observação de uma solicitação de processo, verificando se ele foi preenchido ou não. Para isto, é necessário validar a propriedade *WKUserComment* no evento *beforeTaskSave* ou no evento *beforeCancelProcess*.\n\n**Exemplo:**\n\n```\nfunction beforeTaskSave(colleagueId, nextSequenceId, userList) {\n\tif (getValue(\"WKUserComment\") == null || getValue(\"WKUserComment\") == \"\") {\n\t\tthrow \"A observação deve ser preenchida\";\n\t}\t\n}\n\nfunction beforeCancelProcess(colleagueId, processId) {\n\tif (getValue(\"WKUserComment\") == null || getValue(\"WKUserComment\") == \"\") {\n\t\tthrow \"A observação deve ser preenchida\";\n\t}\t\n}\n```" }, { "metadata": { "title": "docAPI", "source": "https://tdn.totvs.com/display/fluig/docAPI", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos\\docAPI.md" }, "content": "docAPI" }, { "metadata": { "title": "docAPI", "source": "https://tdn.totvs.com/display/fluig/docAPI", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Documentos\\docAPI.md" }, "content": "docAPI\n\n\nPara ter acesso a funções relacionadas a documentos é possível utilizar nos eventos a variável global **docAPI**. Os métodos disponíveis através da **docAPI** são:\n\nLembre-se\n\nUtilizamos padrões de desenvolvimento de mercado portanto, ao utilizar os métodos e classes abaixo, atente-se às boas práticas de desenvolvimento JAVA.\n\n| Método | Especificação |\n| --- | --- |\n| copyDocumentToUploadArea(documentId, version) | Copia os arquivos físicos de um documento existente para a área de upload do usuário logado, onde: - documentId: id do documento a ser copiado; - version: versão do documento a ser copiado; Retorno: Array de Strings contendo os nomes dos arquivos que foram disponibilizados na área de upload. |\n| createDocument(document, attachments, securityConfig, approvers, relatedDocs) | Cria um novo documento no GED de acordo com os parâmetros informados, onde: - document: documento a ser criado; - attachments: lista de anexos do documento; - securityConfig: lista de configurações de segurança do documento; - approvers: lista de aprovadores do documento; - relatedDocs: lista de documentos relacionados ao documento; Retorno: DocumentDto do documento criado. Exemplo de utilização desta função em conjunto com a função copyDocumentToUploadArea: ``` function beforeStateEntry(sequenceId) { if (sequenceId == 5) { var attachments = hAPI.listAttachments(); for ( var i = 0; i < attachments.size(); i++) { var docDto = attachments.get(i); if (docDto.getDocumentType() == \"7\") { docAPI.copyDocumentToUploadArea(docDto.getDocumentId(), docDto.getVersion()); docDto.setDocumentId(0); // Criar uma pasta para armazenar os anexos como documentos, concedendo à mesma as permissões de segurança e aprovação necessárias docDto.setParentDocumentId(20); var attachArray = new java.util.ArrayList(); var mainAttach = docAPI.newAttachment(); mainAttach.setFileName(docDto.getPhisicalFile()); mainAttach.setPrincipal(true); mainAttach.setAttach(false); attachArray.add(mainAttach); // Adicionando aprovadores docDto.setActiveVersion(true); docDto.setColleagueId(getValue(\"WKUser\")); // Informar o usuário logado. docDto.setPublisherId(getValue(\"WKUser\")); // Informar o publicador. var aprovador = docAPI.newApproverDto(); aprovador.setCompanyId(getValue(\"WKCompany\")); aprovador.setColleagueId(getValue(\"WKUser\")); // Informar o aprovador aprovador.setDocumentId(documentoId); aprovador.setVersion(1); // Versão do documento aprovador.setLevelId(1); // Nível de aprovação aprovador.setApproverType(0); //Tipo de aprovadores (0 = Colaboradores, 1 = Grupo) var aprovadoresArray = new java.util.ArrayList(); aprovadoresArray.add(aprovador); try { var doc = docAPI.createDocument(docDto, attachArray, null, aprovadoresArray,null); log.info(\"DOCUMENTO CRIADO COM O ID: \" + doc.getDocumentId()); } catch (e) { log.error(\"Problemas na criação do documento:\\n\" + e); } } } } } ``` |\n| createFolder(document, securityConfig, approvers) | Cria uma nova pasta no GED de acordo com os parâmetros informados, onde: - document: pasta a ser criada; - securityConfig: lista de configurações de segurança da pasta; - approvers: lista de aprovadores da pasta; Retorno: DocumentDto da pasta criada. Exemplo de utilização desta função: ``` function afterProcessFinish(processId) { try { var dto = docAPI.newDocumentDto(); dto.setDocumentDescription(\"Planilhas\"); dto.setDocumentType(\"1\"); dto.setParentDocumentId(20); dto.setDocumentTypeId(\"\"); var folder = docAPI.createFolder(dto, null, null); log.info(\"PASTA CRIADA COM O ID :\" + folder.getDocumentId()); } catch (e) { log.error(\"Problemas na criação da pasta:\\n\" + e); } } ``` O parâmetro publisherId do objeto [DocumentDTO](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto) não será considerado quando a publicação for realizada via *script* em um evento de processo. Esse parâmetro só pode ser definido na criação do objeto via [WebService](http://tdn.totvs.com/pages/viewpage.action?pageId=73084007). Confira um exemplo de como criar pastas definindo sua segurança por grupos e usuários [clicando aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/create-advanced-folder). |\n| getDocumentVersion(documentId, version) | Retorna o DocumentDto de um documento com base no seu id e sua versão, onde: - documentId: id do documento a ser retornado; - version: versão do documento a ser retornado; |\n| getUserPermissions(documentId, version) | Retorna o nível de permissão do usuário logado no documento informado, onde: - documentId: id do documento; - version: versão do documento; |\n| isUserInGroup(group) | Retorna se o usuário logado faz parte do grupo informado, onde: - group: código do grupo a ser verificado; |\n| newAttachment() | Retorna uma nova instância de Attachment. |\n| newRelatedDocumentDto() | Retorna uma nova instância de RelatedDocumentDto. |\n| newDocumentSecurityConfigDto() | Retorna uma nova instancia de DocumentSecurityConfigDto. |\n| newApproverDto() | Retorna uma nova instância de ApproverDto. |\n| newDocumentDto() | Retorna uma nova instância de DocumentDto, com o tipo 2 (Documento) como padrão. |\n\nVeja o exempo (**create-advanced-folder**) em nosso repositório **[aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/create-advanced-folder)**." }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n\n## Índice" }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n\n- 1 [Objetivo](#EventosdeFormulárioExemplodenovomodelo-Objetivo)\n- 2 [Pré-requisitos](#EventosdeFormulárioExemplodenovomodelo-Pré-requisitos)\n- 3 [Como criar eventos de formulário](#EventosdeFormulárioExemplodenovomodelo-Comocriareventosdeformulário)\n- 4 [LOGs](#EventosdeFormulárioExemplodenovomodelo-LOGs)\n - 4.1 [log.info](#EventosdeFormulárioExemplodenovomodelo-log.info)\n - 4.2 [log.warn](#EventosdeFormulárioExemplodenovomodelo-log.warn)\n - 4.3 [log.debug](#EventosdeFormulárioExemplodenovomodelo-log.debug)\n - 4.4 [log.error](#EventosdeFormulárioExemplodenovomodelo-log.error)\n - 4.5 [log.dir](#EventosdeFormulárioExemplodenovomodelo-log.dir)\n- 5 [Eventos](#EventosdeFormulárioExemplodenovomodelo-Eventos)\n - 5.1 [beforeProcessing](#EventosdeFormulárioExemplodenovomodelo-beforeProcessing)\n - 5.2 [displayFields](#EventosdeFormulárioExemplodenovomodelo-displayFields)\n - 5.3 [enableFields](#EventosdeFormulárioExemplodenovomodelo-enableFields)\n - 5.3.1 [Protegendo campos desabilitados](#EventosdeFormulárioExemplodenovomodelo-Protegendocamposdesabilitados)\n - 5.4 [inputFields](#EventosdeFormulárioExemplodenovomodelo-inputFields)\n - 5.5 [validateForm](#EventosdeFormulárioExemplodenovomodelo-validateForm)\n - 5.6 [afterSaveNew](#EventosdeFormulárioExemplodenovomodelo-afterSaveNew)\n - 5.7 [afterProcessing](#EventosdeFormulárioExemplodenovomodelo-afterProcessing)\n - 5.8 [beforeMovementOptions](#EventosdeFormulárioExemplodenovomodelo-beforeMovementOptions)\n - 5.9 [beforeSendValidate](#EventosdeFormulárioExemplodenovomodelo-beforeSendValidate)\n - 5.10 [setEnable](#EventosdeFormulárioExemplodenovomodelo-setEnable)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é descrever os eventos de formulários avançados no Fluig, abordando criar validações e manipulações do seu formulário.\n\n# Pré-requisitos\n\n---\n\nAntes de iniciar, é importante que leia a documentação sobre [Desenvolvimento de Formulários](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários.md) e, durante a leitura você vai sentir a necessidade de entender um pouco mais sobre o parâmetro *form* ([FormController](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md))\n\n# Como criar eventos de formulário\n\n---\n\nApós a criação de uma definição de formulário é possível realizar a criação de scripts para customização. O eventos para formulários são criados conforme os passos a seguir:\n\n- Para a criação de um script de formulário no Fluig, na visão **Explorador de pacotes (Package Explorer)** deve-se acessar a pasta **forms** do **Projeto Fluig**, clicar com o botão direito e no menu acessar **Novo (New) > Outras (Other)***.*\n\n ![](..\\..\\..\\..\\images\\formulario%20fluig.png)\n\n**Figura 5 - Criação de script evento da definição de formulário.**\n\n- Abra a pasta Fluig e selecione a opção **Script Fluig** e clique no botão **Avançar (Next >)**.\n\n![](..\\..\\..\\..\\images\\scrpt%20fluig.png)\n\n**Figura 6 - Criação de script evento da definição de formulário.**\n\n- Selecione o tipo de script e clique em **Avançar (Next >)**.\n\n![](..\\..\\..\\..\\images\\novo%20script.png)\n\n- Nesta tela é necessário informar os campos pertinentes ao evento que deseja adicionar e clicar no botão **Concluir**.\n\nApós a criação de uma definição de formulário é possível realizar a criação de scripts para customização. O eventos para formulários são criados conforme passos a seguir:\n\n- Para a criação de um script de formulário no Fluig, na visão **Explorador de pacotes (Package Explorer)** deve-se acessar a pasta **forms** do **Projeto Fluig**, clicar com o botão direito e no menu acessar **Novo (New) > Outras (Other)**.\n- Abra a pasta Fluig e selecione a opção Script Fluig e clique no botão Avançar (Next > ).\n- Selecione o tipo e clique em Avançar (Next >).\n\n![](..\\..\\..\\..\\images\\image2013-9-23%20104152.png)\n\n**Figura 7 - Criação de script evento da definição de formulário.**\n\n- No exemplo selecionamos o evento *validateForm*, e o relacionamos a definição de formulário *form\\_exemplo\\_fluig*.\n\n![](..\\..\\..\\..\\images\\image2013-9-23%20104323.png)\n\n**Figura 8 - Criação de script evento da definição de formulário.**\n\n- Ao concluir a estrutura principal do método estará disponível no editor.\n\n![](..\\..\\..\\..\\images\\image2013-9-23%20104438.png)\n\n**Figura 9 - Criação de script evento da definição de formulário.**\n\n- Configure seu script. Para entender mais sobre os eventos e algumas dicas continue lendo essa documentação\n\n![](..\\..\\..\\..\\images\\image2013-9-23%20104556.png)\n\n**Figura 10 - Criação de script evento da definição de formulário.**\n\n# LOGs\n\n---\n\nUma das funções mais importantes para entender o que está acontecendo no código e rastreamento futuro é o log. Tanto em eventos de formulário, eventos de processo, datasets, o fluig permite fazer log em quatro níveis:" }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n## log.info\n\nUsado para apresentar alguma mensagem de rastreamento do código ou dos campos\n\n```\nlog.info(“Testando o log info”);\n```\n\n```\nlog.info(“O campo código contém o valor: ” + form.getValue(\"codigo\"));\n```\n\n## log.warn\n\n---\n\nUsado para indicar algum ponto de atenção ou problema eminente no código\n\n```\nif (form.getValue(\"codigo\") == \"\") {\n log.warn(“O campo código está em branco e pode apresentar problemas com as integrações”);\n}\n```\n\n## log.debug\n\n---\n\nOs logs, se não usados com moderação, podem mais atrapalhar do que ajudar. Por isso, caso necessário, algumas informações podem ser utilizadas como debug, que são ativas somente quando o usuário realmente ver elas\n\n```\nlog.debug(\"verificando o conteúdo do campo código\")\nif (form.getValue(\"codigo\") == \"\") {\n log.debug(\"o campo código está em branco\");\n} else {\n log.debug(\"o campo código está preenchido: \" + form.getValue(\"codigo\"));\n}\n```\n\n## log.error\n\n---\n\nUsado para imprimir um log de erro\n\n```\nif (form.getValue(\"codigo\") == \"\") {\n log.error(\"O campo código não foi preenchido\");\n throw \"Preencha o campo código\";\n}\n```\n\n## log.dir\n\n---\n\nEste log não é um tipo diferente, na verdade é um log.info turbinado. Serve para fazer o log de objetos mais complexos que simples strings\n\n```\nvar objeto = {'codigo': form.getValue(\"codigo\"), 'nome': form.getValue(\"nome\")};\nlog.dir(objeto);\n```\n\n# Eventos\n\n---\n\nOs eventos de formulários são um conjunto de scripts carregados pela API de Formulários, os quais são desenvolvidos utilizando Javascript e são chamados durante a execução de ação em formulários ou em momentos específicos de interação em formulários.\n\n## beforeProcessing" }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n\n---\n\nEsse evento é o primeiro a ser disparado. Ocorre antes de qualquer outro evento da definição de formulário. O evento recebe como parâmetro um objeto do tipo [FormController](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md).\n\nNeste contexto, o FormControler deve ser usado apenas para consulta de dados, alterações nos dados não serão persistidas.\n\n```\nfunction beforeProcessing(form){\n}\n```\n\nNo contexto deste evento a variável *form* pode ser usada somente para consulta aos campos da definição de formulário, seus valores e estado de apresentação.\n\n## displayFields" }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n\n---\n\nEsse evento é disparado no momento em que os objetos do formulário são apresentados. O evento recebe como parâmetro um objeto do tipo [FormController](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md) e um parâmetro *customHTML* que serve para personalizar e inserir dados diretamente do servidor no formulário.\n\nEsse evento pode ser utilizado para alterar os valores a serem apresentados no campo do formulário e é o único que permite a alteração antes da renderização. Para isto basta usar o seguinte procedimento:\n\n**Ao modificar um registro, preenche o campo com o valor 1**\n\n```javascript\nfunction displayFields(form, customHTML) {\n if ( form.getFormMode() == “MOD” ) {\n form.setValue('RNC_colab_abertura', new java.lang.Integer(1));\n }\n}\n```\n\nVocê pode também ocultar campos pelo nome ou pelo id:\n\n```javascript\nfunction displayFields(form, customHTML) { \n form.setVisible(\"campoA\", false);\n form.setVisibleById(\"linha___1\", false);\n}\n```\n\nOutras funções interessantes que podem ser usados neste evento são:\n\n- Para visualizar o formulário no formato original com os campos desabilitados, deve-se utilizar o método *setShowDisabledFields*.\n\n- Para habilitar ou desabilitar o botão de excluir nas linhas do formulário filho, que por padrão é habilitado, deve-se utilizar o método *setHideDeleteButton*.\n\n- Para ocultar o os botões*Imprimir*e *Imprimir em nova Janela*,deve-se utilizar o método *setHidePrintLink*.\n\n| Sem customizações | Com customização |\n| --- | --- |\n| | ```function displayFields(form, customHTML) { form.setShowDisabledFields(true); form.setHidePrintLink(true); } ``` |\n| comdelete.png | ``` function displayFields(form, customHTML) { form.setHideDeleteButton(false); } ``` |\n\nFormulário funcional com exemplos de utilização de***setVisible*,***setVisibleById***, setHideDeleteButton e setHidePrintLink****:****\n\n**Formulário - Clique para expandir** Expandir origem\n\n```\n\n\n \n \n \n\n\n
\n
\n

Ao Salvar escolha o que ocultar ao salvar o formulário

\n

\n

\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n


\n
\n

\n

Tabela de registros

\n \n \n \n \n \n \n \n \n \n \n \n \n \n
NM
\n

\n

\n Lorem Ipsum: Proin eget purus non mauris vehicula aliquam vitae sed est\n
\n
\n
\n\n\n```javascript\n\n**displayFields.js - Clique para expandir** Expandir origem\n\n```\n function displayFields(form,customHTML){\n var ocultarTodaTabela = form.getValue(\"ocultarTabela\") == \"on\"; // Ocultar toda tabela\n var ocultarCampoA = form.getValue(\"ocultarCampoA\") == \"on\"; // Ocultar campo A\n var ocultarCampoN1 = form.getValue(\"ocultarCampoN1\") == \"on\"; // Ocultar campo N da primeira linha\n var ocultarCampoM2 = form.getValue(\"ocultarCampoM2\") == \"on\"; // Ocultar campo M da segunda linha\n var ocultarLinha1 = form.getValue(\"ocultarLinha1\") == \"on\"; // Ocultar linha 1\n var ocultarExclusao = form.getValue(\"ocultarExclusao\") == \"on\"; // Ocultar botão de excluir\n var ocultarImpressao = form.getValue(\"ocultarImpressao\") == \"on\"; // Ocultar botão de imprimir\n var ocultarLoremIpsum = form.getValue(\"ocultarLoremIpsum\") == \"on\"; // Ocultar a div Lorem Ipsum\n if ( ocultarTodaTabela ) {\n form.setVisibleById(\"minhaTabela\", false); // bloqueia o campo, tabela ou div cujo id seja \"minhaTabela\"\n }\n if ( ocultarCampoA ) {\n form.setVisible(\"campoA\", false); // bloqueia o campo com name \"campoA\"\n }\n if ( ocultarCampoN1 ) {\n form.setVisible(\"campoN___1\", false); // bloqueia o campo com name \"campoN___1\"\n }\n if ( ocultarCampoM2 ) {\n form.setVisible(\"campoM___2\", false); // bloqueia o campo com name \"campoM___2\"\n }\n if ( ocultarLinha1 ) {\n form.setVisibleById(\"linha___1\", false); // bloqueia o campo, tabela ou div cujo id seja \"linha___1\"\n }\n if ( ocultarLoremIpsum ) {\n form.setVisibleById(\"loremIpsum\", false); // bloqueia o campo, tabela ou div cujo id seja \"loremIpsum\"\n }\n if ( ocultarExclusao ) {\n form.setHideDeleteButton(true); // bloqueia o botão de exclusão de linha\n }\n if ( ocultarImpressao ) {\n form.setHidePrintLink(true); // bloqueia botão de imprimir\n }\n}\n```javascript\n\nConforme explicado, o *customHTML* permite personalizar o formulário diretamente pelo método displayFields. Este exemplo, adaptado dos nos [Exemplos Avançados](../../../Recurso de Processos (BPM).md)/Desenvolvimento de Workflow/Exemplos avançados.md), mostra como usar o displayFields para, no formulário, ter acesso ao modo de visualização, código do solicitante e número da atividade. Além de preencher alguns campos da solicitação com a data atual e o nome do solicitante:\n\n```\nfunction displayFields(form,customHTML){\n // getValue(\"WKNumState\"); -> Número da atividade atual de acordo com o diagrama\n var numeroAtividadeAtual = getValue(\"WKNumState\");\n\n /*\n * form.getFormMode();\n * ADD - Momento inicial do formulário antes de iniciar e/ou salvar o processo\n * MOD - Momento a qual os campos estão editavéis para o usuário modificar após iniciar e/ou salvar o processo\n * VIEW - Modo de visualização do formulário\n */\n var modoDeVisualizacaoDoFormulario = form.getFormMode();\n\n // getValue(\"WKUser\"); -> Retorno o código do usuário logado\n var codigoSolicitante = getValue(\"WKUser\");\n\n if (modoDeVisualizacaoDoFormulario != \"VIEW\") {\n if (numeroAtividadeAtual == Atividades.ZERO || numeroAtividadeAtual == Atividades.INICIO) { //Antes do processo ser iniciado ou salvo o número da primera ativade é 0\n form.setValue(\"codigoSolicitante\", codigoSolicitante);\n form.setValue(\"nomeSolicitante\", buscaNomeDeUsuarioPeloIdentificador(codigoSolicitante));\n form.setValue(\"dataSolicitacao\", retornaDataAtual());\n }\n }\n\n // Exemplo de injeção de javascript pelo evento de formulário displayFields\n customHTML.append(\"\");\n}\n\n/**\n* Função para retornar a data atual\n* @returns data atual\n*/\nfunction retornaDataAtual() {\n return (new java.text.SimpleDateFormat('dd/MM/yyyy')).format(new Date());\n}\n\n/**\n*\n* @param {*} codigoSolicitante\n* @returns retorno o nome do usuário\n*/\nfunction buscaNomeDeUsuarioPeloIdentificador(codigoSolicitante) {\n var constraint = DatasetFactory.createConstraint(\"colleaguePK.colleagueId\", codigoSolicitante , codigoSolicitante, ConstraintType.MUST);\n var dataset = DatasetFactory.getDataset(\"colleague\", null, [constraint], null);\n\n return dataset.getValue(0, \"colleagueName\");\n}\n```javascript\n\nPara que os dados sejam carregados e apresentados em tela, principalmente em dispositivos *mobile*, é necessário chamar as funções que irão carregá-los dentro de uma estrutura de *read*.\n\nA invocação dos métodos que irão popular o formulário deve estar contida dentro de uma chamada $(function(), garantindo assim o carregamento dos arquivos exigidos pelo formulário antes das funções.\n\nPor exemplo, deseja-se carregar dados de produtos em um formulário. Para que isto ocorra, foi criada uma função *loadProdutos()* que irá preencher um *grid* inserido no formulário HTML. Neste caso a chamada desta função dentro do *displayFields* ficaria:\n\n```\ncustomHTML.append('');\n```\n\nMas, exceto em situações onde há mais coisas no *customHTML* que justifiquem isso, o mais recomendado é que você faça isso dentro dos próprios scripts javascript do formulário" }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n## enableFields" }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n\n---\n\nEsse evento é disparado no momento em que os objetos do formulário são habilitados. O evento recebe como parâmetro um objeto do tipo [FormController](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md).\n\n**Exemplo de como tornar campo desativado conforme o modo do formulário**\n\n```\n function enableFields(form) {\n if ( form.getFormMode() != 'ADD' ){ \n form.setEnabled(\"rnc_area\",false);\n form.setEnabled(\"rnc_tipo_ocorrencia\",false);\n }\n}\n```\n\nOutra forma de desabilitar os campos é utilizando comandos JavaScript implementados diretamente em funções do formulário. Porém, neste caso, não é permitido utilizar a propriedade *disabled*, pois os campos não serão gravados ao salvar o registro de formulário. Para esta situação, deve-se utilizar a propriedade *readonly* conforme exemplo abaixo:\n\n```\ndocument.forms['nomeForm'].nomeCampo.setAttribute('readonly',true);\n```\n\nFique atento!\n\nMesmo utilizando a função **setEnable**, ainda existe a possibilidade de algum usuário conseguir visualizar informações do campo formulário oculto, utilizando de recursos como a ferramenta de inspeção de código dos navegadores.\n\nAtenção\n\nAo utilizar o evento *enableFields* para proteger os campos, é adicionado o caractere underline (\\_) nas propriedade **name** e **id**. Com isso as manipulações via JavaScript puro ou pela biblioteca *jQuery* não terão efeitos, devido a alteração destas propriedades:\n\nExemplo enableFields.js:\n\n```\nfunction enableFields(form) {\n var atividade = parseInt(getValue('WKNumState'));\n \n if(atividade == 0 || atividade == 4){\n form.setEnabled('loginsolicitante', false);\n }\n \n if(atividade == 5){\n form.setEnabled('nomesolicitante', false);\n }\n}\n```\n\nHTML:\n\n```\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n```\n\nResultado no navegador/console, onde o campo ***loginsolicitante** agora é \\_**loginsolicitante*** e o campo **nomesolicitante** permanece igual, pois a lógica implementada indica que será bloqueado na próxima movimentação:\n\n![](..\\..\\..\\..\\images\\001.png)" }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n### **Protegendo campos desabilitados**\n\nAo proteger um campo desabilitado, ele não terá o seu valor alterado no registro de formulário. Para isso, informe o valor true para o parâmetro *protect* do método *setEnabled* conforme o exemplo abaixo:\n\n```\n function enableFields(form) { \n if ( form.getFormMode() != 'ADD' ){ \n form.setEnabled(\"rnc_cod_ocorrencia\",false, true);\n }\n}\n```\n\nTambém é possível utilizar o método *setEnhancedSecurityHiddenInputs*, que faz com que todos os campos desabilitados pelo método *setEnabled* fiquem protegidos:\n\n```\nfunction enableFields(form) { \n if ( form.getFormMode() != 'ADD' ){ \n\t\tform.setEnhancedSecurityHiddenInputs(true); \n form.setEnabled(\"rnc_cod_ocorrencia\",false);\n }\n}\n```\n\nAtenção!\n\nO método *setEnhancedSecurityHiddenInputs* só protegerá campos desabilitados após a sua execução no evento e quando o formulário estiver no contexto de uma execução de processo.\n\n## inputFields" }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n\n---\n\nEsse evento é disparado no momento em que os dados do formulário são passados para a BO responsável por formulário do fluig. O evento recebe como parâmetro uma referência ao formulário da definição de formulário. \n\n**Exemplo:**\n\n```\nfunction inputFields(form){\n}\n```\n\nAtenção!\n\nO evento *inputFields* não foi criado para ser utilizado na \"Movimentação em Bloco\", seu foco é o tratamento de campos que vem do navegador.\n\nEsse evento é disparado no momento em que os dados do formulário são passados para a BO responsável por formulário do fluig. O evento recebe como parâmetro um objeto do tipo [FormController](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md). \n\nO getValue não é utilizado em evento de formulário inputFields.\n\nEste evento pode ser usado para que as datas persistidas por formulários customizados sejam salvas corretamente. Hoje no sistema as datas salvas através de formulários pelo navegador Chrome tem o padrão americano (yyyy-mm-dd), enquanto as datas nos demais navegadores tem o padrão brasileiro (dd/mm/yyyy). Para empresas que utilizam múltiplos navegadores e querem que os dados de data estejam padronizados, recomendamos a utilização do evento *inputFields* com o seguinte trecho de código.\n\n**Código para Datas**\n\n```\nfunction inputFields(form) { \n var regEx = /^\\d{4}-\\d{2}-\\d{2}$/; \n\n if (form.getValue(\"dt_solicitacao\").match(regEx)) { \n var split = form.getValue(\"dt_solicitacao\").split('-'); \n form.setValue(\"dt_solicitacao\", split[2] + '-' + split[1] + '-' + split[0]); \n } \n}\n```\n\n## validateForm" }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n\n---\n\nEsse evento é disparado antes da gravação dos dados do formulário. O evento recebe como parâmetro um objeto do tipo [FormController](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md).\n\nEle é utilizado para fazer validações nos campos.\n\n**Exemplo da validação do campo de formulário**\n\n```\nfunction validateForm(form) {\n if (form.getValue('RNC_colab_abertura') == null){\n throw \"O colaborador de abertura não foi informado\";\n } \n}\n```\n\n**Exemplo da validação do campo de formulário com mensagem com quebra de linha**\n\n```\nfunction validateForm(form) {\n if (form.getValue('RNC_colab_abertura') == null){\n throw \"O colaborador de abertura não foi informado\\nFavor preencher o campo e tentar novamente\";\n } \n}\n```\n\n## afterSaveNew\n\n---\n\nEsse evento é disparado após a criação de um formulário. O evento recebe como parâmetro um objeto do tipo [FormController](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md).\n\nEste evento pode ser feito para criar algum tipo de log ou disparar algum evento:\n\n**Exemplo de uso para imprimir log**\n\n```\nfunction afterSaveNew(form) {\n log.info(\"Colaborador de abertura: \" + form.getValue(\"RNC_colab_abertura\"));\n}\n```\n\n## afterProcessing\n\n---\n\nEste é último evento disparado no formulário. O evento recebe como parâmetro um objeto do tipo [FormController](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md).\n\nNeste contexto, o FormControler deve ser usado apenas para consulta de dados, alterações nos dados não serão persistidas. Assim como o *afterSaveNew* pode ser usado para log ou disparo de algum tipo de evento.\n\n```\nfunction afterProcessing(form){\n}\n```\n\n## beforeMovementOptions" }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n\n---\n\nDiferentemente dos outros eventos que precisam de um script próprio e são executados no servidor, este evento acontece ao clicar em \"enviar\" no navegador antes de abrir a tela de movimentação. Por isso, esse código deve ser implementado em um arquivo javascript vinculado ao formulário html. Ele recebe o parâmetro da atividade atual e é muito útil para algumas validações de campos antes mesmo de ser enviado para o servidor.\n\n**Exemplo de implementação em um arquivo.js**\n\n```\n var beforeMovementOptions = function(numState) {\n if (document.form.codigo.value == '') {\n throw (\"Erro: O código não foi preenchido\");\n }\n return true;\n }\n```\n\nFique atento!\n\nEste método só é executado caso haja a abertura da tela de movimentação, o que leva em consideração se há mais de uma atividade destino ou o mecanismo de atribuição da próxima tarefa. E também não é considerada em movimentações via api, ou diretamente no formulário pela navegação de documento. Utilize o validateForm em conjunto com esse método para garantir a integridade das validações\n\n## beforeSendValidate" }, { "metadata": { "title": "Eventos de Formulário - Exemplo de novo modelo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548258", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo.md" }, "content": "Eventos de Formulário - Exemplo de novo modelo\n\n\n---\n\nAssim como beforeMovementOptions, este evento acontece ao clicar em \"enviar\" no navegador para executar a movimentação em si. Ou seja, depois do *beforeMovementOptions* e independente da tela de seleção de atividade/usuário destino.\n\nEsse código deve ser implementado em um arquivo javascript vinculado ao formulário html. Ele recebe o parâmetro da atividade atual e da atividade destino (ou seja, pra qual atividade está sendo enviado essa solicitação) e é muito útil para algumas validações de campos antes mesmo de ser enviado para o servidor.\n\nOcorre antes da solicitação ser movimentada, após já ter sido selecionada a atividade destino o usuário e demais informações necessárias à solicitação.\n\n**Exemplo de implementação em um arquivo.js**\n\n```\n var beforeSendValidate = function(numState, nextState) {\n if (numState == 1 && nextState == 2 && document.form.codigo.value == '') {\n throw (\"Erro: Para movimentar para a atividade 2, o código deve ser preenchido\");\n }\n return true;\n }\n```\n\n## setEnable\n\n---\n\nEste evento está depreciado e não é mais utilizado." }, { "metadata": { "title": "Como criar eventos de formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548336", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo\\Como criar eventos de formulário.md" }, "content": "Como criar eventos de formulário\n\n\n## Índice" }, { "metadata": { "title": "Como criar eventos de formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849548336", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo\\Como criar eventos de formulário.md" }, "content": "Como criar eventos de formulário\n\n\n- 1 [Objetivo](#Comocriareventosdeformulário-Objetivo)\n- 2 [Pré-requisitos](#Comocriareventosdeformulário-Pré-requisitos)\n- 3 [Como criar eventos de formulário](#Comocriareventosdeformulário-Comocriareventosdeformulário)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é descrever como criar os eventos de formulários avançados no Fluig.\n\n# Pré-requisitos\n\n---\n\nAntes de iniciar, é importante conhecer o [Fluig Studio](../../../Fluig Studio.md) e ler a documentação sobre [Desenvolvimento de Formulários](../../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários.md).\n\n# Como criar eventos de formulário\n\n---\n\nApós a criação de uma definição de formulário é possível realizar a criação de scripts para customização. O eventos para formulários são criados conforme passos a seguir:\n\n- Para a criação de um script de formulário no fluig, na visão *Explorador de pacotes* *(Package Explorer)* deve-se acessar a pasta *forms* do projeto fluig, clicar com o botão direito e no menu acessar *Novo (New) > Outras (Other).*\n\n ![](..\\..\\..\\..\\..\\images\\formulario%20fluig.png)\n\n**Figura 5 - Criação de script evento da definição de formulário.**\n\n- Abra a pasta Fluig e selecione a opção *Script Fluig* e clique no botão *Avançar* *(Next > )*.![](..\\..\\..\\..\\..\\images\\scrpt%20fluig.png)\n\n**Figura 6 - Criação de script evento da definição de formulário.**\n\n- Selecione o tipo e clique em *Avançar (Next >)*.\n\n![](..\\..\\..\\..\\..\\images\\novo%20script.png)\n\n- Nesta tela é necessário informar os campos pertinentes ao evento que se deseja adicionar e clicar no botão *Concluir*.\n\nApós a criação de uma definição de formulário é possível realizar a criação de scripts para customização. O eventos para formulários são criados conforme passos a seguir:\n\nPara a criação de um script de formulário no fluig, na visão Explorador de pacotes (Package Explorer) deve-se acessar a pasta forms do projeto fluig, clicar com o botão direito e no menu acessar Novo (New) > Outras (Other).\n\n\n\nFigura 5 - Criação de script evento da definição de formulário.\n\nAbra a pasta Fluig e selecione a opção Script Fluig e clique no botão Avançar (Next > ).\n\nFigura 6 - Criação de script evento da definição de formulário.\n\nSelecione o tipo e clique em Avançar (Next >). \n\n\n![](..\\..\\..\\..\\..\\images\\image2013-9-23%20104152.png)\n\n**Figura 7 - Criação de script evento da definição de formulário.**\n\n- No exemplo selecionamos o evento *validateForm*, e o relacionamos a definição de formulário *form\\_exemplo\\_fluig*.\n\n![](..\\..\\..\\..\\..\\images\\image2013-9-23%20104323.png)\n\n**Figura 8 - Criação de script evento da definição de formulário.**\n\n- Ao concluir a estrutura principal do método estará disponível no editor.\n\n![](..\\..\\..\\..\\..\\images\\image2013-9-23%20104438.png)\n\n**Figura 9 - Criação de script evento da definição de formulário.**\n\n- Configure seu script. Para entender mais sobre os eventos e algumas dicas continue lendo essa documentação\n\n![](..\\..\\..\\..\\..\\images\\image2013-9-23%20104556.png)\n\n**Figura 10 - Criação de script evento da definição de formulário.**" }, { "metadata": { "title": "Lista de eventos de formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849550372", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo\\Lista de eventos de formulário.md" }, "content": "Lista de eventos de formulário\n\n\n# Eventos\n\n---\n\nOs eventos de formulários são um conjunto de scripts carregados pela API de Formulários, os quais são desenvolvidos utilizando Javascript e são chamados durante a execução de ação em formulários ou em momentos específicos de interação em formulários.\n\n## beforeProcessing\n\n---\n\nEsse evento é o primeiro a ser disparado. Exemplificar a utilidade\n\n## displayFields\n\n---\n\nÉ disparado no momento em que os objetos do formulário são apresentados  e é o permite a alteração antes da renderização.  Pode ser utilizado para esconder um campo ou mesmo para alterar os valores a serem apresentados no campo do formulário. \n\n## enableFields\n\n---\n\nÉ disparado no momento em que os objetos do formulário são habilitados e pode ser utilizado para esconder um campo no formulário.\n\n## [inputFields](Lista de eventos de formulário/Evento inputFields.md)\n\n---\n\nÉ disparado no momento em que os dados do formulário são passados para a camada de negócio responsável por formulário do Fluig e pode ser utilizado para fazer algumas transformações dos valores que são enviados a fim de evitar erros como o formato de data que podem variar conforme o navegador\n\n(...)" }, { "metadata": { "title": "Logs em personalização do Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849549543", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo\\Logs em personalização do Fluig.md" }, "content": "Logs em personalização do Fluig\n\n\n## Índice\n\n- 1 [Objetivo](#LogsempersonalizaçãodoFluig-Objetivo)\n- 2 [Pré-requisitos](#LogsempersonalizaçãodoFluig-Pré-requisitos)\n- 3 [LOGs](#LogsempersonalizaçãodoFluig-LOGs)\n - 3.1 [log.info](#LogsempersonalizaçãodoFluig-log.info)\n - 3.2 [log.warn](#LogsempersonalizaçãodoFluig-log.warn)\n - 3.3 [log.debug](#LogsempersonalizaçãodoFluig-log.debug)\n - 3.4 [log.error](#LogsempersonalizaçãodoFluig-log.error)\n - 3.5 [log.dir](#LogsempersonalizaçãodoFluig-log.dir)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é descrever como criar logs em eventos globais, de formulário, processo e datasets.\n\n# Pré-requisitos\n\n---\n\nAntes de iniciar, é importante que leia a documentação sobre o [Fluig Studio](../../../Fluig Studio.md) e tenha experiência com desenvolvimento usando Javascript ou Java.\n\n# LOGs\n\n---\n\nOs logs são registros que ajudam a entender o funcionamento de um código. Eles desempenham um papel crucial no monitoramento, manutenção e resolução de problemas. No Fluig, o desenvolvedor pode criar logs informativos (info), de alerta (warn), de erro (error) e depuração (debug). Escolher corretamente o tipo de log, ajuda na visualização rápida de problemas no log bem como no controle que permite evitar logs excessivos.\n\n## log.info\n\n---\n\nO log do tipo 'info' é o mais comum de ser utilizado e deve ser usado para registrar alguma informação que é esperada e que pode ajudar a entender o que está sendo executado ou os valores que estão relacionados à execução\n\n```\nlog.info(“Testando o log info”);\n```\n\n**Imprimindo conteúdo de uma variável**\n\n```\nvar nome = \"Meu teste de log\";\nlog.info(nome);\n// ou\nlog.info(“O nome é: \" + nome);\n```\n\n**Registrando o valor de um campo de formulário**\n\n```\nlog.info(“O campo código contém o valor: ” + form.getValue(\"codigo\")); // O objeto 'form' é válido apenas para eventos de formulário\n```\n\n## log.warn" }, { "metadata": { "title": "Logs em personalização do Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849549543", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo\\Logs em personalização do Fluig.md" }, "content": "Logs em personalização do Fluig\n\n\n---\n\nO log do tipo 'warn' deve ser usado para registrar situações que não interrompem o fluxo normal da aplicação, mas que indicam a ocorrência de algo fora do esperado, que pode requerer atenção futura. São úteis para monitorar possíveis problemas que, se não tratados, podem se tornar erros mais graves.\n\n```\nif (diasPrazo < 5) {\n\tlog.warn(“O prazo informado é menor que 5 dias”);\n\t// ...\n}\n```\n\n```\nif (form.getValue(\"codigo\") == \"\") { // O objeto 'form' é válido apenas para eventos de formulário\n    log.warn(“O campo código está em branco e pode apresentar problemas com as integrações”);\n}\n```\n\n## log.debug\n\n---\n\nO log do tipo 'debug' deve ser utilizado para registrar informações detalhadas e de baixo nível sobre a execução do sistema. Esses logs são essenciais durante o desenvolvimento e a depuração de software, pois ajudam a entender o comportamento interno da aplicação, permitindo a identificação precisa de bugs e problemas. Por padrão, o Fluig não exibe os logs de debug que devem ser habilitados conforme essa documentação. Isso ajuda a evitar logs excessivos no Fluig ao mesmo tempo que permitem logs detalhados caso seja habilitado.\n\n```\nlog.debug(\"verificando o prazo (\" + diasPrazo + \")\");\nif (diasPrazo < 5) {\n\tlog.debug(“O prazo informado é menor que 5 dias”);\n\t// ...\n} else {\n \tlog.debug(“O prazo informado não é menor que 5 dias”);\n\t// ...\n }\n```\n\n```\nlog.debug(\"verificando o conteúdo do campo código\")\nvar codigo = form.getValue(\"codigo\"); // O objeto 'form' é válido apenas para eventos de formulário\nif (codigo == \"\") { \n log.debug(\"o campo código está em branco\");\n} else {\n log.debug(\"o campo código está preenchido: \" + codigo);\n}\n```\n\n## log.error" }, { "metadata": { "title": "Logs em personalização do Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849549543", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo\\Logs em personalização do Fluig.md" }, "content": "Logs em personalização do Fluig\n\n\n---\n\nO log do tipo 'error' deve ser usado para registrar eventos que causaram falhas na execução do sistema ou que impedem a conclusão de uma tarefa. Esses logs são críticos para identificar e resolver problemas que afetam a funcionalidade da aplicação, fornecendo detalhes sobre o que deu errado e onde.\n\n```\nif (diasPrazo <= 0) {\n\tlog.error(“Foi informado o prazo \" + diasPrazo + \". O prazo informado deve ser maior que zero”);\n\tthrow \"Informe um prazo superior a zero dias\";\n}\n```\n\n## log.dir\n\n---\n\nO log do tipo 'dir' é utilizado para registrar a estrutura e o conteúdo de objetos de dados em um formato fácil de ler. Ele é especialmente útil para inspecionar e entender a composição de objetos complexos durante a execução, proporcionando uma visualização clara das propriedades e valores internos desses objetos.\n\n```\nvar objeto = {\n \"nome\": \"João\",\n \"idade\": 30,\n \"profissao\": \"Desenvolvedor\",\n \"habilidades\": [\"JavaScript\", \"Java\", \"SQL\"],\n \"endereco\": {\n \"rua\": \"Rua das Flores\",\n \"numero\": 123,\n \"cidade\": \"São Paulo\",\n \"estado\": \"SP\"\n }\n}\n\nlog.dir(objeto);\n```\n\n```\nvar objeto = {'codigo': form.getValue(\"codigo\"), 'nome': form.getValue(\"nome\")}; // O objeto 'form' é válido apenas para eventos de formulário \nlog.dir(objeto);\n```\n\nColocar um print do log deste código" }, { "metadata": { "title": "Evento inputFields", "source": "https://tdn.totvs.com/display/fluig/Evento+inputFields", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Formulário\\Eventos de Formulário - Exemplo de novo modelo\\Lista de eventos de formulário\\Evento inputFields.md" }, "content": "Evento inputFields\n\n\nÉ disparado no momento em que os dados do formulário são passados para a camada de negócio responsável por formulário do Fluig e pode ser utilizado para fazer algumas transformações dos valores que são enviados a fim de evitar erros como o formato de data que podem variar conforme o navegador\n\n**Sintaxe**\n\n```\nfunction inputFields(form){\n // implementação\n}\n```\n\n# Propriedades do getValue\n\nNeste método nenhum parâmetro do [Método getValue](../../../Eventos de Processos/Método getValue.md) está disponível\n\n# Pontos de atenção\n\nEste evento não é executado na \"Movimentação em Bloco\". Como o seu uso é para correções de informações vindas do navegador, e na movimentação em bloco isso não acontece ele não é executado.\n\n# Exemplos de uso\n\n## Padronização de datas\n\nExemplo de código que recupera uma data no formato **YYYY-mm-dd** e grava no formato **dd-mm-YYYY**\n\nHoje no sistema as datas salvas através de formulários pelo navegador Chrome tem o padrão americano (yyyy-mm-dd), enquanto as datas nos demais navegadores tem o padrão brasileiro (dd/mm/yyyy). Para empresas que utilizam múltiplos navegadores e querem que os dados de data estejam padronizados, recomendamos a utilização do evento *inputFields* com o seguinte trecho de código.\n\n**Código para Datas**\n\n```\nfunction inputFields(form) { \n var regEx = /^\\d{4}-\\d{2}-\\d{2}$/; \n\n if (form.getValue(\"dt_solicitacao\").match(regEx)) { \n var split = form.getValue(\"dt_solicitacao\").split('-'); \n form.setValue(\"dt_solicitacao\", split[2] + '-' + split[1] + '-' + split[0]); \n } \n}\n```" }, { "metadata": { "title": "hAPI", "source": "https://tdn.totvs.com/display/fluig/hAPI", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos\\hAPI.md" }, "content": "hAPI" }, { "metadata": { "title": "hAPI", "source": "https://tdn.totvs.com/display/fluig/hAPI", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos\\hAPI.md" }, "content": "hAPI\n\n\nEm todos os eventos do processo é possível obter informações da API de *Workflow*. Cada evento possui acesso ao *handle* da API de *workflow* pela variável global **hAPI**. Os seguintes métodos estão disponíveis através da **hAPI**:\n\nVeja o exemplo em nosso repositório [aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse).\n\n| Método | Especificação |\n| --- | --- |\n| getCardValue(\"nomeCampo\") | Permite acessar o valor de um campo do formulário do processo, onde: - nomeCampo: nome do campo do formulário. Dica Campos do tipo *checkbox* retornarem os valores on para marcado ou \"\" (vazio) para não marcado. Para trabalhar de uma maneira mais fácil, é possível transformá-los em booleanos. Exemplo: ```var campoCheckbox = hAPI.getCardValue(\"campoCheckbox\") == \"on\" ? true : false; ``` |\n| setCardValue(\"nomeCampo\", \"valor\") | Permite definir o valor de um campo do formulário do processo, onde: - nomeCampo: nome do campo do formulário; - valor: valor a ser definido para o campo do formulário. |\n| setAutomaticDecision(numAtiv, listaColab, \"obs\") | Atenção: Depreciado O método setAutomaticDecision encontra-se depreciado, não havendo mais suporte a partir da atualização 1.5.9 do fluig. Recomenda-se a utilização da atividade de [Serviço](http://tdn.totvs.com/pages/viewpage.action?pageId=237397494) ou [Gateway Exclusivo](http://tdn.totvs.com/display/fluig/Gateways). Permite definir o fluxo de saída de uma atividade de forma automática, onde: - numAtiv: número da atividade destino; - listaColab: lista (do tipo String) dos usuários que receberão a tarefa; - Deve ser passada a matricula dos usuários que receberão a tarefa. - Se a atividade destino for automática ou um evento intermediário que não possui usuário, deve ser informado \"System:Auto\" no lugar da matrícula. - obs: observação da tarefa; ``` function beforeStateEntry(sequenceId){ if(sequenceId == 4){ var users = new java.util.ArrayList(); //Caso a próxima atividade seja uma automática utilizar users.add(\"System:Auto\"); users.add(\"adm\"); hAPI.setAutomaticDecision(7, users, \"Decisao tomada automaticamente pelo Fluig\"); } } ``` |\n| getActiveStates() | Retorna uma lista das atividades ativas do processo. |\n| getActualThread(numEmpresa, numProcesso, numAtiv) | Atenção: Depreciado O método getActualThread encontra-se depreciado, não havendo mais suporte a partir da atualização 1.8.0-221122 do Fluig. Recomenda-se a utilização dos parâmetros WKCurrentMovto e WKActualThread descritos na documentação [Parâmetros](Método getValue.md). Retorna a *thread* da atividade que está ativa, lembrando que em caso de atividades paralelas, retorna 0, 1, 2 e assim sucessivamente. - numEmpresa: número da empresa; - numProcesso: número da solicitação; - numAtiv: número da atividade. Exemplo de uso para esta função: ``` function afterTaskCreate(colleagueId) { var nrProxAtividade = getValue(\"WKNextState\"); if (nrProxAtividade == \"5\"){ //atividade entre paralelas var data = new Date(); var numEmpresa = getValue(\"WKCompany\"); //seta o dia, mês (Janeiro é 0) e ano data.setDate(20); data.setMonth(10); data.setFullYear(2010); // Recupera o numero da solicitação var numProcesso = getValue(\"WKNumProces\"); // Seta o prazo para as 14:00 hAPI.setDueDate(numProcesso, hAPI.getActualThread(numEmpresa, numProcesso, nrProxAtividade), colleagueId, data, 50400); } } ``` |\n| setDueDate(numProcesso, numThread, \"userId\", dataConclusao, tempoSeg) | Permite alterar o prazo de conclusão para uma determinada atividade do processo, onde: - numProcesso: número da solicitação; - numThread: número da *thread* (normalmente 0, quando não se utiliza atividades paralelas); - userId: o usuário responsável pela tarefa; - dataConclusao: a nova data de conclusão; - tempoSeg: tempo que representa a nova hora de conclusão, calculado em segundos após a meia-noite. Recomendamos a utilização deste método no evento afterTaskCreate, pois será executado logo após a criação da tarefa. Exemplo: ``` function afterTaskCreate(colleagueId) { \tvar atividade = getValue('WKCurrentState'); \t// Atividade de sequência 5 é a da tarefa criada e que vou alterar o prazo de conclusão \tif (atividade == 5) { \t\t// Recuperando a data informada no campo do formulário \t\tvar prazoFormulario = hAPI.getCardValue('prazoConclusao'); \t\tif (prazoFormulario != undefined && prazoFormulario != '') { \t\t\tvar numeroDaSolicitacao = getValue('WKNumProces'); \t\t\tvar threadDaSolicitacao = 0; // Normalmente 0, quando não for atividade paralela \t\t\tvar responsavelPelaTarefa = colleagueId; \t\t\t \t\t\t/* Nesse caso o formato da data salva pelo formulário no exemplo é DD/MM/AAAA, mas isso pode variar de acordo com a formatação utilizada,  mudando assim as posições das informações dentro do array */ \t\t\t \t\t\t/* Extrai os dados da data do formulário para um array, para posteriormente transformar em data do Javascript */ \t\t\tvar arrayPrazoConclusao = prazoFormulario.split(\"/\"); \t\t\tvar dia = arrayPrazoConclusao[0]; // Posição 0 do array é o dia \t\t\tvar mes = arrayPrazoConclusao[1] - 1; // Posição 1 do array é o mês (Subtraímos 1 porque na data do Javascript o mês vai de 0 a 11) \t\t\tvar ano = arrayPrazoConclusao[2]; // Posição 2 do array é o ano \t\t\t \t\t\tvar horaDoPrazo = (24*60*60) - 1; /* A hora é em milisegundos, e esse cálculo tem resultado de 23:59:59, ou seja,  o prazo de conclusão vai ser até o último segundo do dia informado no formulário */ \t \t\t\t// Cria a data no Javascript \t\t\tvar dataDoPrazo = new Date(); \t\t\tdataDoPrazo.setDate(dia); \t\t\tdataDoPrazo.setMonth(mes); \t\t\tdataDoPrazo.setFullYear(ano); \t\t\t \t\t\t// Altera o prazo de conclusão \thAPI.setDueDate(numeroDaSolicitacao, threadDaSolicitacao, responsavelPelaTarefa, dataDoPrazo, horaDoPrazo); \t\t} \t}\t } ``` |\n| startProcess(processId, ativDest, listaColab, \"obs\", completarTarefa, valoresForm, modoGestor) | Inicia uma solicitação *workflow*, onde: - processId: código do processo; - ativDest: código da atividade de destino; - listaColab: lista (do tipo String) de usuários; - obs: texto da observação; - completarTarefa: indica se deve completar a tarefa (true) ou apenas salvar (false); - valoresForm: um Mapa com os valores do formulário do processo; - modoGestor: indica que o usuário iniciará a solicitação como gestor (true) ou que o usuário iniciará a solicitação apenas como solicitante (false). Retorna um mapa com informações da solicitação criada. Entre elas, o iProcess que é o número da solicitação criada. Exemplo de inicialização de uma solicitação pelo método hAPI.startProcess enviando a atividade para um papel: ``` function beforeStateEntry(sequenceId){ \t \tif (sequenceId == 5) { \t\t//A tarefa destino tem o mecanismo de atribuição para um papel, cujo o código é papelUser \t\tvar users = new java.util.ArrayList(); \t\tusers.add(\"Pool:Role:papelUser\"); \t\t \t\tvar formData = new java.util.HashMap();   \t\tformData.put(\"Nome_do_Campo1\", \"Valor do Campo 1\"); formData.put(\"Nome_do_Campo2\", \"Valor do Campo 2\"); \t\t\t\t\t\t \t\thAPI.startProcess(\"pool\", 4, users, \"Solicitação inicializada pela função hAPI\", true, formData, false); \t} \t } ``` |\n| setColleagueReplacement(userId) | Seta um usuário substituto, onde: - userId: código do usuário substituto. |\n| setTaskComments(\"userId\", numProcesso,  numThread, \"obs\") | Define uma observação para uma determinada tarefa do processo, onde: - userId: usuário responsável pela tarefa; - numProcesso: número da solicitação de processo; - numThread: é o número da *thread* (normalmente 0, quando não se utiliza atividades paralelas); - obs: a observação. Atenção É recomendado utilizar em eventos do tipo 'after', pois o comentário será criado no histórico da solicitação, então é necessário que já exista uma movimentação do processo para atribuir este comentário. |\n| getCardData(numProcesso) | Retorna um Mapa com todos os campos e valores do formulário da solicitação. - numProcesso: número da solicitação de processo. Para formulário pai e filho, os campos são identificados da seguinte forma: **campo1\\_\\_\\_1,** sendo **campo1** o nome atribuído ao campo através da tag do campo HTML +\\_\\_\\_(3 underlines) + **número sequencial do registro**. Por exemplo, em um formulário de nota fiscal com os seguintes campos: - Formulário pai: - Número da Nota - numNota; - Formulário filho: - Código do item - codItem; - Descrição do item - desItem; - Quantidade do item - qtdItem; O retorno do mapa seria: - numNota = 99999 - codItem\\_\\_\\_1 = 91 - desItem\\_\\_\\_1 = Caneta - qtdItem\\_\\_\\_1 = 100 - codItem\\_\\_\\_2 = 92 - desItem\\_\\_\\_2 = Lápis - qtdItem\\_\\_\\_2 = 200 - codItem\\_\\_\\_3 = 93 - desItem\\_\\_\\_3 = Borracha - qtdItem\\_\\_\\_3 = 150 |\n| getAdvancedProperty(\"propriedade\") | Retorna o valor da propriedade avançada de um processo. - propriedade: nome da propriedade avançada. |\n| calculateDeadLineHours(data, segundos, prazo, periodId) Importante! Este método retorna o horário com a formatação BRT, sendo necessário algumas adaptações em algumas funções do javascript, como exemplo: getFullYear(). | Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no produto passando o prazo em horas: - data: data inicial (tipo Date); - segundos: quantidade de segundos após a meia noite; - prazo: prazo que será aplicado em horas (tipo int); - periodId: código de expediente. Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo: ``` function afterTaskCreate(colleagueId) { var data = new Date(); //Calcula o prazo var obj = hAPI.calculateDeadLineHours(data, 50000, 2, \"Default\"); var dt = obj[0]; var segundos = obj[1]; //Recupera o numero da solicitação var processo = getValue(\"WKNumProces\"); //Altera o prazo do processo hAPI.setDueDate(processo,0,colleagueId, dt, segundos); } ``` |\n| calculateDeadLineTime(data, segundos, prazo, periodId) | Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no produto passando o prazo em minutos: - data: data inicial (tipo Date); - segundos: quantidade de segundos após a meia noite; - prazo: prazo que será aplicado em minutos (tipo int); - periodId: código de expediente. Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo: ``` function afterTaskCreate(colleagueId) { var data = new Date(); //Calcula o prazo var obj = hAPI.calculateDeadLineTime(data, 50000, 120, \"Default\"); var dt = obj[0]; var segundos = obj[1]; //Recupera o numero da solicitação var processo = getValue(\"WKNumProces\"); // Altera o prazo do processo hAPI.setDueDate(processo,0,colleagueId, dt, segundos); } ``` |\n| getUserTaskLink(numAtiv) | Permite buscar o *link* para movimentação de uma determinada atividade, e utilizá-lo para enviar um *e-mail* com *template* personalizado, por exemplo. - numAtiv: número da atividade Retorno: *link* para movimentação da solicitação. Atenção Este método não retorna *link* para atividades que ainda não foram criadas, ou seja, não pode ser utilizado em eventos como afterTaskComplete(colleagueId,nextSequenceId,userList) para obter o *link* da atividade com \"nextSequenceId\". Exemplo: ``` function afterTaskCreate(colleagueId) { var sequenceId = getValue(\"WKCurrentState\"); if (sequenceId == 2) { var destinatarios = new java.util.ArrayList(); destinatarios.add(colleagueId); var parametros = new java.util.HashMap(); parametros.put(\"WDK_CompanyId\", getValue(\"WKCompany\")); parametros.put(\"WDK_TaskLink\", hAPI.getUserTaskLink(sequenceId)); notifier.notify(getValue(\"WKUser\"), \"tplCustomizado\", parametros, destinatarios, \"text/html\"); } } ``` |\n| createAdHocTasks(workflowProcessInstanceId, sequenceId, assunto, detalhamento, listatvidadesAhoc) | Permite a criação de atividades adhoc dentro dos eventos do fluig - workflowProcessInstanceId: número da solicitação *workflow* no qual se deseja criar as tarefas; - sequenceId: código de sequencia da atividade de SubprocessoAdhoc; - Assunto: assunto da listagem das tarefas que será repassado ao formulário de atividade ad-hoc; - Detalhe: texto com o detalhamento das atividades em questão. Esse texto também será repassado para o formulário da atividade ad-hoc; - listaAtividadesAdhoc: é a lista de atividades contento o que, quando e quem executará as tarefas ad-hoc. Atenção Certifique-se que o *sequenceId* é a sequência da atividade ad-hoc. Normalmente esta atividade contém o símbolo do sub-processo comum acompanhado do identificador \"~\", conforme exemplo abaixo : A sequência pode ser consultada a partir do *plugin* fluig Designer verificando o campo código ao visualizar as propriedades da atividade de subprocesso ad-hoc. Exemplo: ``` function beforeStateEntry(sequenceId){ //lista das tarefas var adHocTasks = new Array(); // variavel com o código da solicitação do processo. var process = getValue(\"WKNumProces\"); //criando uma tarefa var task = { name:\"nome da tarefas\", responsible:\"adm\", dueDate:\"10/10/2014\"}; //adicionando a tarefa criada para a lista de tarefas adHocTasks.push(task); // process = numero da solicitacao // sequenceId = codigo processstate da atividade que tem o processo ad-hoc // meeting = nome do assunto em questao // detalhe = detalhamento do assunto // adHocTasks lista te tarefas hAPI.createAdHocTasks(process, sequenceId, \"Assunto das tarefas\", \"Detalhamento do assunto \", adHocTasks); } ``` |\n| listAttachments() | Retorna a lista de anexos do processo. DocumentDto[ ] [Veja aqui](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto) os paramêtros do objeto DocumentDto e [aqui](http://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos#DesenvolvimentodeEventos-DocumentDto) os métodos para acesso as variáveis. Atenção O formulário do processo não é retornado, apenas anexos do tipo GED e *Workflow*. Exemplo: ``` function beforeTaskSave(colleagueId, nextSequenceId, userList) { var attachments = hAPI.listAttachments(); var hasAttachment = false; for (var i = 0; i < attachments.size(); i++) { var attachment = attachments.get(i); if (attachment.getDocumentDescription() == \"fluig.pdf\") { hasAttachment = true; } } if (!hasAttachment) { throw \"Attachment not found!\"; } } ``` |\n| publishWorkflowAttachment(documento) | Permite publicar anexos *workflow* da solicitação no GED do fluig, onde: - documento: anexo *workflow* a ser publicado no GED. Atenção É obrigatório informar o id da pasta destino do documento através do método setParentDocumentId, conforme o exemplo abaixo. Importante Utiliza os parâmetros do objeto DocumentDto. Exemplo: ``` function beforeStateEntry(sequenceId){ if (sequenceId == 4) { var calendar = java.util.Calendar.getInstance().getTime(); var docs = hAPI.listAttachments(); for (var i = 0; i < docs.size(); i++) { var doc = docs.get(i); if (doc.getDocumentType() != \"7\") { continue; } doc.setParentDocumentId(27); doc.setVersionDescription(\"Processo: \" + getValue(\"WKNumProces\")); doc.setExpires(false); doc.setCreateDate(calendar); doc.setInheritSecurity(true); doc.setTopicId(1); doc.setUserNotify(false); doc.setValidationStartDate(calendar); doc.setVersionOption(\"0\"); doc.setUpdateIsoProperties(true); hAPI.publishWorkflowAttachment(doc); } } } ``` |\n| attachDocument(documentId) | Permite anexar documentos do GED a solicitação *workflow*, onde: - documentId: código do documento a ser anexado a solicitação. Exemplo: ``` function beforeStateEntry(sequenceId) { var docList = [44, 46, 135]; if (sequenceId == 2) { for (var i = 0; i < docList.length; i++) { var docId = docList[i]; hAPI.attachDocument(docId); }; } } ``` Veja o exemplo (**document-attach**) no [repositório do fluig](https://git.fluig.com/projects/SAMPLES) clicando [aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/document-attach). |\n| getAvailableStatesDetail(companyId, userId, processId, processInstanceId, threadSequence) | Retorna detalhes das atividades disponíveis para seleção. Parâmetros: - companyId: código da empresa; - userId: id do usuário; - processId: código do processo; - processInstanceId: número da solicitação; - threadSequence: indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito, dependendo da quantidade de atividade paralelas existentes no processo. Retorno: ProcessStateDto[]. |\n| getChildrenInstances(processInstanceId) | Retorna uma lista com os números das solicitações filhas, onde: - processInstanceId: número da solicitação pai. Exemplo: ``` function beforeStateEntry(sequenceId){ if (sequenceId == 5) { var numProcess = getValue(\"WKNumProces\"); // Busca a Lista com o número da solicitação dos filhos var childrenProcess = hAPI.getChildrenInstances(numProcess); for (var i = 0; i < childrenProcess.size(); i++) { // Busca os dados do formulário da solicitação filha var childCardData = hAPI.getCardData(childrenProcess.get(i)); // Replica um dado do formulário da solicitação filha para o formulário da solicitação pai var obs = childCardData.get(\"obs\"); hAPI.setCardValue(\"obs\", obs ); } } } ``` |\n| getParentInstance(processInstanceId) | Retorna o número da solicitação pai, onde: - processInstanceId: número da solicitação filha. Exemplo: ``` function beforeStateEntry(sequenceId) { if (sequenceId == 2) { var numProcess = getValue(\"WKNumProces\"); // Busca o número da solicitação pai var parentProcess = hAPI.getParentInstance(numProcess); // Busca os dados do formulário da solicitação pai var parentCardData = hAPI.getCardData(parentProcess); // Replica um dado do formulário da solicitação pai para o formulário da solicitação filha var cnpj = parentCardData.get(\"cnpj\"); hAPI.setCardValue(\"cnpj\", cnpj); } } ``` |\n| addCardChild(tableName, cardData) | Adiciona um filho no formulário pai e filho do processo, onde: - tableName: nome da tabela filha onde será criado o filho; - cardData: mapa com os campos do filho e seus valores. Exemplo: ``` function beforeStateEntry(sequenceId) { if (sequenceId == 4) { var childData = new java.util.HashMap(); childData.put(\"matricula\", \"0041\"); childData.put(\"nome\", \"João Silva\"); childData.put(\"cpf\", \"44455889987\"); hAPI.addCardChild(\"funcionarios\", childData); } } ``` |\n| removeCardChild | Este método estará disponível a partir da atualização **1.8.1** do TOTVS Fluig Plataforma. Remove uma linha de uma tabela Pai X Filho. Utilize o método **removeCardChild**, passando o nome da tabela (valor do atributo name) e o número da linha que deseja deletar. Exemplo: removeCardChild(tableName, 1); Observação Caso queira excluir mais de uma linha e chamar o método mais de uma vez (utilizando um laço de repetição), se atente ao detalhe de que cada chamada nesse método ele irá resetar os index dos filhos da tabela por exemplo: Uma tabela tem 3 registros(A,B,C) e você utiliza o método duas vezes para excluir as duas primeiras linhas (A,B): removeCardChild(tableName, 1); removeCardChild(tableName, 2); Nesse caso ele estaria excluindo a linha A e linha C, pois quando chamou o primeiro método para excluir a linha 1(A) ele resetou os index da tabela e a linha 2(B) passou a ser 1 e a 3(C) passou a ser 2 e assim por diante. Temos duas alternativas para esse cenário: **1** - Excluir primeiro os últimos registros Exemplo: removeCardChild(tableName, 2); removeCardChild(tableName, 1); **2** - Antes de excluir utilizar um for para percorrer a linha de forma decrescente. Assim você garante estar excluindo sempre a linha que deseja sem interferir na próxima, por exemplo: ``` var indexes = hAPI.getChildrenIndexes(\"tableName\"); for (var i = indexes.length-1; i >= 0; i--) { \thAPI.removeCardChild(\"tableName\", indexes[i]); } ``` Ou este outro exemplo: ``` var indexes = hAPI.getChildrenIndexes(\"tableName\"); for (var i = indexes.length-1; i >= 0; i--) { \tif (indexes[i] == 1) { \t\thAPI.removeCardChild(\"tableName\", indexes[i]); \t} } ``` Onde a variável indexes[i] possui o valor do número da linha. |\n| getChildrenIndexes | Retorna um lista com os filhos de um formulário Pai x Filho. Utilize o método **getChildrenIndexes**, passando o nome da tabela (valor do atributo name). **1 -** Utilize um for para percorrer cada linha e aplicar sua lógica, por exemplo: ``` var indexes = hAPI.getChildrenIndexes(\"tableName\"); var resultado = []; for (var i = 0; i < indexes.length; i++) { var campoCompleto = \"seu_campo___\" + indexes[i]; var linha = hAPI.getCardValue(campoCompleto); resultado.push(linha); } log.dir(resultado) ``` Esse método está acessível a partir da segunda atividade do processo. Este método está disponível até a versão **1.8.2** do TOTVS Fluig Plataforma. Acompanhe o [Release Notes](https://tdn.totvs.com/pages/viewpage.action?pageId=979805603) para verificar a liberação nas próximas versões. |\n\n**oculto**\n\nNos eventos existe a possibilidade de integração com serviços de dados. Tais serviços podem ser WebServices, AppServer Progress® e Dataset.\n\nO acesso a WebServices ou AppServer Progress® deve ser previamente configurado no cadastro de Serviços. Para mais detalhes consulte em [Integração com aplicativos externos](http://tdn.totvs.com/pages/viewpage.action?pageId=73082260), no capítulo \"Acessando WebServices a partir do fluig\".\n\nAbaixo um exemplo de como executar o WebService de Colleague para criar um usuário no fluig após executar uma tarefa:\n\n```\nfunction afterTaskComplete(colleagueId, nextSequenceId, userList) {\n \n if (nextSequenceId == 2) {\n //Busca o webservices de Colaborador\n //Servico \"/webdesk/ECMColleagueService?wsdl\" cadastrado com o código \"Colleague\"\n var colleagueServiceProvider = ServiceManager.getServiceInstance(\"Colleague\");\n var colleagueServiceLocator = colleagueServiceProvider.instantiate(\"com.totvs.technology.ecm.foundation.ws.ECMColleagueServiceService\");\n var colleagueService = colleagueServiceLocator.getColleagueServicePort();\n \n //Cria o ColleagueDto – Verificar a lista de métodos na visualização do serviço\n var colleagueDto = colleagueServiceProvider.instantiate(\"com.totvs.technology.ecm.foundation.ws.ColleagueDto\");\n colleagueDto.setCompanyId(1);\n colleagueDto.setColleagueId(\"teste\");\n colleagueDto.setColleagueName(\"Usuario Teste\");\n colleagueDto.setActive(true);\n colleagueDto.setVolumeId(\"Default\");\n colleagueDto.setLogin(\"teste\");\n colleagueDto.setMail(\"teste@empresa.com\");\n colleagueDto.setPasswd(\"teste\");\n colleagueDto.setAdminUser(false);\n colleagueDto.setEmailHtml(true);\n colleagueDto.setDialectId(\"pt_BR\");\n \n //Cria o colleagueDtoArray e adiciona\n var colleagueDtoArray = colleagueServiceProvider.instantiate(\"com.totvs.technology.ecm.foundation.ws.ColleagueDtoArray\");\n colleagueDtoArray.getItem().add(colleagueDto);\n \n var result = colleagueService.createColleague(\"adm\", \"adm\", 1, colleagueDtoArray);\n log.info(\"Result: \" + result);\n }\n}\n```\n\nAbaixo um outro exemplo utilizando o WebService ECMCardService para alterar o valor do campo de um registro de formulário após a entrada em uma nova atividade:\n\n```\nfunction afterStateEntry(sequenceId){\n if (sequenceId == 2) {\n //Servico \"/webdesk/ECMCardService?wsdl\"cadastrado com o código \"CardService\"\n var cardServiceProvider = ServiceManager.getServiceInstance(\"01\");\n\t var cardServiceLocator = cardServiceProvider.instantiate(\"com.totvs.technology.ecm.dm.ws.ECMCardServiceService\");\n\t var cardService = cardServiceLocator.getCardServicePort();\n\t var cardFieldDtoArray = cardServiceProvider.instantiate(\"com.totvs.technology.ecm.dm.ws.CardFieldDtoArray\");\n\t var cardField = cardServiceProvider.instantiate(\"com.totvs.technology.ecm.dm.ws.CardFieldDto\");\n \n //Seta valor no campo com name = 'nome'\n cardField.setField(\"nome\");\n cardField.setValue(\"Valor alterado via WS dentro de um evento workflow\");\n \n var vetCardFields = new Array();\n vetCardFields.push(cardField);\n cardFieldDtoArray.getItem().addAll(vetCardFields);\n \n //Altera o(s) campo(s) do registro de formulário.\n //updateCardData(tenantId, login, senha, codRegistroForm, cardFieldDtoArray);\n cardService.updateCardData(1, \"adm\", \"adm\", 8, cardFieldDtoArray);\n }\n}\n```\n\nOs seguintes eventos são disparados pela API de *Workflow*:\n\n| Evento | Descrição | Parâmetros |\n| --- | --- | --- |\n| afterCancelProcess | Ocorre após o cancelamento da solicitação. É recomendado não disparar exceções neste método, pois o cancelamento já foi realizado. | - Usuário corrente (String); - Número do processo (Integer). |\n| afterProcessCreate | Ocorre logo após a criação de um novo processo. | - Número do novo processo (Integer). |\n| afterProcessFinish | Ocorre após finalizada a solicitação. | - Número do processo (Integer). |\n| afterReleaseVersion | Ocorre após a liberação de uma versão do processo. | - XML com a definição do processo (String). |\n| afterStateEntry | Ocorre após a entrada em uma nova atividade. Este evento não retorna erros para a tela naturalmente. Caso ocorra um erro durante a execução do afterStateEntry, ele será ignorado. Se o mesmo erro resultar no encerramento da transação (por exemplo, causando o *timeout* de transação ou uma exceção que force *Rollback*) a mensagem de transação interrompida será apresentada em tela ao invés do erro esperado. | - Sequência da atividade (Integer). |\n| afterStateLeave | Ocorre após a saída de uma atividade. | - Sequência da atividade (Integer). |\n| afterTaskComplete | Ocorre após o usuário completar uma tarefa, porém as informações de próxima tarefa e usuários destino já foram salvas. | - Usuário corrente (String); - Sequência da próxima atividade (Integer); - Lista de usuários destino (List). |\n| afterTaskCreate | Ocorre após o usuário receber uma tarefa. | - Matrícula do usuário (String). |\n| afterTaskSave | Ocorre após salvar as informações selecionadas pelo usuário. | - Usuário corrente (String); - Sequência da próxima atividade (Integer); - Lista de usuários destino (List). |\n| beforeCancelProcess | Ocorre antes do cancelamento da solicitação. | - Usuário corrente (String); - Número do processo (Integer). |\n| beforeStateEntry | Ocorre antes da entrada em uma nova atividade. Dica   Utilize este evento para realizar validações que ocasionalmente possam resultar no bloqueio da movimentação do processo. Para suspender a movimentação e exibir uma mensagem de alerta para o usuário, utilize o comando 'throw', conforme exemplo abaixo: | | | --- | | `throw` `\"Erro ao movimentar solicitação\"``;` | | - Sequência da atividade (Integer). |\n| beforeStateLeave | Ocorre antes da saída de uma atividade. | - Sequência da atividade (Integer). |\n| beforeTaskComplete | Ocorre antes que o usuário complete uma tarefa, porém as informações de próxima tarefa e usuários destino já foram salvas. Observação   Diferente dos demais eventos do tipo **before**, este evento **não** dispara suas validações ao servidor, fazendo com que o sistema não pare a movimentação da atividade quando o mesmo lança uma exceção. | - Usuário corrente (String); - Seqüência da próxima atividade (Integer); - Lista de usuários destino (List). |\n| beforeTaskCreate | Ocorre antes que o usuário receba uma tarefa. | - Matrícula do usuário (String). |\n| beforeTaskSave | Ocorre antes de salvar as informações selecionadas pelo usuário. | - Usuário corrente (String); - Sequência da próxima atividade (Integer); - Lista de usuários destino (List). |\n| calculateAgreement | Ocorre após o cálculo do consenso (somente para atividades conjuntas) e permite alterar os dados do consenso de uma atividade. Exemplo: ``` function calculateAgreement(currentState, agreementData) { log.info(\"Consenso Atual: \" + agreementData.get(\"currentPercentage\")); log.info(\"Atividade Destino Atual: \" + agreementData.get(\"currentDestState\")); log.info(\"Usuario Destino Atual: \" + agreementData.get(\"currentDestUsers\")); //Altera o consenso agreementData.put(\"currentPercentage\", 100); agreementData.put(\"currentDestState\", 2); agreementData.put(\"currentDestUsers\", \"marcos\"); } ``` | - currentState (Integer): atividade que terá o consenso alterado; - agreementData (Map): mapa de dados com o percentual calculado, a atividade destino e os usuários de destino. Para obter os valores, utilize o método \"get\" e para atribuir um valor, utilize o método \"put\". |\n| onNotify | Se refere a um evento global que ocorre após a movimentação da solicitação e antes de enviar as notificações. | Para mais detalhes consulte a página [Desenvolvimento de eventos - On Notify](http://tdn.totvs.com/display/fluig/Desenvolvimento+de+Eventos#DesenvolvimentodeEventos-OnNotify). |\n| subProcessCreated | Ocorre quando um sub-processo é criado. | - Número do sub-processo (Integer). |\n| validateAvailableStates | Ocorre após montada a lista de tarefas disponíveis para o usuário a partir da tarefa atual. Exemplo: ``` function validateAvailableStates(iCurrentState, stateList) { // Código: 1 - Descrição: Atividade inicial // Código: 2 - Descrição: Atividade ordem 3 // Código: 3 - Descrição: Atividade ordem 2 // Código: 4 - Descrição: Atividade ordem 1 // stateList atual: [2,3,4] var stateArray = new Array(); if (iCurrentState == 1) { stateList.clear(); stateArray.push(4,3,2); } stateArray.forEach(function(code) { stateList.add(new java.lang.Integer(code)); }); // stateList reordenado: [4,3,2] return stateList; } ``` | - iCurrentState: Sequência da atividade atual (Integer); - stateList: Lista das sequências dapublishWorkflowAttachments atividades (List). |\n\n- Não é necessário criar todos os eventos do processo – apenas aqueles nos quais se tem interesse.\n- Todos os eventos são executados de forma persistente.\n\nImportante!\n\n \n\nNão é possível capturar (hAPI.getCardValue) ou adicionar (hAPI.setCardValue) dados no formulário na inicialização do processo, sendo possível somente a partir da segunda tarefa.\n\nPara isso pode ser utilizada a seguinte lógica:\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId != \"NUMERO_DA_ATIVIDADE_INICIAL\") {\n var campo = hAPI.getCardValue(\"campo1\");\n }\n}\n```" }, { "metadata": { "title": "Método getValue", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270919174", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos\\Método getValue.md" }, "content": "Método getValue" }, { "metadata": { "title": "Método getValue", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270919174", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos de Processos\\Método getValue.md" }, "content": "Método getValue\n\n\nO método **getValue** é utilizado para obter dados específicos associados aos eventos de personalização. Através deste método, é possível acessar diferentes propriedades dependendo do tipo de evento.\n\nEsta documentação fornece uma visão geral do método getValue e orientações sobre como utilizá-lo com base nas propriedades de diversos tipos de eventos.\n\n# Parâmetros nos eventos de documentos e formulário\n\nOs eventos de formulário possuem bastante variações nos parâmetros disponíveis por evento, por isso, consulte a documentação do evento para conhecer os parâmetros disponíveis.\n\n# Parâmetros específicos para eventos de processo\n\n| Parâmetro | Descrição |\n| --- | --- |\n| WKDef | Código do processo. |\n| WKVersDef | Versão do processo. |\n| WKNumProces | Número da solicitação de processo. |\n| WKNumState | Número da atividade. Importante Para realizar a busca pelo número da atividade, indica-se o uso do parâmetro WKNumState. Caso utilize um campo de formulário, uma segunda chamada pode ser feita para atualizar este campo, o que pode causar inconsistências inesperadas. |\n| WKCompany | Número da empresa. |\n| WKUser | Código do usuário corrente. |\n| WKUserComment | A partir do fluig 1.5 é possível adicionar Complementos em uma solicitação. Este recurso permite inserir diversas observações na mesma solicitação. Ou seja, não temos mais apenas um comentário por atividade. Os complementos em solicitações permitem que um usuário adicione comentários ou anexos em uma solicitação aberta sendo ou não responsável pela tarefa corrente com a finalidade de evitar comunicação por outros meios que não ficarão registrados no histórico do processo. Por isso a forma de retornar a informação mudou para a variável WKUserComment. Agora ela recebe um texto com todas as observações feitas pelos usuários na atividade corrente. Exemplo do valor atual da variável WKUserComment: \" Nome do usuário - 09/03/2017 - 10:46 - Observação feita pelo usuário Nome do usuário - 09/03/2017 - 10:45 - Nova observação feita pelo usuário \" OBS: Esse parâmetro irá retornar apenas os comentários da atividade corrente. A partir da Atualização 1.5, para resgatar os complementos (observação) de uma tarefa, deve ser utilizado o método da API Pública: Documentação indicada para auxiliar na utilização da API publica em eventos: |\n| WKCompletTask | Se a tarefa foi completada (\"true\"/\"false\"). |\n| WKNextState | Número da próxima atividade (destino). |\n| WKCardId | Código do registro de formulário do processo. |\n| WKFormId | Código do formulário do processo. |\n| WKIdentityCompany | Identificador da empresa selecionada para Experiências de uso TOTVS. Esse parâmetro corresponde à empresa que está selecionada quando as experiências de uso TOTVS estão ativas. Nesse cenário, quando o usuário clica na imagem do perfil (canto superior direito), uma das opções que aparece é \"Trocar empresa\". Ao clicar nessa opção aparecerá uma ou mais empresas nas quais o usuário está configurado no Identity. O parâmetro WKIdentityCompany corresponde à empresa selecionada nessa opção de Trocar empresa, e uma forma de verificar o valor que está definido é através do painel de controle, nos dados adicionais do usuário, com a chave \"UX-APP-COMPANY\". |\n| WKMobile | Identifica se a ação foi realizada através de um dispositivo *mobile*. |\n| WKIsService | Identifica se a solicitação de cancelamento foi realizada através de um serviço. Esta variável só pode ser consultada nos eventos *beforeCancelProcess* e *afterCancelProcess*. |\n| WKUserLocale | Identifica o idioma corrente do usuário. |\n| WKManagerMode | Identifica se o processo está sendo movimentado pela visão do gestor do processo ou não. Importante notar que esse parâmetro apenas retorna true/false caso o formulário esteja sendo movimentado por um processo *workflow*. Caso ele esteja sendo aberto e alterado pela navegação de documentos este parâmetro é nulo. |\n| WKReplacement | Código do usuário substituto Observação Para processos que estejam sendo acessados por um usuário substituto, o usuário logado será o retorno do parâmetro WKReplacement |\n| WKIsTransfer | Permite verificar se o usuário está ou não transferindo uma tarefa. |\n| WKCurrentMovto | Permite a movimentação do processo. |\n| WKActualThread | Retorna a Thread atual do processo. |\n| takeTask | Identifica se a atividade foi assumida. |\n\nPara validar se o usuário está completando uma atividade corretamente, basta utilizar o evento **beforeTaskSave** e retornar alguma mensagem caso queira disparar um erro. Por exemplo, segue parte de um código de desenvolvimento de um processo sob a plataforma:\n\n```\nfunction beforeTaskSave(colleagueId, nextSequenceId, userList) {\n\tvar atividadeAtual = getValue(\"WKNumState\");\n\n\tvar tipo = hAPI.getCardValue(\"tipo\");\n\tvar eficacia1 = hAPI.getCardValue(\"eficaz1\"); \n\tvar controle1 = hAPI.getCardValue(\"controle1\");\n\tvar eficaz = true;\n\n\tvar users = new java.util.ArrayList();\n\n\tif (ativAtual == 7 && nextSequenceId == 12) {\n\t\tif (responsavel == \"\") {\n\t\t\tthrow \"Antes de salvar esta solicitação, você deve informar o 'Tipo' no formulário\";\n\t\t}\n\t}\n}\n```\n\nPara iniciar uma nova solicitação de um outro processo ao finalizar uma solicitação podem ser executados os seguintes procedimentos:\n\n1. Cadastrar um serviço no fluig em que a URL seja o WSDL do serviço ECMWorkflowEngineService.\n2. Implementar o evento **afterProcessFinish** utilizando o exemplo abaixo, sendo ‘process2’ o novo processo a ser inicializado.\n\n```\nfunction afterProcessFinish(processId) {\n\tvar user = \"adm\";\n\tvar pass = \"1b09d18a-dbc2-4146-ac33-8864dc283120\";\n \tvar companyId = parseInt(getValue(\"WKCompany\"));\n \tvar processId = \"process2\";\n\tvar serviceName = \"WorkflowEngineService\";\n\n    // Servico /webdesk/ECMWorkflowEngineService?wsdl\n\t// Busca o webservice cadastrado com o código \"WorkflowEngineService\"\n\tvar workflowEngineServiceProvider = ServiceManager.getServiceInstance(serviceName);\n\tvar workflowEngineServiceLocator = workflowEngineServiceProvider.instantiate(\"com.totvs.technology.ecm.workflow.ws.ECMWorkflowEngineServiceService\");\n\tvar workflowEngineService = workflowEngineServiceLocator.getWorkflowEngineServicePort();\n \n\t// Cria o ProcessAttachmentDtoArray\n\tvar processAttachmentDtoArray = workflowEngineServiceProvider.instantiate(\"com.totvs.technology.ecm.workflow.ws.ProcessAttachmentDtoArray\");\n\n\t// Cria o ObjectFactory\n\tvar objectFactory = workflowEngineServiceProvider.instantiate(\"net.java.dev.jaxb.array.ObjectFactory\");\n\t\n\t// Cria um String[][]\n\tvar cardData = objectFactory.createStringArrayArray();\n\n\n    // Cria uma solicitação\n\tworkflowEngineService.simpleStartProcess(user, pass, companyId, processId, \"Comment\", processAttachmentDtoArray, cardData);\t\n}\n```\n\nExistem outros métodos parar iniciar uma solicitação, consulte-os [aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=73084007#UtilizaçãodeWebservices-ECMWorkflowEngineService).\n\nLembre-se de consultar a classe ObjectFactory do serviço, essa classe possui diversos métodos para criar instância de objetos necessários para utilização do serviço.\n\nExemplo para barrar o usuário de movimentar a solicitação com o campo \"nome\" vazio. Caso o mesmo salve a solicitação, a ação será permitida.\n\n```\nfunction beforeTaskSave(colleagueId, nextSequenceId, userList) {\n\tvar completTask = getValue(\"WKCompletTask\"); // 'true' - Completando a tarefa; 'false' - Salvando a tarefa\n\tvar fieldName = hAPI.getCardValue(\"name\");\n \n\tif (completTask == 'true' && (!fieldName || !fieldName.trim()) {\n\t\tthrow(\"Não é permitido movimentar uma solicitação com o campo 'Nome' vazio!\");\n\t}\n}\n```\n\nExemplo que permite verificar se o usuário está ou não transferindo uma tarefa:\n\n```\nfunction beforeTaskCreate(colleagueId) {\n\tvar isTransfer = getValue(\"WKIsTransfer\");\n\n\tif (isTransfer !== null) {\n\t\tif (JSON.parse(isTransfer)) {\n\t\t\tthrow \"Não é permitido transferir a atividade!\";\n\t\t}\n\t}\n}\n```" }, { "metadata": { "title": "Como criar um Evento Global", "source": "https://tdn.totvs.com/display/fluig/Como+criar+um+Evento+Global", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Como criar um Evento Global.md" }, "content": "Como criar um Evento Global\n\n\n- [Pré-requisitos](#ComocriarumEventoGlobal-Pré-requisitos)\n- [Quem pode criar um evento global?](#ComocriarumEventoGlobal-Quempodecriarumeventoglobal?)\n- [Demonstração](#ComocriarumEventoGlobal-Demonstração)\n- [Desenvolvimento de Eventos](#ComocriarumEventoGlobal-DesenvolvimentodeEventos)\n\n---\n\nEsse guia visa orientar a como criar um Evento Global via Fluig Studio para ser utilizado na plataforma Fluig.\n\n## Pré-requisitos\n\n---\n\n- Ter baixado e instalado o [Fluig Studio](../../Fluig Studio.md).\n\n## Quem pode criar um evento global?\n\n---\n\nUsuários administradores da empresa ou usuários com permissões configuradas no recurso [\"Configurar Eventos Globais\"](http://tdn.totvs.com/pages/viewpage.action?pageId=269431799).\n\n## Demonstração\n\n---\n\nAbaixo, temos uma demonstração de como criar um evento global.\n\n## Desenvolvimento de Eventos" }, { "metadata": { "title": "Como criar um Evento Global", "source": "https://tdn.totvs.com/display/fluig/Como+criar+um+Evento+Global", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Como criar um Evento Global.md" }, "content": "Como criar um Evento Global\n\n\n---\n\n**01.** A partir do [Fluig Studio](../../Fluig Studio.md), crie um novo projeto (ou utilize um já existente), clique com o botão direito sobre a pasta ***events***e em seguida ***Novo** -> **Evento Global fluig*** conforme a imagem abaixo.\n\n![](..\\..\\..\\..\\images\\image2013-9-19%20152928.png)\n\n**Criação de evento - fluig Studio.**\n\n**02.** Em seguida, informe o **Servidor** e **Nome** do evento que será adicionado. Uma tela para edição do evento será aberta, conforme imagem abaixo:\n\n![](..\\..\\..\\..\\images\\image2013-9-19%20153341.png)\n\n**Criação de evento - fluig Studio.**\n\nÉ possível observar também que o arquivo **.js** foi adicionado a pasta ***events*** do projeto.\n\nO Fluig permite utilizar o log de execução nos eventos desenvolvidos sobre a plataforma. Através da variável global **log** é possível obter o feedback da execução de cada evento. Existem quatro níveis de log, são eles:\n\n- **ERROR:** apresentação de erros.\n- **DEBUG:** depurar a execução.\n- **WARN:** informar possível problema de execução.\n- **INFO:** apresentação de mensagens.\n\nA forma como cada tipo de log é exibido depende da configuração do servidor de aplicação. Por padrão, no servidor de aplicação, as mensagens do tipo **info** e **warn** são apresentadas no console, enquanto as mensagens do tipo **debug** e **error** são registradas no arquivo de log.\n\nA seguir, é apresentado um exemplo de uso de log em script:\n\n```\nlog.info(\"Testando o log info\");\n```\n\nTeríamos no console do servidor a mensagem **\"Testando o log info\"**.\n\nAtenção\n\nA maioria dos eventos utiliza o parâmetro **WKUser** para identificar o usuário responsável pela ação. Quando a funcionalidade de **substituto** é utilizada — em que um usuário pode atuar em nome de outro — o valor retornado em **WKUser** será sempre o usuário que estiver efetivamente logado no sistema no momento da ação.\n\nEXEMPLO \n![](..\\..\\..\\..\\images\\seta-direita.png) Ana definiu Bruno como seu substituto. Ao acessar o sistema, Bruno realiza uma ação em nome de Ana. Nesse caso, os eventos que utilizam **WKUser** irão retornar o código do usuário **Bruno**, e não o de Ana.\n\nEm todos os eventos é possível realizar chamadas para os serviços disponíveis na API pública. Acesse **[aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=185736325)** nosso guia de consumo da API pública em eventos." }, { "metadata": { "title": "Diferença entre os eventos Before e After", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1022377345", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Diferença entre os eventos Before e After.md" }, "content": "Diferença entre os eventos Before e After\n\n\n- [Eventos do tipo \"Before\"](#DiferençaentreoseventosBeforeeAfter-Eventosdotipo\"Before\")\n- [Eventos do tipo \"After\"](#DiferençaentreoseventosBeforeeAfter-Eventosdotipo\"After\")\n\n---\n\nEsta documentação visa exemplificar e contextualizar a diferença entre os eventos do tipo Before e After.\n\n## Eventos do tipo \"Before\"\n\n---\n\nDe forma geral, os eventos do tipo **before** são executados antes que a ação que disparou o evento seja efetivada. Isso permite filtrar os dados que são passados no evento e, se necessário, **impedir que a ação seja concluída**.\n\nPara bloquear a ação, basta lançar uma **Exception** contendo uma mensagem de texto, que será exibida ao usuário no formato apropriado. Confira o exemplo abaixo:\n\nEXEMPLO\n\n**Estrutura do Evento**\n\n```\nfunction beforeUpdateUser(user) {\n // Verifica se foi alterada a senha do usuário\n if (user.getPassword() != null) {\n // Caso a senha tenha sido alterada verifica se ela atende os requisitos mínimos\n var passwordPattern = \"((?=.*\\\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,16})\";\n if (!user.getPassword().matches(passwordPattern)) {\n throw \"A senha deve ter entre 8 e 16 caracteres e conter pelo menos: uma letra maiúscula, uma minúscula, um número e um caractere especial (@, #, $ ou %).\";\n }\n }\n \n // Adiciona um dado adicional ao usuário informando a última data de atualização\n var dateFormat = new java.text.SimpleDateFormat(\"dd/MM/yyyy HH:mm:ss\");\n user.putData(\"LastUpdateDate\", dateFormat.format(new Date()));\n}\n```\n\n## Eventos do tipo \"After\"" }, { "metadata": { "title": "Diferença entre os eventos Before e After", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1022377345", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Diferença entre os eventos Before e After.md" }, "content": "Diferença entre os eventos Before e After\n\n\n---\n\nOs eventos do tipo **after** são executados após a efetivação da ação e **não exercem influência** sobre ela. Isso significa que qualquer dado alterado no parâmetro recebido dentro do evento **não será refletido** no conteúdo persistido pela ação.\n\nOutra característica desse tipo de evento é que **não devem lançar Exception**. Caso isso ocorra, a Exception será ignorada pelo sistema e não produzirá efeito sobre a ação já concluída. Confira o exemplo abaixo:\n\nEXEMPLO\n\n**Estrutura do Evento**\n\n```\nfunction afterCreateUser(user) {\n // Instância um cliente da API pública do Fluig. O usuário aplicativo utilizado\n // precisa ser um administrador do Fluig\n // Documentação para criar usuário aplicativo: http://tdn.totvs.com/x/KAFlDw\n var consumer = oauthUtil.getNewAPIConsumer(\n \"e3fe3d72-bfcc-4552-8c9b-93c66531dab9\", //Consumer Key do OAuth App\n \"6bd0591b-73d8-4a9e-a161-d54dd92d3172-5a21991e-453f-4ea1-b80c-f42d4c57759d\", //Consumer Secret do OAuth App\n \"11a419dd-0c8a-4388-bd32-d66319bd750b\", //Access Token do Usuário Aplicativo\n \"fd2b53a4-b43d-4118-9725-68abaa1b41a9ee584784-73b2-454b-942f-5e07ad114234\"); //Token Secret do Usuário Aplicativo\n \n // Adiciona o usuário criado na comunidade RH através da utilização do método\n // addParticipants do serviço de comunidades da API Pública\n // Alterar a comunidade RH para a comunidade que deseja realizar a ação em seu ambiente\n var postJson = '{\"communityAlias\": \"RH\", \"userAliases\": [\"' + user.getLogin() + '\"]}';\n consumer.post(\"/public/social/community/addParticipants\", postJson);\n}\n```" }, { "metadata": { "title": "Evento beforeLogin", "source": "https://tdn.totvs.com/display/fluig/Evento+beforeLogin", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Evento beforeLogin.md" }, "content": "Evento beforeLogin" }, { "metadata": { "title": "Evento beforeLogin", "source": "https://tdn.totvs.com/display/fluig/Evento+beforeLogin", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Evento beforeLogin.md" }, "content": "Evento beforeLogin\n\n\n- [Sintaxe](#EventobeforeLogin-Sintaxe)\n- [Parâmetros](#EventobeforeLogin-Parâmetros)\n - [Confira abaixo alguns exemplos](#EventobeforeLogin-Confiraabaixoalgunsexemplos)\n - [Consultando um serviço cadastrado no Fluig para verificar se há um bloqueio](#EventobeforeLogin-ConsultandoumserviçocadastradonoFluigparaverificarseháumbloqueio)\n - [Obrigando que o IP de requisição seja de uma faixa específica](#EventobeforeLogin-ObrigandoqueoIPderequisiçãosejadeumafaixaespecífica)\n - [Compatibilidade](#EventobeforeLogin-Compatibilidade)\n\n---\n\nO evento **beforeLogin** é um evento global do Fluig executado **após** as validações de senha e de bloqueio do usuário e **antes** da conclusão do login. Ele pode ser utilizado tanto para monitoramento quanto para bloquear o login de um usuário em determinadas situações.\n\nAtenção!\n\nO uso indevido do evento **beforeLogin** pode causar inconsistências no processo de login da plataforma, impedindo que usuários consigam acessar o sistema.\n\nEm casos mais críticos, até mesmo o **usuário administrador** pode ser bloqueado, o que impossibilita a atualização ou correção do próprio evento beforeLogin. Nessas situações, torna-se necessária uma **intervenção direta no banco de dados** para resolver o problema.\n\n# Sintaxe\n\n---\n\nA seguir é apresentada a sintaxe básica do evento **beforeLogin**. Esse evento deve ser implementado por meio de uma função chamada **beforeLogin**, que é executada automaticamente durante o processo de autenticação do usuário. Dentro dessa função, é possível realizar validações adicionais ou aplicar regras personalizadas e, se necessário, bloquear o login lançando uma **Exception** com a mensagem que será exibida ao usuário.\n\n```\nfunction beforeLogin(login, origin, requestInfoVO) {}\n```\n\n# Parâmetros\n\n---\n\n**login**\n\n- Uma string com o login do usuário que está tentando fazer o login\n\n**origin**\n\n- Uma string contendo o valor do atributo \"com.totvs.technology.security.protocol\" da requisição. O valor padrão para tentativas de login via web é **null**.\n\n**requestInfoVO**\n\n- Um objeto do tipo [RequestInfoVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378406) contendo os dados  da requisição de login." }, { "metadata": { "title": "Evento beforeLogin", "source": "https://tdn.totvs.com/display/fluig/Evento+beforeLogin", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Evento beforeLogin.md" }, "content": "Evento beforeLogin\n\n## Confira abaixo alguns exemplos\n\n---\n\n#### **Consultando um serviço cadastrado no Fluig para verificar se há um bloqueio**\n\n```\nfunction beforeLogin(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\n\t// Caso o usuário esteja bloqueado pelo serviço customizado lança uma exceção informando\n\t// que o usuário está desativado no serviço customizado e cancela o login no Fluig\n if (service.isBlockedUser(login)) {\n\t\tthrow \"O usuário \" + login + \" está desativado no serviço customizado\";\n }\n}\n```\n\n#### **Obrigando que o IP de requisição seja de uma faixa específica**\n\n```\nfunction beforeLogin(login, origin, requestInfoVO) {\n if (requestInfoVO) { // previne erros em versões onde esse parâmetro não existia\n if (!requestInfoVO.ip.startsWith(\"172.\")) {\n throw \"Você deve estar conectado na VPN para realizar o acesso ao Fluig\";\n }\n }\n}\n```\n\n## Compatibilidade\n\n---\n\nO parâmetro **requestInfoVO** foi implementado na versão **2.0.0-260224**." }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n- [Eventos gerais disponíveis](#OutrosEventosGlobais-Eventosgeraisdisponíveis)\n- [Objetos utilizados nos eventos](#OutrosEventosGlobais-Objetosutilizadosnoseventos)\n - [Exemplo com usuário de aplicação](#OutrosEventosGlobais-Exemplocomusuáriodeaplicação)\n- [Atualização do Analytics](#OutrosEventosGlobais-AtualizaçãodoAnalytics)\n - [Definição](#OutrosEventosGlobais-Definição)\n - [Exemplo de uso](#OutrosEventosGlobais-Exemplodeuso)\n\n# Eventos gerais disponíveis\n\n---\n\nA seguir, são apresentados os **eventos gerais** disponíveis no Fluig, que podem ser disparados independentemente de uma atividade específica de um card.\n\n### DisplayCentralTasks\n\nEste evento é disparado **sempre antes** da exibição da central de tarefas. Por meio dele, é possível **inserir**, **alterar** ou **remover** os links exibidos nessa central. O evento recebe como parâmetro um **LinkedHashMap** contendo os links disponíveis na central de tarefas.\n\n#### **Exemplo de como adicionar um link customizado ao final dos itens da central de tarefas**\n\n```\nfunction displayCentralTasks (links){\nlinks.put(\"Fluig\",\"http://www.fluig.com\");\n}\n```\n\n#### **Exemplo de alteração na ordem de exibição dos links padrão, com a adição de três novos links: um no início e dois ao final**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n```\nfunction displayCentralTasks (links){\n\tvar _links = new java.util.LinkedHashMap();\n\t_links.put(\"Fluig\",\"http://www.fluig.com\"); \n var it = links.keySet().iterator();\n while (it.hasNext()) { \n var key = it.next();\n _links.put(key, links.get(key));\n\t} \n\t_links.put(\"Fluig - DEV\" ,\"http://dev.fluig.com\");\n\t_links.put(\"Google\",\"http://www.google.com.br/search?sourceid=chrome&ie=UTF-8&q=\" + getValue(\"WKUser\"));\n\n\tlinks.clear();\n\tlinks.putAll(_links);\n}\n```\n\nDisponibilizamos outras informações sobre o usuário e a empresa, porém essas informações podem ser consultadas somente via método **getValue**.\n\n| | |\n| --- | --- |\n| **WKUser** | Código do usuário |\n| **WKCompany** | Número da empresa |\n\n**Exemplo**\n\n```\nfunction displayCentralTasks (links){\nlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```\n\n### DisplayCustomMetadata" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEste evento é disparado antes da exibição dos campos customizados de um documento, tanto no momento da publicação quanto da edição. Por meio dele, é possível definir valores iniciais para os campos customizados dos metadados do documento. O evento recebe como parâmetro uma referência aos campos customizados do documento.\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n}\n```\n\nNo contexto deste evento a variável **fields** pode ser utilizada para consultar ou modificar os valores dos campos customizados de um documento. **Não permitindo adicionar novos campos**.\n\nPara inserir novos campos em um documento, podem ser utilizadas as formas descritas abaixo.\n\n- Pela herança da pasta pai;\n- No cadastro de **Campos Customizados**, marcando a opção *Mostrar em todos documentos* ou da forma padrão;\n- Através do WebService CustomFieldsService;\n- Na edição dos metadados do documento, pelo usuário.\n\nPara consultar o valor de um campo customizado neste evento, utiliza-se o **fields.getValue** passando como parâmetro o código do campo desejado. Retornando “null”, casso o campo não esteja disponível para este documento.\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n\tlog.info(\"Valor do Campo 1: \" + fields.getValue(\"campo1\"));\n}\n```\n\nJá pra a **edição** utiliza-se o fields.setValue, passando como parâmetro, **primeiro o nome do campo**, **em seguida o valor**.\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n\tfields.setValue(\"campo1\",\"Valor para o Campo 1\");\n}\n```\n\nAlém dos valores dos campos customizados, disponibilizamos outras informações do documento que está sendo criado ou editado, porém essas informações podem ser consultadas somente via método **getValue**.\n\n| | |\n| --- | --- |\n| **WKUser** | Código do usuário |\n| **WKCompany** | Número da empresa |\n| **WKNumParentDocument** | Número da pasta pai |\n| **WKDocumentType** | Tipo do documento |\n| **WKPrivateDocument** | Se o documento esta sendo publicado na pasta particular (true/false) |\n\n**Exemplo**\n\n```\nfunction displayCustomMetadata(fields){\n\tlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n### BeforeWatchContent\n\nEste evento é utilizado quando, ao acompanhar um conteúdo, é necessário recuperar informações do registro **antes** da execução da ação de “acompanhar”. Por exemplo, ao acompanhar um documento, é possível obter suas informações e utilizá-las em um **dataset**.\n\n**Exemplo**\n\n```\nfunction beforeWatchContent(companyId, watchDTO){\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **companyId** | Código da Empresa | int |\n| **watchDTO** | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction beforeWatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"DOCUMENT\"){\n\t\tvar objClass = \"com.totvs.technology.social.document.6\";\n\t\tvar objClass = watchDTO.getObjectClass();\n\t\tvar patt = new RegExp( /\\d+/) ; \n\t\tvar documentId = patt.exec(objClass) ;\n\t\tvar documentVersion = watchDTO.getObjectId();\n\t\tvar doc = getValue(\"WKDocument\"); \n\t\tvar company = companyId; \n\t\tvar ds ;\n\t\ttry { \n\t\t\tvar c1 = DatasetFactory.createConstraint( \"allocatedDocumentPK.companyId\", company, company, ConstraintType.MUST); \n\t\t\tvar c2 = DatasetFactory.createConstraint(\"allocatedDocumentPK.sourceDocument\",documentId,documentId, ConstraintType.MUST); \n\t\t\tvar c3 = DatasetFactory.createConstraint(\"allocatedDocumentPK.sourceVersion\", documentVersion,documentVersion, ConstraintType.MUST); \n\t\t\tvar c4 = DatasetFactory.createConstraint(\"active\", \"true\",\"true\",ConstraintType.MUST); \n\t\t\tvar constraints = new Array(c1, c2, c3, c4); \n\t\t\t\n\t\t\tds = DatasetFactory.getDataset(\"allocatedDocument\", null, constraints, null); \n\t\t}catch (e) {\n\t\t\tlog.error(\"Erro ao tentar recuperar o documento em CheckOut: \" + e.message); \n\t\t} \n\t \n\t\tif(ds!=null && ds.rowsCount>0){ \n\t\t throw \"Sua solicitação de notificação foi negada, pois o documento está em checkout.\" ; \n\t\t}\n\t}\n}\n```\n\n### AfterWatchContent" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEste evento é utilizado quando, ao acompanhar um conteúdo, é necessário recuperar informações do registro **após** a execução da ação de “acompanhar”. Por exemplo, ao acompanhar um post, é possível recuperar suas informações e utilizá-las para informar o usuário sobre o autor da publicação.\n\n**Exemplo**\n\n```\nfunction afterWatchContent(companyId, watchDTO){\t\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **companyId** | Código da Empresa | int |\n| **watchDTO** | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction afterWatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"POST\"){\n\t\tthrow \"O usuário \"+watchDTO.getUserAlias()+\" vai ser notificado sobre o post \" + watchDTO.getText() + \" do autor \" + watchDTO.getPostAuthor() ;\n\t}\n}\n```\n\n### BeforeUnwatchContent\n\nEste evento é utilizado quando, ao deixar de acompanhar um conteúdo, é necessário recuperar informações do registro **antes** da execução da ação de “deixar de acompanhar”. Por exemplo, ao tentar deixar de acompanhar uma comunidade, é possível avaliar se o usuário pode ou não deixar de acompanhá-la.\n\n**Exemplo**\n\n```\nfunction beforeUnwatchContent(companyId, watchDTO){\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **companyId** | Código da Empresa | int |\n| **watchDTO** | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction beforeUnwatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"COMMUNITY\"){\n\t\t\n\t\tthrow \"Você não pode deixar de ser notificado sobre a comunidade \" + watchDTO.getDescription() ;\n\t}\n}\n```\n\n### AfterUnwatchContent" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEste evento é utilizado quando, ao deixar de acompanhar um conteúdo, é necessário recuperar informações do registro **após** a execução da ação de “deixar de acompanhar”. Por exemplo, ao deixar de acompanhar um post, é possível recuperar suas informações e informar ao usuário que aquele post possui muitos seguidores.\n\n**Exemplo**\n\n```\nfunction afterUnwatchContent(companyId, watchDTO){\n}\n```\n\nSendo os parâmetros:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **companyId** | Código da Empresa | int |\n| **watchDTO** | Dados do registro | WatchDTO |\n\n**Exemplo**\n\n```\nfunction afterUnwatchContent(companyId, watchDTO){\n\tif(watchDTO.getSocialWatchType() == \"POST\" && watchDTO.getNumberWatchers() < 3 ){\n\t\tlog.erro(\"O post \\\"\" + watchDTO.getText() + \"\\\" do autor \" + watchDTO.getPostAuthor() + \" deixou de ser polemico\" )\n\t}\n}\n```\n\n### beforeCreateUser\n\nEvento disparado **antes da criação de um novo usuário**. Pode ser utilizado para realizar validações antes da criação do usuário ou para adicionar dados adicionais de forma programática.\n\n```\nfunction beforeCreateUser(user) {\n}\n```\n\nSomente os atributos **firstName**, **lastName**, **fullName** podem ser modificados. Para adicionar dados adicionais é necessário utilizar o método **addData** do **UserEventVO**.\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **user** | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n\n#### **Exemplo de implementação**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n```\nfunction beforeCreateUser(user) {\n\t// Verifica se a senha informada atende os requisitos mínimos\n\tvar passwordPattern = \"((?=.*\\\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,16})\";\n\tif (!user.getPassword().matches(passwordPattern)) {\n\t\tthrow \"A senha do usuário não atendeu os requisitos mínimos!\";\n\t}\n\n\t// Adiciona um dado adicional ao usuário informando a sua data de criação\n\tvar dateFormat = new java.text.SimpleDateFormat(\"dd/MM/yyyy HH:mm:ss\");\n\tuser.putData(\"CreationDate\", dateFormat.format(new Date()));\n}\n```\n\n### afterCreateUser\n\nEvento disparado depois da criação de um novo usuário. Pode ser utilizado quando for necessário realizar alguma rotina com o usuário criado, como exemplo a criação de recursos adicionais para o usuário.\n\n```\nfunction afterCreateUser(user) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **user** | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n\n#### **Exemplo de implementação**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n```\nfunction afterCreateUser(user) {\n\t// Instância um cliente da API pública do Fluig. O usuário aplicativo utilizado\n\t// precisa ser um administrador do Fluig\n\t// Documentação para criar usuário aplicativo: http://tdn.totvs.com/x/KAFlDw\n\tvar consumer = oauthUtil.getNewAPIConsumer(\n\t\t\t\"e3fe3d72-bfcc-4552-8c9b-93c66531dab9\", //Consumer Key do OAuth App\n\t\t\t\"6bd0591b-73d8-4a9e-a161-d54dd92d3172-5a21991e-453f-4ea1-b80c-f42d4c57759d\", //Consumer Secret do OAuth App\n\t\t\t\"11a419dd-0c8a-4388-bd32-d66319bd750b\", //Access Token do Usuário Aplicativo\n\t\t\t\"fd2b53a4-b43d-4118-9725-68abaa1b41a9ee584784-73b2-454b-942f-5e07ad114234\"); //Token Secret do Usuário Aplicativo\n\n\t// Adiciona o usuário criado na comunidade RH através da utilização do método \n\t// addParticipants do serviço de comunidades da API Pública\n\t// Alterar a comunidade RH para a comunidade que deseja realizar a ação em seu ambiente\n\tvar postJson = '{\"communityAlias\": \"RH\", \"userAliases\": [\"' + user.getLogin() + '\"]}';\n\tconsumer.post(\"/public/social/community/addParticipants\", postJson);\n}\n```\n\n### beforeUpdateUser" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEvento disparado antes da atualização de um usuário. Pode ser utilizado quando for necessário realizar validações no usuário antes da sua atualização ou adicionar dados adicionais programaticamente.\n\n```\nfunction beforeUpdateUser(user) {\n}\n```\n\nSomente os atributos **firstName**, **lastName**, **fullName** podem ser modificados. Para adicionar dados adicionais é necessário utilizar o método **addData** do **UserEventVO**.\n\nPara verificar se a senha do usuário foi alterada basta utilizar o método **getPassword**, onde caso seja retornado algum valor significa que a senha foi alterada. Já para verificar se a atualização do usuário foi realizada por ele próprio, através da edição de perfil, é necessário comparar o login do usuário recebido como parâmetro, através do método **getLogin** com o login do usuário corrente, resgatado através da chamada **getValue(\"WKUser\")**, onde caso sejam iguais significa que a atualização foi realizada pelo próprio usuário.\n\nEXEMPLO\n\n```\n// Verifica se foi alterada a senha do usuário\nif (user.getPassword() != null) {\n\tdoSomething();\n}\n \n// Verifica se a atualização do usuário foi realizada por ele próprio\nif (user.getLogin().equals(getValue(\"WKUser\"))) {\n\tdoSomething();\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **user** | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n\n#### **Exemplo de implementação**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n```\nfunction beforeUpdateUser(user) {\n\t// Verifica se foi alterada a senha do usuário\n\tif (user.getPassword() != null) {\n\t\t// Caso a senha tenha sido alterada verifica se ela atende os requisitos mínimos\n\t\tvar passwordPattern = \"((?=.*\\\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,16})\";\n\t\tif (!user.getPassword().matches(passwordPattern)) {\n\t\t\tthrow \"A senha do usuário não atendeu os requisitos mínimos!\";\n\t\t}\n\t}\n\n\t// Adiciona um dado adicional ao usuário informando a última data de atualização\n\tvar dateFormat = new java.text.SimpleDateFormat(\"dd/MM/yyyy HH:mm:ss\");\n\tuser.putData(\"LastUpdateDate\", dateFormat.format(new Date()));\n}\n```\n\n### afterUpdateUser" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEvento disparado depois da atualização de um usuário, ou após a gravação de uma nova senha, pelo recurso de reset de senha da [tela de login](https://tdn.totvs.com/pages/viewpage.action?pageId=389547065).\n\nO evento *afterUpdateUser* será disparado no reset de senha pela tela de login somente na **atualização 1.6.5 ou superior**.\n\nEste evento pode ser utilizado quando for necessário executar alguma rotina com o usuário atualizado, como, por exemplo, a atualização de recursos adicionais associados a esse usuário.\n\n```\nfunction afterUpdateUser(user) {\n}\n```\n\nPara verificar se a senha do usuário foi alterada basta utilizar o método **getPassword**, onde caso seja retornado algum valor significa que a senha foi alterada. Já para verificar se a atualização do usuário foi realizada por ele próprio, através da edição de perfil, é necessário comparar o login do usuário recebido como parâmetro, através do método **getLogin** com o login do usuário corrente, resgatado através da chamada **getValue(\"WKUser\")**, onde caso sejam iguais significa que a atualização foi realizada pelo próprio usuário.\n\nEXEMPLO\n\n```\n// Verifica se foi alterada a senha do usuário\nif (user.getPassword() != null) {\n\tdoSomething();\n}\n \n// Verifica se a atualização do usuário foi realizada por ele próprio\nif (user.getLogin().equals(getValue(\"WKUser\"))) {\n\tdoSomething();\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **user** | Objeto que contém as informações do usuário | [UserEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n\n#### **Exemplo de implementação**\n\n```\nfunction afterUpdateUser(user) {\n\tlog.info(\"O usuário \" + user.getFullName() + \" foi alterado.\");\n}\n```\n\n### beforeDeactivateUser" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEvento disparado antes da desativação de um usuário. Pode ser utilizado quando for necessário realizar validações no usuário antes da sua desativação.\n\n```\nfunction beforeDeactivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **login** | Login do usuário a ser desativado | String |\n\n#### **Exemplo de implementação**\n\n```\nfunction beforeDeactivateUser(login) {\n\t// Instância um cliente da API pública do Fluig. O usuário aplicativo utilizado\n\t// precisa ser um administrador do Fluig\n\tvar consumer = oauthUtil.getNewAPIConsumer(\n\t\t\t\"e3fe3d72-bfcc-4552-8c9b-93c66531dab9\", \n\t\t\t\"6bd0591b-73d8-4a9e-a161-d54dd92d3172-5a21991e-453f-4ea1-b80c-f42d4c57759d\",\n\t\t\t\"11a419dd-0c8a-4388-bd32-d66319bd750b\",\n\t\t\t\"fd2b53a4-b43d-4118-9725-68abaa1b41a9ee584784-73b2-454b-942f-5e07ad114234\");\n\n\t// Verifica se o usuário que esta sendo desativado é moderador de alguma comunidade. \n\tvar moderateCommunities = [];\n\tvar communities = JSON.parse(consumer.get(\"/public/social/community/listCommunities\")).content;\n\tfor (var i in communities) {\n\t\tvar isModerator = JSON.parse(consumer.get(\"/public/social/community/isCommunityModerator/\" \n\t\t\t\t+ communities[i].alias + \"/\" + login)).content;\n\t\tif (isModerator) {\n\t\t\tmoderateCommunities.push(communities[i].name);\n\t\t}\n\t}\n\n\t// Caso o usuário seja moderador de alguma comunidade lança uma exceção informando que\n\t// o usuário é moderador de comunidades e não pode ser desativado\n\tif (moderateCommunities.length > 0) {\n\t\tthrow \"O usuário \" + login + \" não pode ser desativado por ser moderador nas comunidades: \" \n\t\t\t\t+ moderateCommunities.join(\", \") + \".\";\n\t}\n}\n```\n\n### afterDeactivateUser" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEvento disparado depois da desativação de um usuário. Pode ser utilizado quando for necessário realizar alguma rotina com o usuário desativado.\n\n```\nfunction afterDeactivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **login** | Login do usuário desativado | String |\n\n#### **Exemplo de implementação**\n\n```\nfunction afterDeactivateUser(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\tservice.deactivateUser(login);\n\n\tlog.info(\"O usuário \" + login + \" foi desativado no serviço customizado.\");\n}\n```\n\n### beforeActivateUser\n\nEvento disparado antes da ativação de um usuário. Pode ser utilizado quando for necessário realizar validações no usuário antes da sua ativação.\n\n```\nfunction beforeActivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **login** | Login do usuário a ser ativado | String |\n\n#### **Exemplo de implementação**\n\n```\nfunction beforeActivateUser(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\n // Caso o usuário esteja desativado no serviço customizado lança uma exceção informando\n\t// que o usuário está desativado no serviço customizado e não pode ser ativado no Fluig\n if (service.isDeactivatedUser(login)) {\n\t\tthrow \"O usuário \" + login + \" está desativado no serviço customizado e não pode ser ativado!\";\n }\n}\n```\n\n### afterActivateUser" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEvento disparado depois da ativação de um usuário. Pode ser utilizado quando for necessário realizar alguma rotina com o usuário ativado.\n\n```\nfunction afterActivateUser(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **login** | Login do usuário ativado | String |\n\n#### **Exemplo de implementação**\n\n```\nfunction afterActivateUser(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n\tservice.activateUser(login);\n\n\tlog.info(\"O usuário \" + login + \" foi ativado no serviço customizado.\");\n}\n```\n\n### afterLogin\n\nEvento disparado após o login de um usuário. Pode ser utilizado quando for necessário realizar alguma rotina  quando o usuário é autenticado no fluig.\n\n```\nfunction afterLogin(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **login** | Login do usuário | String |\n\n#### **Exemplo de implementação**\n\n```\nfunction afterLogin(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n service.addUserSession(login);\n}\n```\n\nO evento **afterLogin** funciona mesmo com a autenticação via Identity. O DesktopSSO ou a autenticação automática não interfere na execução do evento, porque ele é executado depois do login não importando como é feito.\n\n### onLoginError" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEvento disparado quando ocorrer um erro de login de um usuário. Este erro pode ser por login e senha inválidos ou usuário inativo. Pode ser utilizado quando for necessário realizar alguma rotina quando ocorrer um erro de login ou apresentar uma mensagem personalizada para o usuário.\n\n```\nfunction onLoginError(login, errorCause) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **login** | Login do usuário | String |\n| **errorCause** | Motivo do erro de login, onde: 0 - Login e senha inválidos 1 - Usuário inativo | Integer |\n\n#### **Exemplo de implementação**\n\n```\nfunction onLoginError(login, errorCause) {\n\t// Verifica se a causa de erro foi senha inválida (0 - Senha inválida, 1 - Usuário inativo)\n\tif (errorCause == 0) {\n\t\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\t\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n\t var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n\t var service = serviceLocator.getCustomServicePort();\n\t \n\t service.registerLoginAttempt(login);\n\t \n\t // Utiliza o serviço customizado para verificar quantas tentativas de login o usuário já\n\t // realizou. Caso tenha ultrapassado 3 tentativas bloqueia o usuário neste serviço \n\t // customizad e lança uma exceção informando ao usuário que ele foi bloqueado.\n\t var loginAttempts = service.checkLoginAttempts(login);\n\t if (loginAttempts > 3) {\n\t \tservice.blockUser(login);\n\t \tthrow \"Seu usuário foi bloqueado por ultrapassar 3 tentativas de login\"\n\t } else {\n\t \tthrow \"Tentativa de login \" + loginAttempts + \" de 3\"\n\t }\n\t}\n}\n```\n\n### onLogout" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEvento disparado quando o usuário realizar logout. Pode ser utilizado quando for necessário realizar alguma rotina quando o usuário realiza o logout no portal através da opção Sair.\n\n```\nfunction onLogout(login) {\n}\n```\n\nParâmetro da função:\n\n| | | |\n| --- | --- | --- |\n| Propriedade | Descrição | Tipo |\n| **login** | Login do usuário | String |\n\n#### **Exemplo de implementação**\n\n```\nfunction onLogout(login) {\n\t// Busca um serviço customizado cadastrado no Fluig e invoca um método específico dele\n\tvar provider = ServiceManager.getServiceInstance(\"CustomService\"); \n var serviceLocator = provider.instantiate(\"com.fluig.sample.service.CustomService_Service\"); \n var service = serviceLocator.getCustomServicePort();\n service.removeUserSession(login);\n \n log.info(\"Usuário \" + login + \" efetuou logout\");\n}\n```\n\n### onNotify" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nPara interferir no envio de uma notificação padrão do fluig, deve ser utilizado o evento global *onNotify*, que é disparado no momento em que qualquer notificação do fluig é enviada. Nesse evento, podem ser feitas alterações como, por exemplo, adicionar outros destinatários ao e-mail, modificar os valores dos parâmetros utilizados no template de e-mail, etc.\n\n**Abaixo disponibilizamos um exemplo de como implementar este evento**\n\n```\nfunction onNotify(subject, receivers, template, params) {\n if (template == \"TPLDOCUMENT_APPROVAL_PENDING\") {\n receivers.add(\"usuario@dominio.com\");\n }\n}\n```\n\nAtenção\n\nA partir da versão 1.3.3 do Fluig, recomenda-se fazer a validação do template utilizando **template == \"TPLDOCUMENT\\_APPROVAL\\_PENDING****\"**ao invés da função match(), evitando assim redundâncias na customização, pois o match() pode retornar como válido para mais de um *template* em casos como TPLNEW\\_TASK e TPLNEW\\_TASK\\_POOL\\_GROUP.\n\nDica\n\nA partir da versão Fluig 1.5.13 o fluigAPI estárá habilitado para este evento.\n\nO evento onNotify está disponível na lista de eventos globais. Ao selecionar esse evento na lista de eventos disponíveis, a assinatura da função acima já será preenchida automaticamente. Este evento disponibiliza os seguintes parâmetros:\n\n| Parâmetro | Descrição |\n| --- | --- |\n| **subject** | É o assunto do e-mail. A alteração desta variável irá implicar que todos os usuários recebam o e-mail com o novo assunto configurado. Exemplo de utilização: **subject.add(\"ASSUNTO\");** |\n| **receivers** | Lista de e-mails destinatários. Também é possível adicionar outros e-mails, de usuários que não participam do processo. Inclusive, podem ser adicionados e-mails de usuários que não estão cadastrados no fluig, caso seja necessário notificar uma pessoa que não tenha acesso ao sistema. |\n| **template** | Permite validar qual tipo de e-mail está sendo enviado (por exemplo, template de documento em aprovação, documento expirando, etc). Com base nessa variável podemos distinguir quais e-mails queremos customizar. É recomendável que sempre seja verificado o código do template, para evitar que ocorram alterações em outros tipos de e-mail, que não necessitariam de customização. |\n| **params** | É um mapa de dados que permite alterar/incluir parâmetros para que sejam apresentados no e-mail. O nome dos parâmetros informados nesse mapa devem ser os mesmos que são utilizados dentro do arquivo de template. |\n\nNo exemplo que foi apresentado acima é validado se o template se refere ao *\"TPLDOCUMENT\\_APPROVAL\\_PENDING\"* (que corresponde a documento pendente de aprovação). Em caso positivo, um novo e-mail será adicionado na lista de destinatários. Ou seja, além do responsável pela aprovação, outra pessoa será notificada, recebendo uma cópia do e-mail. Como está sendo validado o código do template, os demais tipos de e-mail não serão afetados.\n\nOs templates podem ser consultados dentro do diretório do volume, em: *\\templates\\tplmail*. Se for necessário adicionar algum parâmetro no e-mail padrão, os templates podem ser editados diretamente nesse diretório.\n\nImportante\n\n- O evento global onNotify possui bind de variáveis para acesso à log, datasetManager, DatasetFactory, DatasetBuilder, ConstraintType e ServiceManager.\n- Recomenda-se verificar a lista de parâmetros (params) recebida antes de utilizá-los, pois estes variam de acordo com o template utilizado.\n- Quando um workflow possuir evento onNotify, o evento global onNotify será ignorado para os e-mails daquele processo.\n- É imprescindível a validação pelo código do template antes de qualquer implementação, pois TODOS os e-mails passarão por esta customização quando o evento estiver registrado.\n\nDica\n\nQuando o evento onNotify for utilizado como evento global, é necessário informar uma constraint extra informando o usuário para fixar as permissões, já que o evento onNotify não é executado por nenhum usuário mas sim pelo sistema. Vale lembrar ainda que quando for utilizar algum dataset interno do fluig, é necessário tambem informar uma constraint.\n\nEXEMPLO\n\nvar constraintUser = DatasetFactory.createConstraint(\"userSecurityId\", \"nome\\_do\\_usuario\", \"nome\\_do\\_usuario\", ConstraintType.MUST);" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n### beforeSendNotification" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEvento disparado antes do envio de uma notificação ao usuário. Pode ser utilizado quando for necessário adicionar alguma informação à nota ou alterar a prioridade de uma notificação, possibilitando o cancelamento do envio da notificação caso seja definida uma prioridade através do evento.\n\nObservação\n\nPor questões de segurança, somente os campos *priority* e *note* podem ser alterados. Outras alterações não serão consideradas.\n\nImportante\n\nCaso seja lançada uma exceção através do evento a notificação não será enviada, mas esse não é o modo correto de cancelar o envio. Definir o campo *priority* como \"NONE\" impede que a notificação seja enviada sem a necessidade de lançar exceção.\n\n**Abaixo temos um exemplo de como implementar esse evento**\n\n```\nfunction beforeSendNotification(notification) {\n if (notification.eventType == \"DENOUNCED_CONTENT\") {\n notification.priority = \"NONE\";\n }\n if (notification.eventType == \"DOCUMENT_APPROVED\") {\n notification.priority = \"NORMAL\";\n }\n if (notification.eventType == \"DOCUMENT_REPROVED\") {\n notification.priority = \"HIGH\";\n }\n if (notification.eventType == \"LIKE\") {\n notification.priority = \"LOW\";\n }\n}\n```\n\nSão disponibilizadas algumas propriedades referentes à notificação que está sendo enviada.\n\n| | | |\n| --- | --- | --- |\n| **Propriedade** | **Descrição** | **Tipo** |\n| **aliasSender** | Alias de quem enviou a notificação. Pode vir nulo nos casos em que a notificação é enviada pelo sistema. | String |\n| **aliasReceiver** | Alias de quem vai receber a notificação. | String |\n| **place** | Lugar onde foi feita a ação que gerou a notificação. Pode vir nulo quando não for um lugar socializavel. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **object** | Objeto sobre o qual foi feita a ação que gerou o alerta. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **eventType** | Tipo do evento que gerou a notificação. | String |\n| **metadata** | Metadados da notificação. | Hashmap |\n| **priority** | Prioridade da notificação. Valores válidos:  NONE, LOW, NORMAL, HIGH. | String |\n| **note** | Nota enviada junto à notificação. | String |\n\nVeja o exemplo (**event-notification**) no repositório do fluig clicando **[aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/event-notification)**." }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n### afterSendNotification\n\nEvento disparado após o envio de uma notificação ao usuário. Pode ser utilizado quando for necessário registrar alguma informação, para auditoria, por exemplo.\n\nAbaixo segue um exemplo de como implementar etse evento:\n\n```\nfunction afterSendNotification(notification){\n\t\tlog.info(\"notification as send for \" + notification.aliasReceiver);\n}\n```\n\nSão disponibilizadas algumas propriedades referentes à notificação que foi  enviada.\n\n| | | |\n| --- | --- | --- |\n| **Propriedade** | **Descrição** | **Tipo** |\n| **aliasSender** | Alias de quem enviou a notificação. Pode vir nulo nos casos em que a notificação é enviada pelo sistema. | String |\n| **aliasReceiver** | Alias de quem vai receber a notificação. | String |\n| **place** | Lugar onde foi feita a ação que gerou a notificação. Pode vir nulo quando não for um lugar socializavel. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **object** | Objeto sobre o qual foi feita a ação que gerou o alerta. | [GenericAlertEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **eventType** | Tipo do evento que gerou a notificação. | String |\n| **metadata** | Metadados da notificação. | Hashmap |\n| **priority** | Prioridade da notificação. | String |\n| **note** | Nota enviada junto à notificação. | String |\n\nVeja o exemplo (**event-notification**) no [repositório do fluig](http://tdn.totvs.com/display/fluig/htt) clicando [aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/event-notification).\n\n### onDisplayTasks" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEste evento é disparado antes de serem exibidas as tarefas das aba \"Tarefas a concluir\" , \"Minhas solicitações\", \"Tarefas em pool\", \"Tarefas em consenso\" e \"Minhas tarefas sob gerência\" na central de tarefas. Através dele é possível inserir, alterar ou remover itens da central de tarefas. O evento recebe como parâmetro uma lista de [WorkflowTasksVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) das tarefas existentes.\n\n#### **Exemplo de como adicionar, editar e remover uma tarefa personalizada ao final da lista de tarefas**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n```\nfunction onDisplayTasks(tasks) {\n\t// Adiciona uma tarefa customizada\n\tvar newTask = new WorkflowTasksVO();\n\tnewTask.setCode(\"TOTVS\");\n\tnewTask.setUrl(\"http://www.totvs.com\");\n\tnewTask.setProcessDescription(\"Nova Tarefa\");\n\tnewTask.setRequesterName(\"João da Silva\");\n\tnewTask.setStateDescription(\"Atividade 1\");\n\tnewTask.setColleagueName(\"Ana Maria\");\n\tnewTask.setStartDateProcess(\"07/09/2025\");\n\tnewTask.setDateExpires(\"07/10/2025\");\n\ttasks.add(newTask);\n\n\tfor (var i = 0; i < tasks.size(); i++) {\n\t\t// Remove a solicitação com o id 1\n\t\tif (tasks.get(i).getProcessInstanceId() == 1) {\n\t\t\ttasks.remove(i);\n\t\t\ti--; // Necessário para não pular um item após a remoção\n\t\t} else {\n\t\t\t// Altera a descrição de todos os processos para \"Nova Tarefa alterada\"\n\t\t\ttasks.get(i).setProcessDescription(\"Nova Tarefa alterada\");\n\t\t}\n\t}\n```\n\nDisponibilizamos algumas informações para consulta através do método getValue.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| **WKUser** | Código do usuário logado. | String |\n| **WKUserLocale** | Idioma do usuário logado. | String |\n| **WKCompany** | Número da empresa. | Int |\n| **taskUserId** | Código do usuário substituído, em caso de visualização da central como substituto. Nos demais casos retorna o usuário logado. | String |\n| **taskType** | Indicador do tipo de tarefas que estão sendo exibidas, “open” tarefas a concluir e “requests” para minhas solicitações. | String |\n| **filter** | Filtros utilizados. | Map |\n| **order** | Ordenação aplicada. | String |\n| **maxResult** | Número de resultados por página. | Int |\n| **page** | Número da página atual. | Int |\n| **taskId** | Em caso de pool,  quando o taskType for pool, o taskId trará uma string contendo o tipo no caso ‘Role’ para papel ou ‘Group‘ para grupo e seu código. Exemplo: ‘Pool:Role:admin’ para um pool do papel ‘admin’. | String |\n\n**Exemplo**\n\n```\nfunction onDisplayTasks(links){\nlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n### onDisplayTasksSummary\n\nEste evento é disparado antes de serem exibidos os contadores das abas e gráficos da central de tarefas e widgets de BPM. Através dele é possível alterar números de tarefas pendentes de cada tipo.\n\n#### **Exemplo alterando o número de tarefas abertas e no prazo**\n\n```\nfunction onDisplayTasksSummary(resumeTasks) {\n\tresumeTasks.openTasks=20;\n}\n```\n\nO objeto recebido como parâmetro contém:\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| **expiredTasks** | Solicitações atrasadas. | Int |\n| **openTasks** | Solicitações no prazo. | Int |\n| **myRequests** | Minhas solicitações. | Int |\n| **toApprover** | Aprovação de documentos pendentes. | Int |\n| **myDocuments** | Documentos aguardando aprovação. | Int |\n| **checkout** | Documento em checkout. | Int |\n| **learningTasks** | Atividades de Aprendizado. | Int |\n\n```\nfunction onDisplayTasksSummary(resumeTasks) {\n\tresumeTasks.expiredTasks=10;\n\tresumeTasks.openTasks=20;\n\tresumeTasks.myRequests=30;\n\tresumeTasks.toApprover=40;\n\tresumeTasks.myDocuments=50;\n\tresumeTasks.checkout=60;\n\tresumeTasks.learningTasks=70;\n}\n```\n\nDisponibilizamos algumas informações para consulta através do método getValue.\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| **WKUser** | Código do usuário logado. | String |\n| **WKUserLocale** | Idioma do usuário logado. | String |\n| **WKCompany** | Número da empresa. | Int |\n| **taskUserId** | Código do usuário substituído, em caso de visualização da central como substituto. Nos demais casos retorna o usuário logado. | String |\n\n**Exemplo**\n\n```\nfunction onDisplayTasks(links){\nlog.info(\"Usuário: \" + getValue(\"WKUser\"));\n}\n```\n\n# Objetos utilizados nos eventos\n\n---\n\nExistem alguns objetos disponibilizados pelo produto que são utilizados nos eventos, nas próximas sessões eles serão explicados seus métodos e seus retornos.\n\n#### **DocumentDto**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEste objeto representa o documento e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| **getDocumentId()** | Retorna o número do documento. | int |\n| **getVersion()** | Retorna o número da versão do documento. | int |\n| **getCompanyId()** | Retorna o código da empresa em que o documento foi publicado. | Int |\n| **getUUID()** | Retorna o UUID (identificador Único Global) do documento. | String |\n| **getDocumentTypeId()** | Retorna o tipo do arquivo físico, se retornar branco ou nulo é porque esse tipo não é conhecido pelo fluig. | String |\n| **getLanguageId()** | Retorna o código do Idioma do documento. | String |\n| **getIconId()** | Retorna o código do Ícone do documento. | int |\n| **getTopicId()** | Retorna o código do assunto do documento. | int |\n| **getColleagueId()** | Retorna a matricula do usuário que criou o documento. | String |\n| **getDocumentDescription()** | Retorna a descrição do documento. | String |\n| **getAdditionalComments()** | Retorna os comentários adicionais do documento. | String |\n| **getPhisicalFile()** | Retorna o nome do arquivo físico atrelado ao documento. | String |\n| **getCreateDate()** | Retorna a data de criação. | java.util.Date |\n| **getApprovedDate()** | Retorna a data de Aprovação. | java.util.Date |\n| **getLastModifiedDate()** | Retorna a Data da última modificação. | java.util.Date |\n| **getDocumentType()** | Retorna o tipo do documento, onde: 0 à Pasta raiz 1 à Pasta 2 à Documento normal 3 à Documento externo**1** 4 à Formulário 5 à Registro de formulário 7 à Anexo Workflow 8 à Novo Conteúdo 9 à Aplicativo 10 à Relatório portal à Site portalPage à Página de Site **1** → A partir da atualização **2.0.0-26XXXX**, o recurso Documento externo foi desabilitado para novas empresas. | String |\n| **getExpirationDate()** | Retorna a data de expiração. | java.util.Date |\n| **getParentDocumentId()** | Retorna o número da Pasta/Formulário pai | int |\n| **getRelatedFiles()** | String com o nome do arquivo físico principal e anexos. | String |\n| **getActiveVersion()** | Retorna se a versão é ativa. | boolean |\n| **getVersionDescription()** | Retorna a descrição da versão. | String |\n| **getDownloadEnabled()** | Retorna se o documento permite Download | boolean |\n| **getApproved()** | Retorna se o documento está em aprovação. | boolean |\n| **getValidationStartDate()** | Retorna a partir de que data em que o documento poderá ser visualizado. | java.util.Date |\n| **getPublisherId()** | Retorna a matricula do usuário que publicou o documento. | String |\n| **getCardDescription()** | Retorna a descrição do registro de formulário, para documento do tipo 5. | String |\n| **getDocumentPropertyNumber()** | Retorna o formulário que foi usado como base para criação do registro de formulário, por isso só tem um valor quando o documento é do tipo 5 (registro de formulário). | int |\n| **getDocumentPropertyVersion()** | Retorna a versão do formulário em que o registro de formulário foi criado. | int |\n| **getPrivateDocument()** | Retorna se o documento/pasta está abaixo da pasta particular. | boolean |\n| **getPrivateColleagueId()** | Se é um documento particular retorna a matricula do usuário onde este documento está alocado. | String |\n| **getIndexed()** | Retorna se o documento já foi indexado. | boolean |\n| **getPriority()** | Retorna a prioridade do documento. | int |\n| **getUserNotify()** | Retorna se notifica os usuários que tenham esse assunto de interesse. | boolean |\n| **getExpires()** | Retorna se o documento está expirado. | boolean |\n| **getVolumeId()** | Retorna o volume onde o documento foi publicado, se estiver em branco ele utiliza o volume do pai. | String |\n| **getInheritSecurity()** | Retorna se herda segurança do pai. | boolean |\n| **getUpdateIsoProperties()** | Retorna se atualiza as propriedades da cópia controlada. | boolean |\n| **getLastModifiedTime()** | Retorna a hora da última modificação em milissegundos. | String |\n| **getDeleted()** | Retorna se o documento está na lixeira. | boolean |\n| **getDatasetName()** | Retorna o documento do dataset , se o documento é um formulário. | String |\n| **getKeyWord()** | Retorna as palavras chaves do documento. Cada palavra é separada por vírgula. | String |\n| **getImutable()** | Retorna se a versão/revisão é inalterável. | boolean |\n| **getDraft()** | Retorna se o documento está em edição, para documento do tipo “Novo Conteúdo”. | boolean |\n| **getInternalVisualizer()** | Retorna se utiliza visualizador interno. | boolean |\n| **getPhisicalFileSize()** | Retorna o tamanho físico do documento principal e anexos. | float |\n| **getVersionOption()** | Retorna a condição de versionamento do documento: 0 = Será mantida a versão 1 = Será criado nova revisão 2 = Será criado nova versão **Importante lembrar que no momento da criação de um novo documento o valor sempre será 0.** | int |\n\n**Exemplo**\n\n```\nvar doc = getValue(\"WKDocument\");\nlog.info(\"Número do documento: \"+ doc.getDocumentId() + \" - Versão: \"+ doc.getVersion());\n```" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n#### **DocumentEditDto**\n\nEste objeto representa as propriedades editáveis de um documento, na tabela abaixo consta mais informações sobre ele:\n\n| Função | Descrição da função | Tipo do retorno |\n| --- | --- | --- |\n| **setKeyWord** | Adiciona Palavras chaves no documento. Cada palavra é separada por vírgula. | void |\n| **setExpires** | Define se o documento deve expirar | void |\n| **setExpirationDate** | Define a data de expiração. | void |\n| **setValidationStartDate** | Define a data a partir da qual o documento poderá ser visualizado. | void |\n\n**Exemplo**\n\n```\nfunction beforeDocumentPublisher() { \n var docEdit = getValue(\"WKDocumentEdit\");\n \n var dataStartValidation = new Date(2022, 0, 1);\n var dataExpiracao = new Date(2022, 11, 31);\n \n docEdit.setKeyWord(\"testing\");\n docEdit.setExpires(true);\n docEdit.setExpirationDate(dataExpiracao);\n docEdit.setValidationStartDate(dataStartValidation);\n}\n```\n\nAtenção\n\nLembrando que no javascript, no construtor new Date, o valor do \"Mês\" começa com o index 0, sendo 0 = Janeiro e 11 = Dezembro, veja outros exemplos [clicando aqui](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date).\n\n#### **ApproverDto**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEste objeto representa os aprovadores e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| **Função** | **Descrição da Função** | **Tipo do Retorno** |\n| **getDocumentId()** | Retorna o número do documento. | int |\n| **getVersion()** | Retorna o número da versão do documento. | int |\n| **getCompanyId()** | Retorna o código da empresa em que o documento foi publicado. | Int |\n| **getColleagueId()** | Retorna a matricula de um usuário ou o código do grupo que está aprovando este documento. É possível saber se vai retornar um usuário ou um grupo pelo tipo de aprovação. | String |\n| **getApproverType()** | Retorna o tipo da aprovação, onde: 0 à Usuário 1 à Grupo | int |\n| **getLevelId()** | Retorna o nível de aprovação, no caso de aprovação em níveis. | int |\n\n**Exemplo**\n\n```\nvar listApprover = getValue(\"WKListApprover\");\n\tif(listApprover!=null){\n \tfor(j = 0; j < listApprover.size(); j++) { \n \t if (listApprover.get(j).getColleagueId().equals(\"adm\")){\n throw \"O usuário adm não pode ser aprovadores de documentos\";\n }\n }\n}\n```\n\n        \n\n#### **DocumentSecurityConfigDto**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEste objeto representa a segurança de um documento e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| **getDocumentId()** | Retorna o número do documento. | int |\n| **getVersion()** | Retorna o número da versão do documento. | int |\n| **getCompanyId()** | Retorna o código da empresa em que o documento foi publicado. | Int |\n| **getAttributionValue()** | Retorna a matricula de um usuário ou o código do grupo que está na segurança deste documento. É possível saber se vai retornar um usuário ou um grupo pelo tipo da segurança. Obs.: Retorna em branco quando o tipo é todos os usuários. | String |\n| **getAttributionType()** | Retorna o tipo da segurança, onde: 1 à Usuário; 2 à Grupo; 3 à Todos os Usuários. | int |\n| **getPermission()** | Retorna se é uma permissão. Obs.: Se não é uma permissão é uma restrição. | boolean |\n| **getShowContent()** | Retorna se lista o conteúdo. | boolean |\n| **getSecurityLevel()** | Retorna no nível de permissão/restrição, onde: -1 à sem permissão/restrição (nega acesso); 0 à Leitura; 1 à Gravação; 2 à Modificação; 3 à Total. | int |\n| **getSequence()** | Retorna a sequência da permissão/restrição. | int |\n| **getSecurityVersion()** | Retorna se ele utiliza a segurança deste versão nas demais. | boolean |\n\n**Exemplo**\n\n```\nvar listSeg = getValue(\"WKListSecurity\");\nif(listSeg != null){\n for(j = 0; j < listSeg.size(); j++) { \n if (listSeg.get(j).getAttributionValue().equals(\"cvd\")){\n throw \"O usuário cvd não pode estar na segurança de documentos\";\n }\n }\n}\n```\n\n#### **RelatedDocumentDto**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEste objeto representa os documentos relacionados e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| **getDocumentId()** | Retorna o número do documento. | int |\n| **getVersion()** | Retorna o número da versão do documento. | int |\n| **getCompanyId()** | Retorna o código da empresa em que o documento foi publicado. | int |\n| **getRelatedDocumentId()** | Retorna o número do documento que está relacionado ao documento publicado. | int |\n\n**Exemplo**\n\n```\nvar listRelated = getValue(\"WKListRelatedDocument\");\n\tif( listRelated != null){\n \t log.info(\"Os seguintes documentos estão relacionados a este documentos: \");\n for(j = 0; j < listRelated.size(); j++) { \n log.info(\"Nr. documento: \"+ listRelated.get(j).getRelatedDocumentId());\n }\n}\n```\n\n#### **ProcessDefinitionVersionDto**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\nEste objeto representa a definição de um processo e seus atributos. A tabela abaixo apresenta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| **getCompanyId()** | Retorna o código da empresa | Long |\n| **getProcessId()** | Retorna o código do processo | Long |\n| **getProcessDescription()** | Retorna a descrição do processo | String |\n| **getVersion()** | Retorna a versão do processo | Integer |\n| **getVersionDescription()** | Retorna a descrição da versão do processo | String |\n| **getFormId()** | Retorna o código do formulário do processo | Integer |\n| **getCategoryStructure()** | Retorna a categoria do processo | String |\n| **getFullCategoryStructure()** | Retorna a estrutura completa da categoria do processo | String |\n\n**UserEventVO**\n\nEste objeto representa um usuário e seus atributos, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| **getId()** | Retorna o identificador do usuário | Long |\n| **getTenantId()** | Retorna o código da empresa | Long |\n| **getLocationId()** | Retorna o código da localização à qual o usuário pertence | Long |\n| **getFirstName()** | Retorna o nome do usuário | String |\n| **getLastName()** | Retorna o sobrenome do usuário | String |\n| **getFullName()** | Retorna o nome completo do usuário | String |\n| **getEmail()** | Retorna se lista o conteúdo | String |\n| **getLogin()** | Retorna o e-mail do usuário | String |\n| **getPassword()** | Retorna a senha do usuário | String |\n| **getIdpId()** | Retorna o identificador associado ao fluig Identity | String |\n| **getUserCode()** | Retorna o código do usuário | String |\n| **getUserType()** | Retorna o tipo do usuário, onde: 0 - Normal 3 - Aplicativo | Integer |\n| **getState()** | Retorna o estado do usuário, onde: 0 - Não confirmado 1 - Ativo 2 - Bloqueado 3 - Removido | Integer |\n| **getTimeZone()** | Retorna o Fuso Horário do usuário | String |\n| **getRoles()** | Retorna a lista dos códigos dos papéis aos quais o usuário pertence | List |\n| **getGroups()** | Retorna a lista dos códigos dos grupos aos quais o usuário pertence | List |\n| **getData()** | Retorna os dados adicionais do usuário | Map |\n| **setFirstName(String firstName)** | Informa o nome do usuário | void |\n| **setLastName(String lastName)** | Informa o sobrenome do usuário | void |\n| **setFullName(String fullName)** | Informa o nome completo do usuário | void |\n| **putData(String key, String value)** | Adiciona um novo dado adicional ao usuário. Só pode ser utilizado em eventos ***before**.* | void |" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n#### **WatchDTO**\n\nEste objeto representa as notificações de acompanhamento de comentários e suas propriedades, na tabela abaixo consta mais informações sobre ele:\n\n| | | |\n| --- | --- | --- |\n| Função | Descrição da Função | Tipo do Retorno |\n| **getEntityId()** | Retorna o código do Conteúdo. | String |\n| **getUserId()** | Retorna o código do usuário. | String |\n| **getUserAlias()** | Retorna o alias do usuário. | String |\n| **getSociableId()** | Retorna ocódigo sociable. | String |\n| **getCreationDate()** | Retorna a data de criação. | String |\n| **getLastUpdateDate()** | Retorna a data da última atualizaçã. | String |\n| **getNumberComments()** | Retorna o número de comentários. | String |\n| **getNumberLikes()** | Retorna o número de apoios. | String |\n| **getNumberShares()** | Retorna o número de compartilhamentos. | String |\n| **getNumberWatchers()** | Retorna o número de acompanhamentos. | String |\n| **getNumberDenouncements()** | Retorna o número de denúncias. | String |\n| **getSocialWatchType()** | Retorna o tipo (social) | String |\n| **getPostAuthor()** | Retorna o autor do conteúdo. | String |\n| **getTags()** | Retorna as tags. | String |\n| **getText()** | Retorna o texto. | String |\n| **getDescription()** | Retorna a descrição. | String |\n| **getObjectClass()** | Retorna a classe do objeto. | String |\n| **getObjectId()** | Retorna o objectId. | String |\n| **getThumbURL()** | Retorna a url do thumb | String |\n\n#### **SocialPostEventVO**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| **SocialPostEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **getText()** | texto do post | String |\n| **getUser()** | alias do usuário que está postando | String |\n| **getVisibility()** | visibilidade do post | String |\n| **getPostId()** | identificador do post | String |\n| **getCreationDate()** | data de criação do post | String |\n| **getLastUpdateDate()** | data de ultima atualização do post | String |\n| **getSociables()** | objetos sociables relacionado a esse post. Ex: Imagens, Vídeos, Artigos, etc... | List<[SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520)> |\n| **getSocial()** | objeto social onde o post foi feito. Pode ser timeline de um usuario ou um comunidade | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **\\*getAttributes()** | Atributos do Analytics em formato de Lista de Strings. Limite de 3 itens | List |\n| **\\*getFacts()** | Fatos dos atributos do Analytics em formato de Lista de Strings. Limite de 3 itens | List |\n| **customData** | Mapa em formato JSON onde pode-se persistir dados extras da publicação | Map JSON |\n\n**\\*Somente enviado no evento beforSocialPost e afterSocialPost, esses valores não são persistidos no Fluig**\n\n#### **SociableEventVO**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| **SociableEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **getId()** | identificador do objeto | String |\n| **getCreationDate()** | data de criação do objeto | String |\n| **getLastUpdateDate()** | ultima atualização do objeto | String |\n| **getNumberLikes()** | quantidade de curtidas | String |\n| **getNumberShares()** | quantidade de compartilhamentos | String |\n| **getNumberComments()** | quantidade de comentários | String |\n| **getNumberDenouncements()** | quantidade de denúncias | String |\n| **getNumberWatchers()** | quantidade de acompanhamentos | String |\n| **getTags()** | nomes marcadores | String |\n| **getUrl()** | endereço do objeto | String |\n| **getSociableType()** | tipo do objeto social | String |\n| **getRemoved()** | informa se o objeto foi removido | String |\n| **\\*getPostAuthor()** | retorna o alias do autor da publicação que foi comentada | String |\n| **\\*getText()** | retorna o texto da publicação que foi comentada | String |\n| **\\*\\*getDescription()** | Nome do objeto comentado | String |\n| **\\*\\*getThumbURL()** | url de ícone do objeto comentado. | String |\n| **getSocial()** | local aonde o comentário foi efetuado | SocialEvent |\n\n**\\* Retornados apenas quando o comentário é sobre um post.**\n\n**\\*\\*Retornado para os comentários de documentos e etc.**\n\n#### **SocialEventVO**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| **SocialEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **getId()** | identificador do objeto | String |\n| **getCreationDate()** | data de criação do objeto | String |\n| **getLastUpdateDate()** | ultima atualização do objeto | String |\n| **getAlias()** | apelido do objeto social | String |\n| **getName()** | nome do objeto social | String |\n| **getDescription()** | descrição do objeto social | String |\n| **getType()** | tipo do objeto social | String |\n| **getState()** | status do objeto social | String |\n| **getHidden()** | informa se o objeto é oculto | String |\n| **getPrivateContent()** | informa se o conteúdo é privado | String |\n| **getApprovalRequired()** | informa se aprovação é requerida | String |\n| **getCustomPage()** | informação de página customizada | String |\n\n#### **SocialShareEventVO**\n\n| | | |\n| --- | --- | --- |\n| **SocialShareEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **getSociable()** | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **getSocialPlace()** | objeto que recebe o compartilhamento | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **getUser()** | alias do usuario que compartilha | String |\n| **getText()** | texto informado no compartilhamento | String |\n| **getType()** | tipo do objeto | String |\n\n#### **SocialCommentEventVO**\n\n| | | |\n| --- | --- | --- |\n| **SocialCommentEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **getSociable()** | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **getUser()** | alias do usuário que comenta | String |\n| **getText()** | texto informado no comentário | String |\n| **getCommentId()** | id do comentário | String |\n\n#### **SocialDenounceEventVO**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| **SocialDenounceEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **getSociable()** | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **getUser()** | alias do usuário que comenta | String |\n| **getText()** | texto informado no comentário | String |\n| **getType()** | Tipo de denúncia | String |\n\n#### **SocialLikeEventVO**\n\n| | | |\n| --- | --- | --- |\n| **SocialLikeEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **getSociable()** | objeto sendo compartilhado | [SociableEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **getUser()** | alias do usuário que comenta | String |\n\n#### **SocialCommunityRelationEventVO**\n\n| | | |\n| --- | --- | --- |\n| **SocialCommunityRelationEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **getSocial()** | Social relacionado à comunidade | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **getCommunity()** | Social que representa a Comunidade | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n\n#### **SocialFollowEventVO**\n\n| | | |\n| --- | --- | --- |\n| **SocialFollowEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **getSocial()** | Social que seguirá | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n| **getFollowed()** | Social que está sendo seguido | [SocialEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=1022378520) |\n\n#### **SocialPictureEventVO**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| SocialPictureEventVO | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **getLoggedUser()** | Alias do usuário autenticado | String |\n| **getAlias()** | Alias do local aonde se está mudando a imagem (usuário| comunidade) | String |\n| **getPath()** | Path do diretório onde a imagem foi salva | String |\n| **getPictureName()** | Nome da imagem salva | String |\n| **getWidth()** | Largura da imagem | int |\n| **getHeight()** | Altura da imagem | int |\n\n#### **GenericAlertEventVO**\n\n| | | |\n| --- | --- | --- |\n| **GenericAlertEventVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **objectId** | Id do objeto relacionado | String |\n| **objectClass** | Classe que identifica o objeto relacionado | String |\n| **link** | Link que está disponível no objeto. Pode vir nulo nos casos em que não existe um link de acesso | String |\n\n#### **WorkflowTasksVO**" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n| | | |\n| --- | --- | --- |\n| **WorkflowTasksVO** | | |\n| Propriedade / Método | Descrição | Tipo / Retorno |\n| **url** | Url destino para tarefas personalizadas | String |\n| **code** | Código para tarefas personalizadas | String |\n| **processId** | Código do processo | String |\n| **processDescription** | Descrição do processo | String |\n| **requesterId** | Código do usuário de abertura | String |\n| **requesterName** | Nome do usuário de abertura | String |\n| **stateDescription** | Descrição da atividade atual | String |\n| **colleagueName** | Nome do usuário responsável pela tarefa atual | String |\n| **dateExpires** | Data de expiração | String |\n| **attachDescription** | Descrição do anexo principal | String |\n| **expired** | Tarefa expirada? | boolean |\n| **know** | Usuário já visualizou a tarefa? | boolean |\n| **fieldValue1** | Campo do formulário | String |\n| **fieldValue2** | Campo do formulário | String |\n| **fieldValue3** | Campo do formulário | String |\n| **fieldValue4** | Campo do formulário | String |\n| **fieldValue5** | Campo do formulário | String |\n| **fieldValue6** | Campo do formulário | String |\n| **fieldValue7** | Campo do formulário | String |\n| **fieldValue8** | Campo do formulário | String |\n| **fieldValue9** | Campo do formulário | String |\n| **fieldValue10** | Campo do formulário | String |\n| **fieldValue11** | Campo do formulário | String |\n| **fieldValue12** | Campo do formulário | String |\n| **fieldValue13** | Campo do formulário | String |\n| **fieldValue14** | Campo do formulário | String |\n| **fieldValue15** | Campo do formulário | String |\n\n## Exemplo com usuário de aplicação" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n---\n\nNo exemplo abaixo, a mensagem \"**Post criado via evento**\" é postada no mural:\n\n```\nfunction beforeSocialPost(companyId, vo) {\n    if (vo.getSocial().getType() == \"USER\" && vo.getUser() != \"admin\") {\n        var consumer = oauthUtil.getNewAPIConsumer(\"my_app_key\", \"my_app_secret\",\n                        \"605da7f2-d087-4f4b-903e-486df9563956\",\n                        \"2b192950-fe0c-4211-a4bf-5962c18432d85c077dfb-aa51-45a0-ab43-822a680070ab\");\n        var userData = JSON.parse(consumer.get(\"/public/social/user/\" + vo.getUser()));\n        if (userData.numberFollowers == 0) {\n            throw \"Voce deve ser seguido por alguem para poder postar em sua timeline.\";\n        }\n    }\n}\n```\n\nExemplo com usuário logado\n\n---\n\n```\nfunction afterDocumentPublisher(){\n    var doc = getValue(\"WKDocument\");\n    var user = getValue(\"WKUser\");\n \n    var msgPost = \"Novo documento: \"+ doc.getDocumentId() + \" - Versão: \"+ doc.getVersion();\n    log.info(msgPost);\n \n    var jsonContent = \"{\\\"text\\\":\\\"\" + msgPost + \"\\\",\\\"visibility\\\":\\\"PUBLIC\\\"}\";\n    log.info(jsonContent);\n \n    var consumer = oauthUtil.getNewAPIConsumerAsCurrentUser(\"myapp\", \"myappsecret\", \"32718929-568b-4a64-9f67-bbeadf4c1fc3\",\n            \"eff7b746-384b-43ba-be3a-aed14da822a4b8352de0-62be-456e-a0d8-ab5c00a745bc\");\n    consumer.post(\"/public/social/post/create\", jsonContent);\n}\n```\n\n# Atualização do Analytics\n\n---\n\n## Definição\n\nÉ possível enviar dados ao **Analytics** a partir dos eventos de customização. Os dados recebidos no evento **não são persistidos no Fluig**, porém podem ser **alterados antes do envio** para o Analytics. Esses valores são transmitidos por meio do objeto **SocialPostEventVO**.\n\n## Exemplo de uso" }, { "metadata": { "title": "Outros Eventos Globais", "source": "https://tdn.totvs.com/display/fluig/Outros+Eventos+Globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de Eventos\\Eventos Globais\\Outros Eventos Globais.md" }, "content": "Outros Eventos Globais\n\n\n**Assinatura do método**\n\n```\n analyticsUtil.updatePostData(String postId, String[] attributes, String[] facts);\n```\n\n**Utilização no Evento**\n\n```\nfunction afterSocialPost(companyId, post){\n analyticsUtil.updatePostData(post.getPostId(), post.getAttributes(), post.getFacts());\n}\n```" }, { "metadata": { "title": "Componentes de Negócio", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=160104507", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio.md" }, "content": "Componentes de Negócio\n\n\nEste guia ajudará você a utilizar componentes de negócio do Fluig. Alguns conceitos:\n\n- ***Widgets***: é tudo que pode ser utilizado em páginas em forma de portal. Ex.: lista de documentos favoritos, *link* externo.\n- **Temas**: é uma definição de *design* de uma página. Ex.: cores de botão, espaçamentos etc.\n- ***Layouts***: define o posicionamento dos *widgets* por meio de *slots*.\n- **Componentes de interface**: são componentes agnósticos que podem ser utilizados a qualquer momento, sempre documentados no [Guia de Estilos e Componentes](http://style.fluig.com/). Ex.: Modal, Alertas, *Toast*, *DataGrid* etc.\n- **Componentes de negócio**: são facilitadores para promover o reuso de uma funcionalidade de negócio. Ex.: Selecionar Usuários, Selecionar Grupos etc." }, { "metadata": { "title": "Desenvolvendo widgets compatíveis com modo escuro", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=965446583", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Desenvolvendo widgets compatíveis com modo escuro.md" }, "content": "Desenvolvendo widgets compatíveis com modo escuro\n\n\n- [Visão geral](#Desenvolvendowidgetscompatíveiscommodoescuro-Visãogeral)\n - [Como o modo escuro funciona internamente](#Desenvolvendowidgetscompatíveiscommodoescuro-Comoomodoescurofuncionainternamente)\n - [Boas práticas](#Desenvolvendowidgetscompatíveiscommodoescuro-Boaspráticas)\n - [O que já funciona automaticamente](#Desenvolvendowidgetscompatíveiscommodoescuro-Oquejáfuncionaautomaticamente)\n - [Como adaptar estilos da widget para o modo escuro](#Desenvolvendowidgetscompatíveiscommodoescuro-Comoadaptarestilosdawidgetparaomodoescuro)\n - [1. Revisão do CSS Customizado](#Desenvolvendowidgetscompatíveiscommodoescuro-1.RevisãodoCSSCustomizado)\n - [Exemplo de substituição:](#Desenvolvendowidgetscompatíveiscommodoescuro-Exemplodesubstituição:)\n - [2. Onde encontrar as variáveis CSS](#Desenvolvendowidgetscompatíveiscommodoescuro-2.OndeencontrarasvariáveisCSS)\n - [Atenção com plugins de terceiros](#Desenvolvendowidgetscompatíveiscommodoescuro-Atençãocompluginsdeterceiros)\n - [Exemplo de formatação customizada compatível](#Desenvolvendowidgetscompatíveiscommodoescuro-Exemplodeformataçãocustomizadacompatível)\n - [Exemplo de estilo específico para modo claro ou escuro](#Desenvolvendowidgetscompatíveiscommodoescuro-Exemplodeestiloespecíficoparamodoclaroouescuro)\n - [Dúvidas ou suporte](#Desenvolvendowidgetscompatíveiscommodoescuro-Dúvidasousuporte)\n\n# Visão geral\n\n---\n\nO Fluig agora oferece suporte nativo ao modo escuro, proporcionando uma experiência visual mais confortável em ambientes com pouca luz.\n\nEssa funcionalidade já está disponível nas widgets da plataforma e é habilitada automaticamente de acordo com o tema escolhido pelo usuário no Fluig.\n\nImportante:\n\nPara que sua widget fique compatível com o modo escuro, é fundamental seguir as orientações abaixo, principalmente se a widget possui estilos customizados ou utiliza plugins de terceiros.\n\n## Como o modo escuro funciona internamente" }, { "metadata": { "title": "Desenvolvendo widgets compatíveis com modo escuro", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=965446583", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Desenvolvendo widgets compatíveis com modo escuro.md" }, "content": "Desenvolvendo widgets compatíveis com modo escuro\n\n\n---\n\nO modo escuro é ativado automaticamente pela plataforma quando o usuário escolhe esse tema. Internamente, isso é feito adicionando a classe `theme-dark` na tag `` do widget.\n\nCom essa classe presente, o navegador passa a utilizar as variáveis CSS definidas dentro do seletor `html.theme-dark { ... }`, substituindo as definidas em `:root`.\n\n**Exemplo simplificado:**\n\n```\n/* Variáveis do modo claro */\n:root {\n  --fs-color-neutral-light-00: #ffffff; // cor branca no modo claro\n  --fs-color-brand-01-base: #0079b8; // não tem diferença entre modo claro e escuro\n --fs-color-brand-01-lightest: #e3eefb; // cor de brand tom mais claro\n}\n\n/* Variáveis do modo escuro */\nhtml.theme-dark {\n  --fs-color-neutral-light-00: #1c1c1c; // inverte para uma cor escura\n  --fs-color-brand-01-base: #0079b8; // não tem diferença entre modo claro e escuro\n --fs-color-brand-01-lightest: #051f31; // inverte cor de bran tom mais escuro\n}\n```\n\nQuando o modo escuro está ativo, os componentes e estilos que utilizam variáveis CSS (como `var(--fs-color-neutral-light-00)`) automaticamente herdam os valores definidos dentro de `html.theme-dark`.\n\nInformação:\n\nIsso permite alternar entre temas sem precisar alterar nenhuma estrutura de código na widget — basta usar as variáveis CSS corretamente.\n\n## Boas práticas\n\n---\n\n✔ Priorize sempre o uso dos componentes e estilos do Style Guide Fluig. \n✔ Evite o uso de cores fixas ou hardcoded no CSS. \n✔ Teste a widget tanto no tema claro quanto no modo escuro antes de publicar. \n✔ Consulte periodicamente o Style Guide para novas variáveis e atualizações.\n\n## O que já funciona automaticamente" }, { "metadata": { "title": "Desenvolvendo widgets compatíveis com modo escuro", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=965446583", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Desenvolvendo widgets compatíveis com modo escuro.md" }, "content": "Desenvolvendo widgets compatíveis com modo escuro\n\n\n---\n\n- **Componentes padrão do Style Guide Fluig:** \n Todos os componentes visuais do Style Guide já estão preparados para o modo escuro. Se sua widget utiliza apenas esses componentes, **nenhuma ação é necessária**.\n- **Ativação automática:** \n O modo escuro da widget acompanha automaticamente o tema selecionado pelo usuário no Fluig. Não é necessário alterar código para detectar ou ativar o tema.\n\n## Como adaptar estilos da widget para o modo escuro\n\n---\n\n### 1. **Revisão do CSS Customizado**\n\nCaso sua widget tenha estilos próprios definidos via CSS, é necessário substituir cores fixas por variáveis CSS disponibilizadas pela plataforma.\n\n### **Exemplo de substituição:**\n\n**Antes:**\n\n```\n.custom-style {\n background-color: #ffffff;\n color: #333333;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n```\n\n**Depois (compatível com modo escuro):**\n\n```\n.custom-field {\n background-color: var(--fs-color-neutral-light-00);\n color: var(--fs-color-neutral-dark-90);\n box-shadow: var(--fs-shadow-sm);\n}\n```\n\n### 2. **Onde encontrar as variáveis CSS**" }, { "metadata": { "title": "Desenvolvendo widgets compatíveis com modo escuro", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=965446583", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Desenvolvendo widgets compatíveis com modo escuro.md" }, "content": "Desenvolvendo widgets compatíveis com modo escuro\n\n\nTodas as variáveis disponíveis estão documentadas no **Fluig** **Style Guide**, na seção: **CSS > Themes - https:///style-guide/css.html#themes**\n\nAli você encontra a lista completa de variáveis para cores, sombras, bordas, backgrounds e outros aspectos visuais.\n\nCaso seja necessário definir cores manualmente, **siga estas diretrizes:**\n\n**Direcionamentos Gerais**\n\n| Tipo de Cor | Variável CSS a Utilizar |\n| --- | --- |\n| Cor de texto \"padrão\" | var(--fs-color-neutral-dark-90) |\n| Cor de texto \"padrão\" hover ou focus | var(--fs-color-neutral-dark-95) |\n| Cor de fundo (geralmente branco) | var(--fs-color-neutral-light-00) |\n| Cor de fundo cinza claro | var(--fs-color-neutral-light-05) ou var(--fs-color-neutral-light-10) |\n| Cor de fundo cinza com destaque maior | var(--fs-color-neutral-light-20) |\n| Cor de borda \"padrão\" | var(--fs-color-neutral-light-20) ou var(--fs-color-neutral-light-30) |\n\n## Atenção com plugins de terceiros\n\n---\n\nSe a widget utiliza bibliotecas ou plugins visuais de terceiros, é necessário:\n\n- Verificar se o plugin suporta tema escuro nativamente.\n- Caso não suporte, sobrescrever os estilos do plugin utilizando as variáveis CSS do Fluig.\n\n## Exemplo de formatação customizada compatível\n\n---\n\n**HTML:**\n\n```\n
\n
\n

Minha Widget

\n
\n
\n```\n\n**CSS:**\n\n```\n.my-widget .custom-container {\n background-color: var(--fs-color-brand-01-base);\n padding: 16px;\n}\n\n.my-widget .custom-title {\n color: var(--fs-color-neutral-light-00);\n font-size: 24px;\n}\n```\n\n## Exemplo de estilo específico para modo claro ou escuro" }, { "metadata": { "title": "Desenvolvendo widgets compatíveis com modo escuro", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=965446583", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Desenvolvendo widgets compatíveis com modo escuro.md" }, "content": "Desenvolvendo widgets compatíveis com modo escuro\n\n\n---\n\nCaso precise definir estilos específicos para o modo claro e para o modo escuro, siga como no exemplo abaixo:\n\n**Exemplo de formatação específica para modo claro ou escuro**\n\n```\n/* Definições de variáveis para o modo light */\n:root {\n --my-custom-color: #0000ff; // azul\n}\n\n/* Definições de variáveis para o modo dark */\nhtml.theme-dark {\n --my-custom-color: #ff0000; // vermelho\n}\n\n/* uso aplicando a variável em algum elemento */\n.my-widget .my-custom-button {\n color: var(--my-custom-color); // se for modo claro será azul, se for modo escuro será vermelho\n}\n```\n\n## Dúvidas ou suporte\n\n---\n\nEm caso de dúvidas, procure o time responsável pelo Fluig ou abra um chamado pela central de suporte." }, { "metadata": { "title": "Login Único", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185757267", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Login Único.md" }, "content": "Login Único" }, { "metadata": { "title": "Login Único", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185757267", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Login Único.md" }, "content": "Login Único\n\n\nAtenção\n\nEsta página foi revisada para atualizações 1.6 e superiores do TOTVS Fluig Plataforma.\n\nCaso possua uma atualização anterior escolha o tópico da versão 1.5.13 e anteriores desta página.\n\n# Índice\n\n- 1 [Objetivo](#LoginÚnico-Objetivo)\n- 2 [Single Sign-On (SSO)](#LoginÚnico-SingleSign-On(SSO))\n- 3 [A partir da atualização 1.6](#LoginÚnico-Apartirdaatualização1.6)\n- 4 [Atualização 1.5.13 e Anteriores](#LoginÚnico-Atualização1.5.13eAnteriores)\n\n# Objetivo\n\n---\n\nO objetivo deste documento é direcionar desenvolvedores que desejam criar *widgets* e componentes para o TOTVS Fluig Plataforma, aproveitando sua infraestrutura de autenticação.\n\n# Single Sign-On (SSO)\n\n---\n\nO Single Sign-On ou login único, é um mecanismo pelo qual é possível um usuário obter acesso a múltiplos serviços autenticando-se apenas uma vez em algum destes serviços.\n\nNa plataforma TOTVS Fluig a autenticação deve ser sempre iniciada na própria plataforma (acessando a Home e informando usuário/senha). A partir daí então, os *widgets* e componentes poderão fazer uso do SSO para confiarem na autenticação.\n\nUma vez autenticado, os *widgets* poderão acessar os serviços do fluig (por exemplo, API pública) diretamente, sem a necessidade de fazer uma autenticação a cada requisição (por exemplo, via OAuth).\n\n# A partir da atualização 1.6\n\n---\n\nA autenticação das widgets via SSO depende de três arquivos:\n\n- Localizado dentro da pasta **WEB-INF**, o arquivo **web.xml** deve conter o seguinte conteúdo:\n\n**web.xml**\n\n```\n\n\n\t\n\t\tREST\n\t\t\n\t\t\tREST\n\t\t\tREST\n\t\t\t/api/rest/*\n\t\t\n\t\t\n\t\t\tREST\n\t\t\tuser\n\t\t\n\t\n \n FLUIGAUTH, FORM\n TOTVSTech\n \n /login.jsp\n \n \n \n totvstech\n \n \n user\n \n \n sysadmin\n \n\n```\n\n- Deve-se atentar para a tag ****, que define os caminhos que irão precisar de autenticação para serem acessados (no exemplo, **/api/rest/\\***).\n- Deve-se conter pelo menos uma tag **.** A quantidade desta tag pode variar conforme necessidade.\n\n- Localizado dentro da pasta **WEB-INF**, o arquivo **jboss-web.xml** deve conter o seguinte conteúdo:\n\n**jboss-web.xml**\n\n```\n\n\n /[contexto-da-widget]\n false\n \n TOTVSTech\n \n\t\tuser\n\t\ttotvstech\n\t\n\t\n\t\ttotvstech\n\t\ttotvstech\n\t\n\t\n\t\tsysadmin\n\t\twcmadmin\n\t\n\t\n\t\tadmin\n\t\twcmadmin\n\t\n\n```\n\n- Deve-se atentar para a tag ****, que define o contexto que fará parte da URL para acessar recursos estáticos (js, css, etc.) dessa widget.\n\n- Localizado dentro da pasta **WEB-INF**, o arquivo **beans.xml** deve conter o seguinte conteúdo:\n\n**beans.xml**\n\n```\n\n\n\n```\n\n# Atualização 1.5.13 e Anteriores\n\n---\n\nA autenticação das widgets via SSO depende de quatro arquivos:\n\n- Localizado dentro da pasta **WEB-INF**, o arquivo **web.xml** deve conter o seguinte conteúdo:\n\n**web.xml**\n\n```\n\n\n\t\n\t\tREST\n\t\t\n\t\t\tREST\n\t\t\tREST\n\t\t\t/api/rest/*\n\t\t\n\t\t\n\t\t\tREST\n\t\t\tuser\n\t\t\n\t\n \n FORM\n TOTVSTech\n \n /login.jsp\n \n \n \n totvstech\n \n \n user\n \n \n sysadmin\n \n\n```\n\n- Deve-se atentar para a tag ****, que define os caminhos que irão precisar de autenticação para serem acessados (no exemplo, **/api/rest/\\***).\n- Deve-se conter pelo menos uma tag **.** A quantidade desta tag pode variar conforme necessidade.\n\n- Localizado dentro da pasta **WEB-INF**, o arquivo **jboss-web.xml** deve conter o seguinte conteúdo:\n\n**jboss-web.xml**\n\n```\n\n\n /[contexto-da-widget]\n false\n \n TOTVSTech\n \n\t\tuser\n\t\ttotvstech\n\t\n\t\n\t\ttotvstech\n\t\ttotvstech\n\t\n\t\n\t\tsysadmin\n\t\twcmadmin\n\t\n\t\n\t\tadmin\n\t\twcmadmin\n\t\n \n com.totvs.technology.auth.saml.TOTVSAuthenticatorValve\n \n\n```\n\n- Deve-se atentar para a tag ****, que define o contexto que fará parte da URL para acessar recursos estáticos (js, css, etc.) dessa widget.\n\n- Localizado dentro da pasta **WEB-INF**, o arquivo **beans.xml** deve conter o seguinte conteúdo:\n\n**beans.xml**\n\n```\n\n\n\n```\n\n- Localizado dentro da pasta **WEB-INF/lib**.\n- O arquivo pode ser obtido no endereço http://nexus.fluig.com/content/groups/public/com/fluig/foundation-security-authentication-saml/[versao-do-fluig.\n- Ou, para widgets gerenciadas pelo Maven, esse arquivo é adicionado usando a seguinte dependência:\n\n**foundation-security-authentication-smal.jar**\n\n```\n\n\tcom.fluig\n\tfoundation-security-authentication-saml\n\tcompile\n\t[versão-do-fluig]\n\n```" }, { "metadata": { "title": "Primeiros passos no desenvolvimento de widgets", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos+no+desenvolvimento+de+widgets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Primeiros passos no desenvolvimento de widgets.md" }, "content": "Primeiros passos no desenvolvimento de widgets" }, { "metadata": { "title": "Primeiros passos no desenvolvimento de widgets", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos+no+desenvolvimento+de+widgets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Primeiros passos no desenvolvimento de widgets.md" }, "content": "Primeiros passos no desenvolvimento de widgets\n\n\n- [Pré-requisitos do ambiente](#Primeirospassosnodesenvolvimentodewidgets-Pré-requisitosdoambiente)\n - [Kit de desenvolvimento Java (JDK)](#Primeirospassosnodesenvolvimentodewidgets-KitdedesenvolvimentoJava(JDK))\n - [IDE Eclipse e plugin Fluig Studio](#Primeirospassosnodesenvolvimentodewidgets-IDEEclipseepluginFluigStudio)\n- [Configuração do servidor e criação do projeto](#Primeirospassosnodesenvolvimentodewidgets-Configuraçãodoservidorecriaçãodoprojeto)\n - [Passo 1: selecionar a Perspectiva Fluig](#Primeirospassosnodesenvolvimentodewidgets-Passo1:selecionaraPerspectivaFluig)\n - [Passo 2: configurando o servidor (Fluig Server)](#Primeirospassosnodesenvolvimentodewidgets-Passo2:configurandooservidor(FluigServer))\n - [Passo 3: criando o projeto](#Primeirospassosnodesenvolvimentodewidgets-Passo3:criandooprojeto)\n - [Criando a widget: primeiros passos](#Primeirospassosnodesenvolvimentodewidgets-Criandoawidget:primeirospassos)\n - [Deploy para o TOTVS Fluig](#Primeirospassosnodesenvolvimentodewidgets-DeployparaoTOTVSFluig)\n - [Testando sua widget](#Primeirospassosnodesenvolvimentodewidgets-Testandosuawidget)\n - [Visualizar sua widget](#Primeirospassosnodesenvolvimentodewidgets-Visualizarsuawidget)\n - [Acessar o TOTVS Fluig e a página:](#Primeirospassosnodesenvolvimentodewidgets-AcessaroTOTVSFluigeapágina:)\n - [Adicionar a widget](#Primeirospassosnodesenvolvimentodewidgets-Adicionarawidget)\n - [Publicar a página](#Primeirospassosnodesenvolvimentodewidgets-Publicarapágina)\n- [4 Dicas para dominar as widgets no TOTVS Fluig](#Primeirospassosnodesenvolvimentodewidgets-4DicasparadominaraswidgetsnoTOTVSFluig)\n - [Dica 1: domine o ciclo de vida](#Primeirospassosnodesenvolvimentodewidgets-Dica1:domineociclodevida)\n - [Dica 2: use o \"i18n\" no seu código](#Primeirospassosnodesenvolvimentodewidgets-Dica2:useo\"i18n\"noseucódigo)\n - [Dica 3: isole suas instâncias](#Primeirospassosnodesenvolvimentodewidgets-Dica3:isolesuasinstâncias)\n - [Dica 4: renomear arquivos](#Primeirospassosnodesenvolvimentodewidgets-Dica4:renomeararquivos)\n- [Sua widget com WCMAPI](#Primeirospassosnodesenvolvimentodewidgets-SuawidgetcomWCMAPI)\n - [Obtendo o contexto do usuário logado](#Primeirospassosnodesenvolvimentodewidgets-Obtendoocontextodousuáriologado)\n - [Consumindo datasets](#Primeirospassosnodesenvolvimentodewidgets-Consumindodatasets)\n - [Integração com serviços REST](#Primeirospassosnodesenvolvimentodewidgets-IntegraçãocomserviçosREST)\n\n# Pré-requisitos do ambiente\n\n---\n\nAntes de iniciar a criação de uma *widget*, certifique-se de que sua máquina atende aos requisitos técnicos abaixo. Estes componentes são essenciais para que o desenvolvimento e a comunicação com o TOTVS Fluig ocorram sem falhas." }, { "metadata": { "title": "Primeiros passos no desenvolvimento de widgets", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos+no+desenvolvimento+de+widgets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Primeiros passos no desenvolvimento de widgets.md" }, "content": "Primeiros passos no desenvolvimento de widgets\n\n## Kit de desenvolvimento Java (JDK)\n\n---\n\n**O que é:** ferramenta necessária para compilar e desenvolver código Java.\n\nAtenção!\n\nCertifique-se de instalar o **JDK da Oracle**. É obrigatório ter o JDK completo e não apenas o JRE, visto que o JRE serve exclusivamente para executar os programas, e não para criá-los.\n\n## IDE Eclipse e *plugin* Fluig Studio\n\n---\n\nPara desenvolver para a plataforma, utilizamos o Eclipse com ferramenta específica da TOTVS.\n\n- **Versões suportadas:** é necessário utilizar o **Eclipse 2019-R9 (2019-09)** ou o **Eclipse Luna**, pois atualmente são as únicas versões homologadas pela TOTVS.\n- **Extensão:** o *plugin* **Fluig Studio** deve estar instalado e configurado. É fundamental garantir que o *plugin* esteja exatamente na mesma versão do servidor Fluig do seu ambiente.\n\nCaso haja divergência entre a versão do seu *plugin* e a do servidor, consulte a documentação de Instalação do Fluig Studio para realizar o *downgrade* ou *upgrade* de versão do *plugin*.\n\nDica!\n\nConsulte o [Guia de instalação Fluig Studio](../../Instalação e Atualização/Guia de instalação Fluig Studio.md) e [Como fazer - Instalar Eclipse 2019-R9 + Fluig Studio](https://academy.fluig.com/theme/totvs_fluig_academy/landpage.php?course=95) para o passo a passo detalhado.\n\nPara a boa utilização do Fluig Studio, algumas configurações são necessárias [Configuração para uso inicial do Fluig Studio](../Fluig Studio/Configuração para uso inicial do Fluig Studio.md).\n\nAtenção!\n\nO Eclipse Luna não é compatível com a atualização Voyager 2.0 do Fluig.\n\n# Configuração do servidor e criação do projeto\n\n---\n\nPara iniciar o desenvolvimento no TOTVS Fluig, o primeiro passo prático é configurar a comunicação com o seu ambiente e criar um projeto no Eclipse para organizar os seus arquivos.\n\nDica!\n\nConsulte [Criando um projeto Fluig no Studio](../Fluig Studio/Criando um projeto fluig no Studio.md) para o passo a passo detalhado." }, { "metadata": { "title": "Primeiros passos no desenvolvimento de widgets", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos+no+desenvolvimento+de+widgets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Primeiros passos no desenvolvimento de widgets.md" }, "content": "Primeiros passos no desenvolvimento de widgets\n\n## Passo 1: selecionar a Perspectiva Fluig\n\n---\n\nAntes de clicar em qualquer menu, certifique-se de que você está na **Perspectiva Fluig**. No canto superior direito do Eclipse, verifique se o ícone do Fluig está selecionado. Isso habilita os menus específicos da plataforma.\n\n- **Selecione a perspectiva do Fluig.**\n\n![](..\\..\\..\\images\\Passo%201.png)\n\n## Passo 2: configurando o servidor (Fluig Server)\n\n---\n\nO Eclipse precisa saber para onde enviar os arquivos.\n\n- **Criar um novo servidor.**\n\n - Procure a aba Servers. Se não encontrar, vá em Window > Show View > Other... > Fluig > Fluig Servers.\n - Clique com o botão direito sobre **Servers** e selecione **Novo***>***Fluig Server**.\n\n![](..\\..\\..\\images\\Passo%203.png)\n\n- **Autenticação e definição do ambiente. Nesta tela, insira as credenciais essenciais para o \"*deploy*\":**\n\n - **Nome servidor:** um nome para você identificar o servidor. Ex.: \"Servidor Produção\".\n - ***Host*:** o endereço completo. Ex.: `http://lab.fluig.com`.\n - **Usuário e Senha**: devem ser de um usuário com perfil de Administrador no TOTVS Fluig.\n\n Dica!\n\n Em ambientes integrados com Identity, utilize as credenciais de login do Identity.\n - Clique em ***Finish*** para concluir a criação do servidor.\n\n**![](..\\..\\..\\images\\Passo%204.png)**\n\n- Clique **duas vezes** no servidor para validar a configuração.\n\n**![](..\\..\\..\\images\\Passo%205.png)**\n\n## Passo 3: criando o projeto\n\n---\n\nO projeto funciona como uma pasta raiz que conterá todos os seus componentes: *widgets, layouts, datasets.*\n\n- Vá em **Arquivo** > **Novo** > **Projeto Fluig**.\n\n**![](..\\..\\..\\images\\c1.png)**\n\n- **Nome do projeto:** digite o nome do seu projeto. Ex.: `Projeto_Treinamento_Widgets, fluig, etc`.\n- Clique em **Finish**.\n\n![](..\\..\\..\\images\\c2.png)\n\nImportante!\n\nO Eclipse criará uma estrutura de pastas. A pasta que nos interessa é a **WCM**, onde ficam os componentes de *Web Content Management*." }, { "metadata": { "title": "Primeiros passos no desenvolvimento de widgets", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos+no+desenvolvimento+de+widgets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Primeiros passos no desenvolvimento de widgets.md" }, "content": "Primeiros passos no desenvolvimento de widgets\n\n## Criando a *widget*: primeiros passos" }, { "metadata": { "title": "Primeiros passos no desenvolvimento de widgets", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos+no+desenvolvimento+de+widgets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Primeiros passos no desenvolvimento de widgets.md" }, "content": "Primeiros passos no desenvolvimento de widgets\n\n\n---\n\nCriar uma *widget* no Fluig é como construir uma peça de Lego inteligente. Ela terá um visual (HTML), um comportamento (JavaScript), um estilo próprio (CSS) e poderá falar vários idiomas (i18n). Vamos ao passo a passo no seu ambiente de desenvolvimento (Eclipse com *plugin* Fluig Studio):\n\n1. Abra a pasta do seu projeto, localize a pasta **WCM** e, dentro dela, a pasta **Widget**.\n2. Clique com o botão direito sobre a pasta **Widget** e selecione **New > Widget**.\n3. Uma janela de configuração será aberta:\n 1. **Código:** o ID único da sua *widget* no banco de dados. **Regra**: use apenas letras minúsculas, números e *underline*. Ex.: `minha_primeira_widget`.\n 2. **Nome:** o nome amigável que o usuário verá no catálogo de *widgets* ao editar uma página. Ex.: \"Minha primeira *widget*\".\n 3. **Descrição:** explique brevemente o propósito dela.\n4. Na mesma tela de criação, haverá a opção de escolher um ***Template***.\n 1. Selecione a opção **\"Nenhum\".**\n 2. Ao escolher **\"Nenhum\"**, clique em **Next**.\n 3. Uma nova janela de configuração será aberta:\n 1. **Código/Nome/URL do desenvolvedor:** preencha com seus dados ou os da sua empresa.\n 2. **Categoria:** fundamental! É a \"pasta\" onde sua *widget* vai aparecer no menu do Fluig. Anote o nome exato.\n 3. **Renderizador:** mantenha **Freemarker**. É o motor de templates oficial do Fluig.\n 4. **Suporte mobile:** marque se a *widget* terá suporte ao aplicativo mobile Fluig.\n\nAo finalizar, o Fluig Studio gerará a seguinte estrutura limpa. É crucial entender o papel de cada arquivo:\n\n```\nminha_primeira_widget/\n├── src/main/resources/\n│   ├── view.ftl                ➔ (O Rosto) O que o usuário final vê.\n│   ├── edit.ftl                ➔ (Os bastidores) Onde o administrador configura a widget.\n│   ├── application.info        ➔ (O RG) O documento de identidade e configurações da widget.\n│   ├── minha_primeira_widget_pt_BR.properties ➔ Dicionário em Português.\n│   ├── minha_primeira_widget_en_US.properties ➔ Dicionário em Inglês.\n│   └── minha_primeira_widget_es.properties    ➔ Dicionário em Espanhol.\n│\n└── src/main/webapp/resources/\n    ├── css/\n    │   └── minha_primeira_widget.css ➔ (A Roupa) Estilos customizados (se os do Style Guide não bastarem).\n    └── js/\n        └── minha_primeira_widget.js  ➔ (O Cérebro) Lógica, SuperWidget, chamadas de API.\n```\n\nDetalhando os arquivos na prática:\n\n- **application.info?**:guarda tudo o que você preencheu na criação. Se você precisar mudar o ícone (`application.icon`) ou a categoria, é aqui que fará a alteração.\n\nCuriosidade!\n\nSe você precisar mudar o ícone da *widget* ou a categoria dela no futuro, é neste arquivo que você fará a alteração.\n\n- **view.ftl** (interface visual): é o HTML processado pelo Freemarker. Aqui, aplicamos o Fluig Style Guide.\n\nDica!\n\nEvite usar estilos *inline* ou cores *hardcoded*. Use painéis, a grade do Style Guide (`row`, `col-md-*`) e os utilitários de espaçamento do Fluig (`fs-mt-16`, etc.).\n\nExemplo prático (view.ftl):\n\n```\n
\n
\n
\n

\n \n ${i18n.getTranslation('widget.title')}\n

\n
\n
\n
\n
\n

${i18n.getTranslation('widget.description')}

\n \n \n
\n
\n
\n
\n
\n```\n\n- **edit.ftl** (menu de parametrização): exibido apenas quando um administrador entra no modo de edição de página. É aqui que você coloca os *inputs* para o cliente mudar título, cor principal ou URL de integração, sem precisar alterar código.\n\nDica!\n\n**Salvando preferências:** para que configurações feitas no `edit.ftl` (como a escolha em um *Color Picker*) tenham efeito no `view.ftl`, os valores não são salvos automaticamente . Você deve usar a seguinte técnica: *[WCMSpaceAPI.PageService.UPDATEPREFERENCES](https://tdn.totvs.com/pages/viewpage.action?pageId=185735401#Comocriarumwidgetquebusqueconte%C3%BAdo-Armazenamento).*\n\n- Arquivos **.properties** (a internacionalização - i18n): os arquivos .properties guardam chaves e valores. Exemplo no arquivo pt\\_BR.properties:\n\n```\nwidget.title=Minha Primeira Widget\nwidget.description=Olá! Esta é uma widget construída com as melhores práticas do TOTVS Fluig.\nwidget.placeholder=Digite seu nome aqui...\n```\n\n- **JavaScript** e preferências (a lógica): no arquivo JS da pasta webapp, criamos o objeto inteligente baseado na SuperWidget." }, { "metadata": { "title": "Primeiros passos no desenvolvimento de widgets", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos+no+desenvolvimento+de+widgets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Primeiros passos no desenvolvimento de widgets.md" }, "content": "Primeiros passos no desenvolvimento de widgets\n\n## *Deploy* para o TOTVS Fluig\n\n---\n\nCom o servidor configurado, você enviará a *widget* para o TOTVS Fluig:\n\n- No Eclipse, clique com o **botão direito exclusivamente sobre a pasta da sua *widget*** (dentro de WCM/*widget*). Nunca exporte pela pasta raiz do projeto inteiro.\n\n- Selecione **Fluig** > **Exportar para o servidor Fluig**.\n\n- Escolha o servidor que você acabou de configurar e clique em **Finish**.\n\n## Testando sua *widget*\n\n---\n\nPara testar a sua *widget*, siga os passos abaixo.\n\n### Visualizar sua *widget*\n\n---\n\nApós realizar a exportação (*deploy*) no Eclipse, sua *widget* já estará disponível no servidor TOTVS Fluig. Para visualizá-la, siga os passos abaixo:\n\n### Acessar o TOTVS Fluig e a página:\n\n---\n\nPara ver sua *widge*t, siga os passos abaixo:\n\n- **Passo 1:**acesse o endereço do servidor TOTVS Fluig no seu navegador e faça o *login* com credenciais de administrador.\n- **Passo 2:** no menu lateral, vá em **Painel de Controle** > **Minhas páginas** .\n- **Passo 3:** clique em **Criar página**;\n\n - selecione qualquer *layout* de página e clique em **Avançar**;\n - preencha os campos Nome da página e Descrição como quiser. Ex.: Primeira página;\n - o Identificador único preencha como: primeira\\_pagina.\n- **Passo 4:** clique em **Concluir**.\n\nNota:\n\nVocê pode adicionar em uma página existente também caso queira, não precisa criar uma nova página.\n\n### Adicionar a *widget*\n\n---\n\nCom a página em modo de edição, siga os passos abaixo:\n\n- **Passo 1:** com a página em modo de edição, localize o **menu lateral de *widgets***.\n- **Passo 2:** navegue pelas pastas até encontrar a **Categoria** que você definiu no arquivo `application.info` do seu projeto no Eclipse.\n- **Passo 3:** clique sobre a sua *widget* (identificada pelo *Widget Title*, ex.: *\"Minha Primeira Widget\"*) e faça um **drag-and-drop** (arrastar e soltar) diretamente para o *slot* ou coluna desejada na página.\n\n### Publicar a página" }, { "metadata": { "title": "Primeiros passos no desenvolvimento de widgets", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos+no+desenvolvimento+de+widgets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Primeiros passos no desenvolvimento de widgets.md" }, "content": "Primeiros passos no desenvolvimento de widgets\n\n\n---\n\nApós arrastar a *widget*, você verá apenas o conteúdo que escreveu no **`edit.ftl`.**\n\n- **Passo 1:** na barra superior, clique em **Publicar** e dê um nome à versão. Ex.: \"Versão inicial\".\n\nDica!\n\nSe você fizer uma alteração no código dentro do Eclipse e exportar novamente, basta fazer um **\"F5\" (*refresh*)** na página do navegador para ver a mudança . Não é necessário remover e adicionar a *widge*t de novo toda vez que mudar uma linha de código .\n\n# 4 Dicas para dominar as *widgets* no TOTVS Fluig\n\n---\n\n## Dica 1: domine o ciclo de vida\n\n---\n\nToda *widget* é uma extensão da **SuperWidget**. O segredo para um código organizado é entender que o arquivo `.js`  controla o que acontece em cada momento. Use sempre a função `init`, que é o gatilho automático . É nela que você deve usar a propriedade `this.isEditMode` para decidir se o código deve carregar as configurações do arquivo (edit.ftl) ou (view.ftl).\n\n## Dica 2: use o \"i18n\" no seu código\n\n---\n\nEvite escrever textos diretamente no HTML (`view.ftl ou edit.ftl`).Utilize os arquivos **`.properties`**. Ao usar **`${i18n.getTranslation('sua.chave')}`** no HTML, você garante que sua *widget* seja internacionalizável.\n\n## Dica 3: isole suas instâncias" }, { "metadata": { "title": "Primeiros passos no desenvolvimento de widgets", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos+no+desenvolvimento+de+widgets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Primeiros passos no desenvolvimento de widgets.md" }, "content": "Primeiros passos no desenvolvimento de widgets\n\n\n---\n\n- **No HTML (`view.ftl`):** utilize a variável `${instanceId}` fornecida pela plataforma para criar IDs dinâmicos, como `id=\"meu-grafico_${instanceId}\"`.\n- **No JavaScript:** para manipular esse elemento, concatene a propriedade da SuperWidget na sua busca: `const meuGrafico = document.querySelector(\"#meu-grafico_\" + this.instanceId);.` Isso garante que cada *widget* na página seja única e independente .\n\nAtenção!\n\nCuidado com o contexto em chamadas Assíncronas (AJAX): se você fizer uma requisição AJAX ou usar um *callback*, o contexto do `this` muda, e o `this.instanceId` ficará `undefined`. Para não perder essa referência, declare uma variável recebendo o `this` no início do seu escopo.\n\nDica para os desenvolvedores\n\nPara mais informações, acesse o curso [Iniciando o desenvolvimento de *widgets*](https://academy.fluig.com/theme/totvs_fluig_academy/landpage.php?course=97).\n\n## Dica 4: renomear arquivos\n\n---\n\nAo criar uma *widget*, o Fluig Studio gera os arquivos baseados no ***Código da widget*** informado. Se você renomear o arquivo JavaScript principal (Ex.: de `xpto.js` para `portal_cotacao.js`), a *widget* irá quebrar.\n\nA plataforma amarra a identidade do componente através do arquivo `application.info`. Se precisar renomear a *widget* no futuro, certifique-se de alterar também a propriedade `application.code` dentro do `application.info`, além de renomear os arquivos `.properties` para que tudo continue conversando perfeitamente.\n\n# Sua *widget* com WCMAPI\n\n---\n\nSua *widget* tem apenas uma interface estática. Para torná-la dinâmica, o Fluig disponibiliza um objeto global e muito poderoso chamado **`WCMAPI`**. Ele é a ponte entre o *Front-end* da sua *widget* e os serviços do servidor Fluig. Aqui estão os três recursos essenciais da WCMAPI.\n\n## Obtendo o contexto do usuário logado" }, { "metadata": { "title": "Primeiros passos no desenvolvimento de widgets", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos+no+desenvolvimento+de+widgets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Primeiros passos no desenvolvimento de widgets.md" }, "content": "Primeiros passos no desenvolvimento de widgets\n\n\n---\n\nVocê não precisa criar serviços complexos para saber quem está acessando a página. O `WCMAPI` já traz essas informações prontas no momento em que a w*idget* é carregada:\n\n- **`WCMAPI.user`:** retorna o nome completo do usuário logado.\n- **`WCMAPI.userCode`:** retorna a matrícula/código interno do usuário.\n- **`WCMAPI.userId`:** retorna o *login* de acesso do usuário.\n- **`WCMAPI.serverURL`:** retorna a URL base do seu servidor Fluig, ideal para montar *links* de arquivos e chamadas.\n\n## Consumindo *datasets*\n\n---\n\nPara buscar informações de formulários ou tabelas internas do Fluig dentro do **`application.js`** da sua *widget*, a melhor prática é utilizar a **DatasetFactory** nativa:\n\n```\n// Exemplo de busca de dados no JavaScript da Widget\nvar dataset = DatasetFactory.getDataset(\"colleague\", null, null, null);\nif (dataset != null && dataset.values.length > 0) {\n console.log(\"Usuários encontrados: \" + dataset.values.length);\n}\n```\n\nImportante!\n\nPara que o objeto `DatasetFactory` fique disponível no JavaScript da sua página, certifique-se de importar a biblioteca `` no seu `view.ftl`.\n\n## Integração com serviços REST" }, { "metadata": { "title": "Primeiros passos no desenvolvimento de widgets", "source": "https://tdn.totvs.com/display/fluig/Primeiros+passos+no+desenvolvimento+de+widgets", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Primeiros passos no desenvolvimento de widgets.md" }, "content": "Primeiros passos no desenvolvimento de widgets\n\n\n---\n\nSe a sua *widget* precisa buscar ou enviar dados para fontes externas, APIs REST customizadas ou serviços internos do próprio TOTVS Fluig, a forma mais moderna, performática e segura de fazer essa requisição é utilizando a API nativa **`fetch`** do JavaScript em conjunto com métodos assíncronos (`async/await`).\n\nPara garantir que a sua *widget* não quebre ao ser migrada de um ambiente de Homologação para Produção, sempre utilize o método `WCMAPI.getServerURL()` para montar o caminho base das chamadas internas. Ele já herda a autenticação do usuário logado na plataforma!\n\nVeja abaixo o \"esqueleto universal\" para consumir qualquer API:\n\n```\nvar MyWidget = SuperWidget.extend({\n // Variáveis da widget\n variavelNumerica: null,\n\n // Método iniciado quando a widget é carregada no DOM\n init: function() {\n this.consumirApiRest();\n },\n \n // BIND de eventos de clique, alteração, etc.\n bindings: {\n local: {\n 'atualizar-dados': ['click_consumirApiRest']\n }\n },\n \n /**\n * Padrão Universal para requisições REST (Internas ou Externas)\n */\n consumirApiRest: async function() {\n try {\n // 1. Definição da URL\n // Exemplo A (API pública do Fluig): \n const url = `${WCMAPI.getServerURL()}/api/public/ecm/document/listDocument/2`;\n \n // Exemplo B (API Externa ):\n // const url = 'https://sua-api-externa.com.br/v1/dados';\n\n // 2. Realiza a requisição assíncrona\n const response = await fetch(url, {\n method: 'GET', // Pode ser alterado para POST, PUT, DELETE, etc.\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n }\n // Se for POST ou PUT, adicione o corpo da requisição:\n // body: JSON.stringify({ chave: \"valor\" })\n });\n\n // 3. Validação de sucesso HTTP\n if (!response.ok) {\n throw new Error(`Erro HTTP: ${response.status} - ${response.statusText}`);\n }\n\n // 4. Conversão da resposta para JSON\n const data = await response.json();\n console.log(\"Sucesso ao consultar a API:\", data);\n\n\n } catch (error) {\n console.error(\"Algo inesperado ocorreu ao chamar a API:\", error);\n \n // Exibe um alerta visual nativo da plataforma em caso de falha\n FLUIGC.toast({ \n title: 'Atenção: ', \n message: 'Não foi possível carregar os dados da integração.', \n type: 'warning' \n });\n }\n }\n \n});\n```\n\nDica!\n\nO método `WCMAPI.getServerURL()` traz a URL exata do servidor para você montar o caminho da sua chamada REST com segurança, evitando que a sua *widget* quebre caso a empresa mude o endereço do Fluig no futuro!" }, { "metadata": { "title": "Componente Atualizar Arquivo Físico", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=160104509", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Atualizar Arquivo Físico.md" }, "content": "Componente Atualizar Arquivo Físico\n\n\n# Índice\n\n- 1 [Objetivo](#ComponenteAtualizarArquivoFísico-Objetivo)\n- 2 [Pré-requisitos](#ComponenteAtualizarArquivoFísico-Pré-requisitos)\n- 3 [Atualizar arquivo físico](#ComponenteAtualizarArquivoFísico-Atualizararquivofísico)\n - 3.1 [Estrutura Básica](#ComponenteAtualizarArquivoFísico-EstruturaBásica)\n - 3.2 [Utilização Básica](#ComponenteAtualizarArquivoFísico-UtilizaçãoBásica)\n - 3.2.1 [1 - Tela exibida ao chamar o componente](#ComponenteAtualizarArquivoFísico-1-Telaexibidaaochamarocomponente)\n - 3.2.2 [2 - Tela exibida ao selecionar um arquivo para atualização](#ComponenteAtualizarArquivoFísico-2-Telaexibidaaoselecionarumarquivoparaatualização)\n - 3.2.3 [3 - Tela exibida quando o id do documento pertence a uma pasta](#ComponenteAtualizarArquivoFísico-3-Telaexibidaquandooiddodocumentopertenceaumapasta)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos do TOTVS Fluig Plataforma que desejam utilizar o componente **Atualizar arquivo físico**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\nConhecer os conceitos dos componentes de negócio da plataforma, disponíveis na página [Componentes de Negócio](../Componentes de Negócio.md).\n\n# Atualizar arquivo físico\n\n---\n\nO componente **Atualizar arquivo físico** tem como objetivo facilitar o processo de atualização de arquivos encapsulando todas as configurações básicas necessárias para essa atualização, restando para o desenvolvedor somente configurar o *plugin* e utilizar o *callback* para montar sua lógica de negócio.\n\n## Estrutura Básica" }, { "metadata": { "title": "Componente Atualizar Arquivo Físico", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=160104509", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Atualizar Arquivo Físico.md" }, "content": "Componente Atualizar Arquivo Físico\n\n\n---\n\n**Estrutura básica do componente**\n\n```\nECMBC.updateDocument(config, callback);\n```\n\nComo pode-se notar na estrutura básica, o componente recebe basicamente dois parâmetros, o primeiro, um objeto ***config*** com as configurações do componente e o segundo uma função ***callback*** contendo o erro e/ou o sucesso da atualização.\n\nO primeiro parâmetro espera um objeto contendo três atributos: ***id***, ***version*** e ***types***, onde ***types*** não é obrigatório e os demais sim.\n\n**Parâmetro config**\n\n```\nvar config - {\n\tid: 10, //id do documento para atualização\n\tversion: 1000, //versão ATUAL do documento para atualização\n\ttypes: 'gif|jpg|jpeg|tiff|png' //string contendo as extensões permitidas para atualização separado por pipeline \"|\"\n};\n```\n\nO segundo parâmetro espera uma função que recebe dois valores: ***error*** e ***data***.\n\n**Parâmetro callback**\n\n```\nfunction(error, data) {\n\tif(error) {\n\t\t//tratamento de erro...\n\t}\n\t\n\t//lógica do sucesso...\n}\n```\n\n## Utilização Básica\n\n---\n\n**minhawidget.js**\n\n```\nvar EcmDocumentUpdate = SuperWidget.extend({\n\n\tid: null,\n\tversion: null,\n\ttypes: null,\n\t\n\tbindings: {\n\t\tlocal: {\n\t\t\t'update-document': ['click_updateDocument']\n\t\t}\n\t},\n\t\n\tinit: function() {\n\t\tthis.id = 10;\n\t\tthis.version = 1000;\n\t\tthis.type = 'gif|jpg|jpeg|tiff|png';\n\t},\n\t\n\tupdateDocument: function(el, ev) {\n\t\tvar that = this;\n\t\tECMBC.updateDocument({\n\t\t\tid: that.id,\n\t\t\tversion: that.version,\n\t\t\ttypes: that.type\n\t\t}, function(err, data) {\n\t\t\tif(err) {\n\t\t\t\treturn alert(err.responseText);\n\t\t\t}\n\t\t\t\n\t\t\tthat.someFunc(data);\n\t\t});\n\t},\n\t\n\tsomeFunc: function(data) {\n\t\t//Qualquer coisa com o retorno de sucesso...\n\t}\n});\n```\n\nNo application.info de seu widget, adicione o componente como dependência:\n\n**application.info**\n\n```\napplication.resource.component.1=ecm/updatedocument\n```\n\n### 1 - Tela exibida ao chamar o componente\n\n![](..\\..\\..\\..\\images\\Captura%20de%20Tela%202014-09-02%20%C3%A0s%2010.33.43.png)" }, { "metadata": { "title": "Componente Atualizar Arquivo Físico", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=160104509", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Atualizar Arquivo Físico.md" }, "content": "Componente Atualizar Arquivo Físico\n\n### 2 - Tela exibida ao selecionar um arquivo para atualização\n\n![](..\\..\\..\\..\\images\\update_document.png)\n\n### 3 - Tela exibida quando o id do documento pertence a uma pasta\n\n![](..\\..\\..\\..\\images\\Captura%20de%20Tela%202014-09-02%20%C3%A0s%2010.35.19.png)" }, { "metadata": { "title": "Componente Busca de documentos", "source": "https://tdn.totvs.com/display/fluig/Componente+Busca+de+documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Busca de documentos.md" }, "content": "Componente Busca de documentos\n\n\n# Índice\n\n- 1 [Objetivo](#ComponenteBuscadedocumentos-Objetivo)\n- 2 [Pré-requisitos](#ComponenteBuscadedocumentos-Pré-requisitos)\n- 3 [Busca de documentos](#ComponenteBuscadedocumentos-Buscadedocumentos)\n - 3.1 [Estrutura Básica](#ComponenteBuscadedocumentos-EstruturaBásica)\n - 3.2 [Utilização Básica](#ComponenteBuscadedocumentos-UtilizaçãoBásica)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos da plataforma que desejam utilizar o componente **Busca de documentos**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\nConhecer os conceitos dos componentes de negócio da plataforma, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Busca de documentos\n\n---\n\nO componente **Busca de documentos** tem como objetivo facilitar a busca de documentos e pastas da plataforma, restando para o desenvolvedor somente configurar o ***plugin*** e utilizar o ***callback*** para montar sua lógica de negócio.\n\n## Estrutura Básica" }, { "metadata": { "title": "Componente Busca de documentos", "source": "https://tdn.totvs.com/display/fluig/Componente+Busca+de+documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Busca de documentos.md" }, "content": "Componente Busca de documentos\n\n\n---\n\nComo pode-se notar na estrutura básica, o componente recebe basicamente dois parâmetros:\n\n- o primeiro, um objeto ***config*** com as configurações do componente;\n- e o segundo uma função ***callback*** contendo o erro e/ou o sucesso.\n\nVeja o exemplo abaixo:\n\n**Estrutura básica do componente**\n\n```\nECMBC.searchDocument(config, callback);\n```\n\nO primeiro parâmetro espera um objeto contendo até dez atributos, onde nenhum é obrigatório:\n\n**Parâmetro config**\n\n```\nvar config = {\n\tform: false, // (opcional) caso passar o valor true, irá renderizar uma versão antiga com suporte à usar dentro de formulários\t\n\ttitle: 'Selecione um arquivo' // valor default 'Selecionar registro'. Título da modal.\n\tparentId: 0, // valor default 0. Id do diretório inicial da busca, com breadcrumb completo\n\tdocTypeId: '1-2-8', // valor default '1-2-8'. Id dos tipos de documentos que devem aparecer na busca, separados por -\n\tshowPrivate: false, // mostrar ou não aquivos privados\n\tminPermission: 0, // id da permissão mínima para mostrar o arquivo\n\tshowCheckOutDocs: false, // mostrar ou não arquivos em checkout\n\tsocialDocId: 0, // id da pasta onde a busca vai iniciar, o breadcrumb será apenas desta pasta em diante\n\tselectableDocTypeId: '1-2-8' // valor default '1-2-8'. Id dos tipos de documentos que podem ser selecionados na busca, separados por -\n};\n```\n\nO parâmetro \"form\" deve ser passado nas opções da chamada ECMBC.searchDocument, como true ou false, para que funcione trazendo as opções antigas de busca.\n\n**Parâmetro config**\n\n```\nvar config = {\n form: true, // Valida se a chamada é feita via formulário ou widgets no fluig para que exiba tela correta.\n title: 'Selecione um arquivo' // valor default 'Selecionar registro'. Título da modal.\n parentId: 0, // valor default 0. Id do diretório inicial da busca, com breadcrumb completo\n docTypeId: '1-2-8', // valor default '1-2-8'. Id dos tipos de documentos que devem aparecer na busca, separados por -\n showPrivate: false, // mostrar ou não aquivos privados\n minPermission: 0, // id da permissão mínima para mostrar o arquivo\n showCheckOutDocs: false, // mostrar ou não arquivos em checkout\n socialDocId: 0, // id da pasta onde a busca vai iniciar, o breadcrumb será apenas desta pasta em diante\n selectableDocTypeId: '1-2-8' // valor default '1-2-8'. Id dos tipos de documentos que podem ser selecionados na busca, separados por -\n};\n```\n\nTipos de documento\n\nO tipo de documento, no campo docTypeId, segue o padrão:\n\n1 - Pasta \n2 - Documento normal \n3 - Documento externo \n4 - Formulário \n5 - Registro de formulário \n7 - Anexo Workflow \n8 - Novo conteúdo \n9 - Aplicativo \n10 - Relatório\n\nO segundo parâmetro espera uma função que recebe dois valores: ***error*** e ***data***. O valor data contém o objeto do arquivo/pasta selecionado.\n\n**Parâmetro callback**\n\n```\nfunction(error, data) {\n\tif(error) {\n\t\t//tratamento de erro...\n\t}\n\t\n\t//lógica do sucesso...\n}\n```" }, { "metadata": { "title": "Componente Busca de documentos", "source": "https://tdn.totvs.com/display/fluig/Componente+Busca+de+documentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Busca de documentos.md" }, "content": "Componente Busca de documentos\n\n## Utilização Básica\n\n---\n\nUm exemplo da utilização básica abaixo:\n\n**minhawidget.js**\n\n```\nvar EcmDocumentUpdate = SuperWidget.extend({\n\n\twidth: null,\n\tdocTypeId: null,\n\t\n\tbindings: {\n\t\tlocal: {\n\t\t\t'search-document': ['click_searchDocument']\n\t\t}\n\t},\n\t\n\tinit: function() {\n\t\tthis.width = 900;\n\t\tthis.docTypeId= '1-2';\n\t},\n\t\n\tsearchDocument: function(el, ev) {\n\t\tvar that = this;\n\t\tECMBC.searchDocument({\n\t\t\twidth: that.width,\n\t\t\tdocTypeId: that.docTypeId\n\t\t}, function(err, data) {\n\t\t\tif(err) {\n\t\t\t\treturn alert(err.responseText);\n\t\t\t}\n\t\t\t\n\t\t\tthat.someFunc(data);\n\t\t});\n\t},\n\t\n\tsomeFunc: function(data) {\n\t\t//Qualquer coisa com o retorno de sucesso...\n\t}\n});\n```\n\n- No arquivo application.info de seu *widget*, adicione o componente como dependência. Como no exemplo abaixo:\n\n**application.info**\n\n```\napplication.resource.component.1=ecm/searchdocument\n```\n\n**Tela exibida ao chamar o componente**\n\n![](..\\..\\..\\..\\images\\image2023-2-24_15-40-24.png)" }, { "metadata": { "title": "Componente Compartilhar", "source": "https://tdn.totvs.com/display/fluig/Componente+Compartilhar", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Compartilhar.md" }, "content": "Componente Compartilhar\n\n\n# Índice\n\n- 1 [Objetivo](#ComponenteCompartilhar-Objetivo)\n- 2 [Pré-requisitos](#ComponenteCompartilhar-Pré-requisitos)\n- 3 [Compartilhar](#ComponenteCompartilhar-Compartilhar)\n - 3.1 [Estrutura Básica](#ComponenteCompartilhar-EstruturaBásica)\n - 3.2 [Utilização Básica](#ComponenteCompartilhar-UtilizaçãoBásica)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos da plataforma que desejam utilizar o componente **Compartilhar**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\n- Conhecer os conceitos dos componentes de negócio do TOTVS Fluig Plataforma, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Compartilhar\n\n---\n\nO componente **Compartilhar** tem como objetivo facilitar o processo de compartilhamento de conteúdo encapsulando todas as configurações básicas necessárias para o compartilhamento, restando para o desenvolvedor somente configurar o *plugin*.\n\n## Estrutura Básica" }, { "metadata": { "title": "Componente Compartilhar", "source": "https://tdn.totvs.com/display/fluig/Componente+Compartilhar", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Compartilhar.md" }, "content": "Componente Compartilhar\n\n\n---\n\nA seguir é apresentada a estrutura básica do componente:\n\n**Estrutura básica do componente**\n\n```\nSOCIALBC.share(target, config);\n```\n\nO componente recebe dois parâmetros:\n\n- o primeiro, um objeto ***target*** que pode ser um objeto ou uma *string;*\n- e o segundo as configurações para o componente.\n\nO primeiro parâmetro espera um objeto ou uma *string*:\n\n**Parâmetro config**\n\n```\n// Pode ser um objeto resultante de um seletor jquery:\nvar obj = $('#meu_seletor');\n \n// Pode ser uma string de um seletor jquery:\nvar obj = '#meu_seletor';\n```\n\nO segundo parâmetro espera um objeto com os valores: ***showOnlyLink**, **sourceType**, **type**, **preview**, **link*** e ***paramId***.\n\n**Parâmetro callback**\n\n```\n{\n showOnlyLink: \"exibe apenas o link ex.:true or false,\"\n sourceType: \"tipo ex.:SOCIABLE,\"\n type: \"tipo do conteúdo ex.:POST,\"\n preview: \"uma miniatura do conteúdo que será compartilhado,\"\n link: \"url para acessar o recurso,\"\n paramId: \"id social\"\n}\n```\n\n## Utilização Básica" }, { "metadata": { "title": "Componente Compartilhar", "source": "https://tdn.totvs.com/display/fluig/Componente+Compartilhar", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Compartilhar.md" }, "content": "Componente Compartilhar\n\n\n---\n\nA utilização básica do componente é apresentada a seguir:\n\n**minhawidget.js**\n\n```\nSOCIALBC.share('#seletor', {\n showOnlyLink: false,\n sourceType: 'SOCIABLE',\n type: 'POST',\n preview: '
Miniatura
',\n link: 'http://servidor/portal/p/1/post/usuario/12',\n paramId: 12\n});\n```\n\nNo [application.info](http://application.info) de seu *widget*, adicione o componente como dependência:\n\n**application.info**\n\n```\napplication.resource.component.2=social/socialshare\n```\n\n**Tela exibida ao chamar o componente**\n\n![](..\\..\\..\\..\\images\\Captura%20de%20tela%20de%202015-04-01%20170751.png)\n\n**Tela exibida ao selecionar a opção compartilhar**\n\n![](..\\..\\..\\..\\images\\Captura%20de%20tela%20de%202015-04-01%20170809.png)\n\n**Mensagem exibida ao selecionar a opção copiar *link***\n\n![](..\\..\\..\\..\\images\\Captura%20de%20tela%20de%202015-04-01%20171124.png)\n\n**Tela exibida ao selecionar a opção compartilhar quando não existe o Flash no navegador**\n\n![](..\\..\\..\\..\\images\\Captura%20de%20tela%20de%202015-04-01%20171851.png)" }, { "metadata": { "title": "Componente de recorte de imagem", "source": "https://tdn.totvs.com/display/fluig/Componente+de+recorte+de+imagem", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente de recorte de imagem.md" }, "content": "Componente de recorte de imagem\n\n\n# Índice\n\n- 1 [Objetivo](#Componentederecortedeimagem-Objetivo)\n- 2 [Pré-requisitos](#Componentederecortedeimagem-Pré-requisitos)\n- 3 [Recorte de imagem](#Componentederecortedeimagem-Recortedeimagem)\n - 3.1 [Estrutura Básica](#Componentederecortedeimagem-EstruturaBásica)\n - 3.2 [Utilização Básica](#Componentederecortedeimagem-UtilizaçãoBásica)\n - 3.2.1 [Tela exibida ao chamar o componente](#Componentederecortedeimagem-Telaexibidaaochamarocomponente)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos da plataforma que desejam utilizar o componente de **recorte de imagem**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\n- Conhecer os conceitos dos componentes de negócio do TOTVS Fluig Plataforma, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Recorte de imagem\n\n---\n\nO componente de **recorte de imagem** tem como objetivo facilitar o processo de atualização de imagens encapsulando todas as configurações básicas necessárias para essa atualização, restando para o desenvolvedor somente configurar o *plugin* e utilizar o *callback* para montar sua lógica de negócio.\n\n## Estrutura Básica" }, { "metadata": { "title": "Componente de recorte de imagem", "source": "https://tdn.totvs.com/display/fluig/Componente+de+recorte+de+imagem", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente de recorte de imagem.md" }, "content": "Componente de recorte de imagem\n\n\n---\n\n**Estrutura básica do componente**\n\n```\nWCMBC.cropImage(config, callback);\n```\n\nComo pode-se notar na estrutura básica, o componente recebe basicamente dois parâmetros:\n\n- o primeiro, um objeto ***config*** com as configurações do componente;\n- e o segundo uma função ***callback*** contendo o erro e/ou o sucesso da atualização.\n\nO primeiro parâmetro espera um objeto contendo sete atributos: ***alias***, ***title**,* ***types**, **imageShape**, **imageSrc**, **saveCallback** e **cancelCallback***, onde os parâmetros são opcionais*.*\n\n**Parâmetro config**\n\n```\nvar config = {\n\talias: 'bruno.quadrotti', //alias do usuário/comunidade que será atualizada - Valor default: alias do usuário logado.\n\ttitle: 'Atualização de imagem de comunidade', //título do modal de troca de imagem. - Valor default: Editar foto\n\ttypes: 'gif|jpg|jpeg|tiff|png', //string contendo as extensões permitidas para atualização separado por pipeline \"|\". - Valor default: jpg|jpeg|png\n\timageShape: 'rounded', //string com o formato de imagem a ser apresentado, conforme os formatos do guia de estilos('rounded', 'circle' ou '')\n\timageSrc: 'http://www.fluig.com/assets/images/logo_fluig.png', //url da imagem\n\tsaveCallback: function(data){}, //função callback para a ação de salvar imagem, onde \"data\" são as coordenadas definidas para o recorte da imagem\n\tcancelCallback: function(){} //função callback callback para cancelar a função de crop\n};\n```\n\nO segundo parâmetro espera uma função que recebe dois valores: ***error*** e ***data***.\n\n**Parâmetro callback**\n\n```\nfunction(error, data) {\n\tif(error) {\n\t\t//tratamento de erro...\n\t}\n\t\n\t//lógica do sucesso...\n}\n```\n\n## Utilização Básica" }, { "metadata": { "title": "Componente de recorte de imagem", "source": "https://tdn.totvs.com/display/fluig/Componente+de+recorte+de+imagem", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente de recorte de imagem.md" }, "content": "Componente de recorte de imagem\n\n\n---\n\n**minhawidget.js**\n\n```\nvar UserPreferences = SuperWidget.extend({\n\n\talias: null,\n type: null,\n\t\n\tbindings: {\n\t\tlocal: {\n\t\t\t'update-image': ['click_updateImage']\n\t\t}\n\t},\n\t\n\tinit: function() {\n\t\tthis.type = 'gif|jpg|jpeg|png';\n\t},\n\t\n\tupdateImage: function(el, ev) {\n\t\tvar that = this;\n\t\tWCMBC.cropImage({\n\t\t\talias: this.alias,\n\t\t\ttypes: this.type\n\t\t}, function(err, data) {\n\t\t\tif(err) {\n\t\t\t\treturn alert(err.responseText);\n\t\t\t}\n\t\t\t\n\t\t\tthat.someFunc(data);\n\t\t});\n\t},\n\t\n\tsomeFunc: function(data) {\n\t\t//Qualquer coisa com o retorno de sucesso...\n\t}\n});\n```\n\nNo [application.info](http://application.info) de seu *widget*, adicione o componente como dependência:\n\n**application.info**\n\n```\napplication.resource.component.1=wcm/cropimage\n```\n\n### Tela exibida ao chamar o componente\n\n![](..\\..\\..\\..\\images\\Captura%20de%20Tela%202014-09-24%20%C3%A0s%2017.48.51.png)" }, { "metadata": { "title": "Componente de visualização de artigos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=736177685", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente de visualização de artigos.md" }, "content": "Componente de visualização de artigos\n\n\n# Índice\n\n- 1 [Objetivo](#Componentedevisualizaçãodeartigos-Objetivo)\n- 2 [Pré-requisitos](#Componentedevisualizaçãodeartigos-Pré-requisitos)\n- 3 [Visualização de artigos](#Componentedevisualizaçãodeartigos-Visualizaçãodeartigos)\n - 3.1 [Estrutura Básica](#Componentedevisualizaçãodeartigos-EstruturaBásica)\n - 3.2 [Utilização Básica](#Componentedevisualizaçãodeartigos-UtilizaçãoBásica)\n - 3.2.1 [Tela exibida ao chamar o componente](#Componentedevisualizaçãodeartigos-Telaexibidaaochamarocomponente)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos da plataforma que desejam utilizar o componente de **visualização de artigos**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\n- Conhecer os conceitos dos componentes de negócio do TOTVS Fluig Plataforma, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Visualização de artigos\n\n---\n\nO componente de **visualização de artigos** tem como objetivo facilitar o processo de visualização de artigos encapsulando todas as configurações básicas necessárias para essa visualização, restando para o desenvolvedor somente configurar o *plugin* e utilizar o *callback* para montar sua lógica de negócio.\n\n## Estrutura Básica" }, { "metadata": { "title": "Componente de visualização de artigos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=736177685", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente de visualização de artigos.md" }, "content": "Componente de visualização de artigos\n\n\n---\n\n**Estrutura básica do componente**\n\n```\nSOCIALBC.viewArticle(config, callback);\n```\n\nComo pode-se notar na estrutura básica, o componente recebe basicamente dois parâmetros:\n\n- o primeiro, um objeto ***config*** com as configurações do componente;\n- e o segundo uma função ***callback*** contendo o erro e/ou o sucesso da atualização.\n\nO primeiro parâmetro espera um objeto contendo sete atributos: **articleId, alias, version, title, instanceId**, onde os parâmetros são opcionais*.*\n\n**Parâmetro config**\n\n```\nvar config = {\n articleId: 1, // ID do artigo que será visualizado\n alias: 'user_alias', // Alias / User Code do usuário que está visualizando o artigo\n version: '1000', // Versão do artigo que será visualizado\n title: 'Título customizado', // Título do modal do artigo que está sendo visualizado\n instanceId: Date.now(), // ID customizado do componente de visualização de artigos\n};\n```\n\nO segundo parâmetro espera uma função que recebe dois valores: ***error*** e ***data***.\n\n**Parâmetro callback**\n\n```\nfunction(error, data) {\n\tif(error) {\n\t\t//tratamento de erro...\n\t}\n\t\n\t//lógica do sucesso...\n}\n```\n\n## Utilização Básica" }, { "metadata": { "title": "Componente de visualização de artigos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=736177685", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente de visualização de artigos.md" }, "content": "Componente de visualização de artigos\n\n\n---\n\n**minhawidget.js**\n\n```\nvar MyWidget = SuperWidget.extend({\n\t\n\tbindings: {\n\t\tlocal: {\n\t\t\t'view-article': ['click_viewArticle']\n\t\t}\n\t},\n\t\n\tinit: function() {\n\t\t// code\n\t},\n\t\n\tupdateImage: function(el, ev) {\n\t\tvar articleTitle = 'Visualização de artigo';\n \t\tvar articleId = 1;\n \t\tvar version = '1000'; \n \t\tvar userAlias = 'user'; \n   \n\t\tSOCIALBC.viewArticle({\n\t\t\t'title': articleTitle,\n\t\t 'articleId': articleId,\n \t\t 'version': version, \n\t\t 'alias': userAlias,\n\t\t 'instanceId': Date.now()\n\t\t}, function (error, data) {\n \t\tif (error) {\n\t \t// erro ao carregar o artigo\n\t\t return false;\n\t\t }\n\t\t // fazer algo depois do carregamento do artigo\n\t\t});\n\t}\n});\n```\n\nNo [application.info](http://application.info) de seu *widget*, adicione o componente como dependência:\n\n**application.info**\n\n```\napplication.resource.component.1=social/socialarticleview\n```\n\n### Tela exibida ao chamar o componente\n\n![](..\\..\\..\\..\\images\\image2023-1-27_10-30-5.png)" }, { "metadata": { "title": "Componente Listar compartilhamentos", "source": "https://tdn.totvs.com/display/fluig/Componente+Listar+compartilhamentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Listar compartilhamentos.md" }, "content": "Componente Listar compartilhamentos\n\n\n# Índice\n\n# - 1 - 2 [Objetivo](#ComponenteListarcompartilhamentos-Objetivo) - 3 [Pré-requisitos](#ComponenteListarcompartilhamentos-Pré-requisitos) - 4 [Listar compartilhamentos](#ComponenteListarcompartilhamentos-Listarcompartilhamentos) - 4.1 [Estrutura Básica](#ComponenteListarcompartilhamentos-EstruturaBásica) - 4.2 [Utilização Básica](#ComponenteListarcompartilhamentos-UtilizaçãoBásica)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos da plataforma que desejam utilizar o componente **Listar compartilhamentos**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\n- Conhecer os conceitos dos componentes de negócio do TOTVS Fluig Plataforma, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Listar compartilhamentos\n\n---\n\nO componente **Listar compartilhamentos** tem como objetivo facilitar o processo de listagem de compartilhamentos de um conteúdo encapsulando todas as configurações básicas necessárias, restando para o desenvolvedor somente configurar o *plugin* e utilizar o *callback* para montar sua lógica de negócio.\n\n## Estrutura Básica" }, { "metadata": { "title": "Componente Listar compartilhamentos", "source": "https://tdn.totvs.com/display/fluig/Componente+Listar+compartilhamentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Listar compartilhamentos.md" }, "content": "Componente Listar compartilhamentos\n\n\n---\n\nA seguir é apresentada a estrutura básica do componente:\n\n**Estrutura básica do componente**\n\n```\nSOCIALBC.shareListModal(config, callback);\n```\n\nO componente recebe dois parâmetros:\n\n- o primeiro, um objeto ***config*** com as configurações do componente;\n- e o segundo uma função ***callback*** contendo o erro e/ou o sucesso da listagem.\n\nO primeiro parâmetro espera um objeto contendo três atributos: ***sociableId**, **title** e **instanceId**,* onde ***sociableId*** é o único obrigatório.\n\n**Parâmetro config**\n\n```\nvar config - {\n\tsociableId: 10, //id do objeto social que vai ter a sua listagem exibida\n\ttitle: 'Compartilhado por', //o titulo que vai ser utilizado no modal\n\tinstanceId : Date.now()\n };\n```\n\nO segundo parâmetro espera uma função que recebe dois valores: ***error*** e ***data***.\n\n**Parâmetro callback**\n\n```\nfunction(error, data) {\n\tif(error) {\n\t\t//tratamento de erro...\n\t}\n\t\n\t//lógica do sucesso...\n}\n```\n\n## Utilização Básica" }, { "metadata": { "title": "Componente Listar compartilhamentos", "source": "https://tdn.totvs.com/display/fluig/Componente+Listar+compartilhamentos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Listar compartilhamentos.md" }, "content": "Componente Listar compartilhamentos\n\n\n---\n\nA utilização básica do componente é apresentada a seguir:\n\n**minhawidget.js**\n\n```\nvar SocialTimeline = SuperWidget.extend({\n\n\tsociableId: null,\n\ttitle: null,\n\tinstanceId : null,\n\t\n\tbindings: {\n\t\tlocal: {\n\t\t\t'fluig-list-share': ['click_listSharesAction']\n\t\t}\n\t},\n\t\n\tinit: function() {\n\t\tthis.sociableId = 10;\n\t\tthis.title = 'Compartilhado por';\n\t\tthis.instanceId = Date.now();\n\t},\n\t\n\tlistSharesAction: function(el, ev) {\n\t\tvar that = this;\n\t\tSOCIALBC.shareListModal({\n sociableId : that.sociableId,\n instanceId : that.instanceId,\n\t\t\ttitle : that.title\t\n }, function(err, data) {\n\t\t\tif(err) {\n\t\t\t\treturn alert(err.responseText);\n\t\t\t}\n\t\t\t\n\t\t\tthat.someFunc(data);\n\t\t});\n\t},\n\t\n\tsomeFunc: function(data) {\n\t\t//Qualquer coisa com o retorno de sucesso...\n\t}\n});\n```\n\nNo [application.info](http://application.info/) de seu *widget*, adicione o componente como dependência:\n\n**application.info**\n\n```\napplication.resource.component.1=social/socialsharelist\n```\n\n**Tela exibida ao chamar o componente**\n\n![](..\\..\\..\\..\\images\\compartilhar_list.png)" }, { "metadata": { "title": "Componente Renomear documentos e pastas", "source": "https://tdn.totvs.com/display/fluig/Componente+Renomear+documentos+e+pastas", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Renomear documentos e pastas.md" }, "content": "Componente Renomear documentos e pastas\n\n\n# Índice\n\n- 1 [Objetivo](#ComponenteRenomeardocumentosepastas-Objetivo)\n- 2 [Pré-requisitos](#ComponenteRenomeardocumentosepastas-Pré-requisitos)\n- 3 [Renomear documento](#ComponenteRenomeardocumentosepastas-Renomeardocumento)\n - 3.1 [Estrutura Básica](#ComponenteRenomeardocumentosepastas-EstruturaBásica)\n - 3.2 [Utilização Básica](#ComponenteRenomeardocumentosepastas-UtilizaçãoBásica)\n - 3.3 [Tela exibida ao chamar o componente](#ComponenteRenomeardocumentosepastas-Telaexibidaaochamarocomponente)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos da plataforma que desejam utilizar o componente **Renomear documento**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\n- Conhecer os conceitos dos componentes de negócio do TOTVS Fluig Plataforma, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Renomear documento\n\n---\n\nO componente **Renomear documento** tem como objetivo facilitar o processo de renomear documentos encapsulando todas as configurações básicas necessárias para essa atualização, restando para o desenvolvedor somente configurar o *plugin* e utilizar o *callback* para montar sua lógica de negócio.\n\n## Estrutura Básica" }, { "metadata": { "title": "Componente Renomear documentos e pastas", "source": "https://tdn.totvs.com/display/fluig/Componente+Renomear+documentos+e+pastas", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Renomear documentos e pastas.md" }, "content": "Componente Renomear documentos e pastas\n\n\n---\n\n**Estrutura básica do componente**\n\n```\nECMBC.renameDocument(config, callback);\n```\n\nComo pode-se notar na estrutura básica, o componente recebe basicamente dois parâmetros:\n\n- o primeiro, um objeto ***config*** com as configurações do componente;\n- e o segundo uma função ***callback*** contendo o erro e/ou o sucesso da atualização.\n\nO primeiro parâmetro espera um objeto contendo três atributos: ***id***, ***version*** e ***types***, onde ***types*** não é obrigatório e os demais sim.\n\n**Parâmetro config**\n\n```\nvar config - {\n\tid: 10, //id do documento a ser renomeado\n\tversion: 1000 //versão ATUAL do documento para atualização\n};\n```\n\nO segundo parâmetro espera uma função que recebe dois valores: ***error*** e ***data***.\n\n**Parâmetro callback**\n\n```\nfunction(error, data) {\n\tif(error) {\n\t\t//tratamento de erro...\n\t}\n\t\n\t//lógica do sucesso...\n}\n```\n\n## Utilização Básica\n\n---\n\n**minhawidget.js**\n\n```\nvar EcmDocumentUpdate = SuperWidget.extend({\n\n\tid: null,\n\tversion: null,\n\ttypes: null,\n\t\n\tbindings: {\n\t\tlocal: {\n\t\t\t'rename-document': ['click_renameDocument']\n\t\t}\n\t},\n\t\n\tinit: function() {\n\t\tthis.id = 10;\n\t\tthis.version = 1000;\n\t},\n\t\n\trenameDocument: function(el, ev) {\n\t\tvar that = this;\n\t\tECMBC.renameDocument({\n\t\t\tid: that.id,\n\t\t\tversion: that.version,\n\t\t\tvalue: that.value\n\t\t}, function(err, data) {\n\t\t\tif(err) {\n\t\t\t\treturn alert(err.responseText);\n\t\t\t}\n\t\t\t\n\t\t\tthat.someFunc(data);\n\t\t});\n\t},\n\t\n\tsomeFunc: function(data) {\n\t\t//Qualquer coisa com o retorno de sucesso...\n\t}\n});\n```\n\nNo [application.info](http://application.info) de seu *widget*, adicione o componente como dependência.\n\n**application.info**\n\n```\napplication.resource.component.1=ecm/renamedocument\n```\n\n## Tela exibida ao chamar o componente" }, { "metadata": { "title": "Componente Renomear documentos e pastas", "source": "https://tdn.totvs.com/display/fluig/Componente+Renomear+documentos+e+pastas", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Renomear documentos e pastas.md" }, "content": "Componente Renomear documentos e pastas\n\n\n![](..\\..\\..\\..\\images\\Renomear%20documento.JPG)\n\n**oculto**\n\n**Observação importante:** Liberar esses itens após a liberação do recurso. Alinhado com Anderson Graper.\n\nLiberar essa documentação também: \n\nEstrutura Básica\n\n---\n\n**Estrutura básica do componente**\n\n```\nECMBC.renameDocument(config, callback);\n```\n\nComo pode-se notar na estrutura básica, o componente recebe basicamente dois parâmetros:\n\n- o primeiro, um objeto ***config*** com as configurações do componente;\n- e o segundo uma função ***callback*** contendo o erro e/ou o sucesso da atualização.\n\nO primeiro parâmetro espera um objeto contendo três atributos: ***id***, ***version*** e ***title***, onde ***title*** não é obrigatório e os demais sim.\n\n**Parâmetro config**\n\n```\nvar config - {\n\tid: 10, //id do documento a ser renomeado\n\tversion: 1000 //versão ATUAL do documento para atualização\n};\n```\n\nO segundo parâmetro espera uma função que recebe dois valores: ***error*** e ***data***.\n\n**Parâmetro callback**\n\n```\nfunction(error, data) {\n\tif(error) {\n\t\t//tratamento de erro...\n\t}\n\t\n\t//lógica do sucesso...\n}\n```\n\nUtilização Básica\n\n---\n\n**minhawidget.js**\n\n```\nvar EcmDocumentUpdate = SuperWidget.extend({\n\n\tid: null,\n\tversion: null,\n\ttitle: null,\n\t\n\tbindings: {\n\t\tlocal: {\n\t\t\t'rename-document': ['click_renameDocument']\n\t\t}\n\t},\n\t\n\tinit: function() {\n\t\tthis.id = 10;\n\t\tthis.version = 1000;\n\t\tthis.title = \"Título customizado\"\n\t},\n\t\n\trenameDocument: function(el, ev) {\n\t\tvar that = this;\n\t\tECMBC.renameDocument({\n\t\t\tid: that.id,\n\t\t\tversion: that.version,\n\t\t\ttitle: that.title\n\t\t}, function(err, data) {\n\t\t\tif(err) {\n\t\t\t\treturn alert(err.responseText);\n\t\t\t}\n\t\t\t\n\t\t\tthat.someFunc(data);\n\t\t});\n\t},\n\t\n\tsomeFunc: function(data) {\n\t\t//Qualquer coisa com o retorno de sucesso...\n\t}\n});\n```\n\nNo [application.info](http://application.info) de seu *widget*, adicione o componente como dependência.\n\n**application.info**\n\n```\napplication.resource.component.1=ecm/renamedocument\n```\n\nTela exibida ao chamar o componente\n\n![](..\\..\\..\\..\\images\\image2022-8-10_11-17-36.png)" }, { "metadata": { "title": "Componente Resposta de formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185758540", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Resposta de formulário.md" }, "content": "Componente Resposta de formulário\n\n\n# Índice\n\n- 1 [Objetivo](#ComponenteRespostadeformulário-Objetivo)\n- 2 [Pré-requisitos](#ComponenteRespostadeformulário-Pré-requisitos)\n- 3 [Resposta de formulário](#ComponenteRespostadeformulário-Respostadeformulário)\n - 3.1 [Estrutura Básica](#ComponenteRespostadeformulário-EstruturaBásica)\n - 3.2 [Utilização Básica](#ComponenteRespostadeformulário-UtilizaçãoBásica)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos da plataforma que desejam utilizar o componente **Resposta de formulário**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\nConhecer os conceitos dos componentes de negócio do TOTVS Fluig Plataforma, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Resposta de formulário\n\n---\n\nO componente **Resposta de formulário** tem como objetivo facilitar o processo de resposta de formulário, encapsulando todas as configurações básicas necessárias para a resposta de formulário e permitindo sua resposta em qualquer parte da plataforma sem perder a navegação atual, restando para o desenvolvedor somente configurar o *plugin*.\n\n## Estrutura Básica\n\n---\n\nA seguir é apresentada a estrutura básica do componente:\n\n**Estrutura básica do componente**\n\n```\nSOCIALBC.openAnswerForm(formId);\n```\n\nO componente recebe um parâmetro, o id do formulário no ECM.\n\nO parâmetro espera uma *string*.\n\n**Parâmetro config**\n\n```\nvar formId = '45';\n```\n\n## Utilização Básica" }, { "metadata": { "title": "Componente Resposta de formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185758540", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Resposta de formulário.md" }, "content": "Componente Resposta de formulário\n\n\n---\n\nA utilização básica do componente é apresentada a seguir:\n\n**minhawidget.js**\n\n```\nSOCIALBC.openAnswerForm('45');\n```\n\nNo [application.info](http://application.info) de seu *widget*, adicione o componente como dependência:\n\n**application.info**\n\n```\napplication.resource.component.1=social/socialformanswer\n```\n\n**Tela exibida ao chamar o componente**                            ![](..\\..\\..\\..\\images\\Screenshot%20from%202015-04-22%20095908.png)" }, { "metadata": { "title": "Componente Segurança de itens de aprendizado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=272407097", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Segurança de itens de aprendizado.md" }, "content": "Componente Segurança de itens de aprendizado\n\n\n# Índice\n\n- 1 [Objetivo](#ComponenteSegurançadeitensdeaprendizado-Objetivo)\n- 2 [Pré-requisitos](#ComponenteSegurançadeitensdeaprendizado-Pré-requisitos)\n- 3 [Segurança de itens de aprendizado](#ComponenteSegurançadeitensdeaprendizado-Segurançadeitensdeaprendizado)\n - 3.1 [Utilização básica](#ComponenteSegurançadeitensdeaprendizado-Utilizaçãobásica)\n - 3.2 [Métodos disponíveis](#ComponenteSegurançadeitensdeaprendizado-Métodosdisponíveis)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos do TOTVS Fluig Plataforma que desejam utilizar o componente **Segurança de itens de aprendizado**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\nConhecer os conceitos dos componentes de negócio da plataforma TOTVS Fluig, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Segurança de itens de aprendizado\n\n---\n\nO componente **Segurança de itens de aprendizado** tem como objetivo facilitar e padronizar a implementação da segurança dos itens de aprendizado em *widgets*.\n\n## Utilização básica" }, { "metadata": { "title": "Componente Segurança de itens de aprendizado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=272407097", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Segurança de itens de aprendizado.md" }, "content": "Componente Segurança de itens de aprendizado\n\n\n---\n\nPara habilitar o componente de seleção de usuário no seu *widget*, adicione a seguinte propriedade no [application.info](../../../Recurso de Páginas e Widgets (WCM).md)/Estrutura de páginas/Arquivo application.info.md) do *widget*:\n\n```\n application.resource.component.1=lms/elearningsecurity\n```\n\nO componente possui os parâmetros:\n\n- **containerId**: Id do elemento HTML que receberá o contêiner do componente de segurança (obrigatório);\n- **itemId**: Id do item do catálogo para carregar as definições de segurança (opcional);\n- **showRadioButtons: *true***para exibir os *radio buttons*referentes a configuração de herança do item, ***false***para não exibir (opcional, valor padrão é ***true***);\n- **itemType**: tipo de item do catálogo para que, quando for informado o código do item (itemId), traga as definições de segurança corretas (obrigatório).\n\nValores disponíveis para o parâmetro itemType\n\n- 'CatalogItem' para itens do catálogo de treinamentos e trilhas (pasta, treinamento, trilha e *link*);\n- 'DisciplineItem' para itens do catálogo de disciplinas e turmas (pasta, disciplina e *link*);\n- 'DisciplineClass' para itens do catálogo de disciplinas e turmas (turma e turma modelo);\n- 'AssessmentCatalogItem' para itens do catálogo de tópicos e questões (tópicos e questões).\n\nA utilização deste componente pode ser feita da seguinte maneira:\n\n```\nLMSBC.elearningsecurity(\n\t{\t\n\t\tcontainerId: '#elearning-security', \n\t\titemType:'CatalogItem'\n\t}, \n\tfunctionErrorPermissionsDataTable, \n\tfunctionErrorRestrictionsDataTable,\n\tfunctionErrorPartyDataTable, \n\tfunctionErrorPartyModal\n);\n \nExemplo:\n \n\n \nvar MyWidget = SuperWidget.extend({\n init: function() {},\n  \n\tbuildElearningSecurity: function() {\n \tif (!this.elearningSecurity) {\n\t\t\tvar options = {\n\t\t\t\tcontainerId: '#elearning-security',\n\t\t\t\titemType:'CatalogItem'\n\t\t\t};\n\t\t\tthis.elearningSecurity = LMSBC.elearningsecurity(options, this.cbErrorPermissionsDataTable());\n\t\t} \n },\n \n\tcbErrorPermissionsDataTable: function(err) {\n\t\treturn function e(err) {\n\t\t\t FLUIGC.toast({\n\t message: 'Ocorreu um erro ao carregar os dados de permissão',\n\t type: 'danger'\n\t });\n\t\t}\n\t}\n});\n```" }, { "metadata": { "title": "Componente Segurança de itens de aprendizado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=272407097", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Segurança de itens de aprendizado.md" }, "content": "Componente Segurança de itens de aprendizado\n\n## Métodos disponíveis\n\n---\n\nOs métodos disponíveis para utilização são:\n\n**.getSelectRadio(); - Retorna o valor do botão *radio* selecionado contendo o tipo de herança de segurança**\n\n**getSelectRadio()**\n\n```\ninstanceElearningSecurity.getSelectRadio();\n```\n\n**.getPermissions(); - Retorna todas as permissões do item (exibidas em tela e salvas no banco de dados)**\n\n**getPermissions()**\n\n```\ninstanceElearningSecurity.getPermissions();\n```\n\n**.getRestrictions(); - Retorna todas as restrições do item (exibidas em tela e salvas no banco de dados)**\n\n**getRestrictions()**\n\n```\ninstanceElearningSecurity.getRestrictions();\n```\n\n**Tela exibida ao executar o componente**\n\n![](..\\..\\..\\..\\images\\componente.PNG)\n\nImportante!\n\nA partir da atualização **[1.6.5-190219](http://tdn.totvs.com/pages/viewpage.action?pageId=442961412#Atualiza%C3%A7%C3%B5es(1.6.5)-190219)**, o **LMS** não faz mais parte da plataforma para **novas instalações**.\n\nMas, não se preocupe: se você adquiriu a plataforma com o **LMS incluso**, entre em contato com o [Suporte Fluig](https://suporte.fluig.com/) para que você consiga utiliza-lo normalmente – mesmo após a atualização **1.6.5-190219**. Se você não lembra se o LMS está incluso ou não no seu pacote, consulte sua proposta comercial ou entre em contato com o seu ESN." }, { "metadata": { "title": "Componente Seleção de comunidades", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=189309230", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Seleção de comunidades.md" }, "content": "Componente Seleção de comunidades\n\n\n# Índice\n\n- 1 [Objetivo](#ComponenteSeleçãodecomunidades-Objetivo)\n- 2 [Pré-requisitos](#ComponenteSeleçãodecomunidades-Pré-requisitos)\n- 3 [Seleção de comunidades](#ComponenteSeleçãodecomunidades-Seleçãodecomunidades)\n - 3.1 [Estrutura Básica](#ComponenteSeleçãodecomunidades-EstruturaBásica)\n - 3.2 [Utilização Básica](#ComponenteSeleçãodecomunidades-UtilizaçãoBásica)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos do fluig que desejam utilizar o componente **Seleção de comunidades** para recuperar a comunidade desejada e utilizá-la em seu componente ou *widget*. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\nConhecer os conceitos dos componentes de negócio do fluig, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Seleção de comunidades\n\n---\n\nO componente **Seleção de comunidades** tem como objetivo facilitar a etapa de seleção de uma ou mais comunidades, encapsulando todas as configurações básicas necessárias para essa operação, restando para o desenvolvedor somente configurar o *plugin* e utilizar o *callback* para montar sua lógica de negócio.\n\n## Estrutura Básica" }, { "metadata": { "title": "Componente Seleção de comunidades", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=189309230", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Seleção de comunidades.md" }, "content": "Componente Seleção de comunidades\n\n\n---\n\nA seguir é apresentada a estrutura básica do componente:\n\n**Estrutura básica do componente**\n\n```\nSOCIALBC.selectCommunity(config, callback);\n```\n\nO componente recebe dois parâmetros:\n\n- o primeiro, um objeto ***config*** com as configurações do componente;\n- e o segundo, uma função ***callback*** contendo o erro e/ou o sucesso da seleção.\n\nO primeiro parâmetro espera um objeto contendo dois atributos: ***multiselect***, e ***required***, sendo os dois opcionais*.*\n\n**Parâmetro config**\n\n```\nvar config - {\n\tmultiselect: true, //opção que determina se é possível a seleção de uma ou mais comunidades do componente. - Valor default: true\n\trequired: true //opção que determina se a seleção de comunidade é uma etapa obrigatório no fluxo. - Valor default: false\n};\n```\n\nO segundo parâmetro espera uma função que recebe dois valores: ***error*** e ***data***.\n\n**Parâmetro callback**\n\n```\nfunction(error, data) {\n\tif(error) {\n\t\t//tratamento de erro...\n\t}\n\t\n\t//lógica do sucesso...\n}\n```\n\n## Utilização Básica\n\n---\n\nA utilização básica do componente é apresentada a seguir:\n\n**minhawidget.js**\n\n```\nvar GlobalSearch = SuperWidget.extend({\n\n\talias: null,\n\t\n\tbindings: {\n\t\tlocal: {\n\t\t\t'select-comunity': ['click_selectCommunity']\n\t\t}\n\t},\n\t\n\tinit: function() {\n\t\t//init essential params\n\t},\n\t\n\tselectCommunity: function(el, ev) {\n\t\tvar that = this;\n\n\t\tSOCIALBC.selectCommunity({\n\t\t\tmultiselect : false,\n\t\t\trequired : true\n\t\t}, function(data) {\n\t\t\tthat.someFunc(data);\n\t\t});\n\t},\n\n\tsomeFunc: function(data) {\n\t\t//Qualquer coisa com o retorno de sucesso...\n\t}\n});\n```\n\nNo [application.info](http://application.info/) de seu *widget*, adicione o componente como dependência:\n\n**application.info**\n\n```\napplication.resource.component.1=social/selectcommunity\n```\n\n**Tela exibida ao chamar o componente**\n\n![](..\\..\\..\\..\\images\\print-select-community.png)" }, { "metadata": { "title": "Componente Seleção de grupos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185739566", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Seleção de grupos.md" }, "content": "Componente Seleção de grupos\n\n\n# Índice\n\n- 1 [Objetivo](#ComponenteSeleçãodegrupos-Objetivo)\n- 2 [Pré-requisitos](#ComponenteSeleçãodegrupos-Pré-requisitos)\n- 3 [Seleção de grupos](#ComponenteSeleçãodegrupos-Seleçãodegrupos)\n - 3.1 [Utilização básica](#ComponenteSeleçãodegrupos-Utilizaçãobásica)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos do TOTVS Fluig Plataforma que desejam utilizar o componente **Seleção de grupos**. O objetivo é apresentar o seu funcionamento e o detalhamento dos parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\nConhecer os conceitos dos componentes de negócio da plataforma TOTVS Fluig, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Seleção de grupos\n\n---\n\nPara habilitar o componente **Seleção de grupos** no *widget*, adicione a seguinte propriedade no [application.info](../../../Recurso de Páginas e Widgets (WCM).md)/Estrutura de páginas/Arquivo application.info.md) do *widget*:\n\n```\n application.resource.component.3=wcm/selectgroup\n```\n\nO componente possui as opções:\n\n- **multiselect**: ***true***para que seja possível selecionar mais de um registro; ***false***para que seja possível selecionar apenas um registro;\n- **required**: ***true***para que seja possível avançar apenas se algum registro estiver selecionado; ***false***para obrigar a selecionar algum grupo.\n\n## Utilização básica" }, { "metadata": { "title": "Componente Seleção de grupos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185739566", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Seleção de grupos.md" }, "content": "Componente Seleção de grupos\n\n\n---\n\nA utilização deste componente pode ser feita da seguinte maneira:\n\n```\nWCMBC.selectGroup(\n\t{\t\n\t\tmultiselect: true/false, \n\t\trequired:true/false\n\t}, \n\tfuncaoCallbackSucesso, \n\tfuncaoCallbackCancelar\n);\n \nExemplo:\n \nvar MyWidget = SuperWidget.extend({\n init: function() {\n },\n\t\n\t//código fonte da widget omitido\t\n  \n\tselectUsers: function(htmlElement, event) {\n \tvar options = {multiselect: false, required: true};\n \tWCMBC.selectGroup(options, function(data){\n \t\tFLUIGC.toast({\n \t title: 'Grupo selecionado: ' + data[0].description,\n \t message: data[0].description,\n \t type: 'success'\n \t });\n \t\tconsole.log(data);\n \t}, function() {\n \t\tFLUIGC.toast({\n \t title: 'Cancelado!',\n \t message: null,\n \t type: 'success'\n \t });\n \t});\n }\n});\n```\n\n**Tela exibida ao executar o componente**\n\n![](..\\..\\..\\..\\images\\selecao-grupo.png)" }, { "metadata": { "title": "Componente Seleção de papéis", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185739563", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Seleção de papéis.md" }, "content": "Componente Seleção de papéis\n\n\n# Índice\n\n- 1 [Objetivo](#ComponenteSeleçãodepapéis-Objetivo)\n- 2 [Pré-requisitos](#ComponenteSeleçãodepapéis-Pré-requisitos)\n- 3 [Seleção de papéis](#ComponenteSeleçãodepapéis-Seleçãodepapéis)\n - 3.1 [Utilização básica](#ComponenteSeleçãodepapéis-Utilizaçãobásica)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos do TOTVS Fluig Plataforma que desejam utilizar o componente **Seleção de papéis**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\nConhecer os conceitos dos componentes de negócio da plataforma TOTVS Fluig, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Seleção de papéis\n\n---\n\nPara habilitar o componente **Seleção de papéis** no seu *widget*, adicione a seguinte propriedade no [application.info](../../../Recurso de Páginas e Widgets (WCM).md)/Estrutura de páginas/Arquivo application.info.md) do *widget*:\n\n```\napplication.resource.component.3=wcm/selectrole\n```\n\nO componente possui as opções:\n\n- **multiselect**: ***true***para que seja possível selecionar mais de um registro; ***false***para que seja possível selecionar apenas um registro;\n- **required**: ***true***para que seja possível avançar apenas se algum registro estiver selecionado; ***false***para obrigar a selecionar algum papel.\n\n## Utilização básica" }, { "metadata": { "title": "Componente Seleção de papéis", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185739563", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Seleção de papéis.md" }, "content": "Componente Seleção de papéis\n\n\n---\n\nA utilização deste componente pode ser feita da seguinte maneira:\n\n```\nWCMBC.selectRole(\n\t{\t\n\t\tmultiselect: true/false, \n\t\trequired:true/false\n\t}, \n\tfunctionfuncaoCallbackSucesso, \n\tfuncaoCallbackCancelar\n);\n \nExemplo:\n \n\n \nvar MyWidget = SuperWidget.extend({\n init: function() {\n },\n\t\n\t//código fonte da widget omitido\t\n  \n\tselectUsers: function(htmlElement, event) {\n \tvar options = {multiselect: true, required: true};\n \tWCMBC.selectRole(options, function(data){\n \t\tFLUIGC.toast({\n \t title: 'Selecionados: ' + data[0].description,\n \t message: data[0].description,\n \t type: 'success'\n \t });\n \t\tconsole.log(data);\n \t}, function() {\n \t\tFLUIGC.toast({\n \t title: 'Cancelado!',\n \t message: null,\n \t type: 'success'\n \t });\n \t});\n }\n});\n```\n\n**Tela exibida ao executar o componente**\n\n![](..\\..\\..\\..\\images\\selecao-papel.png)" }, { "metadata": { "title": "Componente Seleção de sub grupos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185739570", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Seleção de sub grupos.md" }, "content": "Componente Seleção de sub grupos\n\n\n# Índice\n\n- 1 [Objetivo](#ComponenteSeleçãodesubgrupos-Objetivo)\n- 2 [Pré-requisitos](#ComponenteSeleçãodesubgrupos-Pré-requisitos)\n- 3 [Seleção de sub grupos](#ComponenteSeleçãodesubgrupos-Seleçãodesubgrupos)\n - 3.1 [Utilização básica](#ComponenteSeleçãodesubgrupos-Utilizaçãobásica)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos do TOTVS Fluig Plataforma que desejam utilizar o componente **Seleção de sub grupos**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\nConhecer os conceitos dos componentes de negócio da plataforma TOTVS Fluig, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Seleção de sub grupos\n\n---\n\nPara habilitar o componente **Seleção de sub grupos** no seu *widget*, adicione a seguinte propriedade no [application.info](../../../Recurso de Páginas e Widgets (WCM).md)/Estrutura de páginas/Arquivo application.info.md) do *widget*:\n\n```\napplication.resource.component.3=wcm/selectgroup\n```\n\nO componente possui as opções:\n\n- **group:**grupo pai dos sub grupos a serem selecionados;\n- **multiselect**: ***true***para que seja possível selecionar mais de um registro; ***false***para que seja possível selecionar apenas um registro.\n- **required**: ***true***para que seja possível avançar apenas se algum registro estiver selecionado; ***false***para obrigar a selecionar algum sub grupo.\n\n## Utilização básica" }, { "metadata": { "title": "Componente Seleção de sub grupos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185739570", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Seleção de sub grupos.md" }, "content": "Componente Seleção de sub grupos\n\n\n---\n\nA utilização deste componente pode ser feita da seguinte maneira:\n\n```\nWCMBC.selectUser(\n\t{\t\n\t\tgroup: \"codigo-do-grupo\"\n\t\tmultiselect: true/false, \n\t\trequired:true/false\n\t}, \n\tfunctionfuncaoCallbackSucesso, \n\tfuncaoCallbackCancelar\n);\n \nExemplo:\n \n\n \nvar MyWidget = SuperWidget.extend({\n init: function() {\n },\n\t\n\t//código fonte da widget omitido\t\n  \n\tselectUsers: function(htmlElement, event) {\n \tvar options = {group: \"Administradores\", multiselect: true, required: true};\n \tWCMBC.selectUser(options, function(data){\n \t\tFLUIGC.toast({\n \t title: 'Selecionados: ' + data[0].description,\n \t message: data[0].description,\n \t type: 'success'\n \t });\n \t\tconsole.log(data);\n \t}, function() {\n \t\tFLUIGC.toast({\n \t title: 'Cancelado!',\n \t message: null,\n \t type: 'success'\n \t });\n \t});\n }\n});\n```\n\n**Tela exibida ao executar o componente**\n\n![](..\\..\\..\\..\\images\\selecao-grupo.png)" }, { "metadata": { "title": "Componente Seleção de usuários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185739389", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Seleção de usuários.md" }, "content": "Componente Seleção de usuários\n\n\n# Índice\n\n- 1 [Objetivo](#ComponenteSeleçãodeusuários-Objetivo)\n- 2 [Pré-requisitos](#ComponenteSeleçãodeusuários-Pré-requisitos)\n- 3 [Seleção de usuários](#ComponenteSeleçãodeusuários-Seleçãodeusuários)\n - 3.1 [Utilização básica](#ComponenteSeleçãodeusuários-Utilizaçãobásica)\n\n# Objetivo\n\n---\n\nEste guia é destinado aos desenvolvedores internos e externos do TOTVS Fluig Plataforma que desejam utilizar o componente **Seleção de usuários**. O objetivo é apresentar o seu funcionamento e o detalhamento de todos os parâmetros de configuração.\n\n# Pré-requisitos\n\n---\n\nConhecer os conceitos dos componentes de negócio da plataforma TOTVS Fluig, disponíveis na página [Componentes de Negócio](http://tdn.totvs.com/pages/viewpage.action?pageId=160104507).\n\n# Seleção de usuários\n\n---\n\nO componente **Seleção de usuários** oferece a possibilidade do usuário selecionar um ou mais usuários para alguma necessidade dentro de seu componente ou *widget*.\n\n## Utilização básica" }, { "metadata": { "title": "Componente Seleção de usuários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185739389", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Desenvolvimento de PáginasWidgets (WCM)\\Componentes de Negócio\\Componente Seleção de usuários.md" }, "content": "Componente Seleção de usuários\n\n\n---\n\nPara habilitar o componente de seleção de usuário no seu *widget*, adicione a seguinte propriedade no [application.info](../../../Recurso de Páginas e Widgets (WCM).md)/Estrutura de páginas/Arquivo application.info.md) do *widget*:\n\n```\n application.resource.component.1=wcm/selectuser\n```\n\nO componente possui as opções:\n\n- **multiselect**: ***true***para que seja possível selecionar mais de um registro; ***false***para que seja possível selecionar apenas um registro;\n\n- **required**: ***true***para que seja possível avançar apenas se algum registro estiver selecionado; ***false***para obrigar a selecionar algum usuário.\n\n- **onlyActiveUsers**: ***true*** para que apenas usuários ativos sejam apresentados; ***false*** para que todos os usuários cadastrados sejam apresentados. O padrão é *false*, portanto se este parâmetro não for informado, todos os usuários serão listados.\n\nA utilização deste componente pode ser feita da seguinte maneira:\n\n```\nWCMBC.selectUser(\n\t{\t\n\t\tmultiselect:true/false, \n\t\trequired:true/false\n\t\tonlyActiveUsers:true/false\n\t}, \n\tfunctionfuncaoCallbackSucesso, \n\tfuncaoCallbackCancelar\n);\n \n\nExemplo:\n \nvar MyWidget = SuperWidget.extend({\n init: function() {},\n  \n\tselectUsers: function(htmlElement, event) {\n \tvar options = {multiselect: true, required: true, onlyActiveUsers:true};\n \tWCMBC.selectUser(options, function(data){\n \t\tFLUIGC.toast({\n \t title: 'Usuários selecionados: ' + data.length,\n \t message: data[0].login,\n \t type: 'success'\n \t });\n \t\tconsole.log(data);\n \t}, function() {\n \t\tFLUIGC.toast({\n \t title: 'Cancelar',\n \t message: 'Usuário cancelou a seleção',\n \t type: 'success'\n \t });\n \t});\n }\n});\n```\n\n**Tela exibida ao executar o componente**\n\n![](..\\..\\..\\..\\images\\zoom-usuario.png)" }, { "metadata": { "title": "Desenvolvimento de Processos", "source": "https://tdn.totvs.com/display/fluig/Desenvolvimento+de+Processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos.md" }, "content": "Desenvolvimento de Processos\n\n\n---\n\nO Fluig BPM é gerencia os processos de negócios e permite automatizar fluxos de trabalho, otimizar a eficiência das operações e aumentar a produtividade da empresa. \n\nNeste material serão encontrados detalhes técnicos de como personalizar o seu processo utilizando codificação. Caso necessite da documentação de passo a passo sobre como configurar processos, ela pode ser acessada **[aqui](https://tdn.totvs.com/x/UfHuDQ)**.\n\nO Fluig permite que desenvolvedores criem suas próprias rotinas para criar lista de dados ([Datasets](../Desenvolvimento de Datasets/Acessando Datasets.md)), formulários, processos e gerenciem o desenvolvimento de [eventos do Fluig](../Desenvolvimento de Eventos.md).\n\n## [📃 Introdução ao desenvolvimento de processos BPM](Desenvolvimento de Processos/Introdução ao desenvolvimento de processos BPM.md)\n\nUma introdução as capacidades dos processos no TOTVS Fluig.\n\n## [📖 Glossário do desenvolvimento de processos BPM](Desenvolvimento de Processos/Glossário do desenvolvimento de processos BPM.md)\n\nUm resumo dos termos que usamos durante a documentação para garantir o alinhamento e entendimento do que está sendo descrito" }, { "metadata": { "title": "Formulários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745133369", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Formulários.md" }, "content": "Formulários\n\n\nO formulário no Fluig é uma das principais ferramentas para coleta e gestão de informações dentro da plataforma. Ele permite que empresas capturem dados de maneira personalizada, adaptando-se às necessidades específicas de cada processo. Com a flexibilidade de criar tanto formulários simples quanto complexos, é possível controlar e validar informações, facilitando o fluxo de trabalho e a automação de processos.\n\nA importância do formulário no Fluig vai além da coleta de dados. Ele se integra perfeitamente com os recursos da plataforma, como aprovação de tarefas, regras de negócio e workflows. Com isso, as organizações conseguem otimizar seus processos internos, garantindo maior eficiência e assertividade na tomada de decisões.\n\nUm dos recursos mais poderosos dos formulários no Fluig é a capacidade de gerar automaticamente datasets a partir dos dados coletados. Isso permite que as informações sejam facilmente consultadas e reutilizadas em outros processos, relatórios ou integrações, sem a necessidade de desenvolver consultas complexas ou estruturas adicionais. A geração automática de datasets oferece agilidade e praticidade, garantindo que os dados estejam sempre disponíveis para uso em tempo real, simplificando o desenvolvimento de soluções personalizadas e a integração com outros sistemas.\n\n# [Tipos de formulários](Formulários/Tipos de formulários.md)\n\nComo criar e utilizar formulários simples (sem codificação) e formulários avançados, permitindo desde soluções intuitivas sem programação até personalizações complexas para atender necessidades específicas." }, { "metadata": { "title": "loggedUser", "source": "https://tdn.totvs.com/display/fluig/loggedUser", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\loggedUser.md" }, "content": "loggedUser\n\n\n**loggedUser** é um objeto do tipo [UserVO](Objetos de entrada e retorno/UserVO.md) disponibilizada pela plataforma Fluig em todas os pontos de personalização e permite obter informações sobre o usuário logado.\n\n# Descrição\n\nCom ele o desenvolvedor pode validar, imprimir ou utilizar de outras maneiras os dados do usuário logado.\n\nEm movimentação solicitações quando um usuário está substituindo outro, este é o usuário que está **substituindo**. O usuário que está sendo substituído pode ser obtido através do objeto [currentUser](Objetos e utilitários/currentUser.md). No caso de personificação, este objeto é referente ao usuário que está sendo personificado e não do usuário personificador.\n\n# Sintaxe\n\n```\nloggedUser\n```\n\n# Exemplos de uso\n\n## Imprimir os dados do usuário logado\n\n```\nconsole.log(\"O nome do usuário logado é \" + loggedUser.fullName + \" e a matrícula é \" + loggedUser.userCode);\n```\n\n## Identificar se o usuário logado é diferente do usuário atual\n\n```\nif (loggedUser.id == currentUser.id) {\n\tconsole.log(\"O usuário logado é o usuário atual\");\n} else {\n \tconsole.log(\"O usuário logado é diferente do usuário atual\");\n}\n```\n\n# Compatibilidade\n\nEste objeto só está disponível a partir da versão 1.8.2." }, { "metadata": { "title": "Objetos de entrada e retorno", "source": "https://tdn.totvs.com/display/fluig/Objetos+de+entrada+e+retorno", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos de entrada e retorno.md" }, "content": "Objetos de entrada e retorno\n\n\nAlguns utilitários exigem objetos mais complexos ou retornam estruturas com múltiplos atributos. Abaixo, listaremos esses objetos.\n\n# [MovementResultVO](Objetos de entrada e retorno/MovementResultVO.md)\n\nObjeto com alguns dados de uma movimentação ou inicialização de processos, usado no [processes.start](Processes/processes.start.md)\n\n# [UserVO](Objetos de entrada e retorno/UserVO.md)\n\nObjeto com dados do usuário como nome, login, matrícula e e-mail." }, { "metadata": { "title": "Objetos depreciados", "source": "https://tdn.totvs.com/display/fluig/Objetos+depreciados", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos depreciados.md" }, "content": "Objetos depreciados\n\n\nO Fluig está em constante evolução e algumas mudanças acabam tornando alguns objetos obsoletos. Como estas informações ainda são importantes para projetos anteriores as mudanças, aqui são listados os objetos já depreciados.\n\n# [WorkflowSaveAndSendResultVO](Objetos depreciados/WorkflowSaveAndSendResultVO - Depreciado.md)\n\nObjeto de retorno de uma inicialização de solicitação via hAPI.startProcess" }, { "metadata": { "title": "Objetos e utilitários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745138789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários.md" }, "content": "Objetos e utilitários\n\n\n---\n\nO Fluig possuí vários objetos utilitários que recebem valores específicos e retornam outros valores e objetos. Nesta documentação listaremos cada um deles, em cada link pode ser conferido os detalhes de utilização.\n\n## [console](Objetos e utilitários/console.md)\n\nObjeto usando para imprimir mensagens no console do servidor e no arquivo de log.\n\n## [currentUser](Objetos e utilitários/currentUser.md)\n\nObjeto contendo informações sobre o usuário atual da execução do script.\n\n## [loggedUser](loggedUser.md)\n\nObjeto contendo informações sobre o usuário logado no momento da execução do script. Este usuário pode ser diferente do [currentUser](Objetos e utilitários/currentUser.md) como em movimentações de solicitações como substituto.\n\n## [tenant](tenant.md)\n\nObjeto contendo o código da empresa, podendo usar essa informação para ser enviado como parâmetro em alguns métodos e integraçõ[es.al](http://es.al) e diversas outras funções.\n\n## [processes](https://tdn.totvs.com/display/fluig/processes)\n\nO objeto responsável por permitir iniciar solicitações via outra solicitação, dataset, formulário ou evento global.\n\n## [hAPI (versão atualizada)](Objetos e utilitários/hAPI (nova).md).md)\n\nA hAPI foi o objeto mais importante nos eventos de processo, permitindo acessado aos dados de formulário, informações da solicitação atual.\n\n## [Objetos de entrada e retorno](https://tdn.totvs.com/display/fluig/Objetos+de+Entrada+e+Retorno)\n\nDocumentação sobre objetos usados como entrada ou retorno nos utilitários.\n\n## [Objetos depreciados](https://tdn.totvs.com/display/fluig/Objetos+Depreciados)\n\nDocumentação sobre objetos que não são mais recomendados o uso no Fluig mas que podem estar presentes em projetos anteriores às mudanças.\n\n## [Data-zoom](Objetos e utilitários/Data-zoom.md)\n\nAtributo do campo pesquisa do formulário, ou seja, o campo tipo \"zoom\".\n\n## [Formcontroller](Objetos e utilitários/FormController.md)" }, { "metadata": { "title": "Objetos e utilitários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745138789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários.md" }, "content": "Objetos e utilitários\n\n\nObjeto enviado como parâmetro para todas as funções de personalização do formulário.\n\n## [WorkflowSaveAndSendResultVO](Objetos e utilitários/WorkflowSaveAndSendResultVO.md)\n\nObjeto de retorno do método de iniciar solicitação." }, { "metadata": { "title": "Processes", "source": "https://tdn.totvs.com/display/fluig/Processes", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Processes.md" }, "content": "Processes\n\n\n# Descrição\n\nCom ele, o desenvolvedor poderá iniciar solicitações de um processo a partir de um dataset, uma solicitação, formulário ou mesmo em evento global do fluig.\n\n**processes** é um objeto disponibilizado pela plataforma Fluig em todas os pontos de personalização e permite iniciar solicitações de um determinado processo.\n\n# Sintaxe\n\n```\nprocesses.get(processId)\n```\n\n## Parâmetros\n\n### processId\n\nUma string [case sensitive](https://tdn.totvs.com/pages/viewpage.action?pageId=781872742) com o código do processo que irá ser manipulado\n\n# Métodos da instância\n\n[MovementResultVO start(properties)](Processes/processes.start.md)\n\nInicia uma solicitação do processo *processId*, conforme os *properties* enviados*.*\n\n# Compatibilidade\n\nEste objeto só está disponível a partir da versão 1.8.2." }, { "metadata": { "title": "tenant", "source": "https://tdn.totvs.com/display/fluig/tenant", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\tenant.md" }, "content": "tenant\n\n\n**tenant** é um objeto disponibilizado pela plataforma Fluig em todas os pontos de personalização e permite obter informações sobre o empresa\n\n# Descrição\n\nCom ele o desenvolvedor pode obter o código da empresa atual e pode ser usado para ser enviado como parâmetro em alguns métodos e integrações.\n\n# Sintaxe\n\n```\nconsole.log(\"O código da empresa é \" + tenant.id);\n```\n\n# Compatibilidade\n\nEste objeto só está disponível a partir da versão 2.0." }, { "metadata": { "title": "Glossário do desenvolvimento de processos BPM", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745139901", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Glossário do desenvolvimento de processos BPM.md" }, "content": "Glossário do desenvolvimento de processos BPM\n\n\n---\n\n- 1 [Termos Comuns](#GlossáriododesenvolvimentodeprocessosBPM-TermosComuns)\n - 1.1 [Processo (Workflow)](#GlossáriododesenvolvimentodeprocessosBPM-Processo(Workflow))\n - 1.2 [Solicitação](#GlossáriododesenvolvimentodeprocessosBPM-Solicitação)\n - 1.3 [Formulário](#GlossáriododesenvolvimentodeprocessosBPM-Formulário)\n - 1.4 [Registro de formulário](#GlossáriododesenvolvimentodeprocessosBPM-Registrodeformulário)\n - 1.5 [Dataset](#GlossáriododesenvolvimentodeprocessosBPM-Dataset)\n - 1.6 [Tarefa](#GlossáriododesenvolvimentodeprocessosBPM-Tarefa)\n - 1.7 [Thread](#GlossáriododesenvolvimentodeprocessosBPM-Thread)\n - 1.8 [Mecanismo de atribuição](#GlossáriododesenvolvimentodeprocessosBPM-Mecanismodeatribuição)\n - 1.9 [Personalização](#GlossáriododesenvolvimentodeprocessosBPM-Personalização)\n- 2 [Termos técnicos](#GlossáriododesenvolvimentodeprocessosBPM-Termostécnicos)\n - 2.1 [Case Sensitive / Case Insensitive](#GlossáriododesenvolvimentodeprocessosBPM-CaseSensitive/CaseInsensitive)\n\nQuando se trata de gerenciamento de processos de negócios, é importante estar familiarizado com alguns termos-chave. Neste glossário, explicaremos brevemente alguns dos termos que serão usados ​​na documentação relacionada ao Fluig BPM. Para os termos que precisam de uma explicação mais específica, criamos uma página que pode ser acessada clicando no termo.\n\n## Termos Comuns\n\n### **Processo (Workflow)**\n\nÉ um conjunto de atividades que devem ser executadas de forma sequencial para atingir um objetivo específico (Saiba mais). \n\n### **Solicitação**\n\nÉ a instância de um processo, ou seja, é cada utilização do processo (Saiba mais).\n\n### **Formulário**\n\nÉ uma ferramenta usada para a entrada de informações pelos usuários. Ele pode estar associado a um processo ou mesmo ser um pré-cadastro de fornecedores, clientes ou outros conjuntos de dados que serão usados em outros formulários.\n\n### **Registro de formulário**" }, { "metadata": { "title": "Glossário do desenvolvimento de processos BPM", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745139901", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Glossário do desenvolvimento de processos BPM.md" }, "content": "Glossário do desenvolvimento de processos BPM\n\n\nCada preenchimento/resposta de formulário gera um novo documento que chamamos de Registro de Formulário.\n\n### **Dataset**\n\nÉ um conjunto de dados que podem ser utilizados por processos e formulários. Estes dados podem ser desde listas fixas onde os dados são criados um a um via programação, passando pelos registros de formulários do fluig, ou como ponto de contato com outros sistemas ou banco de dados permitindo inclusive o armazenamento dos dados para o uso sem que o tempo de resposta da integração atrase a movimentação da tarefa dos usuários..\n\n### **Tarefa**\n\nÉ uma atividade específica que deve ser concluída durante a solicitação.\n\n### **[Thread](Glossário do desenvolvimento de processos BPM/Thread de Processo.md)**\n\nSequencial para o controle de paralelismo, ou seja, quando um processo possuí um gateway do tipo fork ou inclusivo.\n\n### **Mecanismo de atribuição**\n\nÉ o processo pelo qual as tarefas são atribuídas a usuários específicos. O mecanismo de atribuição pode ser simples ou complexo, dependendo do processo.\n\n### **Personalização**\n\nÉ a ação de personalizar o Fluig BPM para atender às necessidades específicas da empresa. \n\n## Termos técnicos\n\n### **[Case Sensitive / Case Insensitive](Glossário do desenvolvimento de processos BPM/Case Sensitive Case Insensitive.md)**\n\nÉ a indicação se um método ou função faz a diferenciação entre letras maiúsculas e minúsculas." }, { "metadata": { "title": "Introdução ao desenvolvimento de processos BPM", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745133085", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Introdução ao desenvolvimento de processos BPM.md" }, "content": "Introdução ao desenvolvimento de processos BPM" }, { "metadata": { "title": "Introdução ao desenvolvimento de processos BPM", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745133085", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Introdução ao desenvolvimento de processos BPM.md" }, "content": "Introdução ao desenvolvimento de processos BPM\n\n\n---\n\nO Fluig BPM é uma plataforma de gerenciamento de processos de negócios que permite automatizar fluxos de trabalho, otimizar a eficiência das operações e aumentar a produtividade da empresa. \n\nUma das principais vantagens do TOTVS Fluig é que ele permite criar **processos simples sem codificação**. Por exemplo, criar um [formulário](../Formulários/Tipos de formulários/Formulários Sem Codificação.md) para entrada de dados, definir regras de anexo para determinar quando e quais os arquivos devem ser anexados a uma etapa do processo, criar gateways que permitem criar caminhos alternativos em um fluxo de trabalho com base nas informações inseridas pelo usuário, além de definir conjuntos de pessoas responsáveis por atividades específicas. \n\nPode-se também transformar automaticamente outros formulários em fontes de dados ([dataset](../../Desenvolvimento de Datasets.md)), permitindo a flexibilidade de criar conjuntos de dados que serão usados posteriormente.\n\nAlém disso, o TOTVS Fluig permite criar processos complexos com a criação de [formulários complexos](../Formulários/Tipos de formulários/Formulários avançados (hard-code).md)/Formulário avançado - Primeiros passos.md), leitura de dados de outros bancos de dados ou de serviços remotos, tanto em tempo real como atualizando os dados via agendamento e evitando que a lentidão de outros sistemas impactam na performance do seu processo. Ele também permite regras complexas para atribuição de usuários, bem como a liberdade para o desenvolvimento de condições avançadas na movimentação de cada etapa do processo.\n\nEm resumo, o Fluig BPM é uma ferramenta versátil que pode ser usada para automatizar processos simples ou complexos de negócios. Com a possibilidade de criar formulários sofisticados, ler dados de serviços remotos, definir regras complexas para a atribuição de usuários e desenvolver condições avançadas na movimentação de cada etapa do processo, é possível extrair o máximo da plataforma e aumentar a eficiência e produtividade da sua empresa. Nesta documentação, vamos explicar passo a passo como desenvolver processos complexos com o Fluig BPM, garantindo que sua empresa alcance o máximo potencial desta poderosa ferramenta de gerenciamento de processos." }, { "metadata": { "title": "Motor de personalização", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745133366", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Motor de personalização.md" }, "content": "Motor de personalização\n\n\nPara conhecer mais as características e entender como codificar ou pesquisar, é interessante falarmos sobre como funciona o nosso motor de personalização.\n\n# [Motor de personalização Rhino](Motor de personalização/Motor de personalização Rhino.md)\n\nO Fluig utiliza como motor de personalizações no servidor o Rhino, que é um interpretador JavaScript escrito em Java. É uma biblioteca open source que fornece um ambiente de tempo de execução JavaScript completo para desenvolvedores Java.\n\n# [Compatibilidade ECMA](Motor de personalização/Compatibilidade ECMA do Motor de personalização.md)\n\nO Rhino é compatível com a especificação ECMA 5, que introduziu várias melhorias na linguagem, incluindo suporte para programação orientada a objetos, estruturas de controle avançadas e novos métodos para manipulação de arrays e strings.\n\n# [Características da programação no Rhino](Motor de personalização/Características da programação no Rhino.md)\n\nExemplos para entender como trabalhar com objetos, mapas e listas no Rhino, seja no formato Java, seja no formato JavaScript." }, { "metadata": { "title": "Case Sensitive / Case Insensitive", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=754248018", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Glossário do desenvolvimento de processos BPM\\Case Sensitive Case Insensitive.md" }, "content": "Case Sensitive / Case Insensitive\n\n\n---\n\nO Fluig lida com múltiplos bancos de dados e sistemas operacionais, e foi escrito em linguagens de programação que diferenciam letras maiúsculas e minúsculas (*case*) por isso deve-se sempre ficar atendo ao *case* nas consultas e no desenvolvimento.\n\n# Case Sensitive\n\nPor padrão, considere sempre que a função ou método diferencia letras maiúsculas de letras minúsculas, ou seja, que é *case sensitive*  (sensível a maiúsculas/minúsculas). A função \"buscaDadoDoCampo\" não existe no fluig, mas para exemplificar o que é a diferenciação das letras:\n\n```\nvalue = buscaDadoDoCampo(\"codigoDoCliente\") // retorna o valor correto\nvalue = buscaDadoDoCampo(\"codigodocliente\") // retorna null\nvalue = buscaDadoDoCampo(\"CODIGODOCLIENTE\") // retorna null\n```\n\n# Case Insensitive\n\nQuando especificado na função que ela é *case insensitive*, é sinal que ela não faz diferenciação entre letras maiúsculas e minúsculas, ou seja, que é insensível a maiúsculas/minúsculas. Usando o mesmo exemplo anterior, da função imaginária \"buscaDadoDoCampo\", mas dessa vez considerando que ela **não** diferencia as letras:\n\n```\nvalue = buscaDadoDoCampo(\"codigoDoCliente\") // retorna o valor correto\nvalue = buscaDadoDoCampo(\"codigodocliente\") // retorna o valor correto\nvalue = buscaDadoDoCampo(\"CODIGODOCLIENTE\") // retorna o valor correto\n```" }, { "metadata": { "title": "Thread de Processo", "source": "https://tdn.totvs.com/display/fluig/Thread+de+Processo", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Glossário do desenvolvimento de processos BPM\\Thread de Processo.md" }, "content": "Thread de Processo\n\n\n---\n\nEm processos, usamos um sequencial que chamamos de thread para o controle de paralelismo, ou seja, quando um processo possuí um gateway do tipo fork ou inclusivo.\n\nToda solicitação começa com a thread zero e caso não possua nenhum dos gateways mencionados, todas as suas movimentações serão na thread zero até o final.\n\n| |\n| --- |\n| Imagem de um processo simples sem gateways mostrando que todas as atividades serão na thread zero |\n| Imagem de um processo simples sem gateways mostrando que todas as atividades serão na thread zero |\n\nPorém, quando entra em um fork ou inclusivo, todos os novos caminhos geram uma nova thread (1, 2, 3...). E ao se juntar novamente em um join, uma nova thread é criada, ou seja, uma vez iniciada uma nova thread, nunca mais a thread volta a ser zero.\n\n| |\n| --- |\n| Imagem de um processo com gateway paralelo mostrando que a cada novo caminho do fork gera uma nova thread e o join cria uma nova thread sem voltar para o zero |\n| Imagem de um processo com gateway paralelo mostrando que a cada novo caminho do fork gera uma nova thread e o join cria uma nova thread sem voltar para o zero |" }, { "metadata": { "title": "Características da programação no Rhino", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=757236193", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Motor de personalização\\Características da programação no Rhino.md" }, "content": "Características da programação no Rhino\n\n\n---\n\nEsta página não tem como objetivo ser um guia de como programar com Rhino ou mesmo como um \"aprenda a programar\", mas sim para listar algumas características interessantes que serão referenciadas em outros pontos da documentação. Se você ainda não tem experiência com o desenvolvimento no Rhino, recomendamos que deixe essa documentação para o futuro.\n\nO Rhino, nosso [motor de personalização](Motor de personalização Rhino.md), é um interpretador JavaScript escrito em Java que permite usar funções das duas linguagens. Isso parece um pouco estranho para quem nunca programou dessa forma e alguns cenários podem causar confusão, e o objetivo dessa documentação é explorar estes cenários com as explicações e soluções para alguns cenários que podem ocorrer no desenvolvimento.\n\n# [Lidando com List (List) no Rhino](https://tdn.totvs.com/display/TF/Lidando+com+List+%28List%29+no+Rhino)\n\nExemplos de uso com listas/array no Rhino\n\n# [Lidando com Mapa (Map) no Rhino](https://tdn.totvs.com/display/TF/Lidando+com+Mapa+%28Map%29+no+Rhino)\n\nExemplos de uso com mapas no Rhino\n\n# [Lidando com Objetos (Object) no Rhino](https://tdn.totvs.com/display/TF/Lidando+com+Objetos+%28Object%29+no+Rhino)\n\nExemplos de acesso aos atributos de um objeto no Rhino\n\n# [Lidando com numéricos (int) no Rhino](Características da programação no Rhino/Lidando com numéricos (int) no Rhino.md) no Rhino.md)\n\nExemplos das características do int no Rhino" }, { "metadata": { "title": "Compatibilidade ECMA do Motor de personalização", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=757236189", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Motor de personalização\\Compatibilidade ECMA do Motor de personalização.md" }, "content": "Compatibilidade ECMA do Motor de personalização\n\n\n---\n\nO Rhino, nosso [motor de personalização](Motor de personalização Rhino.md), é compatível com a especificação **ECMA 5**, que define a linguagem JavaScript. A ECMA 5 introduziu várias melhorias na linguagem, incluindo suporte para programação orientada a objetos, estruturas de controle avançadas e novos métodos para manipulação de arrays e strings.\n\nCom a compatibilidade com o ECMA 5, o Rhino permite aos usuários do Fluig usar recursos avançados da linguagem JavaScript em seus processos de negócios, o que pode melhorar a eficiência e a flexibilidade das operações da empresa.\n\nSendo assim, apresenta incompatibilidade com o padrão ECMA 6, também conhecido como ECMAScript 2015. Isso significa que algumas funcionalidades introduzidas nesta versão, como o uso de classes, arrow functions e let/const, **não podem ser utilizadas no desenvolvimento de scripts dentro da plataforma**.\n\nÉ importante ter em mente essa limitação ao planejar o desenvolvimento de processos e customizações que envolvam o uso de scripts. \n\n# Exemplos de código que funcionam\n\n```\nvar a = \"\";\n\nvar b;\nb = \"\";\n\nc = \"\";\n\nd = function() {}\n\nvar e = function() {}\n\nfunction f() {}\n```\n\n# Exemplos de códigos que NÃO funcionam\n\n```\nlet a = \"\"; // 'let' não deve ser utilizado\n\nconst b = \"\" // 'const' não deve ser utilizado\n\nvar c = () => {} // 'arrow functions' não devem ser utilizados\n```" }, { "metadata": { "title": "Motor de personalização Rhino", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=757236186", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Motor de personalização\\Motor de personalização Rhino.md" }, "content": "Motor de personalização Rhino\n\n\n---\n\nO Fluig utiliza como motor de personalizações no servidor o Rhino. Embora o Rhino seja um motor JavaScript que tenha sido descontinuado na versão 1.8 da OpenJDK em favor do Nashorn, o Fluig ainda usa uma versão do Rhino.\n\nA decisão de manter o Rhino como motor foi porque muitos scripts em execução nos clientes que foram criados com o Rhino não seriam compatíveis com o Nashorn. \n\nRhino é um interpretador JavaScript escrito em Java. É uma biblioteca open source que fornece um ambiente de tempo de execução JavaScript completo para desenvolvedores Java. Ele foi criado para fornecer uma implementação completa do [ECMAScript 5](Compatibilidade ECMA do Motor de personalização.md), que é uma especificação padrão para a linguagem de programação JavaScript. \n\nEle é capaz de interpretar e executar o código JavaScript e a incorporação de códigos Java em tempo de execução, permitindo a execução de scripts dinâmicos. Essa característica é útil para desenvolvedores que precisam escrever código em Java e JavaScript ao mesmo tempo, permitindo a interação entre as duas linguagens no mesmo ambiente." }, { "metadata": { "title": "Lidando com List (List) no Rhino", "source": "https://tdn.totvs.com/display/fluig/Lidando+com+List+%28List%29+no+Rhino", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Motor de personalização\\Características da programação no Rhino\\Lidando com List (List) no Rhino.md" }, "content": "Lidando com List (List) no Rhino\n\n\n---\n\nEsta página não tem como objetivo ser um guia de como programar com Rhino ou mesmo como um \"aprenda a programar\", mas sim para listar algumas características interessantes que serão referenciadas em outros pontos da documentação. Se você ainda não tem experiência com o desenvolvimento no Rhino, recomendamos que deixe essa documentação para o futuro.\n\nEm vários momentos da personalização lidamos com o que chamamos de **lista**, ou **array**.\n\nNo [Rhino](../Motor de personalização Rhino.md), existem duas formas de trabalhar com listas, de forma nativa ou na forma do java. A forma nativa, nada mais é que o um array simples do javascript, já na forma Java é utilizando as classes Java que implementam a interface **java.util.List** como o **java.util.ArrayList**.\n\nRecomendamos usar sempre da forma Java por ter uma maior compatibilidade com os nossos métodos, exceto quando a documentação permitir o uso da forma nativa, o que deixara o código mais legível.\n\n# Exemplo de uma Lista Nativa\n\n```\nvar pessoas = [\"João\", \"José\", \"Maria\", \"Helena\"]\n\nconsole.log(\"A primeira pessoa é \" + pessoas[0]);\n\nconsole.log(\"Esta é a lista completa de pessoas: \");\n\nfor (var i = 0; i < pessoas.length; i++) {\n console.log((i+1) + \"- \" + pessoas[i]);\n}\n/* \nimprime: \nA primeira pessoa é João\nEsta é a lista completa de pessoas: \n1- João\n2- José\n3- Maria\n4- Helena\n*/\n```\n\n# Exemplo de uma Lista Java\n\n```\nvar pessoas = new java.util.ArrayList();\npessoas.add(\"João\");\npessoas.add(\"José\");\npessoas.add(\"Maria\");\npessoas.add(\"Helena\");\n\nconsole.log(\"A primeira pessoa é \" + pessoas.get(0));\n\nconsole.log(\"Esta é a lista completa de pessoas: \");\n\nfor (var i = 0; i < pessoas.size(); i++) {\n console.log((i+1) + \"- \" + pessoas.get(i));\n}\n/* \nimprime: \nA primeira pessoa é João\nEsta é a lista completa de pessoas: \n1- João\n2- José\n3- Maria\n4- Helena\n*/\n```" }, { "metadata": { "title": "Lidando com Mapa (Map) no Rhino", "source": "https://tdn.totvs.com/display/fluig/Lidando+com+Mapa+%28Map%29+no+Rhino", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Motor de personalização\\Características da programação no Rhino\\Lidando com Mapa (Map) no Rhino.md" }, "content": "Lidando com Mapa (Map) no Rhino\n\n\n---\n\nEsta página não tem como objetivo ser um guia de como programar com Rhino ou mesmo como um \"aprenda a programar\", mas sim para listar algumas características interessantes que serão referenciadas em outros pontos da documentação. Se você ainda não tem experiência com o desenvolvimento no Rhino, recomendamos que deixe essa documentação para o futuro.\n\nEm vários momentos da personalização lidamos com o que chamamos de **mapa**. Mapa nada mais é que um conjunto de itens com chave/valor.\n\nNo [Rhino](../Motor de personalização Rhino.md), existem duas formas de trabalhar com mapas, de forma nativa ou na forma do java. A forma nativa, nada mais é que o um objeto simples do javascript, já na forma Java é utilizando as classes Java que implementam a interface **java.util.Map** como o **java.util.HashMap**.\n\nRecomendamos usar sempre da forma Java por ter uma maior compatibilidade com os nossos métodos, exceto quando a documentação permitir o uso da forma nativa, o que deixara o código mais legível.\n\n# Exemplo de um Mapa Nativo\n\n```\nvar dados = {\n \"nome\": \"João\", \n \"idade\": 42,\n \"salario\": 2500.98\n}\n\nconsole.log(\"O salário de \" + dados.nome + \" (\" + dados.idade + \" anos) é de R$ \" + dados.salario);\n//imprime: O salário de João (42 anos) é de R$ 2500.98\n```\n\n# Exemplo de um Mapa Java\n\n```\nvar dados = new java.util.HashMap();\ndados.put(\"nome\", \"João\");\ndados.put(\"idade\", 42);\ndados.put(\"salario\", 2500.98);\n\nconsole.log(\"O salário de \" + dados.get(\"nome\") + \" (\" + dados.get(\"idade\") + \" anos) é de R$ \" + dados.get(\"salario\"));\n//imprime: O salário de João (42 anos) é de R$ 2500.98\n```" }, { "metadata": { "title": "Lidando com numéricos (int) no Rhino", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1003463739", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Motor de personalização\\Características da programação no Rhino\\Lidando com numéricos (int) no Rhino.md" }, "content": "Lidando com numéricos (int) no Rhino\n\n\n---\n\nEsta página não tem como objetivo ser um guia de como programar com Rhino ou mesmo como um \"aprenda a programar\", mas sim para listar algumas características interessantes que serão referenciadas em outros pontos da documentação. Se você ainda não tem experiência com o desenvolvimento no Rhino, recomendamos que deixe essa documentação para o futuro.\n\nEm vários momentos da personalização lidamos com variáveis numéricas o que chamamos de **int**, ou **integer**.\n\nNo [Rhino](../Motor de personalização Rhino.md), assim como em qualquer motor javascript, as variáveis numéricas são **double** (ou seja, aceitam casas decimais). Quando um método ou objeto está explícito que o objeto esperado é um int o próprio Rhino faz a conversão, mas quando o objeto esperado é genérico (Object por exemplo) o objeto usado é um Double. Isso é normalmente transparente para o usuário e não tem impacto, mas podem acontecer alguns estranhamentos principalmente em logs.\n\n# Exemplos de logs\n\n```\nconsole.log(1); // 1.0\nconsole.log(parseInt(1)); // 1.0\nconsole.log(typeof 1); // number\n\nvar a = '' + 1; // cria a variável 'a' como uma string\nconsole.log(a); // 1\nconsole.log(typeof a); // string \n\nconsole.log(1.1); // 1.1\nconsole.log(parseInt(1.1)); // 1.0\nconsole.log(typeof 1.1); // number\n```" }, { "metadata": { "title": "Lidando com Objetos (Object) no Rhino", "source": "https://tdn.totvs.com/display/fluig/Lidando+com+Objetos+%28Object%29+no+Rhino", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Motor de personalização\\Características da programação no Rhino\\Lidando com Objetos (Object) no Rhino.md" }, "content": "Lidando com Objetos (Object) no Rhino\n\n\nEsta página não tem como objetivo ser um guia de como programar com Rhino ou mesmo como um \"aprenda a programar\", mas sim para listar algumas características interessantes que serão referenciadas em outros pontos da documentação. Se você ainda não tem experiência com o desenvolvimento no Rhino, recomendamos que deixe essa documentação para o futuro.\n\nNas personalizações é normal que uma função retorne um objeto com dados de retorno. Cada função tem um retorno diferente, podendo ser número, uma string, uma lista, um mapa ou um objeto.\n\nNo caso dos objetos, é feito uma conversão do objeto Java para javascript, o que permite que seus atributos possam ser acessados tanto diretamente quanto pelas funções get como é feito no java.  Recomendamos usar sempre da forma nativa de acesso direto ao atributo por deixar o código mais legível, exceto quando a documentação explicitamente recomendar o uso no formato java.\n\nComo exemplo, supomos que o retorno de uma função seja o objeto Example, que tenha os atributos id e name:\n\n**Estrutura do objeto java de exemplo**\n\n```\npublic class Example {\n private int id;\n private String name;\n\n public int getId() {\n return id;\n }\n\n public void setId(int id) {\n this.id = id;\n }\n\n public String getName() {\n return name;\n }\n public void setName(String name) {\n this.name = name;\n } \n}\n```\n\n## Exemplo da flexibilidade do objeto:" }, { "metadata": { "title": "Lidando com Objetos (Object) no Rhino", "source": "https://tdn.totvs.com/display/fluig/Lidando+com+Objetos+%28Object%29+no+Rhino", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Desenvolvimento de Processos\\Motor de personalização\\Características da programação no Rhino\\Lidando com Objetos (Object) no Rhino.md" }, "content": "Lidando com Objetos (Object) no Rhino\n\n\nEste é apenas um exemplo, não deve ser usado dessa forma por questões de legibilidade de código\n\n```\nvar retorno = funcao(); // retorna o objeto do tipo Example com id = 1 e name = João\n\nconsole.log(retorno.id); // imprime o valor 1\n\nretorno.id++;\nconsole.log(retorno.id); // imprime o valor 2\n\nretorno.id = retorno.id + 1;\nconsole.log(retorno.getId()); // imprime o valor 3\n\nretorno.setId(4);\nconsole.log(retorno.id); // imprime o valor 4\n\nconsole.log(retorno.name); // imprime o valor João \nconsole.log(retorno.getName()); // imprime o valor João\n\nretorno.name = \"José\";\nconsole.log(retorno.getName()); // imprime o valor José\n```\n\n## Utilização na forma nativa:\n\n```\nvar retorno = funcao(); // retorna o objeto do tipo Example com id = 1 e name = João\nconsole.log(retorno.id); // imprime o valor 1\nconsole.log(retorno.name); // imprime o valor João \n\nretorno.id = retorno.id + 1;\nretorno.name = \"José\";\nconsole.log(retorno.id); // imprime o valor 2\nconsole.log(retorno.name); // imprime o valor José\n```\n\n## Utilização na forma Java:\n\n```\nvar retorno = funcao(); // retorna o objeto do tipo Example com id = 1 e name = João\nconsole.log(retorno.getId()); // imprime o valor 1\nconsole.log(retorno.getName()); // imprime o valor João \n\nretorno.setId(retorno.getId() + 1);\nretorno.setName(\"José\");\nconsole.log(retorno.getId()); // imprime o valor 2\nconsole.log(retorno.getName()); // imprime o valor José\n```" }, { "metadata": { "title": "Tipos de formulários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745133371", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Formulários\\Tipos de formulários.md" }, "content": "Tipos de formulários\n\n\n---\n\n[Formulários Sem Codificação](Tipos de formulários/Formulários Sem Codificação.md)\n\nO Fluig oferece uma maneira fácil e intuitiva para criar formulários sem precisar de conhecimento em programação. Com o recurso de arrastar e soltar, é possível criar campos de entrada de dados, como caixas de texto, botões de rádio, tabelas de dados e utilização dos datasets. O Fluig também permite atribuir automaticamente valores aos campos do formulário, como o usuário atual, a data, o número da solicitação ou um valor fixo.\n\nPara garantir a integridade dos dados, o Fluig possibilita a criação de validações de obrigatoriedade, verificações de e-mail, CPF, CNPJ e comparações com a data atual. Além disso, é possível tornar campos invisíveis ou desabilitados conforme a atividade atual do processo, melhorando a experiência do usuário e reduzindo erros. Outro recurso interessante é o suporte ao envio de dados para o Analytics, o que permite a geração de insights e a tomada de decisões estratégicas com base nas informações coletadas.\n\nAcesse a página Formulários simples (no-code) para conhecer melhor essa ferramenta.\n\n# [Formulários avançados (hard-code)](Tipos de formulários/Formulários avançados (hard-code).md).md)\n\nAtravés da codificação, o usuário pode personalizar totalmente o layout e o comportamento do formulário, atendendo às necessidades específicas da empresa. Com essa flexibilidade, é possível incluir campos personalizados, integrar com outros sistemas, criar regras avançadas de validação de dados e até mesmo criar fluxos personalizados dentro do próprio formulário. A criação de formulários avançados no Fluig é uma das maneiras mais eficientes de otimizar os processos de negócios e aumentar a produtividade da empresa.\n\nAcesse a página Formulários avançados (hard-code) para conhecer melhor as possibilidades." }, { "metadata": { "title": "Formulários avançados (hard-code)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745734334", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Formulários\\Tipos de formulários\\Formulários avançados (hard-code).md" }, "content": "Formulários avançados (hard-code)\n\n\nEstá página está em construção\n\nAtravés da codificação, o usuário pode personalizar totalmente o layout e o comportamento do formulário, atendendo às necessidades específicas da empresa. Com essa flexibilidade, é possível incluir campos personalizados, integrar com outros sistemas, criar regras avançadas de validação de dados e até mesmo criar fluxos personalizados dentro do próprio formulário. A criação de formulários avançados no TOTVS Fluig é uma das maneiras mais eficientes de otimizar os processos de negócios e aumentar a produtividade da empresa.\n\nCriar uma documentação que cubra desde os conceitos básicos do formulário até as demandas e funções mais complexas é um desafio. Aprender a partir de uma documentação também pode ser difícil, especialmente para aqueles que estão começando do zero. Muitas vezes, a documentação técnica pode parecer confusa e cheia de jargões, deixando os iniciantes sem saber por onde começar ou como prosseguir. É por isso que é importante criar uma documentação clara e concisa, que inclua exemplos simples e explicativos, para facilitar o processo de aprendizado. \n\n## [\"Hello World\"](Formulários avançados (hard-code).md)/Formulário avançado - Primeiros passos.md)\n\nPara quem nunca criou um formulário no TOTVS Fluig, criamos um ello word para ensinar os primeiros passos incluindo a criação de um arquivo html, upload para o TOTVS Fluig via navegador, criação de um registro de formulário e editar o registro\n\n## CSS e JS no formulário\n\nApós a criação de um formulário, essa documentação ensina como usar as nossas próprias bibliotecas como Fluig Style Guide e JQuery, mas também como criar seus próprios arquivos javascript e css.\n\n## Versionamento de formulários e registros\n\nSobre os problemas e as vantagens do versionamento, principalmente, do formulário. De como isso pode gerar inconsistência entre os registros e como aplicar as alterações pequenas nos registros já criados na versão atual do formulário." }, { "metadata": { "title": "Formulários avançados (hard-code)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745734334", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Formulários\\Tipos de formulários\\Formulários avançados (hard-code).md" }, "content": "Formulários avançados (hard-code)\n\n## Campos especiais\n\nUso de campos com aplicação de máscaras, campos para texto rico e também campos que se comunicam com o servidor e conseguem realizar consultas em outros formulários ou mesmo em serviços de ERPs ou outros sistemas através de à datasets.\n\n## LGPD\n\nComo criar campos no formulário para armazenar dados sensíveis em conformidade com a Lei Geral de Proteção de Dados Pessoais (LGPD) e fazer uso de toda a estrutura que o fluig já dispõe para o monitoramento, logs de acesso e permissão de anonimização dos dados sensíveis.\n\n## Formulários multi-idiomas\n\nPara empresas com funcionários em múltiplos países, o fluig fornece ferramentas para exibir o formulário conforme o idioma do cliente selecionado no fluig;\n\n## IDE\n\nComo utilizar uma IDE com o plugin oficial do Fluig para agilizar o desenvolvimento, permitindo exportar diretamente para o servidor de forma simplificada\n\n## Tratamentos e regras especiais\n\nComo realizar validações e alteração no lado do servidor, garantindo a integridade e segurança dos dados." }, { "metadata": { "title": "Formulários Sem Codificação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745133373", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Formulários\\Tipos de formulários\\Formulários Sem Codificação.md" }, "content": "Formulários Sem Codificação\n\n\nO Fluig oferece uma maneira fácil e intuitiva para criar formulários sem precisar de conhecimento em programação. Com o recurso de arrastar e soltar, é possível criar campos de entrada de dados, como caixas de texto, botões de rádio, tabelas de dados e utilização dos datasets. O Fluig também permite atribuir automaticamente valores aos campos do formulário, como o usuário atual, a data, o número da solicitação ou um valor fixo.\n\nPara garantir a integridade dos dados, o Fluig possibilita a criação de validações de obrigatoriedade, verificações de e-mail, CPF, CNPJ e comparações com a data atual. Além disso, é possível tornar campos invisíveis ou desabilitados conforme a atividade atual do processo, melhorando a experiência do usuário e reduzindo erros. Outro recurso interessante é o suporte ao envio de dados para o Analytics, o que permite a geração de insights e a tomada de decisões estratégicas com base nas informações coletadas.\n\nAcesse a página [Plataforma ❙ Configurar formulário](https://tdn.totvs.com/pages/viewpage.action?pageId=233765763) para conhecer melhor essa ferramenta." }, { "metadata": { "title": "CSS e JS no Formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745734390", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Formulários\\Tipos de formulários\\Formulários avançados (hard-code)\\CSS e JS no Formulário.md" }, "content": "CSS e JS no Formulário\n\n\nEstá página está em construção\n\n# \"Hello World\"\n\nVocê já viu nosso artigo sobre como criar um formulário no Fluig, criar registros e edita-los né? Se não viu, [leia antes aqui](Formulário avançado - Primeiros passos.md).\n\n# fluig Style Guide\n\n# Criando e usando seu próprio CSS\n\nUsando jquery embutido no fluig\n\nCriando e usando seus próprios scripts." }, { "metadata": { "title": "Formulário avançado - Primeiros passos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745133376", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Formulários\\Tipos de formulários\\Formulários avançados (hard-code)\\Formulário avançado - Primeiros passos.md" }, "content": "Formulário avançado - Primeiros passos" }, { "metadata": { "title": "Formulário avançado - Primeiros passos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745133376", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Formulários\\Tipos de formulários\\Formulários avançados (hard-code)\\Formulário avançado - Primeiros passos.md" }, "content": "Formulário avançado - Primeiros passos\n\n\n---\n\nOs formulários avançados no Fluig permitem uma personalização completa através de codificação, possibilitando a criação de *layouts* e comportamentos totalmente adaptados às necessidades da empresa. Com essa abordagem, é possível integrar sistemas externos, criar validações complexas e desenvolver fluxos personalizados.\n\nNo entanto, para aqueles que buscam soluções rápidas e sem necessidade de programação, o Fluig também oferece a opção de formulários sem código que podem ser criados de forma intuitiva através de ferramentas de arrastar e soltar.\n\nComo criar um formulário?\n\n# Formulário avançado - Hello World\n\n Para quem está começando a aprender sobre a plataforma, este é um passo fundamental e simples para entender como funciona a criação de formulários. Vamos começar?\n\nSe você nunca criou um formulário no Fluig, podemos começar de forma simples, apenas com a plataforma e um editor de texto.\n\nTenha atenção em dois pontos:\n\n- As tags **html** e **body** são necessárias.\n- Todos os campos que serão preenchidos precisam estar dentro da tag ***form*** do html. Como no exemplo abaixo:\n\n**meu-primeiro-form.html**\n\n```\n\n\n
\n Oi. Informe o seu nome: \n
\n\n\n```\n\nAgora, acesse a plataforma com seu usuário e senha e siga os passos abaixo:\n\n**01.** Acesse o item de menu **Documentos**;\n\n**02**. Crie uma pasta ou escolha uma já existente. Na imagem de exemplo a pasta se chama Formulários Fluig;\n\n**03.** Clique no botão **Novo**; \n\n**04.** Clique na opção **Formulário Avançado**.\n\n![](..\\..\\..\\..\\..\\..\\images\\formul%C3%A1rio%20avan%C3%A7ado.png)\n\nAo abrir a modal insira as informações solicitadas:\n\n**01.** Em seu diretório, selecione o arquivo HTML criado anteriormente em **Escolher arquivo**;\n\n**02.** Defina um nome para o formulário a ser criado;\n\n**03.** Clique em **Confirmar**.\n\n![](..\\..\\..\\..\\..\\..\\images\\formul%C3%A1rio%20avan%C3%A7ado%20modal.png)\n\nAgora que seu formulário já foi criado, você pode inserir um registro nele. Para isso siga os passos abaixo:\n\n**01.** Acesse a pasta na qual foi criado o formulário avançado;\n\n**02.** Clique no botão **Novo**;\n\n**03.** Selecione a opção **Registro de formulário**.\n\nO formulário será aberto em um modal. Após o preenchimento confirme os dados inseridos para criar o registro de formulário.\n\n![](..\\..\\..\\..\\..\\..\\images\\registro%20de%20formul%C3%A1rio.png)\n\n# Acessando e editando um registro\n\nApós adicionar registros de formulário em seu formulário avançado, é possível acessa-los ou até mesmo edita-los. Sendo os passos parecido com a criação do registro.\n\nPara acessar o registro, siga os passos abaixo:\n\n**01.** Navegue até a pasta na qual onde o formulário foi criado;\n\n**02.** Acesse o formulário seguindo os passos descritos na aba **Abrir o formulário**;\n\n**02.** Encontre o registro que deseja visualizar e clique na descrição.\n\n![](..\\..\\..\\..\\..\\..\\images\\forms.png)\n\nO formulário será aberto em um modal em modo de visualização. Este modo serve para que você possa visualizar o seu registro antes da edição. Para editar o registro, siga os passos abaixo: \n\n**01.** Localize e confira os dados para confirmar o registro que deseja alterar;\n\n**02.** Clique no botão **Editar Formulário** para habilitar o modo de edição.\n\n**03.** Altere os dados dos campos do formulário;\n\n**04.** Grave as alterações clicando no botão **Salvar formulário**. Ou descartar, caso queira cancelar as alterações.\n\n![](..\\..\\..\\..\\..\\..\\images\\image2023-3-10_8-19-17.png)![](..\\..\\..\\..\\..\\..\\images\\image2023-3-10_8-21-27.png)\n\n# O que aconteceu com o meu formulário no modo em edição?\n\n**" }, { "metadata": { "title": "Formulário avançado - Primeiros passos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745133376", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Formulários\\Tipos de formulários\\Formulários avançados (hard-code)\\Formulário avançado - Primeiros passos.md" }, "content": "Formulário avançado - Primeiros passos\n\n#### Como o formulário é exibido dentro do Fluig?\n\nCaso tenha a curiosidade de inspecionar o formulário no Fluig, verá que ele é exibido dentro de um iframe. Isso garante que as funções e estilizações que do formulário não sobrescreva as do próprio fluig. E, entre outras coisas, o fluig modifica a tag *form* para impedir o envio diretamente pela tag e forçar o uso dos botões de confirmação da tela.\n\n#### Como utilizar css no formulário\n\nEm todos os formulário no fluig adicionamos a chamada do fluig style guide (). Assim você pode, mesmo sem criar uma linha de css, deixar o seu formulário mais bonito e com a mesma cara do fluig.\n\n\n\nMas se quiser, claro, você pode adicionar seus próprios css. Crie seu arquivo css e no html adicione ele da seguinte forma:\n\n\n\nAgora, lá no fluig, atualize o seu formulário clicando nos três risquinhos, editar formulário, envie o nome arquivo .html e o arquivo css conforme o print abaixo. \n\n\n\nPronto, seu css já foi aplicado. Crie um novo registro e acesse para verificar como ficou.\n\n\n\n#### Cuidado: Versionamento de formulário" }, { "metadata": { "title": "Formulário avançado - Primeiros passos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745133376", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Formulários\\Tipos de formulários\\Formulários avançados (hard-code)\\Formulário avançado - Primeiros passos.md" }, "content": "Formulário avançado - Primeiros passos\n\n\nO fluig faz o versionamento do formulário, o que significa que cada mudança feita no formulário normalmente é registrada e salva como uma nova versão. No nosso exemplo, agora o seu formulário tem três versões: uma sem nenhuma estilização, outra usando o fluig style guide e a última com o seu próprio css. \n\nEmbora o versionamento seja importante para o controle e organização das mudanças feitas, é preciso ter atenção para possíveis confusões, pois o registro de um formulário fica vinculado à versão em que foi criado. Portanto, é um registro criado na primeira versão não tenha as alterações de estilo das versões seguintes.\n\nEsse comportamento é altamente recomendado para alterações como criação ou remoção de campos, ou mesmo para algumas alterações de script, mas no caso de pequenas mudanças visuais, você pode impedir o versionamento do formulário. Para impedir, na hora de atualizar os arquivos do documento, acesse a aba “Propriedades”, encontre a opção “Versionamento” e selecione a opção “Manter versão”.\n\n\n\nAgora os registros de formulários que foram criados na versão atual e os próximos registros de formulários, todos estarão com o mesmo estilo. Já as versões anteriores, hoje não é possível modificar pela plataforma.\n\n" }, { "metadata": { "title": "Versionamento de Formulários e Registros", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745734411", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Formulários\\Tipos de formulários\\Formulários avançados (hard-code)\\Versionamento de Formulários e Registros.md" }, "content": "Versionamento de Formulários e Registros\n\n\nEstá página está em construção\n\n# \"Hello World\"\n\nVocê já viu nosso artigo sobre como criar um formulário no Fluig, criar registros e edita-los né? Se não viu, [leia antes aqui](Formulário avançado - Primeiros passos.md). Talvez queira aproveitar e ler sobre [o uso de css e de scripts](CSS e JS no Formulário.md) também, mas não é fundamental para esta documentação em específico.\n\n# Como funciona o versionamento no Fluig\n\n# Porque versionamos\n\nPensando em formulário, quando esse versionamento pode se tornar um problema \n\nComo evitar o versionamento ao atualizar um formulário\n\n#### Cuidado: Versionamento de formulário\n\nO fluig faz o versionamento do formulário, o que significa que cada mudança feita no formulário normalmente é registrada e salva como uma nova versão. No nosso exemplo, agora o seu formulário tem três versões: uma sem nenhuma estilização, outra usando o fluig style guide e a última com o seu próprio css. \n\nEmbora o versionamento seja importante para o controle e organização das mudanças feitas, é preciso ter atenção para possíveis confusões, pois o registro de um formulário fica vinculado à versão em que foi criado. Portanto, é um registro criado na primeira versão não tenha as alterações de estilo das versões seguintes.\n\nEsse comportamento é altamente recomendado para alterações como criação ou remoção de campos, ou mesmo para algumas alterações de script, mas no caso de pequenas mudanças visuais, você pode impedir o versionamento do formulário. Para impedir, na hora de atualizar os arquivos do documento, acesse a aba “Propriedades”, encontre a opção “Versionamento” e selecione a opção “Manter versão”.\n\n\n\nAgora os registros de formulários que foram criados na versão atual e os próximos registros de formulários, todos estarão com o mesmo estilo. Já as versões anteriores, hoje não é possível modificar pela plataforma.\n\n" }, { "metadata": { "title": "MovementResultVO", "source": "https://tdn.totvs.com/display/fluig/MovementResultVO", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos de entrada e retorno\\MovementResultVO.md" }, "content": "MovementResultVO" }, { "metadata": { "title": "MovementResultVO", "source": "https://tdn.totvs.com/display/fluig/MovementResultVO", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos de entrada e retorno\\MovementResultVO.md" }, "content": "MovementResultVO\n\n\nEste objeto é o retorno do método [processes.start](../Processes/processes.start.md).\n\n# Descrição\n\nEste é um objeto de retorno do método de iniciar solicitação através do [processes.start](../Processes/processes.start.md). Ele contém diversas informações sobre a solicitação iniciada como código da solicitação, do formulário, e, caso tenha gerado algum sub-processo, os códigos e ids de processos que foram gerados.\n\n# Atributos da instância\n\n**int requestId**\n\nRetorna um valor numérico com o id da solicitação.\n\nCaso a solicitação não tenha sido criada, retorna zero.\n\n**int stateSequence**\n\nRetorna um valor numérico com o código da atividade atual.\n\nCaso a solicitação não tenha sido criada, retorna zero.\n\n**String stateName**\n\nRetorna uma string com o nome **não traduzido** da atividade atual da solicitação.\n\nCaso a solicitação não tenha sido criada, retorna uma string vazia.\n\n**int condition**\n\nRetorna um valor numérico referente a qual condição do gateway foi atendida para definir o próxima atividade.\n\nCaso a solicitação não tenha sido criada ou não tenha passado por um gateway, retorna zero.\n\n**int movementSequence**\n\nRetorna um valor numérico com o código do histórico de movimentação .\n\nCaso a solicitação não tenha sido criada, retorna zero.\n\n**int formId**\n\nRetorna um valor numérico com o código do formulário associado à solicitação.\n\nCaso a solicitação não tenha sido criada ou não possua um formulário, retorna zero.\n\n**int formVersion**\n\nRetorna um valor numérico com a versão do formulário associado à solicitação.\n\nCaso a solicitação não tenha sido criada ou não possua um formulário, retorna zero.\n\n**boolean joint**\n\nRetorna um valor booleano *true* quando a solicitação está em uma situação de paralelismo, ou seja, passou por um gateway paralelo (fork) ou inclusivo, ou *false* quando não passou.\n\n**String observation**\n\nRetorna uma string com a observação criada na solicitação.\n\nCaso a solicitação não tenha sido criada ou nenhum comentário seja informado, retorna uma string vazia.\n\n**String[] currentAssignees**\n\nRetorna uma [lista](https://tdn.totvs.com/pages/viewpage.action?pageId=781871855) de strings com as matrículas dos usuários responsáveis pela atividade.\n\nCaso a solicitação não tenha sido criada, retorna uma lista vazia.\n\n**boolean multipleUsers**\n\nRetorna um valor booleano *true* indicando há mais um usuário possível para a atividade e que deve ser indicado qual o usuário correto ou *false* quando não há necessidade de escolha.\n\nNo caso de uma atividade em consenso configurada para \"Nunca selecionar colaboradores\" ou atividades do tipo gateway esse retorno sempre será false.\n\n**UserVO[] availableColleagues**\n\nRetorna uma [lista](https://tdn.totvs.com/pages/viewpage.action?pageId=781871855) de objetos do tipo [UserVO](UserVO.md) com os dados do usuários que podem ser selecionados para a atividade no caso de não ter criado uma solicitação pois a múltiplos usuários que podem ser responsáveis pela atividade (*multipleUsers*).\n\n**boolean usingManagerUsers**\n\nRetorna um valor booleano *true*quando, por não conseguir selecionar nenhum colaborador válido, atribuiu a atividade à um (ou mais) gestor do processo. Ou *false* quando não foi necessário ou possível utilizar o gestor.\n\n**int[] subprocessRequestIds**\n\nRetorna uma [lista](https://tdn.totvs.com/pages/viewpage.action?pageId=781871855) de valores numéricos com os códigos das solicitações de subprocessos que foram criadas após a movimentação.\n\nCaso nenhuma solicitação tenha sido criada por subprocessos, retorna uma lista vazia.\n\n**String[] subprocessIds**\n\nRetorna uma [lista](https://tdn.totvs.com/pages/viewpage.action?pageId=781871855) de strings com os códigos dos processos que tiveram solicitações criadas como subprocessos após a movimentação.\n\nCaso nenhuma solicitação tenha sido criada por subprocessos, retorna uma lista vazia.\n\n# Exemplos de uso" }, { "metadata": { "title": "MovementResultVO", "source": "https://tdn.totvs.com/display/fluig/MovementResultVO", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos de entrada e retorno\\MovementResultVO.md" }, "content": "MovementResultVO\n\n## Imprimir os dados gerais da solicitação criada\n\n```\nvar result = processes.get(\"processId\").start(/* properties */);\n\nconsole.log(\"Criada solicitação \" + result.requestId + \" com o formulário \" + result.formId); // imprime: Criada solicitação 50 com o formulário 102\n```\n\n## Imprimir lista dos subprocessos criados\n\n```\nvar result = processes.get(\"processId\").start(/* properties */);\n\nif (result.subprocessRequestIds.length == 0) {\n\tconsole.log(\"Nenhum subprocesso foi criado\");\n} else {\n \tfor (var i = 0; i < result.subprocessRequestIds.length; i++) {\n\t\tconsole.log(\"Criada solicitação \" + result.subprocessRequestIds[i] + \" do processo \" + result.subprocessIds[i]); // imprime: Criada solicitação 51 do processo SolicitacaoCompras\n\t}\n}\n```" }, { "metadata": { "title": "UserVO", "source": "https://tdn.totvs.com/display/fluig/UserVO", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos de entrada e retorno\\UserVO.md" }, "content": "UserVO\n\n\nEste objeto é o objeto retornado ao acessar as variáveis [currentUser](../Objetos e utilitários/currentUser.md) e [loggedUser](../loggedUser.md) e compõe outros objetos como [MovementResultVO](MovementResultVO.md).\n\n# Descrição\n\nEste objeto possui alguns dados do usuário como matrícula, nome, email e login. Pode ser usado para preencher formulários ou mesmo integrações usando a matrícula do usuário.\n\n# Atributos da instância\n\n**long id**\n\nO código único do usuário no Fluig\n\n**String userCode**\n\nRetorna uma string com a matrícula do usuário.\n\n**String firstName**\n\nRetorna uma string com o primeiro nome do usuário.\n\n**String lastName**\n\nRetorna uma string com o sobrenome do usuário.\n\n**String fullName**\n\nRetorna uma string com o nome completo (\"Nome de Exibição\") do usuário.\n\n**String email**\n\nRetorna uma string com o e-mail do usuário.\n\n**String login**\n\nRetorna uma string com o login do usuário.\n\nExemplos de uso\n\n## Imprimindo os dados do usuário atual no log\n\n```\nconsole.log(currentUser.fullName + \"(\" + currentUser.userCode + ): \" + currentUser.email); // imprime: Nome Completo Do Usuário (matricula): usuario@empresa.com\n```\n\n## Imprimindo os dados do usuário no log\n\n```\n// var result = processes.get(\"processId\").start(...)\nvar users = result.availableColleagues;\n \nif (users.length > 0) {\n    console.log(\"Não foi possível identificar apenas um usuário apto a receber a atividade. Estes são os usuários possíveis:\");\n    for (var i = 0; i < users.length; i++) {\n        console.log(users[i].fullName + \"(\" + users[i].userCode + \")\"); // para cada usuário da lista, imprime: Nome Completo Do Usuário (matricula)\n    }\n}\n```" }, { "metadata": { "title": "WorkflowSaveAndSendResultVO - Depreciado", "source": "https://tdn.totvs.com/display/fluig/WorkflowSaveAndSendResultVO+-+Depreciado", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos depreciados\\WorkflowSaveAndSendResultVO - Depreciado.md" }, "content": "WorkflowSaveAndSendResultVO - Depreciado" }, { "metadata": { "title": "WorkflowSaveAndSendResultVO - Depreciado", "source": "https://tdn.totvs.com/display/fluig/WorkflowSaveAndSendResultVO+-+Depreciado", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos depreciados\\WorkflowSaveAndSendResultVO - Depreciado.md" }, "content": "WorkflowSaveAndSendResultVO - Depreciado\n\n\nDepreciado\n\nCom a introdução do método [processes.start](../Processes/processes.start.md) a hAPI.startProcess é considerada depreciada bem como esta classe de retorno.\n\nEste objeto é o retorno do método [startProcess da hAPI](../Processes/processes.start.md).\n\n# Descrição\n\nEste é um objeto de retorno do método de iniciar solicitação. Foi introduzido no **fluig 1.8.1** e substitui o retorno anterior que era um [mapa](https://tdn.totvs.com/pages/viewpage.action?pageId=781871856) com chave do tipo string e valor do tipo Object.\n\nPor questões de retrocompatibilidade, **este objeto também é um mapa**. Então, todos os códigos que funcionavam antes, continuam funcionando sem problemas.\n\n# Atributos da instância\n\nint processInstanceId\n\nRetorna um valor numérico com o id da solicitação.\n\nCaso a solicitação não tenha sido criada, retorna zero.\n\nint taskSequence\n\nRetorna um valor numérico com o código da atividade atual.\n\nCaso a solicitação não tenha sido criada, retorna zero.\n\nint condition\n\nRetorna um valor numérico referente a qual condição do gateway foi atendida para definir o próxima atividade.\n\nCaso a solicitação não tenha sido criada ou não tenha passado por um gateway, retorna zero.\n\nint movementSequence\n\nRetorna um valor numérico com o código do histórico de movimentação .\n\nCaso a solicitação não tenha sido criada, retorna zero.\n\nint documentId\n\nRetorna um valor numérico com o código do formulário associado à solicitação.\n\nCaso a solicitação não tenha sido criada ou não possua um formulário, retorna zero.\n\nint documentVersion\n\nRetorna um valor numérico com a versão do formulário associado à solicitação.\n\nCaso a solicitação não tenha sido criada ou não possua um formulário, retorna zero.\n\nboolean joint\n\nRetorna um valor booleano *true* quando a solicitação está em uma situação de paralelismo, ou seja, passou por um gateway paralelo (fork) ou inclusivo, ou *false* quando não passou.\n\nString stateName\n\nRetorna uma string com o nome **não traduzido** da atividade atual da solicitação.\n\nCaso a solicitação não tenha sido criada, retorna uma string vazia.\n\nString observation\n\nRetorna uma string com a observação criada na solicitação.\n\nCaso a solicitação não tenha sido criada ou nenhum comentário seja informado, retorna uma string vazia.\n\nProcessLink processLink\n\nRetorna um objeto ProcessLink indicando qual o fluxo foi utilizado para chegar na atividade atual da solicitação.\n\nCaso a solicitação não tenha sido criada, retorna **null**.\n\nListcurrentAssignees\n\nRetorna uma [lista java](../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com List (List) no Rhino.md) no Rhino.md) de strings com as matrículas dos usuários responsáveis pela atividade.\n\nCaso a solicitação não tenha sido criada, retorna uma lista vazia.\n\nboolean multipleUsers\n\nRetorna um valor booleano *true* indicando há mais um usuário possível para a atividade e que deve ser indicado qual o usuário correto ou *false* quando não há necessidade de escolha.\n\nNo caso de uma atividade em consenso configurada para \"Nunca selecionar colaboradores\" ou atividades do tipo gateway esse retorno sempre será false.\n\nList availableColleagues\n\nRetorna uma [lista java](../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com List (List) no Rhino.md) no Rhino.md) de objetos do tipo Colleague com dados dos usuários que podem ser selecionados para a atividade no caso de não ter criado uma solicitação pois a múltiplos usuários que podem ser responsáveis pela atividade (*multipleUsers*).\n\nboolean usingManagerUsers\n\nRetorna um valor booleano *true*quando, por não conseguir selecionar nenhum colaborador válido, atribuiu a atividade à um (ou mais) gestor do processo. Ou *false* quando não foi necessário ou possível utilizar o gestor.\n\nList subProcessInstancesIds\n\nRetorna uma [lista java](../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com List (List) no Rhino.md) no Rhino.md) de valores numéricos com os códigos das solicitações de subprocessos que foram criadas após a movimentação.\n\nCaso nenhuma solicitação tenha sido criada por subprocessos, retorna uma lista vazia." }, { "metadata": { "title": "console", "source": "https://tdn.totvs.com/display/fluig/console", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\console.md" }, "content": "console" }, { "metadata": { "title": "console", "source": "https://tdn.totvs.com/display/fluig/console", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\console.md" }, "content": "console\n\n\n- [Descrição](#console-Descrição)\n- [Métodos da instância](#console-Métodosdainstância)\n- [Limitando a linha de log](#console-Limitandoalinhadelog)\n- [Ocultando no console do servidor](#console-Ocultandonoconsoledoservidor)\n\nO **console** é um objeto disponibilizado dentro do ambiente de execução de personalizações. Sua função é permitir que o desenvolvedor registre mensagens, variáveis e o estado de objetos para fins de depuração, rastreio ou monitoramento no log da aplicação.\n\nEsse objeto foi incluído na **atualização 2.0**. Nas versões anteriores, o nome desse objeto é **log**.\n\n# Descrição\n\n---\n\nA principal característica do console é a capacidade de realizar logs em diferentes níveis de necessidade e criticidade: desde logs extremamente detalhados (TRACE e DEBUG) até mensagens informativas (INFO, que inclui o log padrão), alertas de desvios não críticos (WARN) e logs de falhas graves (ERROR e FATAL).\n\nAlém de imprimir mensagens textuais simples e concatenadas, o console permite a inspeção de objetos complexos (como Mapas, Listas e Objetos) através do método *dir*(). Este método *serializa* a estrutura do objeto para uma representação JSON indentada e legível, facilitando a análise e o rastreio de dados estruturados dentro dos logs.\n\nO objeto console é disponibilizado em todos os pontos de extensão de script do sistema, permitindo o rastreio consistente em eventos de processo, datasets, notificações e eventos globais.\n\nAs mensagens registradas através deste objeto são processadas e, dependendo da configuração de log do ambiente, serão gravadas nos arquivos de log correspondentes (por exemplo, server.log).\n\n# Métodos da instância\n\n---\n\n[void log(Object message [, Object message.. ] )](console/console.log.md)\n\n- Imprime uma mensagem (ou várias strings concatenadas) em nível de INFO\n\nvoid warn(Object message [, Object message.. ] )\n\n- Imprime uma mensagem (ou várias strings concatenadas) em nível de WARN\n\nvoid error(Object message [, Object message.. ] )\n\n- Imprime uma mensagem (ou várias strings concatenadas) em nível de ERROR\n\nvoid debug(Object message [, Object message.. ] )\n\n- Imprime uma mensagem (ou várias strings concatenadas) em nível de DEBUG\n\n[void dir(Object message [, Object message.. ] )](console/console.dir.md)\n\n- Imprime um objeto (ou vários objectos concatenadas) no formato json em nível de INFO\n\n# Limitando a linha de log\n\n---\n\nPara evitar o consumo excessivo de memória ou disco com logs muito longos, todas as mensagens geradas pelos métodos console.log, console.info, console.warn, console.error, etc., estão sujeitas a um truncamento automático.\n\nO comprimento máximo da mensagem é definido pela propriedade de sistema com.fluig.sdk.api.log.ScriptingLog.truncateLength. Se a mensagem exceder este limite, ela será cortada e as reticências [...] serão adicionadas ao final.\n\nPara configurar esse limite de conteúdo impresso nos eventos de personalização basta adicionar na [configuração de inicialização](../../../Configuração/Configuração de Ambiente/Configurando Propriedades do Sistema via JAVA_OPTS.md) o parâmetro com.fluig.sdk.api.log.ScriptingLog.truncateLength:\n\n**Linux (standalone.conf)**\n\n```\nJAVA_OPTS=\"$JAVA_OPTS -Dcom.fluig.sdk.api.log.ScriptingLog.truncateLength=500\"\n```\n\n**Windows (standalone.conf.bat)**\n\n```\nset \"JAVA_OPTS=%JAVA_OPTS% -Dcom.fluig.sdk.api.log.ScriptingLog.truncateLength=500\"\n```\n\nSe nenhum parâmetro for informado, a mensagem não será cortada. Lembre-se que isso pode apresentar um custo de processamento e I/O do servidor e pode afetar a performance do seu servidor.\n\n# Ocultando no console do servidor\n\n---\n\nTodo os logs de eventos personalizados, por padrão, são impressos no console e no armazenados no arquivo server.log. É possível também, para economizar recursos, manter esse apenas em arquivo e não no console. Principalmente em ambientes que em que o console do servidor não é monitorado diretamente, essa é uma solução inteligente para economizar recursos. Para isso, basta editar o arquivo standalone.xml:\n\n```\n\n \n     \n     \n \n \n     \n \n     \n \n \n```" }, { "metadata": { "title": "currentUser", "source": "https://tdn.totvs.com/display/fluig/currentUser", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\currentUser.md" }, "content": "currentUser\n\n\n**currentUser** é um objeto do tipo [UserVO](../Objetos de entrada e retorno/UserVO.md) disponibilizada pela plataforma Fluig em todas os pontos de personalização e permite obter informações sobre o usuário atual\n\n# Descrição\n\nCom ele o desenvolvedor pode validar, imprimir ou utilizar de outras maneiras os dados do usuário atual. Este usuário é o usuário que está executando a ação.\n\nEm movimentação solicitações, este é o usuário que está **movimentando** ou o usuário que **está sendo substituído**. Para ter informações do usuário substituto, use o objeto [loggedUser](../loggedUser.md). E no caso de personificação, este objeto é referente ao usuário que está sendo personificado.\n\n# Sintaxe\n\n```\ncurrentUser\n```\n\n# Exemplos de uso\n\n## Imprimir os dados do usuário atual\n\n```\nconsole.log(\"O nome do usuário atual é \" + currentUser.fullName + \" e a matrícula é \" + currentUser.userCode);\n```\n\n# Compatibilidade\n\nEste objeto só está disponível a partir da versão 1.8.2." }, { "metadata": { "title": "Data-zoom", "source": "https://tdn.totvs.com/display/fluig/Data-zoom", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\Data-zoom.md" }, "content": "Data-zoom\n\n\n# Índice\n\n- 1 [Descrição](#Datazoom-Descrição)\n- 2 [Sintaxe](#Datazoom-Sintaxe)\n- 3 [Atributos](#Datazoom-Atributos)\n - 3.1 [datasetId](#Datazoom-datasetId)\n - 3.2 [displayKey](#Datazoom-displayKey)\n - 3.3 [maximumSelectionLength](#Datazoom-maximumSelectionLength)\n - 3.4 [resultLimit](#Datazoom-resultLimit)\n - 3.5 [placeholder](#Datazoom-placeholder)\n - 3.6 [filterValues](#Datazoom-filterValues)\n - 3.7 [fields](#Datazoom-fields)\n- 4 [Atributos do objeto field](#Datazoom-Atributosdoobjetofield)\n - 4.1 [field](#Datazoom-field)\n - 4.2 [label](#Datazoom-label)\n - 4.3 [standard (opcional)](#Datazoom-standard(opcional))\n - 4.4 [visible](#Datazoom-visible)\n - 4.5 [Exemplo de uso](#Datazoom-Exemplodeuso)\n\nO data-zoom é um atributo do campo pesquisa do formulário, ou seja, o campo tipo \"zoom\". Este atributo recebe um objeto com vários parâmetros e configurações da consulta e esse objeto, apesar de não ter um nome oficial, vamos chamar de data-zoom.\n\n# Descrição\n\n---\n\nO atributo data-zoom é onde a maior parte das configurações possíveis para o campo pesquisa são feitas. Ele é um objeto complexo onde é definido qual o dataset, qual campo deste dataset será usado para preencher o campo, se permite mais de uma item selecionado e quais os campos podem ser usados de filtro.\n\n# Sintaxe\n\n---\n\n```\n{\n \t'datasetId':'colleague',\n 'displayKey':'colleagueName',\n 'placeholder': 'Selecione o usuário do Fluig',\n 'filterValues': 'campo1,valorDoCampo1,campo2,valorDoCampo2',\n 'resultLimit': 30,\n \t'fields':[{\n\t\t'field': 'colleagueName',\n\t\t'label': 'colleagueName',\n\t\t'standard': 'true'\n\t},{\n\t\t'field': 'colleagueId',\n\t\t'label': 'colleagueId',\n\t\t'visible': 'false'\n\t}]\n}\n```\n\n# Atributos\n\n---\n\n## **datasetId**\n\nUma string que define id do dataset que o campo pesquisa vai consultar\n\n## **displayKey**\n\nUma string que define qual o campo do dataset que será usado como exibição no campo pesquisa após a seleção.\n\n## **maximumSelectionLength**" }, { "metadata": { "title": "Data-zoom", "source": "https://tdn.totvs.com/display/fluig/Data-zoom", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\Data-zoom.md" }, "content": "Data-zoom\n\n\n```\n(opcional)\n```\n\nUm número inteiro que indica um limite de itens do dataset que podem ser selecionados (múltipla escolha)\n\nCaso não seja informado, será utilizado o valor padrão que é 1, ou seja, permite que apenas um registro selecionado.\n\n## **resultLimit**\n\n```\n(opcional)\n```\n\nUm número inteiro que indica um limite de itens retornado por consulta no campo pesquisa\n\nCaso não seja informado, será utilizado o valor padrão que é 300. Não é recomendável usar um número grande por questões de performance e processamento de dados.\n\n## **placeholder**\n\n```\n(opcional)\n```\n\nUm texto para user usado como place holder, ou seja, uma instrução quando não tiver nenhum item selecionado\n\nCaso não seja informado, o campo não exibirá nenhum texto quando não tiver nenhum item selecionado\n\n## **filterValues**\n\n```\n(opcional)\n```\n\nUma string complexa composta por um ou mais campos que serão usados como filtro prévio do campo de pesquisa e valores esperados. Este campo é válido de forma automática para os datasets internos do Fluig. Em datasets personalizados, vale lembrar que é necessário implementar os filtros a partir das *constraints* recebidas.\n\nCaso não seja informado, nenhum filtro prévio será utilizado.\n\n## **fields**\n\nUma lista de objetos que representam a coluna e os dados que serão retornados ao ser selecionado um item na pesquisa. configuram quais são os campos ('*field'*) do dataset que serão exibidos, qual o label ('*label'*) que será utilizado, qual será usado para ordenação ('*standard': 'true'*) e se será visível ou não (*'visible': 'false'*) para o usuário final.\n\n# Atributos do objeto field\n\n---\n\n## **field**\n\nUma string com o nome do campo no dataset que será exibido na coluna e/ou retornado a selecionar um item\n\n## **label**\n\nUma string com o título da coluna que será exibido na listagem do campo pesquisa\n\n## **standard** (opcional)" }, { "metadata": { "title": "Data-zoom", "source": "https://tdn.totvs.com/display/fluig/Data-zoom", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\Data-zoom.md" }, "content": "Data-zoom\n\n\nUma string com o valor 'true' quando esta coluna será a coluna de ordenação padrão do campo de pesquisa.\n\nQuando não informado, assume o valor 'false' e não usa essa coluna como ordenação\n\n## **visible**\n\n**(opcional)**\n\nUma string com o valor 'false' quando este campo não será visível ao buscar no campo de pesquisa. Ele serve para ocultar algumas informações do dataset mas trazer esses dados ao selecionar um item.\n\nQuando não informado, assume o valor 'true' e o campo é exibido como uma coluna no campo de pesquisa\n\n## Exemplo de uso\n\n---\n\nOs exemplos de uso estão centralizados na documentação do campo pesquisa." }, { "metadata": { "title": "FormController", "source": "https://tdn.totvs.com/display/fluig/FormController", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\FormController.md" }, "content": "FormController\n\n\n# Índice\n\n- 1 [Descrição](#FormController-Descrição)\n- 2 [Métodos da instância](#FormController-Métodosdainstância)\n\nO FormController é um objeto enviado como parâmetro para todas as funções de personalização do formulário e possui os dados do formulário atual e informações que ajudaram a personalizar ainda mais o formulário\n\n# Descrição\n\n---\n\nO objeto mais importante nos eventos de formulário é o [FormController](https://tdn.totvs.com/pages/viewpage.action?pageId=745139208). Com ele o desenvolvedor pode identificar melhor os dados gerais do registro de formulário como o código e a versão, se está no modo de visualização ou alteração, se está sendo visualizado no app mobile ou pelo navegador, além de manipular os valores e o status de cada um dos campos da tela.\n\nTambém consegue desabilitar os botões de imprimir e desabilitar o botão de exclusão de registro das tabelas pai x filho.\n\nEsta documentação está em construção e por isso ainda está incompleta. Para ter visualizar todos os métodos, [acesse a nossa documentação antiga](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/FormController - a varíavel form.md).\n\n# Métodos da instância\n\n---\n\n[long getCompanyId()](FormController/FormController.getValue(fieldname).md).md)\n\nRetorna o código da empresa do registro de formulário atual\n\n[int getDocumentId()](FormController/FormController.getValue(fieldname).md).md)\n\nRetorna o código de documento do registro de formulário atual\n\n[int getVersion()](FormController/FormController.getValue(fieldname).md).md)\n\nRetorna a versão do registro de formulário atual\n\n[int getCardIndex()](FormController/FormController.getValue(fieldname).md).md)\n\nRetorna o código do formulário do qual o registro de formulário pertence\n\n[int getValue(String fieldname)](FormController/FormController.getValue(fieldname).md).md)\n\nRetorna o valor do campo *fieldname* no registro de formulário atual." }, { "metadata": { "title": "hAPI (nova)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=778540422", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\hAPI (nova).md" }, "content": "hAPI (nova)" }, { "metadata": { "title": "hAPI (nova)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=778540422", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\hAPI (nova).md" }, "content": "hAPI (nova)\n\n\n# Índice\n\n- 1 [Descrição](#hAPI(nova)-Descrição)\n- 2 [Métodos da instância](#hAPI(nova)-Métodosdainstância)\n\nA hAPI é uma API (Application Programming Interface) disponibilizada pela plataforma Fluig que permite o acesso a diversas funcionalidades do sistema. Essa API é amplamente utilizada no desenvolvimento de processos e aplicações personalizadas, e é fundamental para quem deseja tirar o máximo proveito da plataforma. Nesta documentação, apresentaremos as principais funções da hAPI e como utilizá-las.\n\n# Descrição\n\n---\n\nO objeto mais importante nos [eventos de processo](../../Desenvolvimento de Eventos/Eventos de Processos.md) é a [hAPI (nova)](https://tdn.totvs.com/pages/viewpage.action?pageId=778540422). Com ele o desenvolvedor pode consultar e atribuir dados do formulário, obter informações da movimentação como id do histórico de movimentação, [thread](../Desenvolvimento de Processos/Glossário do desenvolvimento de processos BPM/Thread de Processo.md), atividades para onde a solicitação atual pode ser movimentada, outras atividades ativas, solicitação que gerou a solicitação atual (no caso de ser um sub-processo), link para uma determinada atividade (que pode ser usado para o envio de notificações), calcular prazo de conclusão dinamicamente, trabalhar com os anexos da solicitação (adicionando, listando, ou publicando os itens atuais no GED) e atribuir valores como prazo de conclusão, comentários.\n\nAlém disso, consegue tomar ações como transferir atividade e iniciar solicitações.\n\nPode ser utilizada em todos os eventos do processo (before, after, services e condicionais), evento de notificação (onNotify) e eventos globais (como displayCentralTask, afterSaveCard, entre outros). Neste último caso, por não estar associado diretamente à uma solicitação, nem todos os métodos está disponíveis e a documentação do método deve ser consultada antes do desenvolvimento.\n\nEsta documentação encontra-se em construção e por isso alguns métodos ainda não estão disponíveis. Para visualizar todos os métodos, acesse nossa [documentação antiga](http://tdn.totvs.com).\n\n# Métodos da instância\n\n---\n\n[String getCardValue(String fieldName)](hAPI (nova).md)/hAPI.getCardValue (nova).md)\n\n- Retorna o valor do campo *fieldName* no formulário\n\nvoid setCardValue(String fieldName, String newValue)\n\n- Define o valor *newValue* ao campo de formulário *fieldName*\n\nMap getCardData(int instanceId)\n\n- Retorna todos os dados do formulário da solicitação *instanceId*.\n\nvoid addCardChild(String tableName, Map childData)\n\n- Adiciona um novo registro filho na tabela *tableName* com os dados *childData*.\n\nboolean removeCardChild(String tableName, int index)\n\n- Remove o registro filho de ordem *index* da tabela *tableName*.\n\nList getChildrenInstances(int instanceId)\n\n- Retorna uma lista com os número de solicitações da solicitações geradas diretamente a partir da solicitação *instanceId*.\n\nInteger getParentInstance(int instanceId)\n\n- Retorna o número da solicitação que originou a solicitação atual, ou zero, caso não seja um subprocesso.\n\nList getActiveStates()\n\n- Retorna uma lista com os códigos de atividades ativas na solicitação atual\n\nvoid setDueDate(int instanceId, int threadSequence, String userId, Object data, int timeInSeconds)\n\n- Define a data *data* e horário *timeInSeconds* a tarefa atual da thread *threadSequence* do usuário *userId* da solicitação *instanceId*\n\nvoid transferTask(List users, String comment, int threadSequence)\n\n- Transfere uma atividade ativa na thread *threadSequence* da solicitação atual para os usuários *users*e adiciona o comentário *comment*.\n\nvoid transferTask(List users, String comment)\n\n- Transfere uma atividade ativa na thread 0 da solicitação atual para os usuários *users*e adiciona o comentário *comment*.\n\n[WorkflowSaveAndSendResultVO startProcess(String processId, int chosenState, List colleagues, String comments, boolean completeTask, Map cardData, Boolean managerMode)](hAPI (nova).md)/hAPI.startProcess (nova).md)\n\n```\n(Depreciado)\n```\n\n- Inicia uma solicitação do processo *processId*, encaminhando pra tarefa *chosenState* e para os usuários *colleagues*com o comentário *comments*  e dados de formulário *cardData.*\n\nsetColleagueReplacement(userId)\n\nsetTaskComments(\"userId\", numProcesso,  numThread, \"obs\")\n\ngetAdvancedProperty(\"propriedade\")\n\ncalculateDeadLineHours(data, segundos, prazo, periodId)\n\ncalculateDeadLineTime(data, segundos, prazo, periodId)\n\ngetUserTaskLink(numAtiv)\n\ncreateAdHocTasks(workflowProcessInstanceId, sequenceId, assunto, detalhamento, listatvidadesAhoc)\n\nlistAttachments()\n\npublishWorkflowAttachment(documento)\n\nattachDocument(documentId)\n\ngetAvailableStatesDetail(companyId, userId, processId, processInstanceId, threadSequence)\n\n[int getDocumentId()](hAPI (nova).md)/hAPI.getCardValue (nova).md)\n\nRetorna o código de documento do registro de formulário atual\n\n[int getVersion()](hAPI (nova).md)/hAPI.getCardValue (nova).md)\n\nRetorna a versão do registro de formulário atual\n\n[int getCardIndex()](hAPI (nova).md)/hAPI.getCardValue (nova).md)\n\nRetorna o código do formulário do qual o registro de formulário pertence\n\n[int getValue(String fieldname)](hAPI (nova).md)/hAPI.getCardValue (nova).md)\n\nRetorna o valor do campo *fieldname* no registro de formulário atual. \n\n(Verificar links, todos apontam para a mesma documentação. Está correto?) -Samara\n\n**Depreciado:**\n\ngetActualThread\n\nsetDueDate(long companyId, int processInstanceId, int movementSequence, String userId, Date newDueDate, \n            int timeInSeconds)\n\n" }, { "metadata": { "title": "RequestInfoVO", "source": "https://tdn.totvs.com/display/fluig/RequestInfoVO", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\RequestInfoVO.md" }, "content": "RequestInfoVO" }, { "metadata": { "title": "RequestInfoVO", "source": "https://tdn.totvs.com/display/fluig/RequestInfoVO", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\RequestInfoVO.md" }, "content": "RequestInfoVO\n\n\n- [Descrição](#RequestInfoVO-Descrição)\n- [Atributos da instância](#RequestInfoVO-Atributosdainstância)\n- [Exemplos de uso](#RequestInfoVO-Exemplosdeuso)\n\n# Descrição\n\n---\n\nEste é um objeto de entrada do método de validação de login. Foi implementado na atualização **Fluig 2.0.0-260224** e permite criar validações com os dados da requisição como IP, host, porta.\n\nEste objeto é um dos parâmetros de entrada do método [beforeLogin](../../Desenvolvimento de Eventos/Eventos Globais/Evento beforeLogin.md).\n\n# Atributos da instância\n\n---\n\n**String ip**\n\n- Endereço IP real do cliente, considerando cabeçalhos de proxy (X-Forwarded-For).\n- Este IP só é confiável quando o ambiente utiliza um **[Proxy reverso](../../../Configuração/Configuração de Ambiente/Proxy reverso.md)** configurado corretamente, com a funcionalidade de encaminhamento do IP original habilitada na requisição.\n\n**String userAgent**\n\n- Valor enviado pelo navegador contendo detalhes sobre sistema operacional, navegador e dispositivo.\n\n**String method**\n\n- O método HTTP utilizado na requisição (GET, POST, PUT, DELETE…).\n\n**String requestURI**\n\n- Parte do caminho solicitado pelo cliente dentro da aplicação.\n- Ex: /portal/login/auth.\n\n**String queryString**\n\n- Parâmetros enviados na URL quando o método é GET.\n- Ex: user=jose&id=10.\n\n**String host**\n\n- Valor do cabeçalho Host, normalmente o domínio acessado.\n- Ex: fluig.minhaempresa.com ou localhost:8080.\n\n**String protocol**\n\n- Protocolo e versão usados na requisição.\n- Ex: HTTP/1.1 ou HTTP/2.\n\n**String referer**\n\n- URL da página anterior de onde o usuário veio (caso o navegador envie). Útil para entender fluxo de navegação e identificar redirecionamentos externos.\n\n \n\n# Exemplos de uso\n\n---\n\n**Impressão dos dados da requisição:**\n\n```\nfunction beforeLogin(login, origin, requestInfoVO) {\n log.dir(requestInfoVO);\n}\n```\n\n**Saída:**\n\n```\n{\n \"referer\" : \"http://127.0.1.1:8080/portal/p/1/home\",\n \"protocol\" : \"HTTP/1.1\",\n \"method\" : \"POST\",\n \"ip\" : \"127.0.0.1\",\n \"host\" : \"127.0.1.1:8080\",\n \"userAgent\" : \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36\",\n \"requestURI\" : \"/portal/p/1/j_security_check\",\n \"queryString\" : null\n}\n```" }, { "metadata": { "title": "WorkflowSaveAndSendResultVO", "source": "https://tdn.totvs.com/display/fluig/WorkflowSaveAndSendResultVO", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\WorkflowSaveAndSendResultVO.md" }, "content": "WorkflowSaveAndSendResultVO" }, { "metadata": { "title": "WorkflowSaveAndSendResultVO", "source": "https://tdn.totvs.com/display/fluig/WorkflowSaveAndSendResultVO", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\WorkflowSaveAndSendResultVO.md" }, "content": "WorkflowSaveAndSendResultVO\n\n\n# Índice\n\n- 1 [Descrição](#WorkflowSaveAndSendResultVO-Descrição)\n- 2 [Atributos da instância](#WorkflowSaveAndSendResultVO-Atributosdainstância)\n\nEste objeto é o retorno do método [startProcess da hAPI](../Processes/processes.start.md).\n\n# Descrição\n\n---\n\nEste é um objeto de retorno do método de iniciar solicitação. Foi introduzido no **fluig 1.8.1** e substitui o retorno anterior que era um [mapa](https://tdn.totvs.com/pages/viewpage.action?pageId=781871856) com chave do tipo string e valor do tipo Object.\n\nPor questões de retrocompatibilidade, **este objeto também é um mapa**. Então, todos os códigos que funcionavam antes, continuam funcionando sem problemas.\n\n# Atributos da instância\n\n---\n\n**int processInstanceId**\n\n- Retorna um valor numérico com o id da solicitação.\n- Caso a solicitação não tenha sido criada, retorna zero.\n\n**int taskSequence**\n\n- Retorna um valor numérico com o código da atividade atual.\n- Caso a solicitação não tenha sido criada, retorna zero.\n\n**int condition**\n\n- Retorna um valor numérico referente a qual condição do gateway foi atendida para definir o próxima atividade.\n- Caso a solicitação não tenha sido criada ou não tenha passado por um gateway, retorna zero.\n\n**int movementSequence**\n\n- Retorna um valor numérico com o código do histórico de movimentação .\n- Caso a solicitação não tenha sido criada, retorna zero.\n\n**int documentId**\n\n- Retorna um valor numérico com o código do formulário associado à solicitação.\n- Caso a solicitação não tenha sido criada ou não possua um formulário, retorna zero.\n\n**int documentVersion**\n\n- Retorna um valor numérico com a versão do formulário associado à solicitação.\n- Caso a solicitação não tenha sido criada ou não possua um formulário, retorna zero.\n\n**boolean joint**\n\n- Retorna um valor booleano *true* quando a solicitação está em uma situação de paralelismo, ou seja, passou por um gateway paralelo (fork) ou inclusivo, ou *false* quando não passou.\n\n**String stateName**\n\n- Retorna uma string com o nome **não traduzido** da atividade atual da solicitação.\n- Caso a solicitação não tenha sido criada, retorna uma string vazia.\n\n**String observation**\n\n- Retorna uma string com a observação criada na solicitação.\n- Caso a solicitação não tenha sido criada ou nenhum comentário seja informado, retorna uma string vazia.\n\n**ProcessLink processLink**\n\n- Retorna um objeto ProcessLink indicando qual o fluxo foi utilizado para chegar na atividade atual da solicitação.\n- Caso a solicitação não tenha sido criada, retorna **null**.\n\n**ListcurrentAssignees**\n\n- Retorna uma [lista java](../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com List (List) no Rhino.md) no Rhino.md) de strings com as matrículas dos usuários responsáveis pela atividade.\n- Caso a solicitação não tenha sido criada, retorna uma lista vazia.\n\n**boolean multipleUsers**\n\n- Retorna um valor booleano *true* indicando há mais um usuário possível para a atividade e que deve ser indicado qual o usuário correto ou *false* quando não há necessidade de escolha.\n- No caso de uma atividade em consenso configurada para \"Nunca selecionar colaboradores\" ou atividades do tipo gateway esse retorno sempre será false.\n\n**List availableColleagues**\n\n- Retorna uma [lista java](../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com List (List) no Rhino.md) no Rhino.md) de objetos do tipo Colleague com dados dos usuários que podem ser selecionados para a atividade no caso de não ter criado uma solicitação pois a múltiplos usuários que podem ser responsáveis pela atividade (*multipleUsers*).\n\n**boolean usingManagerUsers**\n\n- Retorna um valor booleano *true*quando, por não conseguir selecionar nenhum colaborador válido, atribuiu a atividade à um (ou mais) gestor do processo. Ou *false* quando não foi necessário ou possível utilizar o gestor.\n\n**List subProcessInstancesIds**\n\n- Retorna uma [lista java](../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com List (List) no Rhino.md) no Rhino.md) de valores numéricos com os códigos das solicitações de subprocessos que foram criadas após a movimentação.\n- Caso nenhuma solicitação tenha sido criada por subprocessos, retorna uma lista vazia." }, { "metadata": { "title": "console.dir", "source": "https://tdn.totvs.com/display/fluig/console.dir", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\console\\console.dir.md" }, "content": "console.dir\n\n\nO método dir do [console](../console.md) registra em formato json os dados de um objeto umano nível INFO. É o método comumente usado para ter uma visão clara do conteúdo de um objeto complexo de forma expandida. Múltiplos argumentos são concatenados com um espaço. Este é o mesmo método que log.dir.\n\n# Nesta documentação\n\n- 1 [Sintaxe](#console.dir-Sintaxe)\n- 2 [Parâmetros](#console.dir-Parâmetros)\n - 2.1 [object](#console.dir-object)\n - 2.2 [objects](#console.dir-objects)\n- 3 [Valor de retorno](#console.dir-Valorderetorno)\n- 4 [Exemplos de uso](#console.dir-Exemplosdeuso)\n - 4.1 [Log de uma string simples](#console.dir-Logdeumastringsimples)\n - 4.2 [Log de um objeto](#console.dir-Logdeumobjeto)\n - 4.3 [Log com dois objetos](#console.dir-Logcomdoisobjetos)\n - 4.4 [Log com array](#console.dir-Logcomarray)\n\n# Sintaxe\n\n---\n\n```\nconsole.dir(object)\n```\n\n```\nconsole.log(...objects)\n```\n\n# Parâmetros\n\n---\n\n### **object**\n\nUm [objeto](../../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com Objetos (Object) no Rhino.md) no Rhino.md) que deve ser impresso no console ou arquivo no formato JSON.\n\n### objects\n\nUm ou mais [objetos](../../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com Objetos (Object) no Rhino.md) no Rhino.md) que devem ser impressos no console ou arquivo no formato JSON.\n\n# Valor de retorno\n\n---\n\nNão retorna nada\n\n# Exemplos de uso\n\n---\n\n## Log de uma string simples\n\n```\nconsole.dir(\"Opção 'a' marcada\");\n```\n\n**server.log**\n\n```\n2025-10-07 08:30:16,456 INFO [com.fluig.sdk.api.log.ScriptingLog] (default task-1) Opção 'a' marcada\n```\n\n## Log de um objeto\n\n```\nvar obj = {\"field\": \"value\", \"message\":\"ok\"};\nconsole.dir(obj);\n```\n\n**server.log**\n\n```\n2025-10-07 08:30:16,456 INFO [com.fluig.sdk.api.log.ScriptingLog] (default task-1) {\n \"field\" : \"value\",\n \"message\" : \"ok\"\n}\n```\n\n## Log com dois objetos" }, { "metadata": { "title": "console.dir", "source": "https://tdn.totvs.com/display/fluig/console.dir", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\console\\console.dir.md" }, "content": "console.dir\n\n\n```\nvar obj = {\"field\": \"value\", \"message\":\"ok\"};\nconsole.dir(obj, obj);\n```\n\n**server.log**\n\n```\n2025-10-07 08:30:16,456 INFO [com.fluig.sdk.api.log.ScriptingLog] (default task-1) {\n \"field\" : \"value\",\n \"message\" : \"ok\"\n} {\n \"field\" : \"value\",\n \"message\" : \"ok\"\n}\n```\n\n## Log com array\n\n```\nvar arr = [\"Usuário\", userId, \"acessou o formulário.\"];\nconsole.dir(arr);\n```\n\n**server.log**\n\n```\n2025-10-07 08:30:16,456 INFO [com.fluig.sdk.api.log.ScriptingLog] (default task-1) \"Usuário\" \"9999\" \"acessou o formulário.\"\n```" }, { "metadata": { "title": "console.log", "source": "https://tdn.totvs.com/display/fluig/console.log", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\console\\console.log.md" }, "content": "console.log\n\n\nO método log do [console](../console.md) registra uma mensagem no nível INFO. É o método mais comumente usado. Múltiplos argumentos são concatenados com um espaço. Este é o mesmo método que log.info ou console.info.\n\n# Nesta documentação\n\n- 1 [Sintaxe](#console.log-Sintaxe)\n- 2 [Parâmetros](#console.log-Parâmetros)\n - 2.1 [message](#console.log-message)\n - 2.2 [error](#console.log-error)\n - 2.3 [messages](#console.log-messages)\n- 3 [Valor de retorno](#console.log-Valorderetorno)\n- 4 [Exemplos de uso](#console.log-Exemplosdeuso)\n - 4.1 [Log simples](#console.log-Logsimples)\n - 4.2 [Log de um valor numérico](#console.log-Logdeumvalornumérico)\n - 4.3 [Log com dois atributos](#console.log-Logcomdoisatributos)\n - 4.4 [Log com múltiplos argumentos](#console.log-Logcommúltiplosargumentos)\n - 4.5 [Log com array](#console.log-Logcomarray)\n - 4.6 [Log de um objeto nativo](#console.log-Logdeumobjetonativo)\n - 4.7 [Log com mensagem de erro](#console.log-Logcommensagemdeerro)\n\n# Sintaxe\n\n---\n\n```\nconsole.log(message)\n```\n\n```\nconsole.log(message, error)\n```\n\n```\nconsole.log(...messages)\n```\n\n# Parâmetros\n\n---\n\n### **message**\n\nUm objeto (ou [array nativo](../../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com List (List) no Rhino.md) no Rhino.md) de objetos) que deve ser impresso no console ou arquivo. Preferencialmente uma string ou numérico, apesar de aceitar qualquer valor.\n\n### **error**\n\nCaso sejam passados dois argumentos e o segundo argumento seja objeto de erro (Throwable),  que deve ser impresso no console ou arquivo.\n\n### messages\n\nUm ou mais objetos que devem ser impressos no console ou arquivo. Preferencialmente strings ou numéricos, apesar de aceitar qualquer valor.\n\n# Valor de retorno\n\n---\n\nNão retorna nada\n\n# Exemplos de uso\n\n---\n\n## Log simples" }, { "metadata": { "title": "console.log", "source": "https://tdn.totvs.com/display/fluig/console.log", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\console\\console.log.md" }, "content": "console.log\n\n\n```\nconsole.log(\"Opção 'a' marcada\");\n```\n\n**server.log**\n\n```\n2025-10-07 08:30:16,456 INFO [com.fluig.sdk.api.log.ScriptingLog] (default task-1) Opção 'a' marcada\n```\n\n## Log de um valor numérico\n\n```\nconsole.log(1);\n```\n\n**server.log**\n\n```\n2025-10-07 08:30:16,456 INFO [com.fluig.sdk.api.log.ScriptingLog] (default task-1) 1.0\n```\n\nTodo valor numérico, quando impresso como numérico, tem uma casa decimal pelas [características do nosso motor de personalizações](../../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com numéricos (int) no Rhino.md) no Rhino.md).\n\n## Log com dois atributos\n\n```\nconsole.log(\"Total:\", count);\n```\n\n**server.log**\n\n```\n2025-10-07 08:30:16,456 INFO [com.fluig.sdk.api.log.ScriptingLog] (default task-1) Total: 15.0\n```\n\n## Log com múltiplos argumentos\n\n```\nconsole.log(\"Usuário\", userId, \"acessou o formulário.\");\n```\n\n**server.log**\n\n```\n2025-10-07 08:30:16,456 INFO [com.fluig.sdk.api.log.ScriptingLog] (default task-1) Usuário 9999 acessou o formulário\n```\n\n## Log com array\n\n```\nvar arr = [\"Usuário\", userId, \"acessou o formulário.\"];\nconsole.log(arr);\n```\n\n**server.log**\n\n```\n2025-10-07 08:30:16,456 INFO [com.fluig.sdk.api.log.ScriptingLog] (default task-1) Usuário 9999 acessou o formulário\n```\n\n## Log de um objeto nativo\n\n```\nvar obj = {\"field\": \"value\", \"message\":\"ok\"};\nconsole.log(obj);\n```\n\n**server.log**\n\n```\n2025-10-07 08:30:16,456 INFO [com.fluig.sdk.api.log.ScriptingLog] (default task-1) {field=value, message=ok}\n```\n\n## Log com mensagem de erro\n\n```\ntry {\n a.b; // exemplo de código que vai resultar em erro\n} catch (e) {\n console.log(\"Erro ao executar o script:\", e);\n}\n```\n\n**server.log**\n\n```\n2025-10-07 08:30:16,456 INFO [com.fluig.sdk.api.log.ScriptingLog] (default task-1) Erro ao executar o script: ReferenceError: \"a\" is not defined\n```" }, { "metadata": { "title": "formController.getCardData()", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1008213423", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\FormController\\formController.getCardData().md" }, "content": "formController.getCardData()\n\n\nO método getCardData do formController retorna um [mapa](../../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com Mapa (Map) no Rhino.md) no Rhino.md) contendo todos os dados do registro do formulário atual.\n\n# Nesta documentação\n\n- 1 [Sintaxe](#formController.getCardData()-Sintaxe)\n- 2 [Parâmetros](#formController.getCardData()-Parâmetros)\n- 3 [Valor de retorno](#formController.getCardData()-Valorderetorno)\n- 4 [Exemplos de uso](#formController.getCardData()-Exemplosdeuso)\n\n# Sintaxe\n\n---\n\n```\nform.getCardData()\n```\n\n# Parâmetros\n\n---\n\nEste método não espera parâmetros\n\n# Valor de retorno\n\n---\n\n**retorno**\n\n```\n        {\n            DOCUMENTID=12, \n            CARDID___1=10, \n            ANONYMIZATION_DATE___1=, \n            TABLEID___1=tabledetailname, \n            ANONYMIZATION_DATE=, \n            CARDID=10, \n\t\t\tvalor=, \n            NOME_SOLICITANTE=123, \n            VERSION___1=1000, \n            ANONYMIZATION_USER_ID=, \n           PRODUTO___1=Produto de exemplo, \n            CODIGO=, \n            DATA_APROVACAO=, \n           VALOR___1=1000, \n            produto=, \n            TABLEID=principal, \n            COMPANYID___1=999, \n            VERSION=1000, \n            COMPANYID=999, \n            DOCUMENTID___1=12, \n            ANONYMIZATION_USER_ID___1=, \n            MASTERID___1=2\n        }\n```\n\n# Exemplos de uso\n\n---\n\nRecuperar todos os dados do formulário para uma variável\n\n**displayFields**\n\n```javascript\nfunction displayFields(form, customHTML) {\n   var mapaForm = new java.util.HashMap();\n   mapaForm = form.getCardData();\n   log.info(\"### getCardData ###: \" + mapaForm);\n}\n```" }, { "metadata": { "title": "FormController.getValue(fieldname)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=745139690", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\FormController\\FormController.getValue(fieldname).md" }, "content": "FormController.getValue(fieldname)\n\n\n# Índice\n\n- 1 [Exemplos de uso](#FormController.getValue(fieldname)-Exemplosdeuso)\n - 1.1 [Validar o preenchimento de um campo](#FormController.getValue(fieldname)-Validaropreenchimentodeumcampo)\n - 1.2 [Validações condicionais](#FormController.getValue(fieldname)-Validaçõescondicionais)\n\nO método **getValue** retorna o valor de um campo no registro de formulário. O parâmetro **fieldname** define o nome do campo do qual o valor será lido e é case insensitive, ou seja, você pode usar \"codigo\", \"Codigo\", \"CoDiGo\" ou \"CODIGO\", todos irão funcionar.\n\n# Exemplos de uso\n\n---\n\n## Validar o preenchimento de um campo\n\n---\n\n```\n\n\n
\n\t\tCódigo do usuário*:
\n \t\tNome do usuário (opcional):
\n
\n\n\n```\n\n```\nfunction validateForm(form){\n if (form.getValue(\"codigo\") == \"\") {\n throw \"Informe o código\";\n }\n}\n```\n\n## Validações condicionais\n\n---\n\n```\n\n\n
\n\t\tTem alguma alergia? (s/n):
\n\t\tSe sim, quais?
\n
\n\n\n```\n\n```\nfunction validateForm(form){\n\tvar temAlergia = form.getValue(\"temAlergia\");\n\tvar alergias = form.getValue(\"alergias)\";\n\n if (temAlergia == \"s\") {\n\t\tif (alergias == null || alergias == \"\") {\n\t       throw \"Você deve informar quais alergias\";\n\t\t}\n } else if (temAlergia == \"n\") {\n\t\tif (alergias != null || alergias != \"\") {\n\t\t throw \"Se você não possui alergias, não deve preencher o campo quais\";\n\t\t}\n\t} else {\n\t\tthrow \"Você deve informar apenas 's' ou 'n' no campo 'Tem alguma alergia'\";\n\t}\n}\n```" }, { "metadata": { "title": "hAPI.getCardValue (nova)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=778540423", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\hAPI (nova)\\hAPI.getCardValue (nova).md" }, "content": "hAPI.getCardValue (nova)\n\n\nO método **getCardValue** da [hAPI (nova)](../hAPI (nova).md).md) retorna o valor de um campo no registro de formulário da solicitação atual.\n\n# Nesta documentação\n\n- 1 [Sintaxe](#hAPI.getCardValue(nova)-Sintaxe)\n- 2 [Parâmetros](#hAPI.getCardValue(nova)-Parâmetros)\n - 2.1 [fieldname](#hAPI.getCardValue(nova)-fieldname)\n- 3 [Valor de retorno](#hAPI.getCardValue(nova)-Valorderetorno)\n- 4 [Exemplos de uso](#hAPI.getCardValue(nova)-Exemplosdeuso)\n - 4.1 [Validar o preenchimento de um campo](#hAPI.getCardValue(nova)-Validaropreenchimentodeumcampo)\n\n# Sintaxe\n\n---\n\n```\nhAPI.getCardValue(fieldName)\n```\n\n# Parâmetros\n\n---\n\n### **fieldname**\n\nUma string [case insensitive](../../Desenvolvimento de Processos/Glossário do desenvolvimento de processos BPM/Case Sensitive Case Insensitive.md) com o nome do campo de formulário que será lido.\n\n# Valor de retorno\n\n---\n\nUma nova string contendo o valor do campo. Sempre é retornado uma string, não importando o tipo de campo no formulário\n\nCaso o campo não exista no formulário ou a solicitação não tenha formulário ou esteja sendo executado em um ponto fora dos eventos de processo, será retornado o valor **null**.\n\n# Exemplos de uso\n\n---\n\n## Validar o preenchimento de um campo\n\n```\n\n\n
\n\t\tCódigo do usuário*:
\n \t\tNome do usuário*:
\n
\n\n\n```\n\n```\nfunction beforeTaskSave(colleagueId, nextSequenceId, userList) {\n if (hAPI.getCardValue(\"codigo\") == \"\") {\n throw \"Informe o código\";\n }\n if (hAPI.getCardValue(\"nome\") == \"\") {\n throw \"Informe o nome\";\n }\n}\n```" }, { "metadata": { "title": "hAPI.startProcess (nova)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=778540424", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\hAPI (nova)\\hAPI.startProcess (nova).md" }, "content": "hAPI.startProcess (nova)" }, { "metadata": { "title": "hAPI.startProcess (nova)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=778540424", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Objetos e utilitários\\hAPI (nova)\\hAPI.startProcess (nova).md" }, "content": "hAPI.startProcess (nova)\n\n\n# Índice\n\n- 1 [Sintaxe](#hAPI.startProcess(nova)-Sintaxe)\n- 2 [Parâmetros](#hAPI.startProcess(nova)-Parâmetros)\n- 3 [Valor de retorno](#hAPI.startProcess(nova)-Valorderetorno)\n- 4 [Exemplos de uso](#hAPI.startProcess(nova)-Exemplosdeuso)\n\nO método **startProcess** da [hAPI (nova)](../hAPI (nova).md).md) inicia uma solicitação nova, podendo preencher dados e movimentar para a atividade seguinte selecionando quais os usuários irão receber a próxima atividade.\n\nA solicitação **sempre** será iniciada pelo usuário atual, que está movimentando a solicitação.\n\n# Sintaxe\n\n---\n\n```\nhAPI.startProcess(processId, chosenState, colleagues, comments, completeTask, cardData, managerMode)\n```\n\n# Parâmetros\n\n---\n\n**processId**\n\nA string do id do processo da nova solicitação.\n\n**chosenState**\n\nUm número inteiro representando o sequencial da atividade para qual será encaminhado a solicitação após o início. Deve ser um sequencial de atividade existente no processo *processId* e que seja uma atividade que receba um fluxo da atividade inicial.\n\nCaso seja enviado zero, será usado o sequencial da primeira atividade pós atividade inicial.\n\n**colleagues**\n\n```\n(opcional)\n```\n\nUma lista de strings com a(s) matrícula(s) dos usuários que irão receber a atividade.\n\nEste campo é opcional quando *completeTask* é **false** ou quando o mecanismo de atribuição da atividade destino (*chosenState*) possui apenas uma opção de destino.\n\n**comments**\n\n```\n(opcional)\n```\n\nUma string com comentários que serão adicionando junto com a abertura da solicitação.\n\nCaso não queira adicionar um comentário pode ser enviado **null** ou uma string vazia.\n\n**completeTask**\n\nUm booleano informando se a tarefa vai ser movimentada ou apenas salva.\n\nCaso *true*, a solicitação será salva com os comentários e dados de formulário informados e movimentada para a próxima atividade.\n\nCaso *false*, a solicitação será salva com os comentários e dados de formulário informados **mas** permanecerá na atividade inicial, sem movimentar.\n\n**cardData**\n\n```\n(opcional)\n```\n\nUma [mapa](../../Desenvolvimento de Processos/Motor de personalização/Características da programação no Rhino/Lidando com Mapa (Map) no Rhino.md) no Rhino.md) com os dados do formulário, composta por chave do tipo String com o nome do campo de formulário e valores do tipo String com o valor respectivo de cada campo.\n\nCaso não tenha formulário ou o formulário será preenchido posteriormente, pode ser enviado **null**.\n\n**managerMode**\n\nUm booleano informando se a tarefa vai ser movimentada como usuário gestor do processo.\n\nCaso *true* a tarefa é movimentada como usuário gestor.\n\nCaso *false* a tarefa é movimentada como usuário normal, responsável pela tarefa.\n\n# Valor de retorno\n\n---\n\nUm objeto [WorkflowSaveAndSendResultVO](../WorkflowSaveAndSendResultVO.md) com os dados da solicitação criada\n\n# Exemplos de uso\n\n---\n\n**Inicialização simples mantendo a solicitação na atividade inicial:**\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) {\n var processId = \"solicitacaoCompras\";\n\n var chosenState = 0;\n \n var users = new java.util.ArrayList();\n users.add(\"adm\");\n\n var comments = null;\n var completeTask = false;\n var formData = null;\n var managerMode = false;\n\n \n hAPI.startProcess(processId, chosenState, users, comments, completeTask, formData, managerMode);\n }\n}\n```\n\n**Inicialização simples movimentando a solicitação para a próxima atividade:**\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) {\n var processId = \"solicitacaoCompras\";\n\n var chosenState = 0; // só tem uma atividade possível após a atividade inicial\n \n var users = new java.util.ArrayList();\n users.add(\"adm\");\n\n var comments = null;\n var completeTask = true;\n var formData = null;\n var managerMode = false;\n\n \n hAPI.startProcess(processId, chosenState, users, comments, completeTask, formData, managerMode);\n }\n}\n```\n\n**Inicialização simples movimentando a solicitação para a próxima atividade, quando existe mais de uma opção:**\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) {\n var processId = \"solicitacaoCompras\";\n\n var chosenState = 4;\n \n var users = new java.util.ArrayList();\n users.add(\"adm\");\n\n var comments = null;\n var completeTask = true;\n var formData = null;\n var managerMode = false;\n\n \n hAPI.startProcess(processId, chosenState, users, comments, completeTask, formData, managerMode);\n }\n}\n```\n\n**Movimentando uma tarefa que tem mecanismo de atribuição \"para um Grupo\":**\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) {\n var processId = \"solicitacaoCompras\";\n\n var chosenState = 0;\n \n var users = new java.util.ArrayList();\n users.add(\"Pool:Group:Compras\"); // Compras é o id do grupo\n\n var comments = null;\n var completeTask = false;\n var formData = null;\n var managerMode = false;\n\n \n hAPI.startProcess(processId, chosenState, users, comments, completeTask, formData, managerMode);\n }\n}\n```\n\n**Movimentando uma tarefa que tem mecanismo de atribuição \"para um Papel\":**\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) {\n var processId = \"solicitacaoCompras\";\n\n var chosenState = 0;\n \n var users = new java.util.ArrayList();\n users.add(\"Pool:Role:Supervisao\"); // Supervisao é o id do papel\n\n var comments = null;\n var completeTask = false;\n var formData = null;\n var managerMode = false;\n\n \n hAPI.startProcess(processId, chosenState, users, comments, completeTask, formData, managerMode);\n }\n}\n```\n\n**Inicialização simples com dados de formulário:**\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) {\n var processId = \"solicitacaoCompras\";\n\n var chosenState = 0;\n \n var users = new java.util.ArrayList();\n users.add(\"adm\");\n\n var comments = null;\n var completeTask = true;\n\n    var formData = {\n   \"codigo\": \"1\",\n   \"nome\": \"João da Silva\"\n   };\n\n    var managerMode = false;\n\n \n hAPI.startProcess(processId, chosenState, users, comments, completeTask, formData, managerMode);\n }\n}\n```\n\n**Inicialização simples com dados de formulário com registro pai x filho:**\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) {\n var processId = \"solicitacaoCompras\";\n\n var chosenState = 0;\n \n var users = new java.util.ArrayList();\n users.add(\"adm\");\n\n var comments = null;\n var completeTask = true;\n\n    var formData = {\n   \"codigo\": \"1\",\n   \"nome\": \"João da Silva\",\n   \"email___1\": \"joao@mail.com\",\n   \"email___2\": \"joao.silva@mail.com\" \n   };\n\n    var managerMode = false;\n\n \n hAPI.startProcess(processId, chosenState, users, comments, completeTask, formData, managerMode);\n }\n}\n```\n\n**Adicionando comentários na inicialização da solicitação:**\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) {\n var processId = \"solicitacaoCompras\";\n\n var chosenState = 0;\n \n var users = new java.util.ArrayList();\n users.add(\"adm\");\n\n var comments = \"Solicitação criada automaticamente pelo fluig\";\n var completeTask = true;\n var formData = null;\n var managerMode = false;\n\n \n hAPI.startProcess(processId, chosenState, users, comments, completeTask, formData, managerMode);\n }\n}\n```" }, { "metadata": { "title": "processes.start", "source": "https://tdn.totvs.com/display/fluig/processes.start", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Processes\\processes.start.md" }, "content": "processes.start\n\n\nO método **start** do objeto [Processes](../Processes.md) inicia uma solicitação nova, podendo preencher dados e movimentar para a atividade seguinte selecionando quais os usuários irão receber a próxima atividade.\n\nA solicitação **sempre** será iniciada pelo usuário atual, que está movimentando a solicitação.\n\n# Sintaxe\n\n```\nprocesses.get(processId).start({\n \"chosenState\": chosenState, \n \"colleagues\": colleagues, \n \"comments\": comments, \n \"completeTask\": completeTask, \n \"formData\": formData, \n \"managerMode\": managerMode\n})\n```\n\n## Parâmetros\n\n### processId\n\nA string do id do processo da nova solicitação.\n\n### chosenState\n\n```\n(opcional) \n```\n\nUm número inteiro representando o sequencial da atividade para qual será encaminhado a solicitação após o início. Deve ser um sequencial de atividade existente no processo *processId* e que seja uma atividade que receba um fluxo da atividade inicial.\n\nCaso não seja enviado ou seja enviado zero, será usado o sequencial da primeira atividade pós atividade inicial.\n\n### colleagues\n\n```\n(opcional)\n```\n\nUma string ou uma [lista](https://tdn.totvs.com/pages/viewpage.action?pageId=781871855) de strings com a(s) matrícula(s) dos usuários que irão receber a atividade.\n\nEste campo é opcional quando *completeTask* é **false** ou quando o mecanismo de atribuição da atividade destino (*chosenState*) possui apenas uma opção de destino.\n\n### comments\n\n```\n(opcional)\n```\n\nUma string com comentários que serão adicionando junto com a abertura da solicitação.\n\nCaso não seja enviado ou seja enviado  **null** ou uma string vazia, nenhum comentário será adicionado.\n\n### completeTask" }, { "metadata": { "title": "processes.start", "source": "https://tdn.totvs.com/display/fluig/processes.start", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Processes\\processes.start.md" }, "content": "processes.start\n\n\n(opcional)\n\nUm booleano informando se a tarefa vai ser movimentada ou apenas salva.\n\nCaso *true*, a solicitação será salva com os comentários e dados de formulário informados e movimentada para a próxima atividade.\n\nCaso não seja informado ou seja *false*, a solicitação será salva com os comentários e dados de formulário informados **mas** permanecerá na atividade inicial, sem movimentar.\n\n### formData\n\n```\n(opcional)\n```\n\nUma [mapa](https://tdn.totvs.com/pages/viewpage.action?pageId=781871856) com os dados do formulário, composta por chave do tipo String com o nome do campo de formulário e valores do tipo String com o valor respectivo de cada campo.\n\n### managerMode\n\n```\n(opcional)\n```\n\nUm booleano informando se a tarefa vai ser movimentada como usuário gestor do processo.\n\nCaso *true* a tarefa é movimentada como usuário gestor.\n\nCaso não seja informado ou seja *false* a tarefa é movimentada como usuário normal, responsável pela tarefa.\n\n## Valor de retorno\n\nUm objeto [MovementResultVO](../Objetos de entrada e retorno/MovementResultVO.md) com os dados da solicitação criada\n\n# Exemplos de uso\n\n## Inicialização simples mantendo a solicitação na atividade inicial\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) { \n\n processes.get(\"solicitacaoCompras\").start({\n      colleagues: \"adm\" // ou [\"adm\"]\n });\n }\n}\n```\n\n## Inicialização simples movimentando a solicitação para a próxima atividade\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) { \n processes.get(\"solicitacaoCompras\").start({\n      colleagues: \"adm\", // ou [\"adm\"]\n completeTask: true\n });\n }\n}\n```\n\n## Inicialização simples movimentando a solicitação para a próxima atividade, quando existe mais de uma opção" }, { "metadata": { "title": "processes.start", "source": "https://tdn.totvs.com/display/fluig/processes.start", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Processes\\processes.start.md" }, "content": "processes.start\n\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) { \n processes.get(\"solicitacaoCompras\").start({\n    chosenState: 4,\n      colleagues: \"adm\", // ou [\"adm\"]\n completeTask: true\n });\n }\n}\n```\n\n## Movimentando uma tarefa que tem mecanismo de atribuição \"para um Grupo\"\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) {\n processes.get(\"solicitacaoCompras\").start({\n    chosenState: 4,\n colleagues: \"Pool:Group:Compras\", // ou [\"Pool:Group:Compras\"], onde Compras é o id do grupo\n completeTask: true\n });\n }\n}\n```\n\n## Movimentando uma tarefa que tem mecanismo de atribuição \"para um Papel\"\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) {\n processes.get(\"solicitacaoCompras\").start({\n      chosenState: 4,\n colleagues: \"Pool:Role:Supervisao\", // ou [\"Pool:Role:Supervisao\"], onde Supervisao é o id do papel\n completeTask: true\n });\n }\n}\n```\n\n## Inicialização simples com dados de formulário\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) { \n processes.get(\"solicitacaoCompras\").start({\n    colleagues: \"adm\", // ou [\"adm\"]\n completeTask: true,\n formData: {\n   \"codigo\": \"1\",\n   \"nome\": \"João da Silva\"\n   }\n });\n }\n}\n```\n\n## Inicialização simples com dados de formulário com registro pai x filho\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) { \n processes.get(\"solicitacaoCompras\").start({\n      colleagues: \"adm\", // ou [\"adm\"]\n completeTask: true,\n formData: {\n   \"codigo\": \"1\",\n   \"nome\": \"João da Silva\",\n   \"email___1\": \"joao@mail.com\",\n   \"email___2\": \"joao.silva@mail.com\" \n   }\n });\n }\n}\n```\n\n## Adicionando comentários na inicialização da solicitação" }, { "metadata": { "title": "processes.start", "source": "https://tdn.totvs.com/display/fluig/processes.start", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Documentação para desenvolvedores Fluig\\Processes\\processes.start.md" }, "content": "processes.start\n\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) { \n processes.get(\"solicitacaoCompras\").start({\n      colleagues: \"adm\", // ou [\"adm\"]\n comments: \"Solicitação criada automaticamente pelo fluig\",\n completeTask: true\n });\n }\n}\n```\n\n## Movimentando para uma atividade em consenso para múltiplos usuários\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 5) { \n processes.get(\"solicitacaoCompras\").start({\n    colleagues: [\"adm\", \"supervisor\", \"gestor\" /*, ... */],\n completeTask: true\n });\n }\n}\n```" }, { "metadata": { "title": "Skills - profissionais fluig Serviços", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=145363504", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Serviços\\Skills - profissionais fluig Serviços.md" }, "content": "Skills - profissionais fluig Serviços" }, { "metadata": { "title": "Skills - profissionais fluig Serviços", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=145363504", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Serviços\\Skills - profissionais fluig Serviços.md" }, "content": "Skills - profissionais fluig Serviços\n\n\nNa matriz abaixo descrevemos os skills necessários para profissionais que desejam trabalhar na entrega e no desenvolvimento de projetos Fluig\n\n| | | | |\n| --- | --- | --- | --- |\n| Fase Projeto Fluig | Papel Envolvido no Projeto | Principais Atividades | Profissionais de Mercado e Conhecimentos |\n| Gestão do Projeto | Gerente de Projeto | Gerenciar atividades do projeto | Gerente de projeto de softwares |\n| Levantamento e Especificação | Arquiteto de Soluções | - Levantar requisitos de projeto junto ao cliente de forma que subsidiem o desenvolvimento da solução - Identificar a(s) necessidade(s) do cliente, elaborar descritivo técnico, planejar e avaliar o escopo do projeto - Elaborar e apresentar propostas técnicas desenvolvidas para clientes. - Mapeamento da vantagem competitiva da solução e do serviço ofertado frente ao concorrente, de forma a garantir a diferenciação na proposição de valor e a melhor adequação a necessidade do cliente. | Arquiteto de Soluções com conhecimentos em Desenvolvimento Web, banco de dados, infraestrutura, sistemas operacionais (Windows e Linux), redes, sistemas e virtualização (Vmware e Hyper-V) e estruturas de backup e storage |\n| Instalação | Consultor Técnico Instalação | - Instalação do Fluig - Instalação do Fluig Identity - Configuração do Fluig Identity (AD e Produtos TOTVS) - Criação de Base de Dados Fluig - Configuração Rede (DMZ, DNS, SSL) - Alta disponibilidade (Tomcat, BigIP) | Analista de Suporte, Analista de Help Desk, DBA, Especialista de Redes |\n| Implantação - Configuração Fluig Plataforma | Consultor de Implantação | - Configuração do ECM, BPM, WCM, SOCIAL | Analista de Suporte, Analista de Help Desk, Analista de ERP |\n| Implantação - WCM e BPM | Desenvolvedor Web | - Desenvolvimento de formulários HTML complexos com responsividade (mobile), layouts WCM customizados em HTML, relatórios BIRT e JavaScript, widgets WCM customizados HTML e Javascript, acesso a Web Services SOPA e Rest | Desenvolvedor Web (HTML, Javascript, JQuery, CSS, Bootstrap, SOAP Webservices, Rest, XML) |\n| Implantação - Desenvolvimento Identity | Desenvolvedor Identity | - Desenvolvimento de integrações específicas com sistemas | Analista de Sistema (SOAP Webservices, Rest, XML. Protocolos SAML e SCIM) |\n| Implantação - Desenvolvimento ESB | Desenvolvedor Integração | - Desenvolvimento de componentes de Integração com sistemas (componente CUSTOM) | Desenvolvedor Java (SOAP Webservices, Rest, XML, XSLT, TCL) |" }, { "metadata": { "title": "Comandos Freemarker (FTL) no Studio", "source": "https://tdn.totvs.com/display/fluig/Comandos+Freemarker+%28FTL%29+no+Studio", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Comandos Freemarker (FTL) no Studio.md" }, "content": "Comandos Freemarker (FTL) no Studio" }, { "metadata": { "title": "Comandos Freemarker (FTL) no Studio", "source": "https://tdn.totvs.com/display/fluig/Comandos+Freemarker+%28FTL%29+no+Studio", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Comandos Freemarker (FTL) no Studio.md" }, "content": "Comandos Freemarker (FTL) no Studio\n\n\n# Índice\n\n- 1 [Objetivo](#ComandosFreemarker(FTL)noStudio-Objetivo)\n- 2 [Comandos](#ComandosFreemarker(FTL)noStudio-Comandos)\n\n# Objetivo\n\nO objetivo deste guia é apresentar alguns comandos do Freemarker que podem ser utilizados no fluig Studio.\n\n# Comandos\n\nA seguir são apresentados os comandos e sua utilização:\n\n| Comando | Descrição |\n| --- | --- |\n| @wcm.header | Macro especial do fluig, insere o cabeçalho no *layout*. Veja mais em [Biblioteca WCM](http://tdn.totvs.com/display/fluig/Biblioteca+WCM). |\n| @wcm.menu | Macro especial do fluig, insere o menu no *layout*. Veja mais em [Biblioteca WCM](../../Recurso de Páginas e Widgets (WCM).md)/Construção de Widgets e Layouts/Layouts/Desenvolvimento de layouts personalizados/Biblioteca WCM.md). |\n| @wcm.renderSlot | Macro especial do fluig, insere um *slot* no *layout*. Veja mais em [Biblioteca WCM](../../Recurso de Páginas e Widgets (WCM).md)/Construção de Widgets e Layouts/Layouts/Desenvolvimento de layouts personalizados/Biblioteca WCM.md). |\n| @wcm.footer | Macro especial do fluig, insere o rodapé no layout. Veja mais em [Biblioteca WCM](../../Recurso de Páginas e Widgets (WCM).md)/Construção de Widgets e Layouts/Layouts/Desenvolvimento de layouts personalizados/Biblioteca WCM.md). |\n| assign | Cria uma variável, ou substitui uma variável existente, veja mais em *[Assign](http://freemarker.org/docs/ref_directive_assign.html#ref.directive.assign)*. |\n| attempt | Faz com que a página renderize, mesmo que uma parte da renderização falhe. Veja mais em *[Attempt](http://freemarker.org/docs/ref_directive_attempt.html#ref.directive.attempt)*. |\n| break | Veja *[Switch](https://tdn.totvs.com/pages/viewpage.action?pageId=185748598)* ou *[List](https://tdn.totvs.com/pages/viewpage.action?pageId=185748598)*. |\n| case | Veja *[Switch](https://tdn.totvs.com/pages/viewpage.action?pageId=185748598)*. |\n| compress | Remove espaços em branco desnecessários. Veja mais em *[Compress](http://freemarker.org/docs/ref_directive_compress.html#ref.directive.compress)*. |\n| default | Veja *[Switch](https://tdn.totvs.com/pages/viewpage.action?pageId=185748598)*. |\n| else / elseif | Veja *[If](https://tdn.totvs.com/pages/viewpage.action?pageId=185748598)*. |\n| function | Cria um método. Se o método não contém um retorno, então é retornada uma variável *undefined*. Veja mais em *[Function](http://freemarker.org/docs/ref_directive_function.html#ref.directive.function)*. |\n| flush | Quando o Freemarker gera o *output*, geralmente ele guarda esse *output* gerado e envia para o *client* em um ou mais pedaços. Esse ato se chama fazer o *flush*. Normalmente ele ocorre automaticamente. Veja mais em *[Flush](http://freemarker.org/docs/ref_directive_flush.html#ref.directive.flush)*. |\n| global if | Você pode utilizar as diretivas *if*, *elseif* e *else* para condicionalmente pular uma seção do template. As condições devem traduzir para um valor *booleano*, caso contrário, um erro irá interromper o processamento do *template*. Os *elseif* e *else* devem ocorrer dentro de um *if* (ou seja, entre as tags de inicio e fim do *If*). O *if* pode conter qualquer numero de *elseif* (incluindo 0) e, no final, opcionalmente, um *else*. Veja mais em [If](http://freemarker.org/docs/ref_directive_if.html#ref.directive.if). |\n| import | Importa uma biblioteca. Veja mais em *[Import](http://freemarker.org/docs/ref_directive_import.html#ref.directive.import)* e [Criar uma biblioteca personalizada](../../Recurso de Páginas e Widgets (WCM).md)/Construção de Widgets e Layouts/Layouts/Desenvolvimento de layouts personalizados/Criar uma biblioteca personalizada.md). |\n| include | Inclui outro *template* Freemarker dentro do seu *template*. Veja mais em *[Include](http://freemarker.org/docs/ref_directive_include.html#ref.directive.include)*. |\n| list | Processa uma seção de *template* para cada variável contida dentro de uma sequência. Veja mais em *[List](http://freemarker.org/docs/ref_directive_list.html#ref.directive.list)*. |\n| local | Cria ou substitui uma variável local. Funciona apenas dentro de uma [Macro](https://tdn.totvs.com/pages/viewpage.action?pageId=185748598) ou *[Function](https://tdn.totvs.com/pages/viewpage.action?pageId=185748598)*. Veja mais em [Local](http://freemarker.org/docs/ref_directive_local.html#ref.directive.local). |\n| lt | *Left Trim*: ignora todos os espaços em branco precedentes na linha. Veja mais em [LT](http://freemarker.org/docs/ref_directive_t.html#ref.directive.lt). |\n| macro | Cria uma variável de macro. Veja mais em [Macro](http://freemarker.org/docs/ref_directive_macro.html#ref.directive.macro) e [Criar uma biblioteca personalizada](../../Recurso de Páginas e Widgets (WCM).md)/Construção de Widgets e Layouts/Layouts/Desenvolvimento de layouts personalizados/Criar uma biblioteca personalizada.md). |\n| nested | Executa o fragmento do *template*. Veja a diretiva [Macro](https://tdn.totvs.com/pages/viewpage.action?pageId=185748598). |\n| nt | *No Trim*: desabilita a remoção de espaços em branco na linha onde ele é utilizado. Ele também desabilita os efeitos de outras diretivas de *trim*. Veja mais em [NT](http://freemarker.org/docs/ref_directive_nt.html#ref.directive.nt). |\n| recover | Veja *[Attempt](https://tdn.totvs.com/pages/viewpage.action?pageId=185748598)*. O bloco de *recover* é executado no lugar do bloco *attempt*. Caso nenhum erro ocorra durante a execução do bloco *attempt* então o bloco *recover* é ignorado. |\n| recurse | Percorre todos os nós filhos de um nó. Veja mais em *[Recurse](http://freemarker.org/docs/ref_directive_visit.html#ref.directive.recurse)*. |\n| return | Veja [Macro](https://tdn.totvs.com/pages/viewpage.action?pageId=185748598) e *[Function](https://tdn.totvs.com/pages/viewpage.action?pageId=185748598)*. |\n| rt | *Right Trim*: ignora todos os espaços em branco procedentes na linha. Veja mais em [RT](http://freemarker.org/docs/ref_directive_t.html#ref.directive.rt). |\n| stop | Interrompe o processo de renderização do *template*. Veja mais em *[Stop](http://freemarker.org/docs/ref_directive_stop.html#ref.directive.stop)*. |\n| switch | *Switch* é utilizado para selecionar um fragmento do template dependendo do valor de uma expressão. Veja mais em *[Switch](http://freemarker.org/docs/ref_directive_switch.html#ref.directive.switch)*. |\n| t | *Trim*: ignora os espaços em branco precedentes e procedentes na linha. Veja mais em [T](http://freemarker.org/docs/ref_directive_t.html#ref.directive). |" }, { "metadata": { "title": "Como criar um diagrama no fluig Studio", "source": "https://tdn.totvs.com/display/fluig/Como+criar+um+diagrama+no+fluig+Studio", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Como criar um diagrama no fluig Studio.md" }, "content": "Como criar um diagrama no fluig Studio" }, { "metadata": { "title": "Como criar um diagrama no fluig Studio", "source": "https://tdn.totvs.com/display/fluig/Como+criar+um+diagrama+no+fluig+Studio", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Como criar um diagrama no fluig Studio.md" }, "content": "Como criar um diagrama no fluig Studio\n\n\n# Índice\n\n- 1 [Objetivo](#ComocriarumdiagramanofluigStudio-Objetivo)\n- 2 [Criando um diagrama](#ComocriarumdiagramanofluigStudio-Criandoumdiagrama)\n\n# Objetivo\n\nO objetivo deste guia é apresentar os procedimentos necessários para criar um diagrama no fluig Studio.\n\nA modelagem de processos de negócio consiste na representação dos processos internos da empresa, através de modelagem gráfica (diagramas). Esta tem por finalidade facilitar e apoiar a gestão de processos de negócios para usuários técnicos e/ou usuários de negócio de maneira intuitiva.\n\nOs processos, que podem ser remodelados para otimização quando se julgar necessário, são basicamente compostos por atividades e fluxos dentre outros componentes gráficos que permitem a fácil composição dos diagramas de processos. A modelagem do diagrama também pode ser realizada de maneira *offline*, pois é possível exportar o processo posteriormente para o servidor fluig, iniciando assim a visualização e movimentação de tarefas no portal web.\n\n# Criando um diagrama\n\nNota\n\nAntes de criar um diagrama, é necessário [criar um projeto fluig no Studio](Criando um projeto fluig no Studio.md).\n\nA seguir são apresentados os passos necessários para a criação de um diagrama no fluig Studio:\n\n- Com o projeto criado, basta criar o diagrama propriamente dito. Expanda o objeto recém criado.\n\n- Expanda a pasta *workflow* e clique com o botão esquerdo do *mouse*. No menu de contexto que surge, selecione o menu “Novo/New” e a opção “Diagrama Fluig”.\n\n![](..\\..\\..\\images\\Screenshot%2015_06%20002.png)\n\n**Figura 1 - Opção Diagrama de processo fluig**\n\n- Na tela apresentada, basta informar o nome do processo e o servidor que você pretende utilizar para obtenção dos dados de modelagem.\n\n![](..\\..\\..\\images\\2.png)\n\n**Figura 2 - Janela Criação de diagrama fluig**\n\n- Confirme os dados. Depois disso seu diagrama estará criado e pronto para modelagem.\n\n![](..\\..\\..\\images\\3.png)\n\n**Figura 3 - Criação do diagrama concluída**" }, { "metadata": { "title": "Configuração de Processos com Componentes Avançados (BPMN 2.0)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126714181", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0).md" }, "content": "Configuração de Processos com Componentes Avançados (BPMN 2.0)" }, { "metadata": { "title": "Configuração de Processos com Componentes Avançados (BPMN 2.0)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126714181", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0).md" }, "content": "Configuração de Processos com Componentes Avançados (BPMN 2.0)\n\n\n# Índice\n\n- 1 [Introdução](#ConfiguraçãodeProcessoscomComponentesAvançados(BPMN2.0)-Introdução)\n- 2 [Script condicional](#ConfiguraçãodeProcessoscomComponentesAvançados(BPMN2.0)-Scriptcondicional)\n- 3 [Sinal](#ConfiguraçãodeProcessoscomComponentesAvançados(BPMN2.0)-Sinal)\n\n# Introdução\n\nUma das novos recursos do Fluig é a possibilidade de utilizar todo um conjunto de novos componentes vindos da notação BPMN 2.0 permitindo não apenas a automação de um processo como também permite a documentação do mesmo para a organização . Esses novos componentes permitem a extensão de funcionalidades já criadas com os antigos componentes e podem ser acessados utilizando o botão BPMN Extendido localizada na barra de ferramentas da sua IDE. Este botão permite alternar entre os modos **Principal** e **Extendido**. Ao ser pressionado este botão terá efeito imediato sobre a palheta de componentes de modelagem de processo .\n\n![](..\\..\\..\\images\\image2014-2-25%20172424.png)\n\nAo acessar o modo **BPMN Extendido**você terá um acréscimo de mais 33 novos elementos que poderão ser utilizados em qualquer processo Fluig que você tenha em sua organização hoje estendendo as funcionalidades do mesmo .\n\n# Script condicional\n\nUm dos novos conceitos existentes no BPMN 2.0 foi a adoção de scripts condicionais. Scripts condicionais são desenvolvidos usando a linguagem javascript e permitem ao Fluig consultar serviços externos permitindo a criação de processos mais elaborados. Scripts condicionais geralmente estão atrelados a agendadores que determinam o período ou a frequência no qual esses scripts serão executados. Quando o script conseguir retornar um valor lógico igual a true significa que o script foi executado com sucesso movimentando as solicitações workflow de acordo com elemento de modelagem utilizado. Maiores detalhes sob como funciona e exemplos de uso podem ser encontrados neste artigo dedicado a [scripts condicionais](Configuração de Processos com Componentes Avançados (BPMN 2.0).md)/Scripts Condicionais.md).\n\n# Sinal\n\nSinais é uma nova forma de comunicação entre processos criado para o fluig. Utilizando sinais é possível que um processo mova ou inicie uma ou mais solicitações workflow de acordo com o sinal configurado. A melhor forma de descrever o funcionamento do mesmo com um exemplo . No processo abaixo temos um processo de venda de automóvel em que o cliente acabou de confirmar a compra do mesmo. A atividade seguinte a atividade de compra é um evento intermediário de envio de sinal que possui um sinal chamado \"VendaEfetivada\" configurada.\n\n![](..\\..\\..\\images\\processovenda.png)\n\nO evento intermediário emite o sinal e avança imediatamente para a próxima atividade permitindo ao cliente retirar imediatamente o seu automóvel.  A empresa que vendeu o carro possui um setor de seguros que tem um processo integrado por sinal . Aguarda a confirmação da compra do cliente para imediatamente começar a montar a apólice do seguro e procurar o cliente oferecendo o seguro para o automóvel.\n\n![](..\\..\\..\\images\\processoseguro.png)\n\nO processo do setor de seguros possui um evento inicial de recepção de sinal . Toda vez que a loja confirma a venda de automóvel automáticamente é aberta uma nova solicitação de workflow no processo de seguros que pouco tempo depois já procura o cliente para oferecer uma proposta de seguro .\n\nNeste meio tempo a fábrica de automóveis que já tem automóveis prontos no estoque também está monitorando o mesmo sinal enviado pela loja e movimenta o seu processo de repor os automóveis da loja.\n\n![](..\\..\\..\\images\\processofabrica.png)\n\nApenas configurando os sinais que os eventos estão operando é possível criar um novo tipo de integração entre diferentes processos de diferentes setores sem necessidade nenhuma de programação ou customização adicional.\n\nObservação\n\nPara o completo entendimento deste guia é necessário que o utilizador tenha conhecimento sólido sobre o modo BPMN Principal. Caso contrário solicite treinamento na Academia TOTVS." }, { "metadata": { "title": "Configuração para uso inicial do Fluig Studio", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=172297237", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração para uso inicial do Fluig Studio.md" }, "content": "Configuração para uso inicial do Fluig Studio" }, { "metadata": { "title": "Configuração para uso inicial do Fluig Studio", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=172297237", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração para uso inicial do Fluig Studio.md" }, "content": "Configuração para uso inicial do Fluig Studio\n\n\n# Índice\n\n- 1 [Introdução](#ConfiguraçãoparausoinicialdoFluigStudio-Introdução)\n- 2 [Performance](#ConfiguraçãoparausoinicialdoFluigStudio-Performance)\n- 3 [Alteração do código de página](#ConfiguraçãoparausoinicialdoFluigStudio-Alteraçãodocódigodepágina)\n- 4 [Definir tempo de espera pelo retorno do servidor (timeout)](#ConfiguraçãoparausoinicialdoFluigStudio-Definirtempodeesperapeloretornodoservidor(timeout))\n\n# Introdução\n\nPara a boa utilização do Fluig Studio, algumas configurações são necessárias. Uma delas é referente ao \"Código de página\", \"Codificação de caracteres\" ou \"*encoding*\".  Para mais informações sobre *encoding*, [clique aqui](http://www.w3.org/International/questions/qa-what-is-encoding.pt-br.php).\n\n# Performance\n\nÉ recomendado verificar as definições de memória configuradas para o ambiente em que o Fluig Studio será  executado.\n\nEstas configurações podem ser acessadas na raiz da pasta de instalação do ambiente de desenvolvimento.\n\nSe for utilizado o Eclipse, o nome do arquivo é eclipse.ini, e caso esteja sendo utilizado o TOTVS Developer Studio (TDS), o arquivo a ser verificado é o developerStudio.ini.\n\nNeste arquivo, recomenda-se incluir / alterar as configuração conforme abaixo. Desta forma evitam-se possíveis falhas por falta de memória e obtém-se uma experiência mais fluída com a plataforma.\n\n```\n--launcher.XXMaxPermSize\n512m\n-Xms128m\n-Xmx1024m\n```\n\n# Alteração do código de página\n\nO Fluig Studio para Windows vem com a codificação Cp1252 como padrão, o que pode gerar diversas inconsistências dependendo das configurações utilizadas no servidor. Por isso, deve-se alterar as configurações da sua *workspace* para utilizar como padrão a codificação **UTF-8**.\n\nPara alterar a codificação, no menu superior acesse **Janela** > **Preferências**.\n\nNa tela de preferências, selecione **Geral** > **Espaço de trabalho** e em **Codificação de Arquivo de Texto** selecione **Outra**e informe **UTF-8**. Caso seu Fluig Studio esteja em inglês, o caminho é **Windows** > **Preferences** > **General** > **Workspace** e em **Text file encoding** altere para **Other** e **UTF-8**.\n\n![](..\\..\\..\\images\\image_fileencoding.jpg)\n\n# Definir tempo de espera pelo retorno do servidor (*timeout*)\n\nNa janela de preferências do fluig Studio é possível definir o tempo de espera de retorno do servidor (*timeout*), ou seja, o tempo que a ferramenta irá aguardar por uma resposta quando for realizada uma requisição para o servidor.\n\nEsse parâmetro se aplica a todos os acessos que o plugin fluig Studio faz via *Web Service*s ou SOAP ao servidor do fluig, seja através de processos, formulários, eventos, datasets, serviços, mecanismos customizados, consultas de usuários, papéis ou grupos.\n\n![](..\\..\\..\\images\\timeout.png)" }, { "metadata": { "title": "Criando um projeto fluig no Studio", "source": "https://tdn.totvs.com/display/fluig/Criando+um+projeto+fluig+no+Studio", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Criando um projeto fluig no Studio.md" }, "content": "Criando um projeto fluig no Studio\n\n\n# Índice\n\n- 1 [Objetivo](#CriandoumprojetofluignoStudio-Objetivo)\n- 2 [Pré-requisito](#CriandoumprojetofluignoStudio-Pré-requisito)\n- 3 [Acessando perspectiva fluig](#CriandoumprojetofluignoStudio-Acessandoperspectivafluig)\n - 3.1 [Cadastrando o servidor fluig](#CriandoumprojetofluignoStudio-Cadastrandooservidorfluig)\n - 3.2 [Criando um projeto fluig](#CriandoumprojetofluignoStudio-Criandoumprojetofluig)\n\n# Objetivo\n\nO objetivo desse guia é apresentar os passos necessários para criar um projeto fluig no Studio.\n\n# Pré-requisito\n\nÉ necessário instalar o [fluig Studio](../../Instalação e Atualização/Guia de instalação Fluig Studio.md) para criar seu projeto fluig.\n\n# Acessando perspectiva fluig\n\nPara acessar a perspectiva fluig, efetue os passos a seguir:\n\nApós instalar o fluig Studio, acesse a perspectiva fluig de trabalho. Para isso, acesse o menu “Janela”, depois “Abrir perspectiva” e, por fim, acesse o item “outras “.\n\n![](..\\..\\..\\images\\a1.png)\n\n**Figura 1 - Abrir perspectiva**\n\nNa tela exibida, selecione a perspectiva “fluig” e confirme a opção.\n\n![](..\\..\\..\\images\\a2.png)\n\n**Figura 2 - Perspectiva fluig**\n\n## Cadastrando o servidor fluig" }, { "metadata": { "title": "Criando um projeto fluig no Studio", "source": "https://tdn.totvs.com/display/fluig/Criando+um+projeto+fluig+no+Studio", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Criando um projeto fluig no Studio.md" }, "content": "Criando um projeto fluig no Studio\n\n\nPara cadastrar o servidor fluig, efetue os passos a seguir:\n\nCom a perspectiva fluig aberta, o primeiro passo recomendado é o cadastro do fluig *Server*. Para cadastrar um servidor, acesse a aba de servidores do fluig chamada \"fluig *Servers*\". Sobre o ícone da lista de servidores, clique com o botão direito do *mouse*, abrindo o menu de contexto selecione o submenu “fluig” e, por fim, a opção “fluig *Server*”.\n\n![](..\\..\\..\\images\\b1.png)\n\n**Figura 1 - Opção fluig *Server***\n\nInforme os dados solicitados conforme apresentado na figura abaixo. Forneça o endereço *host* (IP ou nome DNS válido), SSL (opcional), porta, usuário e senha.\n\nIntegração com fluig Identity\n\nCaso tenha configurada a autenticação integrada com o fluig Identity, forneça o endereço de email e senha de acesso ao Identity nos campos Usuário e Senha para conexão ao servidor fluig.\n\n![](..\\..\\..\\images\\Captura%20de%20Tela%2015_12%20001.png)\n\n**Figura 3 - Dados do servidor**\n\nConfirme o cadastro e acione duplo clique no servidor recém cadastrado para verificar o acesso da IDE a ele. Depois, uma mensagem será exibida confirmando que a operação foi bem sucedida.\n\n![](..\\..\\..\\images\\servidor_fluig_conectado.png)\n\n**Figura 4 - Confirmação de conexão com o servidor criado**\n\n## Criando um projeto fluig\n\nEfetue os passos a seguir para criar um projeto fluig:\n\nAgora vamos criar um projeto fluig que irá abrigar processos *workflow*, formulários, relatórios e *scripts* de desenvolvimento sobre a plataforma. Para criar um projeto fluig, acesse a aba “Explorador de pacote” ou “*Package Explorer*” e clique com o botão esquerdo do mouse na área em branco do explorador de pacotes. Então, selecione o menu “Novo” e o item “Projeto fluig”, conforme a figura abaixo:\n\n![](..\\..\\..\\images\\c1.png)\n\n**Figura 1 - Aba Explorador de pacote**\n\nInforme o nome do seu projeto e clique em Concluir.\n\n![](..\\..\\..\\images\\c2.png)\n\n**Figura 2 - Novo projeto fluig**" }, { "metadata": { "title": "Fluig Studio para outros idiomas", "source": "https://tdn.totvs.com/display/fluig/Fluig+Studio+para+outros+idiomas", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Fluig Studio para outros idiomas.md" }, "content": "Fluig Studio para outros idiomas\n\n\n# Alterar idioma do fluig Studio\n\nO idioma padrão do fluig Studio é o Português. Contudo é possível ativar a tradução tanto para o Inglês como para o Espanhol.\n\n### Configurar idioma" }, { "metadata": { "title": "Fluig Studio para outros idiomas", "source": "https://tdn.totvs.com/display/fluig/Fluig+Studio+para+outros+idiomas", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Fluig Studio para outros idiomas.md" }, "content": "Fluig Studio para outros idiomas\n\n\nSiga o procedimento a seguir para alterar o idioma utilizado:\n\n- 1. No Studio, acesse menu ***Help | Install new software***. \n \n ![](..\\..\\..\\images\\ide500.png)\n 2. *No campo **Work with:***, informe o endereço do projeto \"Babel\", que é o responsável pelo gerenciamento de internacionalização do Eclipse. Escolha o update site conforme sua versão do Eclipse no site \n 3. Localize o adicional ***Babel Language Packs for eclipse*** e expanda-o;\n 4. No item expandido, selecione os idiomas desejados;\n 5. Acione ***Next*** e prossiga com as instruções fornecidas;\n 6. Ao solicitar a reinicialização, ***não*** o faça.\n 7. Encerre o *TOTVS | Developer Studio*;\n\nAinda não acabou\n\nO procedimento de configuração ainda não acabou.\n\nÉ possível prosseguir de duas maneiras diferentes, veja na sequência duas formas alternativas para prosseguir.\n\n- A primeira alternativa é alterando o arquivo *developerStudio.ini* (eclipse.ini para Eclipse Keppler) adicionando os parâmetros *Duser.language* e Duser.country, informe o idioma desejado:\n\n **Espanhol**\n\n ```\n -Duser.language=es\n -Duser.country=ES\n ```\n\n **Inglês**\n\n ```\n -Duser.language=en\n -Duser.country=US\n ```\n\n **Português (Brasil)**\n\n ```\n -Duser.language=pt\n -Duser.country=BR\n ```\n\n Inicie o Studio normalmente.\n\n- A segunda alternativa é editar o atalho (conforme seu sistema operacional), acrescentando o parâmetro *-nl locale* (localização) na linha de comando;\n\n![](..\\..\\..\\images\\ide501.png)\n\n- *O parâmetro de inicialização nl*, necessita da informação *locale*, que indica qual o idioma a ser utilizado. Este valor é composto por uma ou mais siglas, que formam um código. O *TOTVS | Developer Studio*suporta os seguintes idiomas com seus respectivos códigos.\n\n | | |\n | --- | --- |\n | **Idioma** | **Exeplo de linha de comando** |\n | Português (Brasil) | eclipse.exe -nl pt\\_BR |\n | Inglês | eclipse.exe -nl en\\_US |\n | Espanhol | eclipse.exe -nl es\\_ES |\n\nInicie o Studio normalmente.\n\nObservação\n\nAlguns menus poderão ficar indisponíveis após a instalação do Eclipse Babel e do Plugin Fluig (Ex: Menu de Importação, Lista de perspectivas, Menu \"novo\"). Caso isso aconteça verifique a presença de pacotes RAP dentro dos plugins instalados em seu eclipse. Em alguns casos é necessário remover estes pacotes para que os menus voltem a funcionar no idioma em que a IDE esteja trabalhando . Abaixo segue um exemplo de um pacote rap que poderá causar este problema . Este pacote poderá vir junto com a instalação do plugin Babel.\n\n![](..\\..\\..\\images\\trad.png)" }, { "metadata": { "title": "Gerando a página de documentação de processos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126718685", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Gerando a página de documentação de processos.md" }, "content": "Gerando a página de documentação de processos" }, { "metadata": { "title": "Gerando a página de documentação de processos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126718685", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Gerando a página de documentação de processos.md" }, "content": "Gerando a página de documentação de processos\n\n\n# Índice\n\n- 1 [Introdução](#Gerandoapáginadedocumentaçãodeprocessos-Introdução)\n- 2 [Gerando o site](#Gerandoapáginadedocumentaçãodeprocessos-Gerandoosite)\n- 3 [Campos de Extensão para entidades de processo](#Gerandoapáginadedocumentaçãodeprocessos-CamposdeExtensãoparaentidadesdeprocesso)\n\n# Introdução\n\nCom a introdução do Fluig Studio e da adoção da notação BPMN 2.0, a plataforma Fluig passou a oferecer a possibilidade de documentar detalhadamente os processos existentes dentro de uma organização. Partindo desta premissa a plataforma Fluig está oferecendo agora a geração da documentação de processos em forma de página Web permitindo que o modelador/documentador de processos publique essa página aonde ele achar adequado oferecendo o acesso a informação aonde ele for solicitado.\n\n![](..\\..\\..\\images\\image2014-3-6%20144947.png)\n\n# Gerando o site\n\nGerar o site de documentação de processos é um processo simples. No Explorador de pacotes clique com o botão esquerdo em qualquer pasta do seu projeto Fluig e selecione a opção Exportar que aparece no menu de contexto .\n\n![](..\\..\\..\\images\\image2014-3-6%20145613.png)\n\nNas opções de exportação abra a pasta \"Fluig\" e selecione a opção \"Exportar Projeto para o formato de site\" .\n\n![](..\\..\\..\\images\\image2014-3-6%20145821.png)\n\nConfirme a informação e o site será gerado abrindo a página com o Navegador Web padrão da máquina .\n\nVale lembrar que cada projeto Fluig terá apenas um site e este site listará todos os diagramas de processo existentes na pasta \"workflow/diagrams\" do projeto em questão .\n\n# Campos de Extensão para entidades de processo\n\nPara cada entidade existente dentro do diagrama (e para o próprio diagrama) é possível criar campos de extensão que permitem documentar de forma mais detalhada um diagrama ou uma atividade do mesmo dentro da página de documento (site) . Para cadastrar campos de extensão para as entidades basta acessar a seção de \"**Extensão**\" dentro das propriedades do elemento. Nessa seção a quantidade e o tipo de campos necessários de acordo com a necessidade do seu negócio.\n\n![](..\\..\\..\\images\\image2014-3-6%20152330.png)\n\nAo clicar na atividade dentro do site gerado esses campos estarão incluídos na documentação da entidade .\n\n![](..\\..\\..\\images\\image2014-3-6%20152513.png)\n\nNas atividades sem campos extensão associados apenas o código e a descrição da tarefa serão exibidos dentro desta tela de detalhamento ." }, { "metadata": { "title": "Importação e Exportação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239039127", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação.md" }, "content": "Importação e Exportação" }, { "metadata": { "title": "Visualização de Datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239021220", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Visualização de Datasets.md" }, "content": "Visualização de Datasets" }, { "metadata": { "title": "Visualização de Datasets", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239021220", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Visualização de Datasets.md" }, "content": "Visualização de Datasets\n\n\n# Índice\n\n- 1 [Objetivo](#VisualizaçãodeDatasets-Objetivo)\n- 2 [Pré-requisitos](#VisualizaçãodeDatasets-Pré-requisitos)\n- 3 [Consultando Datasets](#VisualizaçãodeDatasets-ConsultandoDatasets)\n- 4 [Desenvolvimento de Datasets sobre a Plataforma](#VisualizaçãodeDatasets-DesenvolvimentodeDatasetssobreaPlataforma)\n\n# Objetivo\n\nEste guia tem o objetivo de apresentar uma visão geral da consulta e desenvolvimento de datasets com o fluig Studio.\n\n# Pré-requisitos\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre o fluig e sobre o [Desenvolvimento de Datasets](../Desenvolvimento de Datasets.md).\n\nAtenção\n\nPara que um usuário que não é administrador da empresa possa criar e visualizar datasets via fluig Studio é necessário que ele possua a permissão \"Configurar Datasets\". Esta permissão pode ser concedida pelo administrador através do item [Permissões](http://tdn.totvs.com/pages/viewpage.action?pageId=234455792) disponível no agrupador \"Pessoas\" do Painel de Controle do TOTVS Fluig Plataforma.\n\n# Consultando Datasets\n\nPelo fluig Studio, através da visão Visualização de Dataset, é possível consultar os Datasets disponíveis bem como visualizar o seu conteúdo. Com isto é possível verificar quais os campos disponíveis, tanto para filtros quanto para acesso, bem como fazer testes sobre Datasets avançados.\n\nOs passos para consultar os dados do dataset são apresentados abaixo:\n\nNa perspectiva Fluig, acessa a aba **Visualização de Dataset**, e clique em **Consultar Dataset**.\n\n![](..\\..\\..\\images\\Screenshot%2016_06%20001.png)\n\nNa janela aberta, selecione o servidor fluig e escolha o dataset que deseja consultar. O usuário também pode escolher em quantos registros a busca será limitada.\n\n![](..\\..\\..\\images\\Screenshot%2016_06%20003.png)\n\nApós clicar em finalizar aguarde o procedimento de consulta ser concluído. A tabela será preenchida com as colunas e os respectivos registros salvos no dataset.\n\nNeste exemplo, é possível visualizar os campos disponíveis (conta, título, natureza e tipo) e os registros retornados pelo Dataset. Note que estas informações são essenciais para o uso dos Datasets, principalmente quando há necessidade de restringir os dados que queremos acessar.\n\n![](..\\..\\..\\images\\Dataset1.PNG)\n\nVeja a seguir o vídeo *how to* que demonstra a consulta de dados de um Dataset interno pelo fluig Studio.\n\n# Desenvolvimento de Datasets sobre a Plataforma\n\nDatasets desenvolvidos sobre a plataforma são criados utilizando a linguagem JavaScript, sendo possível criar o dataset a partir de valores fixos ou realizar chamadas a outros datasets e serviços externos.\n\nPara desenvolver um dataset, selecione um projeto fluig, clique com o botão direito do *mouse* e escolha a opção **New** → **Dataset Customizado**.\n\n![](..\\..\\..\\images\\Screenshot%2016_06%20005.png)\n\nPreencha dados como o nome do dataset e descrição e clique em **Finish**.\n\n![](..\\..\\..\\images\\Screenshot%2016_06%20004.png)\n\nUm arquivo com extensão .js será criado e aberto para edição imediatamente. Neste arquivo deverá ser desenvolvido o dataset.\n\nVeja a seguir o vídeo How To que demonstra a criação de um dataset avançado com dados fixos.\n\nVídeos How To\n\nVeja mais vídeos how to sobre datasets em: [Datasets - Consulta, criação e registros](https://tdn.totvs.com/pages/viewpage.action?pageId=270925461)." }, { "metadata": { "title": "Visualização de Serviços", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239021223", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Visualização de Serviços.md" }, "content": "Visualização de Serviços\n\n\n# Índice\n\n- 1 [Objetivo](#VisualizaçãodeServiços-Objetivo)\n- 2 [Visualização de serviços](#VisualizaçãodeServiços-Visualizaçãodeserviços)\n- 3 [Gerenciando Serviços](#VisualizaçãodeServiços-GerenciandoServiços)\n - 3.1 [Consultar Serviço](#VisualizaçãodeServiços-ConsultarServiço)\n - 3.2 [Adicionar Serviço](#VisualizaçãodeServiços-AdicionarServiço)\n\n# Objetivo\n\nEste guia tem o objetivo de apresentar uma visão geral da consulta de serviços pelo fluig Studio.\n\n# Visualização de serviços\n\nPermite a integração e utilização de serviços disponibilizados por outros sistemas. A principal forma de integração ao TOTVS Fluig Plataforma é através de *Web Services*.\n\nAtenção\n\nPara que um usuário que não é administrador da empresa possa visualizar e adicionar serviços pelo fluig Studio, é necessário que ele possua a permissão \"Configurar Serviços\". Esta permissão pode ser concedida pelo administrador através da tela de [Permissões](https://tdn.totvs.com/pages/viewpage.action?pageId=234455792) disponível no agrupador \"Pessoas\" do Painel de Controle do TOTVS Fluig Plataforma.\n\n# Gerenciando Serviços\n\nO gerenciamento dos serviços está localizado na perspectiva Fluig, aba **Visualização de Serviços**.\n\n![](..\\..\\..\\images\\Screenshot%2015_06%20002.png)\n\n## Consultar Serviço\n\nNa aba de **Visualização de Serviços**, escolha a opção **Consulta Serviço**.\n\nUma janela será aberta para a consulta. Escolha o servidor fluig e o serviço que deseja consultar.\n\n![](..\\..\\..\\images\\Img%2002.PNG)\n\nAguarde enquanto o serviço é carregado. A tabela será preenchida com os dados do serviço.\n\n## Adicionar Serviço" }, { "metadata": { "title": "Visualização de Serviços", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239021223", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Visualização de Serviços.md" }, "content": "Visualização de Serviços\n\n\nNa aba de **Visualização de Serviços**, escolha a opção **Incluir Serviço** e preencha os dados necessários:\n\n![](..\\..\\..\\images\\Captura%20de%20Tela%2005_10%20003.png)\n\n- **Servidor**: Informe o servidor fluig em que deseja incluir o serviço.\n\n- **Código**: Escolha um código para o serviço que está cadastrando.\n\n- **Descrição**: Informe uma descrição para o serviço.\n\n- **URL**: Informe a URL WSDL do serviço.\n\n- **Pacote**: Caso deseje que as classes sejam geradas em um pacote, informe o nome do pacote desejado.\n\n- **Tipo**: *WebService*\n\nImportante\n\nAlém de *Web Services*, a plataforma também pode realizar chamadas Progress. Entretanto essa técnica está descontinuada, e nossa recomendação é usar os serviços SOAP. Caso seu projeto já utilize essa técnica acesse a [documentação depreciada](http://tdn.totvs.com/pages/viewpage.action?pageId=237378575).\n\n- **API**: informe o tipo de API. O recomendado é que seja selecionada a API CXF, pois o suporte à API Axis foi depreciado.\n\n- **Arquivo de *Bind***: Se houverem conflitos durante a geração dos *stubs* devido a uma ou mais propriedades possuírem o mesmo nome, é possível adicionar um arquivo de *bind* para alterar os nomes conflitantes.\n\n- **Requer autenticação**: Marque esta opção caso o *Web Service* exija Autenticação Básica para acesso. Será necessário informar o Usuário e Senha ao finalizar a inclusão do serviço.\n\nPor fim, clique no botão ***Finish*** e aguarde a inclusão do serviço no servidor.\n\nDica\n\nPara mais detalhes sobre a integração com aplicativos externos através de Web Services, consulte a documentação [Integração Com Aplicativos Externos](../Integrações/Integração/Integração com outros sistemas/Integração com Aplicativos Externos.md)." }, { "metadata": { "title": "Atividades Workflow", "source": "https://tdn.totvs.com/display/fluig/Atividades+Workflow", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Atividades Workflow.md" }, "content": "Atividades Workflow" }, { "metadata": { "title": "Atividades Workflow", "source": "https://tdn.totvs.com/display/fluig/Atividades+Workflow", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Atividades Workflow.md" }, "content": "Atividades Workflow\n\n\n- 1 [Atividade Comum](#AtividadesWorkflow-AtividadeComum)\n- 2 [Atividade usuário](#AtividadesWorkflow-Atividadeusuário)\n- 3 [Atividade de serviço](#AtividadesWorkflow-Atividadedeserviço)\n- 4 [Atividade de Envio de mensagem](#AtividadesWorkflow-AtividadedeEnviodemensagem)\n- 5 [Atividade manual](#AtividadesWorkflow-Atividademanual)\n- 6 [Atividade de script](#AtividadesWorkflow-Atividadedescript)\n- 7 [Atividade de negócio](#AtividadesWorkflow-Atividadedenegócio)\n- 8 [Subprocesso](#AtividadesWorkflow-Subprocesso)\n- 9 [Ad-Hoc](#AtividadesWorkflow-Ad-Hoc)\n\n# Atividade Comum\n\nÉ a atividade workflow comum do Fluig. É a unidade básica da separação de um processo workflow em atividades . Deverá ser executado por um usuário para que a solicitação workflow para dar andamento a solicitação workflow.\n\n# Atividade usuário\n\nBastante semelhante a atividade comum poderá mais restritiva. Essa notação determina que obrigatoriamente um usuário deverá executar esta tarefa e que ela é controlada e registrada pelo Fluig.\n\n# Atividade de serviço\n\nEsta atividade permite consultar dados de um serviço externo e passar para o processo dados provindos de tais serviços. Nas propriedades da atividade é possível selecionar um serviço cadastrado no fluig e editar um script JavaScript que fará acesso aos métodos e dados desse serviço. Fazendo uso das APIs hAPI, e forms é possível passar os dados obtidos na consulta do serviço para dentro do fluig.\n\nExistem dois modelos de utilização da atividade serviço: Execução **Imediata**e Execução **Automatizada**.\n\n- Execução **Automatizada**\n\nNeste caso a execução do script de serviço será assíncrona e script será executado sem a necessidade de uma interação do usuário para que isso aconteça. É possível configurar o número de tentativas e a mensagem de sucesso caso a execução do script seja concluída sem erros. Ao enviar uma solicitação para a atividade de serviço configurada como posterior ela ficará parada na atividade de serviço e executará o script pelo número de vezes consecutivas configuradas no parâmetro tentativas ou até que o script não retorne um erro. Caso o número de tentativas seja concluído sem que haja uma execução do script com sucesso a atividade será movimentada para o evento intermediário de captura de erro que por sua vez movimentará a atividade para o fluxo indicado, caso contrário a atividade de serviço será concluída e seguirá o seu fluxo de saída normal.\n\nA atividade de serviço pode apenas ter um fluxo de saída e deve ter um evento intermediário de captura de erro anexado a mesma para o caso de ocorrer algum problema. É importante ressaltar que a atividade posterior a captura de erro **não**será atribuída automaticamente a quem enviou a solicitação para a atividade de serviços, portanto o operador deve modelar o processo informando qual usuário será o responsável pela atividade de erro para que não haja uma atribuição automática para o primeiro usuário da lista.\n\nEm tarefas de serviço com tipo de execução **Automatizada** é obrigatório o uso do evento anexo de captura de erro. Bem como um fluxo de saída deste evento permitindo que o processo seja desviado caso o script de integração não tenha sido executado com sucesso em todas as tentativas.\n\nO script da atividade de serviço com execução posterior pode receber como parâmetro a quantidade de tentativas e a mensagem de erro da última execução que podem ser utilizados dentro do script. O script em si ficaria como a seguir:\n\n```\nfunction servicetask9(attempt, message) {\n\tlog.info(\"Exemplo servicetask\");\n\tvar a = hAPI.getCardValue(\"campo_no_formulario\");\n\tif (a == \"1\") {\n\t\treturn true;\n\t} else {\n\t\tthrow \"Exemplo de Erro\";\n\t}\n}\n```\n\nTanto a mensagem de sucesso quanto as mensagens de erro serão gravadas no histórico como complementos e apresentados aos usuários que visualizarem aquela solicitação. Este tipo de integração é melhor utilizado para integração com serviços possivelmente indisponíveis ou externos e que necessariamente devem ser assíncronos a utilização do usuário, possibilitando um fluxo de contingência caso a integração não seja concluída com sucesso em todas as tentativas por qualquer razão. Para criação deste fluxo de contingência deverá ser **anexado um evento de captura de erro** (colocado em cima) cujo fluxo de saída será utilizado caso todas as tentativas de integração falharem. Abaixo segue um exemplo de como fica uma modelagem básica de uma tarefa de serviço do tipo Automática.\n\n![](..\\..\\..\\..\\images\\image2017-5-4%20104922.png)\n\n- Execução **Imediata**\n\nO código gerado de script específico desta atividade será executado após evento *afterStateEntry* relacionado deste processo e será processado no momento que solicitação entrar na atividade de serviço.\n\nExemplo de código gerado para iniciar o trabalho de integração com serviço:\n\n```\ntry {\n\tvar Service = ServiceManager.getService('rm');\n\tvar serviceHelper = Service.getBean();\n\tvar serviceLocator = serviceHelper.instantiate('classe.locator');\n} catch(erro) { \n\tlog.error(erro);\n}\n```\n\nO tipo de execução **Imediata** não é recomentado atualmente por ter sua qualidade reduzida.\n\n# Atividade de Envio de mensagem\n\nEsta atividade permite o envio de uma mensagem de email para um endereço externo ao endereço a ferramenta fluig. É possível configurar o tipo e email (texto ou html) o assunto e o texto do email em tempo de modelagem.\n\n# Atividade manual\n\nAtividade manual representa uma atividade externa ao sistema que não necessariamente precisa ser executada por um usuário usando a tela de movimentação de processos. Um exemplo prático seria o usuário buscar um documento que acabou de ser impresso. Essa notação deve ser usada em casos em que essas atividades externas ao sistema precisam ser colocadas no diagrama de processos para fins de documentação de processo.\n\n# Atividade de script\n\nEssa atividade faz a execução de um script ao ser executada. Em tempo de modelagem esse script deverá ser desenvolvido em linguagem JavaScript e poderá fazer uso de todas as APIs de infraestrutura que o fluig oferece como a hAPI.\n\n# Atividade de negócio\n\nO Objetivo desse tipo de atividade é consultar regras de negócio que não estejam internalizados no Fluig. Essa consulta se dará por meio de um script javascript consultando um serviço pré-cadastrado no fluig. O comportamento interno desta atividade será o mesmo comportamento da atividade  de serviço.\n\n# Subprocesso\n\nPermite selecionar outro processo previamente exportado para o servidor do fluig como subprocesso. Abaixo, os atributos do Subprocesso:\n\n| Atributo | Descrição |\n| --- | --- |\n| Código | Código da atividade. |\n| Nome | Nome da atividade. |\n| Descrição | Descrição da atividade. |\n| Subprocesso | Processo que será iniciado ao iniciar esta atividade. |\n| Transfere Anexos | Transfere anexos do processo pai ao processo filho (o inverso não ocorre). |\n| Cancelamento conjunto com solicitação principal | Cancela todos os subprocessos iniciados pela solicitação caso ela seja cancelada. |\n\n# Ad-Hoc\n\nPermite a inclusão e o gerenciamento de tarefas não estruturadas dentro do motor de execução e controle do fluig.\n\nNem todos os processos de uma organização podem ser estruturados dentro de processos*workflow* estáticos. Nos negócios, encontramos diversas situações que geram um conjunto de tarefas que não podem ser estruturadas da forma tradicional, porém necessitam ficar registradas e precisam ser monitoradas para que tenhamos como medir a evolução dessas tarefas para o alcance dos objetivos.\n\nExemplo: Supondo que após uma reunião, um determinado plano de ação foi criado para resolver um problema pontual. A criação de um processo estruturado para resolver este único problema não faz sentido. Para essas situações, devemos utilizar o processo Ad-Hoc.\n\nExemplo de processo simples configurado pelo Ad-Hoc:\n\n![](..\\..\\..\\..\\images\\adhoc1.png)\n\nNas propriedades da atividade Ad-Hoc, selecionar a opção de \"Tarefa Inicial\" para determinar que se torne a atividade inicial do processo. Ao liberar o processo, já poderá ser utilizado.\n\n![](..\\..\\..\\..\\images\\adhoc2.png)\n\nAo executar o processo, o usuário já terá acesso a aba \"AdHoc\" onde poderá informar o título da reunião ou tema, descrição do problema e as atividades a serem realizadas.\n\n![](..\\..\\..\\..\\images\\novoadhoc.PNG)\n\nAtravés do botão \"Adicionar atividade\" é possível criar uma nova tarefa não estruturada, informando a Atividade, Prazo de Conclusão e Responsável.\n\n![](..\\..\\..\\..\\images\\adhoc4.png)\n\nApós movimentar o processo, selecionar a opção disponível \"Criar Tarefas Ad-Hoc\", para que sejam criadas as atividades definidas para cada responsável, onde cada um irá receber uma pendência do subprocesso \"Executar Tarefa Ad-Hoc\" contendo as informações do processo principal.\n\nA partir dessa movimentação, será permitindo ao responsável cumprir ou rejeitar a tarefa, informando na \"Observação\" o motivo ou complemento sobre a ação tomada na tarefa.\n\n![](..\\..\\..\\..\\images\\adhoc5.png)\n\nNa solicitação principal, onde a lista foi criada, é permitido ao criador da lista, gerenciar as atividades abertas para saber se foram concluídas ou rejeitadas através da aba \"Status\". É possível também cancelar tarefas em aberto ou criar novas, independente do status das tarefas anteriores.\n\n![](..\\..\\..\\..\\images\\adhoc6.png)\n\nAtravés do botão de mais ![](..\\..\\..\\..\\images\\image2017-1-16%2015115.png) localizado na lateral direta da atividade, é possível ver o detalhamento sobre a execução da tarefa, bem como possíveis anexos e observações inseridos na atividade de execução da tarefa.\n\n![](..\\..\\..\\..\\images\\adhoc7.png)\n\nImportante\n\nAs tarefas de subprocesso Ad-Hoc só poderão ser encerradas quando todas as atividades relacionadas não estiverem mais com status \"Em andamento\".\n\nAtenção\n\nHoje, os anexos de workflow de um subprocesso **não** são transferidos ao processo pai a menos que haja algum desenvolvimento específico para tal, porém os anexos do pai podem ser transferidos ao processo filho através do atributo [Transfere Anexos](http://tdn.totvs.com/display/HF/Configurar+atividades+e+fluxos)." }, { "metadata": { "title": "Eventos Finais de processo", "source": "https://tdn.totvs.com/display/fluig/Eventos+Finais+de+processo", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Eventos Finais de processo.md" }, "content": "Eventos Finais de processo\n\n\n# Evento final de processo comum\n\nIndica o fim do processo workflow. Esta tarefa não é atribuída a nenhum usuário pois é apenas uma indicação de que a solicitação workflow foi terminada. Não ocorrerão pós processamentos após o fim da solicitação workflow. (Embora através de customização seja possível realizar pós processamentos) .\n\n# Evento final com erro\n\nIndica que a solicitação workflow foi terminada com um erro do ponto de vista de negócio da organização . A Nível de execução o Fluig se comportará da mesma forma que estivesse executando um fim comum. Esta notação tem apenas o objetivo de deixar mais claro do ponto de vista do negócio que a solicitação workflow não seguiu conforme o esperado.\n\n# Evento final de cancelamento\n\nPermite cancelar uma solicitação Workflow através da navegação da mesma. Caso a solicitação workflow seja movida para esta atividade ela será cancelada. É o mesmo efeito obtido cancelando solicitações abertas através da opção minhas solicitações na central de tarefas .\n\n# Evento final de Sinal\n\nAo terminar a solicitação será emitido um sinal que será captado por atividades de recepção de sinal em outros processos.\n\n# Evento final múltiplo\n\nEste evento permite enviar múltiplos sinais e executar diversos scripts condicionais. Neste caso scripts condicionais serão apenas executados e seu retorno não será validado . Este componente é recomendado nos casos em que se faz necessário enviar diferentes sinais após o fim do processo. Essa atividade não terá agendamento e não irá impedir o fim da solicitação. A solicitação será encerrada e a execução dos scripts e o envio de sinais ficará para como um pós processamento no fim da solicitação workflow.\n\n# Evento final terminal\n\nEste evento se comporta da mesma forma que o fim comum de processo.  A notação indica que o processo foi encerrado e que não ocorrerá nenhum tipo de compensação ou pós-processamento." }, { "metadata": { "title": "Eventos Iniciais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Iniciais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Eventos Iniciais.md" }, "content": "Eventos Iniciais" }, { "metadata": { "title": "Eventos Iniciais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Iniciais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Eventos Iniciais.md" }, "content": "Eventos Iniciais\n\n\n# Evento Inicial de processo comum\n\nÉ o tradicional evento que indica o inicio do processo. Ao selecionar este tipo de inicio de processo os usuários que tiverem a permissão para iniciar este processo poderão iniciar o mesmo através da tela de abertura de solicitações do Fluig. As permissões são definidas através do mecanismo de atribuição desta atividade. Para processos definidos como públicos qualquer usuário poderá abrir solicitações neste processo. Embora essa atividade inicial possa ser em conjunto com outros tipos de atividade inicial o fluig aceitará apenas uma única instância de objeto de início comum por diagrama.\n\n# Evento inicial condicional\n\nEste evento permite que uma nova solicitação workflow seja criada toda vez que um script condicional retornar verdadeiro em uma determinada faixa de tempo. Será necessário configurar um usuário de integração que será o usuário utilizado para abrir as solicitações. Ao liberar um processo que contenha um evento inicial condicional será criado no fluig uma atividade no agendador de tarefas que ficará a cargo da execução periódica do script condicional bem como da criação da solicitação caso as condições do script condicional sejam verdadeiras.\n\nMais detalhes sob como funciona e exemplos de uso podem ser encontrados no [artigo dedicado a](http://tdn.totvs.com/display/fluig/Scripts+Condicionais)[scripts condicionais](http://tdn.totvs.com/display/fluig/Scripts+Condicionais)[.](http://tdn.totvs.com/display/fluig/Scripts+Condicionais)\n\n# Evento inicial de sinal\n\nEste evento inicial deverá ser configurado para monitorar a emissão de determinado sinal . Quando o sinal que este evento estiver monitorando fora emitido por alguma atividade emissora de sinais uma nova solicitação workflow será aberta. Será necessário configurar um usuário de integração que será o usuário utilizado para abrir as solicitações. É possível utilizar mais de uma atividade inicial de sinal para monitorar a emissão de diferentes sinais . Contudo em um cenário de monitoramento de multiplos sinais é recomendado que seja utilizado o evento inicial múltiplo ou o evento inicial paralelo.\n\n# Evento inicial temporizador\n\nPermite a criação de solicitações workflow em uma determinada faixa de tempo. Será necessário configurar um usuário de integração que será o usuário utilizado para abrir as solicitações. Ao liberar um processo que contenha um evento inicial temporizador será criado no fluig uma atividade no agendador de tarefas que ficará a cargo da criação de solicitações periódicas para o processo.\n\nATENÇÃO\n\nA tecnologia utilizada para a temporização das atividades reinicia seus contadores de tempo a partir de um determinado período definido pelo próprio tipo de tempo utilizado para definir o gatilho. Isso significa que não se pode utilizar períodos de tempo acima de 24 horas para se temporizar por horas, ou um período acima de 31 dias para se temporizar por dia. O contador reinicia toda 24 horas ou todo começo do mês. Isso também significa que ao se colocar um período de dias, como por exemplo 8 dias, o período irá reiniciar no dia primeiro e começará a contar a partir de então. Para mais informações: .\n\n \n\n# Evento inicial múltiplo\n\nPermite iniciar uma solicitação workflow analisando periodicamente um conjunto de condições para que uma solicitação workflow seja aberta. Essas condições podem incluem um ou mais scripts condicionais bem como um ou mais sinais a serem monitorados. Caso algum script condicional tenha suas condições atendidas ou um dos sinais tenha sido emitido será aberta uma solicitação workflow para aquele processo. Será necessário configurar um usuário de integração que será o usuário utilizado para abrir as solicitações. Ao liberar um processo que contenha um evento inicial múltiplo será criado no fluig uma atividade no agendador de tarefas que ficará a cargo do monitoramento de sinais e scripts condicionais relacionados a esta atividade, bem como da abertura das solicitações caso uma das condições relacionadas se torne verdadeira." }, { "metadata": { "title": "Eventos Intermediários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126714787", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Eventos Intermediários.md" }, "content": "Eventos Intermediários\n\n\n- [Evento Intermediário](#EventosIntermediários-EventoIntermediário)\n- [Evento Intermediário Temporizador](#EventosIntermediários-EventoIntermediárioTemporizador)\n- [Evento Intermediário Condicional](#EventosIntermediários-EventoIntermediárioCondicional)\n- [Evento Intermediário de envio de sinal](#EventosIntermediários-EventoIntermediáriodeenviodesinal)\n- [Evento Intermediário de recepção de sinal](#EventosIntermediários-EventoIntermediárioderecepçãodesinal)\n- [Evento Intermediário de Link (Entrada)](#EventosIntermediários-EventoIntermediáriodeLink(Entrada))\n- [Evento Intermediário de Link (Saída)](#EventosIntermediários-EventoIntermediáriodeLink(Saída))\n- [Evento Intermediário múltiplo](#EventosIntermediários-EventoIntermediáriomúltiplo)\n- [Evento Intermediário de captura de erro](#EventosIntermediários-EventoIntermediáriodecapturadeerro)\n\n## Evento Intermediário\n\nConforme o próprio nome indica é um evento que ocorre entre o inicio e o fim do processo. É uma atividade comum que poderá ser atribuida para qualquer usuário durante a execução de um processo workflow. Usada para fins de conformidade com a notação BPMN 2.0.\n\n## Evento Intermediário Temporizador" }, { "metadata": { "title": "Eventos Intermediários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126714787", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Eventos Intermediários.md" }, "content": "Eventos Intermediários\n\n\nPermite a criação de um atraso na solicitação workflow. quando o processo chegar nesta atividade a solicitação ficará parada neste ponto do processo pelo período determinado dentro do agendamento da atividade.\n\nATENÇÃO\n\nA tecnologia utilizada para a temporização das atividades reinicia seus contadores de tempo a partir de um determinado período definido pelo próprio tipo de tempo utilizado para definir o gatilho. Isso significa que não se pode utilizar períodos de tempo acima de 24 horas para se temporizar por horas, ou um período acima de 31 dias para se temporizar por dia. O contador reinicia toda 24 horas ou todo começo do mês. Isso também significa que ao se colocar um período de dias, como por exemplo 8 dias, o período irá reiniciar no dia primeiro e começará a contar a partir de então. Para mais informações: .\n\n## Evento Intermediário Condicional" }, { "metadata": { "title": "Eventos Intermediários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126714787", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Eventos Intermediários.md" }, "content": "Eventos Intermediários\n\n\nEste evento criará uma atividade na central de tarefas atrasadas que ficará executando periodicamente um script condicional. Quando as condições do script forem cumpridas o processo será movido para a próxima etapa do processo. O usuário que movimentou a tarefa anterior do evento intermediário condicional será usado para movimentar esta tarefa. Ao criar esta tarefa, deverá ser gerado um Script de Evento Workflow associado, que corresponde ao código da atividade deste evento (exemplo: intermediateconditional2), que, sendo criada através do Studio, gera uma função JavaScript homônima que será executada a partir do tempo definido.\n\nAtenção\n\nOs scripts deste evento devem ter um método com o mesmo nome da atividade e devem ser nomeados como tal.\n\nMais detalhes sob como funciona e exemplos de uso podem ser encontrados no [artigo dedicado a](http://tdn.totvs.com/display/fluig/Scripts+Condicionais)[scripts condicionais](http://tdn.totvs.com/display/fluig/Scripts+Condicionais)[.](http://tdn.totvs.com/display/fluig/Scripts+Condicionais)\n\n## Evento Intermediário de envio de sinal\n\nEste evento funcionará como uma atividade automática e irá realizar a emissão de sinal configurado dentro do Fluig . Quando o solicitação chegar nesta atividade ela será movida imediatamente para a próxima atividade apenas realizando o envio de um sinal.\n\n## Evento Intermediário de recepção de sinal\n\nEste evento manterá a solicitação workflow parada até que o sinal configurado tenha sido emitido por outra atividade de envio de sinal.\n\n## Evento Intermediário de Link (Entrada)" }, { "metadata": { "title": "Eventos Intermediários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126714787", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Eventos Intermediários.md" }, "content": "Eventos Intermediários\n\n\nEm alguns processos as vezes é necessário criar um fluxo de atividade que acaba atravessando boa parte do diagrama dificultando o entendimento do mesmo. Eventos intermediários de link permitem a criação de conectores de fluxo tornando a conexão de atividades mais elegante. Nas configurações (propriedades) deste componente é apresentado um combo-box que irá listar todas as atividades intermediárias de link de saída de fluxo . Para cada a evento intermediário de link de entrada obrigatoriamente deverá existir pelo menos um evento intermediário de link de saída. Todo evento de link de entrada deverá receber pelo menos um fluxo de entrada . No processo de exemplo a seguir temos um fluxo que precisa ligar a atividade inicial com a atividade5 . Veja que o fluxo atravessa quase todo o diagrama para poder conectar as duas atividades :\n\n![](..\\..\\..\\..\\images\\liught%20-%20C%C3%B3pia.png)\n\nUtilizando os eventos de entrada e saída de links é possível ter uma modelagem mais eficiente e elegante. Veja o mesmo processo utilizando os eventos de entrada e saida de links :\n\n![](../../../../images/liught%20-%20C%C3%B3pia%20(2).png).png)\n\nVocê obteve exatamente o mesmo processo porém com uma modelagem muito mais clara.\n\n## Evento Intermediário de Link (Saída)\n\nDetermina a saída de um fluxo do processo que entrou no evento de Link de entrada . Necessita pelo menos um fluxo de saída para ser considerado um evento modelado de forma válida.\n\n## Evento Intermediário múltiplo\n\nEste elemento irá disparar múltiplos sinais executar múltiplos scripts condicionais ao ser executado. Este item é recomendado em situações em que o modelador deseja disparar mais de um sinal ao mesmo tempo em determinado momento do processo.\n\n## Evento Intermediário de captura de erro" }, { "metadata": { "title": "Eventos Intermediários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126714787", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Eventos Intermediários.md" }, "content": "Eventos Intermediários\n\n\nEste elemento só pode ser associado a atividade serviço quando a mesma é configurada como Execução **Automatizada**, sendo obrigatória neste caso. Ela serve para indicar para qual atividade a solicitação deve ser movimentada caso o número de tentativas da atividade de serviço seja excedido sem que haja uma execução com sucesso. Não pode receber fluxos e nem ter um fluxo de saída com fluxo de retorno, sua única interação é anexada à própria atividade de serviço com um fluxo de saída comum para uma atividade qualquer. Este evento também não pode ser instanciado de forma isolada dentro de um diagrama sendo que a única forma de instancia-lo é colocando o mesmo por cima de uma tarefa de serviço automatizada . O modelo abaixo representa a modelagem básica necessária para se utilizar o evento intermediário de captura de erro :\n\n![](..\\..\\..\\..\\images\\image2017-5-4%20105641.png)" }, { "metadata": { "title": "Fluxos", "source": "https://tdn.totvs.com/display/fluig/Fluxos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Fluxos.md" }, "content": "Fluxos" }, { "metadata": { "title": "Fluxos", "source": "https://tdn.totvs.com/display/fluig/Fluxos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Fluxos.md" }, "content": "Fluxos\n\n\n# Índice\n\n- 1 [Fluxo Comum](#Fluxos-FluxoComum)\n- 2 [Fluxo de Retorno](#Fluxos-FluxodeRetorno)\n- 3 [Fluxo Automático](#Fluxos-FluxoAutomático)\n- 4 [Fluxo Informativo](#Fluxos-FluxoInformativo)\n- 5 [Fluxo Padrão](#Fluxos-FluxoPadrão)\n\nPara que o fluxo automático funcione corretamente, além de incluir o *job* do fluxo automático, é necessário incluir o *job* de Tarefas atrasadas. \nO fluxo automático é acionado quando uma tarefa está atrasada, mas caso o cliente não tenha criado o *job* de tarefa atrasada no agendador, o fluxo não será movimentado.\n\n# Fluxo Comum\n\nFluxo padrão para movimentação de atividades. É o tipo de fluxo mais usado pra movimentação de atividades, permitindo que uma atividade seja movimentada para outra sem a possibilidade de retorno. As configurações do fluxo comum são:\n\n![](..\\..\\..\\..\\images\\CONF%20FLUXOS.png)\n\n- **Código:**É o código do fluxo, utilizado pra identificá-lo no sistema e não pode ser alterado.\n\n- **Nome:**É o nome do fluxo, a legenda que aparecerá próxima ao desenho do fluxo para identificá-lo quando estiver visualizando o processo.\n\n- **Fluxo automático:** Habilitao fluxo automático, conforme descrito nos tópicos a seguir.\n\n- **Ativ. Fluxo:** Legendade identificação para fluxo, especificando o nome da atividade quando estiver sendo apontada por aquele fluxo específico.\n\n- **Permite retorno:** Habilitao fluxo de retorno, conforme descrito nos tópicos a seguir.\n\n- **Ativ. Retorno:** Legendade identificação para fluxo de retorno, especificando o nome da atividade quando estiver sendo apontada como retorno da atividade atual.\n\n# Fluxo de Retorno\n\nAo habilitar o retorno nas configurações de um fluxo, sua cor se tornará vermelha e uma seta irá apontar para a atividade de origem.\n\nQuando uma solicitação tiver sido movimentada da atividade de origem para a atividade de destino através desse fluxo, durante a movimentação da atividade destino será permitido retornar a solicitação à atividade anterior. O responsável que será atribuído à esta atividade será o mesmo usuário que a movimentou da primeira vez.\n\nSó é possível utilizar o fluxo de retorno para a versão do processo corrente durante a movimentação. Por isso, caso uma solicitação seja convertida para uma outra versão do processo, **durante a primeira movimentação da solicitação** **após a conversão, essa solicitação não poderá retornar à atividade anterior**, pois neste caso a solicitação terá uma nova movimentação representando sua conversão e portanto perderá a possibilidade de retorno imediato.\n\n# Fluxo Automático\n\nAo habilitar o fluxo automático nas configurações de um fluxo, sua cor se tornará verde e será adicionado o ícone de um relógio próximo ao meio da seta.\n\nEste tipo de fluxo define que se o prazo de uma atividade for concluído sem que ela tenha sido movimentada, a solicitação será movida automaticamente para a atividade de destino apontada pelo fluxo.\n\nComo o fluxo automático só poderá ser movimentado **após** o prazo da atividade ser concluído, a atividade de origem também precisará ter configurado um fluxo de saída comum para movimentações convencionais\n\nPara que esse fluxo funcione corretamente, é obrigatório que a atividade de origem tenha um **prazo** definido e que o administrador da plataforma agende uma tarefa de **Fluxo Automático,** através da opção Agendador de Tarefas no Painel de Controle, com o intervalo em que o sistema deve verificar e executar a movimentação das atividades com fluxos automáticos.\n\nImportante notar que, durante a execução de um fluxo automático, **não há um usuário logado realizando a movimentação**. Portanto, eventos que utilizem o usuário logado através de APIs do fluigAPI devem levar isso em consideração em suas tratativas para evitar problemas em sua execução.\n\n# Fluxo Informativo\n\nEsse tipo de fluxo é apresentado apenas quando uma atividade for relacionada a algum objeto que não seja uma atividade, tais como anotações, documentos, *databases* e afins. Não é possível movimentar a solicitação através desse fluxo, ele serve apenas como uma referência entre uma atividade e um objeto.\n\n# Fluxo Padrão\n\nEsse tipo de fluxo indica qual ação deve ser tomada por uma atividade automática, caso nenhuma das condições definidas seja atendida. Com o fluxo padrão configurado, quando um Gateway Automático Exclusivo ou Inclusivo não encontrar nenhuma condição válida, ele será movimentado para a atividade destino deste fluxo.\n\nApenas atividades comuns e os gateways inclusivo, exclusivo e complexo podem ser configurados com um fluxo padrão de saída, porém no caso de atividades comuns e no gateway complexo atualmente serve apenas como informativo, sem ações definidas.\n\nSomente um fluxo de saída padrão pode ser definido por atividade / gateway. Para configurá-lo em uma atividade, basta marcar a opção conforme descrito abaixo:\n\n![](..\\..\\..\\..\\images\\FLUXO_PADRAO_CONFIG.png)\n\nAo habilitar a opção Fluxo padrão, mesmo em uma atividade comum, o fluxo não poderá ser configurado como fluxo automático nem permitir retorno e estas opções serão desabilitadas por padrão neste cenário, conforme a imagem acima.\n\nFluxo padrão **não** vai movimentar automaticamente uma atividade comum com a variável estendida *AutomaticTasks* configurada.\n\nUm fluxo padrão pode ter uma condição própria para ele e ser movimentado apenas com sua condição sendo atendida. Caso uma solicitação seja movimentada por uma automática pelo fluxo padrão devido a nenhuma condição ter sido aceita, o informativo aparecerá no histórico para que seja possível identificar o não cumprimento das condições. Mesmo com um fluxo padrão, automáticas exclusivas e inclusivas ainda devem possuir obrigatoriamente ao menos uma condição válida para um destino." }, { "metadata": { "title": "Gateways", "source": "https://tdn.totvs.com/display/fluig/Gateways", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Gateways.md" }, "content": "Gateways" }, { "metadata": { "title": "Gateways", "source": "https://tdn.totvs.com/display/fluig/Gateways", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Gateways.md" }, "content": "Gateways\n\n\n- 1 [Gateway Exclusivo](#Gateways-GatewayExclusivo)\n- 2 [Gateway Paralelo](#Gateways-GatewayParalelo)\n- 3 [Gateway Inclusivo](#Gateways-GatewayInclusivo)\n- 4 [Gateway Complexo](#Gateways-GatewayComplexo)\n- 5 [Gateway Evento](#Gateways-GatewayEvento)\n- 6 [Gateway Evento Exclusivo](#Gateways-GatewayEventoExclusivo)\n- 7 [Gateway Evento Paralelo](#Gateways-GatewayEventoParalelo)\n- 8 [Gateway de Join](#Gateways-GatewaydeJoin)\n\n# Gateway Exclusivo\n\nAtravés de expressões aritméticas esse gateway irá decidir o destino de um processo. As expressões serão validadas na ordem que forem expostas na aba de condições. Quando uma das condições for satisfeita, as demais não serão executadas.\n\nCada condição terá um fluxo de destino relacionado, assim, a primeira expressão que for validada como verdadeira será utilizada para mover o processo para a atividade relacionada.\n\nO fluxo de **entrada** para este gateway não pode possuir um fluxo de retorno, pois como esta atividade é automática um dos fluxos que procede será sempre executado. Caso um dos fluxos de **saída** possua retorno, a tarefa será executada de forma automática novamente.\n\n# Gateway Paralelo\n\nAo chegar neste componente do processo a solicitação workflow será bifurcada em N saídas permitindo a execução de fluxos paralelos. No fim dos fluxos paralelos será necessário relacionar um objeto de Join que indicará o fim da execução dos fluxos paralelos voltando ao fluxo único do processo.\n\nSão criadas duas ou mais atividades, não exibindo para o usuário nenhuma janela de seleção de responsável. Com isso, caso um mecanismo de atribuição de uma destas atividades retorne mais de um responsável, como por exemplo os usuários de um grupo, será selecionado automaticamente o primeiro da lista dos possíveis.\n\n# Gateway Inclusivo\n\nEste componente é uma mescla entre os gateways paralelos e exclusivo. Como no gateway exclusivo, é possível definir expressões lógicas para cada fluxo de saida do gateway. Neste componente todas as expressões serão validadas independente da ordem, sendo que a validação de uma condição verdadeira não impede a validação de outras condições. O processo pode ter todas as condições verdadeiras ou apenas uma, mas nunca pode ter todas as condições falsas.\n\nAs expressões que se confirmarem verdadeiras abrirão um processamento em paralelo que se encerrará no componente de Join.  Em um gateway Inclusivo de três  fluxos de saídas teremos 3 expressões atreladas cada uma a um fluxo de saída. Todas as expressões serão executadas. Caso apenas duas expressões sejam válidas teremos um paralelismo de apenas dois fluxos.\n\nEx: Imagine que temos um processo de analise de renda em que dependendo da renda do cliente diferentes opções de investimentos e financiamentos serão oferecidos para o cliente. Segue o processo abaixo :\n\n![](..\\..\\..\\..\\images\\novo_diagrama%20-%20C%C3%B3pia.png)\n\nNa lista de condições do gateway Inclusivo temos as seguintes configurações :\n\n![](..\\..\\..\\..\\images\\props.png)\n\nSupondo que na execução da solicitação workflow o valor da variável renda seja de 18000. Nesta caso teremos um paralelismo dos fluxos que levam para as atividades \"Iniciar financiamento de automóvel\" e \"Solicitar financiamento de Imóvel\" pois o valor 18000 torna verdadeiras as condições de ordem 1 e 2 . A condição da ordem 3 é falsa e não irá ativar o paralelismo do terceiro fluxo.\n\n# Gateway Complexo\n\nEste gateway irá se comportar como o gateway paralelo. Porém antes de de abrir o paralelismo dos diversos fluxos será executado um script que permitirá a execução de diversas operações que poderão estar internalizadas ou não dentro do Fluig. Como a execução de serviços ou a execução de expressões aritméticas através da linguagem javascript.\n\nEste Gateway deixará de receber atualizações e manutenções. Recomendamos o uso de [atividade de serviço](Atividades Workflow.md).\n\n# Gateway Evento\n\nTipo de gateway especial que se comportará como um gateway paralelo. Porém ele apenas suporta eventos intermediários para serem atrelados com o mesmo . Este gateway poderá ser utilizado como o inicio de um processo fazendo paralelismo logo na abertura de solicitação.\n\nGateways do tipo evento deixarão de receber atualizações e manutenções.\n\n# Gateway Evento Exclusivo\n\nTipo de gateway especial que se comportará como um gateway exclusivo. Porém ele apenas suporta eventos intermediários para serem atrelados com o mesmo.\n\nEste Gateway deixará de receber atualizações e manutenções. Recomenda-se o uso do Gateway Exclusivo.\n\n# Gateway Evento Paralelo\n\nTipo de gateway especial que se comportará como um gateway paralelo. Porém ele apenas suporta eventos intermediários para serem atrelados com o mesmo .  Este tipo de gateway não poderá ser utilizado como evento inicial de uma solicitação workflow.\n\nEste Gateway deixará de receber atualizações e manutenções. Recomenda-se o uso do Gateway Paralelo.\n\n# Gateway de Join\n\nÉ a entidade que o Fluig utiliza para simbolizar o fim do paralelismos de fluxos . Deverá ser usado no fim dos gateways paralelos.\n\nCaso um *Gateway* Join seja relacionado a uma atividade que não possua mecanismo de atribuição definido, o fluxo será enviado para o primeiro usuário da lista." }, { "metadata": { "title": "Itens de agrupamento e dados", "source": "https://tdn.totvs.com/display/fluig/Itens+de+agrupamento+e+dados", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Itens de agrupamento e dados.md" }, "content": "Itens de agrupamento e dados\n\n\n# Pool\n\nPermite o agrupamento de raias. Geralmente representam uma organização um setor ou meramente o processo que está sendo desenhado .\n\n# SwimLane/Raia\n\nRepresenta uma partição dentro do pool . Podem representar diferentes departamentos de uma organização que executa diferentes atividades dentro de um processo workflow.\n\n# Agrupamento\n\nUma outra forma de agrupar atividades . Pode representar tarefas que exigem o esforço conjunto de diferentes setores de uma organização (que já foram separadas nas raias/swimlanes).\n\n# Anotação\n\nPermite ao modelador de processos adicionar notas explicativas para facilitar o entendimento do processo por todos os envolvidos no mesmo .\n\n# Documento\n\nPermite ao modelador anexar ao diagrama um documento previamente publicado no Fluig a fim de que o mesmo possa ser consultado durante a fase de execução de um processo.\n\n# Database\n\nSimboliza a entrada e saída de dados de um banco de dados externo. Esse banco de dados poderia pertencer a um sistema de ERP que está integrado com o Fluig por exemplo.\n\nObservação\n\nTodos os objetos dessa sessão são objetos para fins de documentação ou decorativos e não possuem influência ou função ativa dentro da execução das solicitações workflow." }, { "metadata": { "title": "Scripts Condicionais", "source": "https://tdn.totvs.com/display/fluig/Scripts+Condicionais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Scripts Condicionais.md" }, "content": "Scripts Condicionais\n\n\n# Índice\n\n- 1 [Objetivo](#ScriptsCondicionais-Objetivo)\n- 2 [Script Condicional](#ScriptsCondicionais-ScriptCondicional)\n - 2.1 [Exemplo de utilização do script condicional](#ScriptsCondicionais-Exemplodeutilizaçãodoscriptcondicional)\n - 2.2 [Processo Exemplo monitoramento de solicitações](#ScriptsCondicionais-ProcessoExemplomonitoramentodesolicitações)\n - 2.3 [Procedimento para implantação do exemplo](#ScriptsCondicionais-Procedimentoparaimplantaçãodoexemplo)\n- 3 [Variáveis e funções suportadas em scripts condicionais](#ScriptsCondicionais-Variáveisefunçõessuportadasemscriptscondicionais)\n\n# Objetivo\n\nO objetivo desta página é esclarecer o uso de um script condicional do fluig.\n\n# Script Condicional\n\nO objetivo de um script condicional é verificar alguma informação que não pertence ao fluig que foi disponibilizada em algum webservice externo. Essa informação é dinâmica logo os eventos condicionais poderão ser programados para periodicamente executarem o script e verificarem se uma informação atingiu um determinado valor ou atingiu algum patamar estabelecido pelo negócio.\n\n### Exemplo de utilização do script condicional" }, { "metadata": { "title": "Scripts Condicionais", "source": "https://tdn.totvs.com/display/fluig/Scripts+Condicionais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Scripts Condicionais.md" }, "content": "Scripts Condicionais\n\n\nUm exemplo de uso de negócio seria criar um processo com uma atividade inicial condicional cujo script verifica o preço do dólar para compra. O preço do dólar pode variar durante o dia e neste caso poderíamos ter um processo workflow de compra de dólares que seria iniciado apenas se o preço do dólar atingisse um patamar aceitável para o negócio do cliente.\n\nOs scripts condicionais são scripts javascript que possuem basicamente todos os recursos dos eventos de processo do fluig podendo combinar a consulta de webservices externos com dados do formulário. Quando este script conseguir retornar *true* então a solicitação workflow será iniciada ou movimentada de acordo com o elemento utilizado na modelagem.\n\n**Exemplo de script acessando um webservice:**\n\n**Exemplo script**\n\n```\nfunction intermediateconditional2() {\n\n\tvar adminUser = \"adm\";\n\tvar adminPass = \"adm\";\n\tvar colleagueId = hAPI.getCardValue(\"cbuser\")\n\tvar companyId = 1;\n\tvar solic = hAPI.getCardValue(\"nmSol\");\n\tvar NOME_SERVICO = \"fluigDashBoardService\";\n\tvar CAMINHO_SERVICO = \"com.totvs.technology.ecm.dm.ws.ECMDashBoardServiceService\";\n\tvar servico = ServiceManager.getService(NOME_SERVICO);\n\tvar instancia = servico.instantiate(CAMINHO_SERVICO);\n\tvar ws = instancia.getDashBoardServicePort();\n\tvar summaryRequests = ws.getSummaryRequests(companyId, adminUser, adminPass, colleagueId);\n\tvar pendingRequests = summaryRequests.getNumberOfWorkflowPendingRequests();\n\tlog.info(\"pendingRequests \" + pendingRequests);\n\tif (pendingRequests > solic) {\n\t\treturn true;\n\t}\n}\n```\n\nObservação\n\nEmbora seja possível realizar a alteração de dados e consulta de webservices internos do fluig dentro de um script condicional, alertamos que esta prática não é recomendada.\n\nEm nossos exemplos estamos utilizando os próprios webservices do fluig apenas para facilitar a compreensão e implantação destes exemplos em ambientes de desenvolvimento do fluig.\n\n### Processo Exemplo monitoramento de solicitações" }, { "metadata": { "title": "Scripts Condicionais", "source": "https://tdn.totvs.com/display/fluig/Scripts+Condicionais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Scripts Condicionais.md" }, "content": "Scripts Condicionais\n\n\nPara este processo exemplo iremos monitorar a lista de tarefas pendentes de um usuário fluig escolhido no formulário do processo. Caso o número de solicitações pendentes seja superior ao número tolerado informado no formulário então será encaminhada para o administrador uma tarefa de \"Aviso\" em que o administrador poderá atuar com este usuário.\n\n![](..\\..\\..\\..\\images\\Manuf.png)\n\n**Figura 1 - Diagrama do processo de exemplo com script condicional.**\n\n### Procedimento para implantação do exemplo" }, { "metadata": { "title": "Scripts Condicionais", "source": "https://tdn.totvs.com/display/fluig/Scripts+Condicionais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Configuração de Processos com Componentes Avançados (BPMN 2.0)\\Scripts Condicionais.md" }, "content": "Scripts Condicionais\n\n\n- Cadastre o DashBoardService utilizando o código fluigDashBoardService . A URL informada será a seguinte:\n\n[https://(servidor): porta /webdesk/DashBoardService?wsdl](https://envinc.fluig.com/webdesk/DashBoardService?wsdl)\n\n![](..\\..\\..\\..\\images\\CadastroStudioservices.png)\n\n- Importar o processo exemplo.\n- Cadastrar o servidor destino no studio.\n\n![](..\\..\\..\\..\\images\\importzip.png)\n\n- Verificar a frequência de checagem do Job nas propriedades da atividade condicional no fluxo.\n\n![](..\\..\\..\\..\\images\\propriedadescondicional.png)\n\n- Exportar e liberar o processo junto com o formulário que está neste projeto.\n- Iniciar uma solicitação e mover para a atividade condicional.\n\nApós os procedimentos realizados acima você terá um exemplo de script condicional funcionando no seu ambiente. [Clique aqui](https://tdn.totvs.com/download/attachments/201732539/ScriptCondicional.zip?version=1&modificationDate=1442268598000&api=v2) e faça o download do projeto que contém o exemplo acima mencionado.\n\n# Variáveis e funções suportadas em scripts condicionais\n\nSegue a lista de variáveis e funções suportadas em scripts condicionais :\n\n| Variável | Função |\n| --- | --- |\n| **log** | Impressão de mensagens dentro do log do Fluig. |\n| **ServiceManager** | Objeto que permite a instância de objetos é métodos de webservices soap |\n| **DatasetManager** | Objeto que permite carregar datasets entro das customizações. |\n| **DatasetFactory** | O objeto **DatasetFactory** é a \"porta de entrada\" para o acesso a qualquer Dataset Maiores detalhes sobre este item se encontram no artigo sobre [construção de datasets.](../../Desenvolvimento de Datasets.md) |\n| **DatasetBuilder** | Permite a criação de datasets. Maiores detalhes sobre este item se encontram no artigo sobre [construção de datasets.](../../Desenvolvimento de Datasets.md) |\n| **ConstraintType** | Determina o tipo de constraint a ser utilizada em uma condição do dataset. Maiores detalhes sobre este item se encontram no artigo sobre [construção de datasets.](../../Desenvolvimento de Datasets.md) |\n| **notifier** | Permite realizar notificações extras em eventos e scripts. |\n| **WKParams** | Coleção de parâmetros que podem ser utilizados dentro dos scripts como o WKCompany e WKUser. As outras variáveis e o que elas retornam podem ser encontradas no artigo sobre [desenvolvimento de processos workflow](../../../Recurso de Processos (BPM).md)/Desenvolvimento de Workflow.md) . |\n| **hAPI** | Contém operações relacionadas a solicitação workflow em andamento. Está disponível apenas para os scripts de eventos intermediários condicionais. Maiores detalhes sobre as funções da hAPI podem ser encontradas no artigo sobre [desenvolvimento de processos workflow](../../../Recurso de Processos (BPM).md)/Desenvolvimento de Workflow.md). |" }, { "metadata": { "title": "Exportando eventos globais", "source": "https://tdn.totvs.com/display/fluig/Exportando+eventos+globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Exportando eventos globais.md" }, "content": "Exportando eventos globais\n\n\nOs eventos globais são eventos disparados durante a utilização do fluig e podem ser desenvolvidos sobre a plataforma.\n\nO desenvolvimento de um evento é realizado por meio da criação de *scripts* na linguagem JavaScript. O código de implementação de cada *script* é armazenado no banco de dados do fluig, dispensando o uso de qualquer outro arquivo.\n\nAtenção\n\nPara que um usuário que não é administrador da empresa possa exportar eventos globais é necessário que ele possua a permissão \"Configurar Eventos Globais\". Esta permissão pode ser concedida pelo administrador através do item \"Permissões\" disponível no agrupador \"Pessoas\" do Painel de Controle do fluig.\n\nSaiba como realizar esse procedimento [clicando aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=269431799).\n\nNa perspectiva Fluig, localize o arquivo desejado dentro do projeto, no caminho events/[nome\\_servidor]/[evento].js.\n\nClique com o botão direito sobre o arquivo do evento e selecione a opção **Export...**\n\nEscolha a opção **Exportar para Servidor Fluig** e clique em **Next**.\n\n![](..\\..\\..\\..\\images\\Screenshot%2016_06%20008.png)\n\nSelecione o servidor para onde o evento será exportado. Na tabela são mostrados ao usuários todos os eventos do servidor. Também é possível alternar as opções de manter, atualizar, eliminar ou criar novos eventos.\n\n![](..\\..\\..\\..\\images\\Screenshot%2016_06%20010.png)\n\nApós configurar, clique em **Finish** e aguarde o término do processamento." }, { "metadata": { "title": "Exportando formulários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239018344", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Exportando formulários.md" }, "content": "Exportando formulários" }, { "metadata": { "title": "Exportando formulários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239018344", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Exportando formulários.md" }, "content": "Exportando formulários\n\n\nApós a criação do formulário e desenvolvimento de eventos sobre a plataforma, é possível exportá-los para o servidor fluig e realizar a publicação no sistema.\n\nPara exportar os formulários siga os passos abaixo:\n\nAo exportar o formulário, os eventos desenvolvidos para ele também serão exportados.\n\nCaso a exportação já tenha sido realizada, uma nova exportação deve ser feita para que os novos eventos sejam publicados.\n\nPara exportar um formulário para um servidor fluig, basta clicar no arquivo principal do formulário com o botão direito do *mouse* e selecionar a opção **Export...**\n\n![](..\\..\\..\\..\\images\\Img%2001.PNG)\n\nNeste *wizard*, selecione a opção **Exportar para servidor Fluig** e clique em **Next**.\n\n![](..\\..\\..\\..\\images\\Screenshot%2016_06%20011.png)\n\nNa próxima janela, escolha o servidor destino. Se o formulário for novo, marque a opção **Criar nova versão**, caso contrário escolha a opção **Manter versão atual** e selecione um formulário existente para ser sobrescrito. Caso queira fixar uma opção por padrão, o desenvolvedor poderá configurar essa opção nas [preferências do eclipse](https://tdn.totvs.com/download/attachments/239018344/Screenshot%20from%202023-06-12%2010-23-20.png?api=v2).\n\nPara criar um dataset que armazene os dados das solicitações deste formulário, preencha o campo **Nome Dataset**.\n\nObrigatoriamente, escolha uma pasta do fluig onde será publicado o formulário. Clique em **Pesquisar** e preencha o campo de busca com o nome ou código da pasta desejada para que o plugin localize-a.\n\nNo campo **Armazenar em**, mantenha a opção padrão Tabelas de Banco de Dados (recomendado). [Saiba mais](http://tdn.totvs.com/pages/viewpage.action?pageId=244716710).\n\n**Tela de criação de novo formulário:**\n\n![](..\\..\\..\\..\\images\\Screenshot%20from%202023-06-12%2010-32-51.png)\n\n**Tela de edição de formulário:**\n\n![](..\\..\\..\\..\\images\\Screenshot%20from%202023-06-12%2010-23-08.png)\n\nUma vez preenchidos os campos, é possível finalizar a exportação de formulário e aguardar o término do processamento. Também é possível clicar em **Next** e visualizar os campos que o fluig está considerando nos formulários." }, { "metadata": { "title": "Exportando processos", "source": "https://tdn.totvs.com/display/fluig/Exportando+processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Exportando processos.md" }, "content": "Exportando processos\n\n\nAo modelar um processo, é possível verificar se existem inconsistências antes de exportá-lo para o servidor fluig. Por exemplo, um mecanismo de atribuição por grupo pode estar configurado sem existir um grupo selecionado. Em caso de erro, um X em vermelho é exibido na atividade e no ícone do processo.\n\nNão é possível exportar o processo para o servidor até que todos os erros da modelagem sejam corrigidos.\n\nPara exportar um processo para um servidor fluig, basta clicar no processo com o botão direito, e selecionar a opção **Export...**\n\n![](..\\..\\..\\..\\images\\Img%2001.PNG)\n\nNa janela de exportação, escolher a opção **Exportar para um Servidor Fluig** e clique em **Next**\n\n![](..\\..\\..\\..\\images\\Img%2002.PNG)\n\nÉ possível também exportar o processo para os seguintes formatos:\n\n- Formato Site - Irá gerar uma página web com todas as informações sobre o processo\n- Formato XPDL - Criará um arquivo de extensão .xpdl que pode ser importado em outros softwares de modelagem\n\nNeste último passo, escolhemos o servidor destino do processo. O plugin irá carregar os processos já cadastrados no servidor e, caso encontre o processo que está sendo exportado, o usuário poderá atualizar o modelo existente.\n\nMarcando a opção de **Novo Processo** o plugin irá criar um processo com o nome informado. Após preencher os dados, clique em **Finish** e espere o procedimento ser finalizado.\n\n![](..\\..\\..\\..\\images\\Img%2003.PNG)" }, { "metadata": { "title": "Exportando relatórios", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239019006", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Exportando relatórios.md" }, "content": "Exportando relatórios\n\n\nO BIRT - *Business Intelligence and Reporting Tools*, é uma plataforma *open source* que facilita a modelagem de relatórios dentro do fluig. A plataforma se integra com o aplicativo Java / Java EE e os relatórios podem ser desenvolvidos através do Studio ou outra distribuição do Eclipse.\n\nPara exportar relatórios siga os passos abaixo:\n\n- Na perspectiva Fluig, clique com o botão direito do *mouse* sobre o arquivo de relatório .rptdesign e selecione a opção **Export...**\n- Escolha a opção **Exportar para servidor Fluig**.\n\n![](..\\..\\..\\..\\images\\exportar%20formularios.png)![](..\\..\\..\\..\\images\\Img%2001.PNG)\n\n- Selecione o servidor destino, e marque a opção **Novo Relatório** caso deseje criar um relatório novo.\n- Para escolher a pasta onde o relatório será armazenado no fluig, clique em **Pesquisar** e digite o nome ou código da pasta destino.\n- Após preencher todos os campos, clique em **Finish** e aguarde o relatório ser exportado.\n\n![](..\\..\\..\\..\\images\\Img%2002.PNG)" }, { "metadata": { "title": "Importando eventos globais", "source": "https://tdn.totvs.com/display/fluig/Importando+eventos+globais", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Importando eventos globais.md" }, "content": "Importando eventos globais\n\n\nOs eventos globais são eventos disparados durante a utilização do fluig e podem ser desenvolvidos sobre a plataforma.\n\nO desenvolvimento de um evento é realizado por meio da criação de *scripts* na linguagem JavaScript. O código de implementação de cada *script* é armazenado no banco de dados do fluig, dispensando o uso de qualquer outro arquivo.\n\nAtenção\n\nPara que um usuário que não é administrador da empresa possa importar eventos globais é necessário que ele possua a permissão \"Configurar Eventos Globais\". Esta permissão pode ser concedida pelo administrador através do item \"Permissões\" disponível no agrupador \"Pessoas\" do Painel de Controle do fluig.\n\nSaiba como realizar esse procedimento [clicando aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=269431799).\n\nNa perspectiva Fluig, clique com o botão direito do *mouse* sobre a pasta do projeto e selecione a opção **Import...**\n\nEscolha a opção **Importar Evento do Servidor Fluig** e clique em **Next**.\n\n![](..\\..\\..\\..\\images\\Screenshot%2016_06%20006.png)\n\nSelecione o servidor fluig de onde será importado o evento. Se desejar importar todos os eventos deixe a opção **Todos os Eventos** marcadas. Caso contrário, desmarque a opção e escolha o evento desejado.\n\n![](..\\..\\..\\..\\images\\Screenshot%2016_06%20007.png)" }, { "metadata": { "title": "Importando formulários", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239018330", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Importando formulários.md" }, "content": "Importando formulários\n\n\nOs formulários no fluig são um tipo de pasta formatada, pois todos os registros abaixo dessa estrutura terão o mesmo formato. Uma **Solicitação de Nota Fiscal**, por exemplo, pode ser um formulário no fluig.\n\nTodas as solicitações deste formulário irão possuir o mesmo formato e os mesmos campos a serem preenchidos. O modelo de formatação da solicitação é informado na definição de formulário.\n\nPara importar formulários siga os passos abaixo:\n\nNa perspectiva Fluig, clique com o botão direito sobre a pasta do projeto e selecione a opção **Import...**\n\nSelecione a opção **Importar Formulário do Servidor Fluig** e clique em **Next**.\n\n![](..\\..\\..\\..\\images\\Capturar.PNG)\n\nNa próxima tela informe o servidor que o formulário se encontra. Assim que carregada a lista de formulários, escolha o desejado.\n\n![](..\\..\\..\\..\\images\\Img%2002.PNG)\n\nClique em **Finish** e aguarde o término da importação. Após o processo de importação ser finalizado, o arquivo de formulário será aberto automaticamente." }, { "metadata": { "title": "Importando processos ECM 3 no fluig", "source": "https://tdn.totvs.com/display/fluig/Importando+processos+ECM+3+no+fluig", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Importando processos ECM 3 no fluig.md" }, "content": "Importando processos ECM 3 no fluig\n\n\nOs processos são criados no fluig por meio da interface Web, porém também é possível criá-los no Studio a partir do plugin fluig Designer. A modelagem de processos de negócio consiste na representação dos processos internos da empresa, através de modelagem gráfica. Esta tem por finalidade facilitar e apoiar a gestão de processos de negócios para usuários técnicos e/ou usuários de negócio de maneira intuitiva.\n\n# Importando processos do ECM 3 para o fluig Designer\n\nNo espaço de visualização de projetos, clique com o botão direito sobre o projeto e escolha a opção **Import...**\n\n![](..\\..\\..\\..\\images\\Img%2001.PNG)\n\nEscolha a opção **Importar Processo**.\n\n![](../../../../images/exportar_processo%20_ecm(1).png).png)\n\nSe você deseja importar um processo do ECM, escolha o formato **ECM** **3.1**.\n\n![](../../../../images/exportar_processo%20_ecm(2).png).png)\n\nDefina o servidor fluig para o qual este processo deverá carregar as informações e selecione o arquivo XML do processo gerado pelo ECM. Dê um nome ao processo e clique em **Finish.**\n\n**![](../../../../images/exportar_processo%20_ecm(3).png).png)**" }, { "metadata": { "title": "Importando processos", "source": "https://tdn.totvs.com/display/fluig/Importando+processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Importando processos.md" }, "content": "Importando processos\n\n\nOs processos são criados no fluig por meio da interface web, porém também é possível criá-los no Studio a partir do plugin fluig Designer. A modelagem de processos de negócio consiste na representação dos processos internos da empresa, através de modelagem gráfica. Esta tem por finalidade facilitar e apoiar a gestão de processos de negócios para usuários técnicos e/ou usuários de negócio de maneira intuitiva.\n\nNo menu de visualização do projeto, clique com o botão direito sobre o projeto e escolha a opção **Importar**.\n\n![](..\\..\\..\\..\\images\\Img%2001.PNG)\n\nEscolha a opção **Importar Processo**.\n\n![](..\\..\\..\\..\\images\\Img%2002.PNG)\n\nSe você deseja importar um processo existente de um ambiente fluig, escolha o formato **Fluig Server**.\n\n![](..\\..\\..\\..\\images\\Img%2003.PNG)\n\nSelecione o servidor do qual deseja importar o processo. Após carregar a lista de processos, escolha o desejado e clique em **Finish**.\n\nÉ possível também importar o formulário que está atrelado ao processo, marcando a opção **Importar Formulário**.\n\n![](..\\..\\..\\..\\images\\Img%2004.PNG)" }, { "metadata": { "title": "Importando relatórios", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239019001", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Importando relatórios.md" }, "content": "Importando relatórios\n\n\nO BIRT - *Business Intelligence and Reporting Tools*, é uma plataforma *open source* que facilita a modelagem de relatórios dentro do fluig. A plataforma se integra com o aplicativo Java / Java EE e os relatórios podem ser desenvolvidos através do Studio ou outra distribuição do Eclipse.\n\nPara importar relatórios siga os passos abaixo:\n\nNa perspectiva Fluig, clique com o botão direito sobre a pasta do projeto e selecione a opção **Importar** ***(Import).***\n\nSelecione a opção **Importar Relatório do Servidor Fluig**.\n\n![](..\\..\\..\\..\\images\\importar%20relatorio.png)![](..\\..\\..\\..\\images\\Img%2001.PNG)\n\nInforme o servidor que o relatório está localizado. Após a lista de relatórios carregar, selecione o relatório desejado e clique em **Finalizar *(Finish)*.**\n\n![](..\\..\\..\\..\\images\\Img%2002.PNG)" }, { "metadata": { "title": "Importação e exportação de projeto no fluig Studio", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=128681226", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Importação e exportação de projeto no fluig Studio.md" }, "content": "Importação e exportação de projeto no fluig Studio" }, { "metadata": { "title": "Importação e exportação de projeto no fluig Studio", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=128681226", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Fluig Studio\\Importação e Exportação\\Importação e exportação de projeto no fluig Studio.md" }, "content": "Importação e exportação de projeto no fluig Studio\n\n\n# Índice\n\n- 1 [Objetivo](#ImportaçãoeexportaçãodeprojetonofluigStudio-Objetivo)\n- 2 [Exportação de Projetos Fluig do TDS](#ImportaçãoeexportaçãodeprojetonofluigStudio-ExportaçãodeProjetosFluigdoTDS)\n- 3 [Importação de Projetos Fluig do TDS](#ImportaçãoeexportaçãodeprojetonofluigStudio-ImportaçãodeProjetosFluigdoTDS)\n- 4 [Importação de artefatos Fluig do servidor Fluig](#ImportaçãoeexportaçãodeprojetonofluigStudio-ImportaçãodeartefatosFluigdoservidorFluig)\n- 5 [Exportação de artefatos Fluig para servidor Fluig](#ImportaçãoeexportaçãodeprojetonofluigStudio-ExportaçãodeartefatosFluigparaservidorFluig)\n\n# Objetivo\n\nO objetivo deste guia é apresentar os procedimentos necessários para a importação e exportação de projetos Fluig através do TDS.\n\n# Exportação de Projetos Fluig do TDS\n\nA exportação de um projeto Fluig é realizada pelo plugin Fluig BPM no TOTVS Developer Studio – TDS.\n\nA estrutura de projeto Fluig é apresentada a seguir:\n\n![](..\\..\\..\\..\\images\\exped-proc-studio.png)\n\nOs arquivos com formulários e seus anexos - por exemplo arquivos CSS e imagens - são armazenados em uma pasta específica. Na figura exemplo acima, os arquivos do formulário estão na pasta “63 - Especificações” que é o local do Fluig onde o formulário do processo foi publicado. A pasta é criada automaticamente com o mesmo nome dado ao formulário do processo de *workflow*.\n\nPor fim, a pasta “*workflow*” contém todos os arquivos que compõem a estrutura do processos. Nela é possível encontrar o “.process” que é a definição do processo e a pasta “scripts”. Na pasta “scripts” são armazenadas a implementação de todos os eventos de customização criados para o processo.\n\nA exportação do projeto Fluig pode ser realizada para que em outro momento seja importada em outra ferramenta de desenvolvimento (Ex: Totvs Developer Studio ou Eclipse). Para fazer este procedimento, basta selecionar o projeto e com o botão direito escolher a opção “*Export*” conforme ilustrado na figura a seguir:\n\n![](..\\..\\..\\..\\images\\exped-proc-studio2.png)\n\nNa árvore, expandir o item “*General*” e selecionar a opção “*Archive File*” conforme ilustrado na figura a seguir:\n\n![](..\\..\\..\\..\\images\\exped-proc-studio3.png)\n\nPor fim, informe o caminho completo e o nome do arquivo a ser gerado para o arquivo do processo. Para a criação de um arquivo no formato ZIP verifique se a opção “*Save in zip format*” está selecionada.\n\n# Importação de Projetos Fluig do TDS\n\nA partir de um projeto já exportado a importação de um projeto Fluig pode ser realizada para a ferramenta de desenvolvimento desejada, desde que esta tenha o plugin Fluig Studio instalado.\n\nPara importar o arquivo de um processo de *workflow*, abra o TDS e selecione a visão “*Package Explorer*”. Em “*Package Explorer*” clique com o botão direito na área de trabalho desta visão e selecione a opção “*Import*” conforme ilustrado na figura a seguir:\n\n![](..\\..\\..\\..\\images\\exped-proc-studio4.png)\n\nNa tela de importação, feche o nó Fluig e, posteriormente, selecione o nó *General* > *Existing Project sinto Workspace*” conforme apresentado na figura a seguir:\n\n![](..\\..\\..\\..\\images\\exped-proc-studio5.png)\n\nPor fim, selecione opção “*Select archive file*” e clique em “*Browser*”. Navegue até o arquivo ZIP que contém a definição do processo a ser importado e finalize o *Wizard* conforme a tela a seguir:\n\n![](..\\..\\..\\..\\images\\exped-proc-studio6.png)\n\n# Importação de artefatos Fluig do servidor Fluig\n\nApós criar um projeto, é possível **importar** os **artefatos** já existentes no **servidor** **Fluig.**\n\nA funcionalidade permite que os artefatos como: ***workflow***, **formulários,** ***datasets***, **eventos**, **relatórios**entre outros, sejam manipulados a partir do *plugin* **Fluig *Designer*** no ***Studio*.**\n\nA seguir, veja o passo a passo para **importar** artefatos já existentes no **Fluig**.\n\n- Para importar artefatos, clique com o botão direito na visão **Explorador de Pacotes | Importar.** \n Nesta tela, as origens de importação são exibidas.\n\n ![](..\\..\\..\\..\\images\\1-1.png)\n\n- Clique sobre a pasta **Fluig** e verifique as opções de importação disponíveis:\n\n**Importar *dataset* do servidor Fluig.**\n\n**Importar definição de formulário do servidor Fluig.**\n\n**Importar evento Fluig do servidor.**\n\n**Importar processo do servidor Fluig.**\n\n**Importar processo via arquivo XML.**\n\n**Importar relatório do servidor Fluig.**\n\n- Selecione a opção desejada e clique em Avançar.\n\n![](..\\..\\..\\..\\images\\1-2.png)\n\n- Como exemplo, um ***Dataset*** do servidor será importado.\n\n![](..\\..\\..\\..\\images\\1-3.png)\n\n- A seguir, informe o servidor no qual já foi previamente cadastrado e, em seguida, selecione o *dataset* customizado desejado para a importação. \n Clique em **Concluir** para finalizar. \n \n \n ![](..\\..\\..\\..\\images\\1-4.png)\n\n- O ***Dataset*** importado é disponibilizado no projeto **Fluig**criado anteriormente e, também, será exibido no editor para customização.\n\n ![](..\\..\\..\\..\\images\\1-5.png)\n\n# Exportação de artefatos Fluig para servidor Fluig\n\nAssim como é possível importar artefatos de um **servidor** **Fluig**, também é possível exportá-los.\n\nNo ***Fluig*** ***Studio*** o usuário pode manipular os artefatos de maneira *offline* e posteriormente exportar para o servidor do **Fluig**.\n\nPara exportar é necessário que um servidor esteja cadastrado e no ar.\n\nA exportação pode ser efetuada para todos os artefatos presentes no projeto **Fluig.**\n\nA seguir, veja o passo a passo para **exportar**artefatos no **Fluig,** ao clicar nas setas acima ou na sequência de números abaixo.\n\n- Selecione o item desejado para exportar na visão **Explorador de Pacotes,**clique com o botão direito e, em seguida, clique em**Exportar.** \n Neste exemplo, um *dataset* será exportado.\n\n **![](..\\..\\..\\..\\images\\2-1.png)**\n\n- Nesta tela, deve ser informado o destino da exportação. \n Selecione, **Exportar para o servidor Fluig**, disponível na pasta **Fluig**.\n\n![](..\\..\\..\\..\\images\\2-2.png)\n\n- Em seguida, informe o **servidor**de destino, previamente cadastrado. \n Selecione a opção **Novo *Dataset*** somente quando exportar um novo***Dataset*,** neste exemplo estamos atualizando um ***Dataset*** que já existe e por este motivo não é necessário a seleção da opção.\n- Selecione o *dataset* e preencha a descrição.\n- Para finalizar, clique em **Concluir.**\n\n**![](..\\..\\..\\..\\images\\2-3.png)**\n\nPara mais informações sobre importações e exportações no Fluig Studio, sugerimos a realização da trilha de treinamento do produto que está disponível na academia TOTVS." }, { "metadata": { "title": "Plataforma | Guia de estilos", "source": "https://tdn.totvs.com/display/fluig/Plataforma+%7C+Guia+de+estilos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Guia de Estilos\\Plataforma Guia de estilos.md" }, "content": "Plataforma | Guia de estilos\n\n\n![](..\\..\\..\\images\\guia-estilos.png)\n\n---\n\nO Guia de estilos permite criar desenvolvimentos sobre a plataforma TOTVS Fluig mantendo a consistência técnica e visual.\n\n \n\n![](..\\..\\..\\images\\guia-estilos.png)\n\n# [Acesse o Guia de estilos](https://style.fluig.com/)\n\nVeja a documentação completa dos componentes que fazem parte do Guia de estilos." }, { "metadata": { "title": "Utilizando o Guia de Estilos", "source": "https://tdn.totvs.com/display/fluig/Utilizando+o+Guia+de+Estilos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Guia de Estilos\\Utilizando o Guia de Estilos.md" }, "content": "Utilizando o Guia de Estilos\n\n\n- 1 [Sobre](#UtilizandooGuiadeEstilos-Sobre)\n - 1.1 [O Guia](#UtilizandooGuiadeEstilos-OGuia)\n - 1.2 [Passos para Utilização](#UtilizandooGuiadeEstilos-PassosparaUtilização)\n - 1.3 [Crie seu Design Responsivo](#UtilizandooGuiadeEstilos-CrieseuDesignResponsivo)\n - 1.4 [Exemplo de Utilização](#UtilizandooGuiadeEstilos-ExemplodeUtilização)\n - 1.4.1 Exemplo Fluig Style Guide\n- 2 [Utilizando em Formulários no fluig 1.4](#UtilizandooGuiadeEstilos-UtilizandoemFormuláriosnofluig1.4)\n - 2.1 [Passos para Utilização](#UtilizandooGuiadeEstilos-PassosparaUtilização.1)\n\n# Sobre\n\n---\n\nCom o **fluig 1.4** lançamos o ***fluig Style Guide***, o guia de estilos que ajuda que desenvolvimentos sobre a plataforma sejam mais ágeis e que gerem um visual padrão do fluig mesmo no caso de personalizações.\n\nEste guia é destinado a desenvolvedores que desejam construir páginas, *widgets* e formulários com as folhas de estilos (CSS) do guia de estilos do fluig.\n\n## O Guia\n\n---\n\nTemos um guia para o acesso completo a todos os componentes do guia de estilo, antes de desenvolver observe a documentação e exemplos de uso.\n\nDocumentação Online\n\nAcesse [style.fluig.com](http://style.fluig.com/) e confira todos os componentes disponíveis\n\nDocumentação no seu fluig\n\nA sua instalação do fluig também possui o style Guide para consult e terá exatamente o que sua atualização permite utilizar, visto que regularmente trazemos novos componentes para o Style Guide.\n\nAcesse **/style-guide** para consultar seu Style Guide disponível.\n\nExemplo de URL: \n\n## Passos para Utilização" }, { "metadata": { "title": "Utilizando o Guia de Estilos", "source": "https://tdn.totvs.com/display/fluig/Utilizando+o+Guia+de+Estilos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Guia de Estilos\\Utilizando o Guia de Estilos.md" }, "content": "Utilizando o Guia de Estilos\n\n\n---\n\nOs seguintes passos devem ser observados para a utilização do fluig Style Guide:\n\n- Importe os artefatos necessários no seu desenvolvimento.\n\n**Artefatos**\n\n```\n\n\n\n\n\n```\n\nSerá necessário ter as fontes locais, pois alguns navegadores impedem carregamento de outros domínios, acrescente no seu ambiente as fontes e altere o CSS acima.\n\n- **[Download das Fontes](https://tdn.totvs.com/download/attachments/172295291/fluig-fonts.zip?version=1&modificationDate=1414589858000&api=v2)**\n\nAtenção\n\nAo ser liberado o Fluig 1.4, todos os *layouts* de páginas do fluig receberão essas linhas por padrão, por isso não será necessário adicionar essas linhas manualmente.\n\n- Encapsule seu código sobre a classe ***fluig-style-guide***. Assim você não afeta outros desenvolvimentos que ainda não usam fluig Style Guide.\n\n**Colocando seu código dentro da classe**\n\n```\n
\n\n \n\n
\n```\n\nLembre-se que apesar de ter importado os recursos, caso seu código HTML não esteja dentro dessa classe, o estilo não será aplicado!\n\n- Utilizando o guia, busque os componentes desejados e monte sua tela.\n\n![](..\\..\\..\\images\\style.png)\n\n## Crie seu Design Responsivo" }, { "metadata": { "title": "Utilizando o Guia de Estilos", "source": "https://tdn.totvs.com/display/fluig/Utilizando+o+Guia+de+Estilos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Guia de Estilos\\Utilizando o Guia de Estilos.md" }, "content": "Utilizando o Guia de Estilos\n\n\n---\n\nUma das principais funções disponível no fluig Style Guide é a possibilidade de criar páginas responsivas, que se comportam de forma especial se estiverem em *smartphones*, *tablets* e computadores.\n\n![](..\\..\\..\\images\\responsive.png)\n\nCriar um design responsivo fará com que sua página, *widget* e formulário adaptem sua visualização dependendo do tamanho da tela que o usuário está utilizando. No exemplo acima quando a tela é maior o usuário vê duas colunas, mas quando o dispositivo tem uma tela pequena os campos ficam um embaixo do outro.\n\nDocumentação\n\nAcesse [style.fluig.com/css.html#grid](http://style.fluig.com/css.html#grid) e saiba mais como criar seu design responsivo\n\n## Exemplo de Utilização\n\n---\n\n\n\n- Abaixo temos um exemplo de uma página html com a aplicação do guia de estilos do fluig.\n\n\n\n\n### Exemplo Fluig Style Guide" }, { "metadata": { "title": "Utilizando o Guia de Estilos", "source": "https://tdn.totvs.com/display/fluig/Utilizando+o+Guia+de+Estilos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Guia de Estilos\\Utilizando o Guia de Estilos.md" }, "content": "Utilizando o Guia de Estilos\n\n\n×Close **Fluig Style guide** Acesse [aqui](http://style.fluig.com/javascript.html#alerts).\n\n  \n\nEmail\n\nPassword\n\nRemember me\n\nSign in\n\n- Você deverá declarar em seu html a carga do arquivo css e js e declarar na sua div `class``=``\"fluig-style-guide\".`\n\n**suapagina.html**\n\n```\n\n\n\n\n\n\n\n\n
\n \n\t\t
 \n\t\t\t

ExemploFluig Style Guide

\n\t\t
\n\t\t
\n\t\t\t\n\t\t\tFluig Style guide Acesse aqui.\n\t\t
\n\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n\n\n\n```\n\n**Downloads:**\n\n[fluig-glyphs.svg](https://tdn.totvs.com/download/attachments/172295291/fluigicons.ttf?version=1&modificationDate=1414588754000&api=v2)\n\n[fluigicons.ttf](https://tdn.totvs.com/download/attachments/172295291/fluigicons.ttf?version=1&modificationDate=1414588754000&api=v2)\n\n[fluigicons.woff](https://tdn.totvs.com/download/attachments/172295291/fluigicons.woff?version=1&modificationDate=1414588751000&api=v2)\n\n[fluigicons.svg](https://tdn.totvs.com/download/attachments/172295291/fluigicons.svg?version=1&modificationDate=1414588746000&api=v2)\n\n[fluigicons.eot](https://tdn.totvs.com/download/attachments/172295291/fluigicons.eot?version=1&modificationDate=1414588741000&api=v2)\n\n# Utilizando em Formulários no fluig 1.4\n\n---\n\nO fluig Style Guide estará disponível no Fluig 1.4. Para utilizar em formulários você deve seguir os passos abaixo.\n\nDocumentação Online\n\nAcesse [git.fluig.com](http://git.fluig.com/projects/SAMPLES/repos/exercise-style-guide/browse) e confira projeto de exemplo com formulário e Widgets." }, { "metadata": { "title": "Utilizando o Guia de Estilos", "source": "https://tdn.totvs.com/display/fluig/Utilizando+o+Guia+de+Estilos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Guia de Estilos\\Utilizando o Guia de Estilos.md" }, "content": "Utilizando o Guia de Estilos\n\n## Passos para Utilização\n\n---\n\nOs seguintes passos devem ser observados para a utilização do fluig Style Guide em formulários a partir da release 1.4.\n\n- Importe os artefatos necessários no seu formulário.\n\n**Artefatos**\n\n```\n\n\n\n\n```\n\n- Encapsule seu código sobre a classe ***fluig-style-guide***. Assim você não afeta outros desenvolvimentos que ainda não usam fluig Style Guide.\n\n**Colocando seu código dentro da classe**\n\n```\n
\n\n \n\n
\n```\n\nLembre-se de que, apesar de ter importado os recursos, se o seu código HTML não estiver dentro dessa classe, o estilo não será aplicado!\n\n- Utilizando o guia, busque os componentes desejados e monte sua tela.\n\n![](..\\..\\..\\images\\style.png)" }, { "metadata": { "title": "Fluig API", "source": "https://tdn.totvs.com/display/fluig/Fluig+API", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API.md" }, "content": "Fluig API" }, { "metadata": { "title": "Fluig API", "source": "https://tdn.totvs.com/display/fluig/Fluig+API", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API.md" }, "content": "Fluig API\n\n\nAtenção\n\nEsta página foi revisada para considerar as configurações do TOTVS Fluig Plataforma a partir da **atualização 1.6**.\n\n# Índice\n\n- 1 [Objetivo](#FluigAPI-Objetivo)\n- 2 [Pré requisitos](#FluigAPI-Prérequisitos)\n- 3 [API](#FluigAPI-API)\n - 3.1 [OAuth](#FluigAPI-OAuth)\n - 3.2 [Processo de autenticação](#FluigAPI-Processodeautenticação)\n - 3.3 [Cadastrar aplicativo no fluig](#FluigAPI-Cadastraraplicativonofluigapp)\n - 3.4 [Aplicação de Exemplo](#FluigAPI-AplicaçãodeExemplo)\n - 3.5 [Acesso ao Java DOC do componente SDK](#FluigAPI-AcessoaoJavaDOCdocomponenteSDK)\n\n# Objetivo\n\n---\n\nEste documento é direcionado a desenvolvedores, clientes e parceiros que desejam criar aplicações e recursos externos ou internos ao fluig. O fluig possui uma API Pública com os principais serviços disponíveis na plataforma, bem como um componente interno (fluig-sdk-api.jar) que pode ser importado e utilizado para chamadas dos serviços no mesmo contexto do fluig. A API disponibiliza uma documentação de classes e interfaces no padrão Java Doc que pode ser encontrada [aqui](http://api.fluig.com/old/sdk).\n\nAtravés da API é possível criar mensagens em nome do usuário, adicionar um contato como favorito, criar artigos e muito mais. Para que aplicativos possam atuar em nome do usuário a autorização é realizada através do protocolo OAuth, e caso o serviço seja utilizado pelo componente interno, é injetado o EJB para execução dos serviços.\n\n# Pré requisitos\n\n---\n\nSão pré requisitos básicos ter conhecimento sobre:\n\n- Desenvolvimentos de API REST\n- Padrão OAuth\n\n# API\n\n---\n\nAPI, de *Application Programming Interface* (Interface de Programação de Aplicativos), é um conjunto de rotinas e padrões estabelecidos pelo *software* para que aplicativos externos possam utilizar seus recursos em suas aplicações. No fluig, a documentação da API está disponível em http://[servidor\\_fluig]/api ou [aqui](http://api.fluig.com).\n\nTodos os serviços são baseados em **REST**, onde ações de escrita estão limitados à requisições HTTP do tipo **POST**, e ações de consulta à requisições do tipo **GET.**" }, { "metadata": { "title": "Fluig API", "source": "https://tdn.totvs.com/display/fluig/Fluig+API", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API.md" }, "content": "Fluig API\n\n### OAuth\n\n![](..\\..\\..\\images\\zeput87tfEe0mreaYKPTHyVDF4yVDBYMO1B2L3TtAncTWFNLv5iE59ulRMx58uW619aSkxQddzwtfEQgNFh0wmjSnXUjveCqS7YanKfTZjsV9ej8YPByeXbY)\n\nA autenticação e autorização de aplicativos externos ao fluig é realizada através do protocolo [OAuth](http://oauth.net/core/1.0a/) 1.0 e [OAuth 1.0a](http://oauth.net/core/1.0a/) , que possibilita que aplicações executem ações em nome do usuário sem armazenar seus dados de acesso (usuário/senha). Também é possível utilizar a API do fluig através de uma sessão válida no navegador de internet.\n\nObservação\n\nO fluig não é compatível com o protocolo OAuth 2.0.\n\n### Processo de autenticação" }, { "metadata": { "title": "Fluig API", "source": "https://tdn.totvs.com/display/fluig/Fluig+API", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API.md" }, "content": "Fluig API\n\n\nPara que um aplicativo consiga atuar no fluig em nome de um usuário ou em nome próprio é necessário que ele esteja previamente cadastrado na plataforma fluig com suas chaves pública e privada. Quando o aplicativo estiver cadastrado no fluig, é possível iniciar o processo de autenticação conforme etapas abaixo:\n\n- **Etapa 1:**Aplicativo solicita ao fluig token para iniciar uma sessão OAuth (http://[servidor\\_fluig]/portal/api/rest/oauth/request\\_token).\n\n- **Etapa 2:**Aplicativo solicita autorização do usuário através de login e senha (http://[servidor\\_fluig]/portal/api/rest/oauth/authorize).\n\n- **Etapa 3:**Aplicativo solicita ao fluigtokens para atuar em nome do usuário (http://[servidor\\_fluig]/portal/api/rest/oauth/access\\_token).\n\n![](../../../images/OAuth%20Fluig%20%20(1).png).png) \n**Exemplo OAuth**\n\n**Consumo da API Pública em Eventos**\n\n**Utilizando um objeto consumer**\n\nPara obter uma instância de consumer é necessário solicitar ao objeto de ambiente **oauthUtil** executando o método **getNewAPIConsumer** ou**getNewAPIConsumerAsCurrentUser**.\n\n- **getNewAPIConsumer:** Utilizada para solicitar um objeto de acesso com autenticação por usuário da aplicação.\n\n- **getNewAPIConsumerAsCurrentUser:** Utilizada para solicitar um objeto de acesso com autenticação pelo usuário logado.\n\n**IMPORTANTE:**Para poder utilizar esse método você deve marcar na página do usuário aplicativo a opção ***\"Pode agir como usuário logado em eventos customizados\"***\n\n***O usuário da aplicação utiliza o modo Impersonate como forma de identificação na autenticação do acesso. Esse modo Impersonate só é permitido através dos eventos customizados e não fora dele.***\n\nPara ambos os métodos descritos acima, utilizar os seguintes parâmetros:\n\n- Consumer Key\n- Consumer Secret\n- Token Access\n- Token Secret\n\nPara mais informações acesse o passo [Cadastrar aplicativo no fluig](https://tdn.totvs.com/pages/viewpage.action?pageId=258277672).\n\n**Método GET**\n\nEsse método realiza uma chamada GET na API Publica, passando como argumento uma URI válida da API .\n\n***Ex:*** consumer.get(\"/public/social/community/comunidade1\");\n\n**Método POST**\n\nEsse método realiza uma chamada POST na API Publica, passando como argumento uma URI válida da API e os dados enviados em formato JSON.\n\n***Ex:*** consumer.post(\"/public/social/post/create/with/upload\", \"{\\\"text\\\":\\\"Post criado via evento\\\",\\\"visibility\\\":\\\"PUBLIC\\\"}\");" }, { "metadata": { "title": "Fluig API", "source": "https://tdn.totvs.com/display/fluig/Fluig+API", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API.md" }, "content": "Fluig API\n\n### Cadastrar aplicativo no fluig" }, { "metadata": { "title": "Fluig API", "source": "https://tdn.totvs.com/display/fluig/Fluig+API", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API.md" }, "content": "Fluig API\n\n\n---\n\nPara cadastrar um aplicativo na plataforma, acompanhe os passos a seguir:\n\n- Acesse o menu **Painel de controle**, localize o agrupador **Parâmetros técnicos** e acione a opção **Oauth Provider.**\n\n![](..\\..\\..\\images\\Oauth%20Provider%20165.png)\n\n- Clique em **Adicionar**, preencha os campos conforme a imagem e salve.\n\n![](..\\..\\..\\images\\002_03_02.png)\n\n**Cadastro de provedor Oauth** \n\n**Detalhes:**\n\n| Campo | Exemplo |\n| --- | --- |\n| Código | 01 |\n| OAuth Provider | WCM |\n| Descrição | Aplicativo de exemplo |\n| Acess Token URL | http:///portal/api/rest/oauth/access\\_token |\n| Request Token URL | http:///portal/api/rest/oauth/request\\_token |\n| User Authorization URL | http:///portal/api/rest/oauth/authorize |\n| Request Method | GET |\n| Signature Method | HMAC-SHA |\n\n- Volte para o **Painel de controle** e acesse agora a opção **Oauth application**.\n\n![](..\\..\\..\\images\\Oauth%20application%20165.png)\n\n- Clique em **Adicionar**, preencha os campos Consumer Key, Descrição e Consumer Secret, pois são todos campos obrigatórios, conforme imagem abaixo e acione **Salvar**:\n\n![](..\\..\\..\\images\\005_03_02.png)\n\n**Cadastro de aplicativo Oauth** \n\n**Detalhes:**\n\n| Campos | Exemplo |\n| --- | --- |\n| Consumer Key | |\n| OAuth Provider | Provedor cadastrado no Passo 2 |\n| Consumer Secret | |\n\n- Opcional: Caso seu aplicativo execute ações em nome próprio, você pode criar um usuário aplicativo.\n\nAtenção\n\nCaso a plataforma Fluig esteja configurada para autenticação utilizando o TOTVS Identity, é requerida a criação de um usuário aplicativo que será utilizado na conexão com a API.\n\n- Na mesma tela de cadastro de aplicativo OAuth existe uma ação chamada **Usuário Aplicativo**. Ao acessá-la poderão ser gerados tokens exclusivos para o aplicativo.\n\nSe desejar que o usuário aplicativo execute ações em nome de outro usuário cadastrado na plataforma, basta selecionar a opção **Permite Impersonalização**. Selecionando este recurso, o usuário aplicativo pode, por exemplo, fazer um post em uma comunidade em nome de outro usuário, sendo apresentado da seguinte forma:\n\n- 'Usuário x' fez uma publicação na comunidade, **em vez de** 'App X' fez uma publicação na comunidade.\n\nEste comportamento é válido para todos métodos da API como por exemplo, publicação de documentos, movimentar processos entre outros.\n\n- Caso as ações do seu aplicativo devam ser executadas em nome de um usuário, então o aplicativo deve passar pelo processo padrão de autenticação OAuth.\n\n![](..\\..\\..\\images\\007_03_02.png)\n\n**Usuário aplicativo**" }, { "metadata": { "title": "Fluig API", "source": "https://tdn.totvs.com/display/fluig/Fluig+API", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API.md" }, "content": "Fluig API\n\n### Aplicação de Exemplo" }, { "metadata": { "title": "Fluig API", "source": "https://tdn.totvs.com/display/fluig/Fluig+API", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API.md" }, "content": "Fluig API\n\n\n---\n\nExiste uma aplicação desenvolvida pela equipe do fluig que mostra como usar a API. A aplicação está desenvolvida em Java. Você deve possuir o JDK 1.8 instalado para executar a aplicação. A gestão de build e de dependências é feita pelo Maven, então é obrigatório tê-lo instalado no ambiente de desenvolvimento a ser utilizado.\n\n[fluig-client-demo.zip](/display/fluig/Fluig+API?preview=%2F258277672%2F258277668%2Ffluig-client-demo.zip)\n\n- Baixe o arquivo e descompacte-o em um diretório de sua preferência.\n\nO projeto basicamente consiste em um **pom.xml** (***Project Object Model*, arquivo padrão do Maven**) e uma classe Java chamada FluigClientExample. Abra a classe e verifique a documentação gerada a partir de comentários.\n\nVocê verá que é necessário construir um objeto **FluigClient** e este objeto recebe alguns parâmetros como *host, consumer key* e *consumer secret*. Você deve alterar os valores passados na construção para um *host* conhecido e informar o *consumer key* e *secret* da aplicação de sua responsabilidade, conforme o código abaixo:\n\n```\nFluigClient fluig = new FluigClient()\n\t\t\t.setHost(\"http://127.0.0.1:8080\")\n\t\t\t.setConsumerKey(\"informe aqui o seu consumer key\")\n\t\t\t.setConsumerSecret(\"informe aqui o seu consumer secret\")\n\t\t\t.connect();\n```\n\nNo caso da autenticação no Identity, também será necessário informar o Access Token e Token Secret apresentados na criação do usuário aplicativo.\n\n```\nFluigClient fluig = new FluigClient()\n\t\t\t.setHost(\"http://127.0.0.1:8080\")\n\t\t\t.setConsumerKey(\"informe aqui o seu consumer key\")\n\t\t\t.setConsumerSecret(\"informe aqui o seu consumer secret\")\n\t\t\t.setTokenAccess(\"informe aqui o seu Token Access\")\n\t\t\t.setTokenSecret(\"informe aqui o seu Token Secret\")\n\t\t\t.connect();\n```\n\nMais abaixo no código, podemos reparar que a aplicação cria e lê posts de comunidades. Você deve informar uma comunidade válida do seu ambiente para executar a aplicação demonstração;\n\n```\nString comunidadeAlias = \"coloque_aqui_alias_de_alguma_comunidade\";\n```\n\nDepois de realizar as alterações, entre no diretório gerado e você notará que o arquivo **pom.xml** localiza-se na raiz do projeto.\n\nPara realizar o *build* do projeto, digite:\n\n```\n$ mvn clean install\n```\n\nDurante o processo de build, o Maven irá exibir vários logs como dependências sendo baixadas dentre outros.\n\nDepois do *build* finalizado com sucesso, repare que o arquivo **target/api-client-demo-jar-with-dependencies.jar** foi gerado. Este arquivo é um executável Java.\n\nPara executá-lo digite o comando:\n\n```\n$ java -jar target/api-client-demo-jar-with-dependencies.jar\n```\n\nSe você reparar na classe **FluigClientExample**, a execução irá: listar os usuários, criar uma publicação na página pessoal do usuário, criar uma publicação em uma comunidade e listar as publicações de uma comunidade. Durante a execução os *logs* dos resultados das chamadas serão exibidos no console." }, { "metadata": { "title": "Fluig API", "source": "https://tdn.totvs.com/display/fluig/Fluig+API", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API.md" }, "content": "Fluig API\n\n### Acesso ao Java DOC do componente SDK\n\n---\n\nPara ter acesso à documentação JAVA DOC do componente SDK, [clique aqui](http://api.fluig.com/old/sdk).\n\nVeja o exemplo (**upload-file-ecm-rest**) em nosso repositório [aqui](https://git.fluig.com/projects/SAMPLES/repos/widgets/browse)." }, { "metadata": { "title": "Integração de aplicativos externos com o Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=496822391", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração de aplicativos externos com o Fluig.md" }, "content": "Integração de aplicativos externos com o Fluig" }, { "metadata": { "title": "Integração de aplicativos externos com o Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=496822391", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração de aplicativos externos com o Fluig.md" }, "content": "Integração de aplicativos externos com o Fluig\n\n\n# Índice\n\n- 1 [Objetivo](#IntegraçãodeaplicativosexternoscomoFluig-Objetivo)\n- 2 [Caso de uso](#IntegraçãodeaplicativosexternoscomoFluig-Casodeuso)\n- 3 [Criação do Workflow (BPM)](#IntegraçãodeaplicativosexternoscomoFluig-CriaçãodoWorkflow(BPM))\n - 3.1 [Customizando o processo](#IntegraçãodeaplicativosexternoscomoFluig-Customizandooprocesso)\n - 3.1.1 [Envio de e-mail](#IntegraçãodeaplicativosexternoscomoFluig-Enviodee-mail)\n - 3.1.1.1 [Template de e-mail](#IntegraçãodeaplicativosexternoscomoFluig-Templatedee-mail)\n - 3.1.1.2 [Script de envio de e-mail](#IntegraçãodeaplicativosexternoscomoFluig-Scriptdeenviodee-mail)\n - 3.1.2 [Customizando o formulário](#IntegraçãodeaplicativosexternoscomoFluig-Customizandooformulário)\n\n# Objetivo\n\nO objetivo deste guia é exemplificar a criação de um workflow para ser integrado com um aplicativo externo.\n\n# Caso de uso\n\nA empresa x necessita de um processo de solicitação de compra. A solicitação será iniciada por um usuário “comum” onde será incluído os dados da compra como categoria, justificativa de compra, fornecedor e a lista de produtos. Ao iniciar o processo um email deverá ser disparado para o fornecedor com a URL de acesso para uma página pública contendo os dados dos produtos para cotação. Após informar os valores dos produtos e submeter, o processo deverá ficar pendente com o gestor da área de compra para aprovação. Após aprovado um novo email é enviado para o fornecedor confirmando a solicitação de compra. O processo ficará pendente com o fornecedor até que ele submeta o envio dos produtos. Nesse momento o processo ficará pendente com a equipe de recebimento que fará a conferência dos produtos e finaliza o processo.\n\n**![](..\\..\\..\\images\\wkf.png)****Figura 1 - Workflow solicitação de compra.**\n\n# Criação do Workflow (BPM)\n\nAcesse a documentação completa em \n\nO workflow base e seu formulário foram criados pelo próprio desenhador de processos do BPM, após isso foi importado no Fluig dev studio e realizado as customizações necessárias. Para criar um novo processo acesse: Processos > Configurar Processos > Adicionar\n\nWorkflow\n\nTodo o fluxo do processo foi feito apenas arrastando os componentes em tela. Para dúvidas referentes a processos segue toda documentação detalhada .\n\nPara criar um formulário para o processo acesse a opção Formulário dentro da criação/edição do processo:\n\n![](..\\..\\..\\images\\Formulario.png)                                                                                                         **Figura 2 - Criar formulário**\n\nA partir deste ponto foi necessário apenas arrastar os componentes em tela." }, { "metadata": { "title": "Integração de aplicativos externos com o Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=496822391", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração de aplicativos externos com o Fluig.md" }, "content": "Integração de aplicativos externos com o Fluig\n\n## Customizando o processo\n\nPara customizar o processo e o formulário é necessário ter instalado e configurado o Fluig studio. Acompanhe os passos a seguir:\n\n- Instalar Fluig studio \n\n- Configurar Fluig studio \n\n- Configurar servidor [http://tdn.totvs.com/x/UhgSCw#1-p1](http://tdn.totvs.com/x/UhgSCw)\n\n- Criar um novo projeto Fluig \n\n- Importar o processo criado na sessão \"Criação do Workflow (BPM)\"\n\n### Envio de e-mail\n\n#### Template de e-mail\n\nToda documentação referente a customização de templates de e-mail está disponível em  \n\nPara criar um novo template simples de e-mail acompanhe os passos a seguir:\n\n- Criar um template de email em HTML ([Template HTML](https://github.com/fluig/workflow-solicitacao-de-compra/blob/master/workflow/layout_email/email_universo_totvs.html))\n\n**Template de e-mail**\n\n```\n\n\n Fluig\n\n\n \n
\n
\n \n \n \n \n \n \n
\t\n\t\t\t\t\t\t

${MESSAGE}

\n\t\t\t\t\t
\n
\n
\n\n\n```\n\nNa linha 13 adicionamos uma variável **${MESSAGE}**, o valor dessa variável será enviado no script responsável pelo envio de email.\n\n- Após criar o arquivo html é necessário importa-lo na plataforma.  Acesse o Fluig > Painel de controle > Templates de email > Adicionar . Informar Código do formulário, descrição e selecionar o arquivo html criado no passo 1 para realizar o upload.\n\n![](..\\..\\..\\images\\Captura%20de%20tela%20de%202019-06-10%2011-46-15.png)**Figura 3 - Adicionar formulário**\n\n#### Script de envio de e-mail" }, { "metadata": { "title": "Integração de aplicativos externos com o Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=496822391", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração de aplicativos externos com o Fluig.md" }, "content": "Integração de aplicativos externos com o Fluig\n\n\nAcesse a documentação de envio de e-mail .\n\nO script mencionado a seguir está disponível em nosso github. Clique [aqui](https://github.com/fluig/workflow-solicitacao-de-compra/blob/master/workflow/scripts/solicitacaodecompra.beforeStateEntry.js) para acessar.\n\nPara criar um script de envio de e-mail acesso o Fluig studio. Clicar com botão direito do mouse na pasta “workflow” > novo > Script Fluig > Script Evento Workflow > beforeStateEntry e relacionar com o processo importado:\n\nSegue abaixo como ficou nosso script de envio de e-mail após codificação:\n\n**Envio de e-mail**\n\n```\nfunction beforeStateEntry(sequenceId){\n\t\t\n\tvar parametros = new java.util.HashMap();\t\t\t\t\n\t\n\t/*Esse valor poderia ser pego do fornecedor selecionado no formulário*/\n\tvar destinatarios = new java.util.ArrayList();\n\tdestinatarios.add(\"jeferson.francisco@fluig.com\");\n\t\n\t/*Etapa de cotação*/\n\tif (sequenceId == 2) {\n\t\t\n\t\tparametros.put(\"MESSAGE\",\"Nova cotação, acesse: https://wcm.fluig.com/portal///\" +\n\t\t\t\t\"supplier-quotation?isFullScreen=true&WKNumProces=\" + getValue(\"WKNumProces\"));\n\t\tnotifier.notify(getValue(\"WKUser\"), \"cotacao_fornecedor\", parametros, destinatarios, \"text/html\");\n\t\n\t/*Etapa de Envio do pedido*/\n\t} else if (sequenceId == 6) {\n\t\t\n\t\tparametros.put(\"MESSAGE\",\"Cotação Aprovada, aguardando o envio dos produtos. Ao enviar os produtos acesse \" +\n\t\t\t\t\"https://wcm.fluig.com/portal///send-order?isFullScreen=true&WKNumProces=\" \n\t\t\t\t+ getValue(\"WKNumProces\"));\n\t\tnotifier.notify(getValue(\"WKUser\"), \"cotacao_fornecedor\", parametros, destinatarios, \"text/html\");\n\t}\t\n\n}\n```\n\nOnde:\n\n**parametros.put :**\n\n- O primeiro parâmetro é o nome da variável que definimos no template de e-mail\n- O segundo parâmetro  é texto que será atribuído a variável “MESSAGE”\n\n**notifier.notify:**\n\n- O primeiro parâmetro que a função notify recebe é o código/matrícula do usuário que irá enviar o e-mail (remetente).\n- O segundo parâmetro é o código do template que foi cadastrado no Fluig.\n- O terceiro parâmetro é um mapa de dados (java.util.HashMap) que contém os parâmetros que serão utilizados para preencher as variáveis do template. \n Por padrão, os parâmetros WDK\\_VirtualDir (diretório virtual) e WDK\\_AdviceUser (Nome do colaborador remetente) são adicionados ao mapa de parâmetros automaticamente e podem ser utilizados no template, sem que os valores sejam adicionados pela personalização.\n- O quarto parâmetro representa a lista de usuários que irão receber o e-mail (java.util.ArrayList). Esta lista de usuários consiste em uma lista de códigos de usuários cadastrados no Fluig e/ou e-mails diretos para caso seja necessário enviar o e-mail a endereços externos de destinatários não cadastrados na plataforma.\n- O quinto e último parâmetro especifica qual será o formato do e-mail enviado. Os valores aceitos são \"text/html\" e \"text/plain\"." }, { "metadata": { "title": "Integração de aplicativos externos com o Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=496822391", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração de aplicativos externos com o Fluig.md" }, "content": "Integração de aplicativos externos com o Fluig\n\n### Customizando o formulário" }, { "metadata": { "title": "Integração de aplicativos externos com o Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=496822391", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração de aplicativos externos com o Fluig.md" }, "content": "Integração de aplicativos externos com o Fluig\n\n\nPara o nosso formulário precisamos da informação do usuário solicitante para exibição, número do processo, e a etapa que o processo se encontra para podermos realizar as tratativas de exibir/ocultar ou bloquear os campos, dependendo da etapa do processo. Para isso vamos inserir o seguinte trecho de código no arquivo [displayFields.js.](https://github.com/fluig/workflow-solicitacao-de-compra/blob/master/forms/94%20-%20Solicita%C3%A7%C3%A3o%20de%20compra/events/displayFields.js)\n\n```javascript\nfunction displayFields(form,customHTML){ \n\t\n\tvar CURRENT_STATE = getValue(\"WKNumState\") ? getValue(\"WKNumState\") : 0;\t\n\tvar CURRENT_USER = getValue(\"WKUser\");\n\n\tcustomHTML.append('');\n}\n```\n\nUtilizamos o método “getValue()” para pegar informações do workflow e criar no html as variáveis:\n\n- NUM\\_PROCESS: Número do processo\n- CURRENT\\_USER: Usuário logado\n- CURRENT\\_STATE: Etapa que se encontra o processo\n\nCada evento possui acesso ao *handle* da API de *workflow* pela variável global hAPI, com ela é possível pegar diversas informações. Saiba mais em . Com as informações do processo sendo acessadas diretamente no HTML conseguimos manipular nosso formulário para exibir/ocultar e bloquear campos dependendo da etapa que o processo se encontra. No [HTML do nosso formulário](https://github.com/fluig/workflow-solicitacao-de-compra/blob/master/forms/94%20-%20Solicita%C3%A7%C3%A3o%20de%20compra/Solicita%C3%A7%C3%A3o_de_compra.html) vamos adicionar um script chamado [custom.js](https://github.com/fluig/workflow-solicitacao-de-compra/blob/master/forms/94%20-%20Solicita%C3%A7%C3%A3o%20de%20compra/custom.js) para realizar as alterações necessárias.\n\n```\n$(function() {\t\t\n\t\n\tswitch(CURRENT_STATE) {\n\t case 0:\n\t case 1:\n\t\t solicitOrder();\n\t break;\n\t case 2:\n\t\t toBudget();\n\t break;\n\t case 3:\n\t\t approve();\n\t break;\n\t case 6:\n\t\t sendOrder();\n\t break;\n\t case 16:\n\t\t checkOrder();\n\t break;\t \n\t}\n});\n```\n\nO “CURRENT\\_STATE” pode ser identificado nas propriedades da etapa do processo:\n\n![](..\\..\\..\\images\\Captura%20de%20tela%20de%202019-06-10%2013-43-54.png)                                                                                   **Figura 4: Propriedades do processo**\n\nPara deixar nosso campo de “valor” dos produtos no formato monetário vamos utilizar uma biblioteca open source disponivel em . Fazer o download e adicionar o script no [HTML](https://github.com/fluig/workflow-solicitacao-de-compra/blob/master/forms/94%20-%20Solicita%C3%A7%C3%A3o%20de%20compra/Solicita%C3%A7%C3%A3o_de_compra.html) da mesma forma que adicionamos o [custom.js](https://github.com/fluig/workflow-solicitacao-de-compra/blob/master/forms/94%20-%20Solicita%C3%A7%C3%A3o%20de%20compra/custom.js). Devemos alterar nosso [custom.js](https://github.com/fluig/workflow-solicitacao-de-compra/blob/master/forms/94%20-%20Solicita%C3%A7%C3%A3o%20de%20compra/custom.js) para que a primeira instrução seja a formatação do campo de valor:\n\n```\n$(function() {\t\n\t\n\t$(\".price\").maskMoney({prefix:'R$ ', allowNegative: false, thousands:'.', decimal:',', affixesStay: true});\n```\n\nPara iniciar o processo é necessário selecionar um fornecedor em uma lista. Esta lista de fornecedores está sendo carregada a partir de um [dataset](https://github.com/fluig/workflow-solicitacao-de-compra/blob/master/datasets/fornecedores.js). saiba mais sobre datasets em \n\n**Integração com aplicações externas**\n\nPara realizar chamadas nas APIs do Fluig é necessário ter cadastrado um aplicativo no Fluig. Para realizar esse cadastro acesse o passo a passo na documentação .  O aplicativo web utilizando THF para o estudo de caso encontra-se disponível em nosso [repositório no github](https://github.com/fluig/app-angular-thf). Todos os detalhes de deploy de um aplicativo THF no Fluig encontram-se no README do projeto.\n\nApós gerar as chaves de autenticação foi necessário configurar o aplicativo no arquivo [environment.prod.ts](https://github.com/fluig/app-angular-thf/blob/master/src/main/universo-totvs-app/src/environments/environment.prod.ts).\n\nPara movimentar processos do BPM é necessário que o token seja do usuário responsável pela tarefa. Para gerar token de usuário utilize a [API disponível em nosso portal](https://api.fluig.com/old/resource_WCMServiceRest.html#/wcm/oauth/generateKeysToUser)." }, { "metadata": { "title": "Integração do TOTVS Fluig com TOTVS iPaaS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=773513926", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração do TOTVS Fluig com TOTVS iPaaS.md" }, "content": "Integração do TOTVS Fluig com TOTVS iPaaS" }, { "metadata": { "title": "Integração do TOTVS Fluig com TOTVS iPaaS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=773513926", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração do TOTVS Fluig com TOTVS iPaaS.md" }, "content": "Integração do TOTVS Fluig com TOTVS iPaaS\n\n\n# Índice\n\n- 1 [Falando de integração do TOTVS Fluig com TOTVS iPaaS...](#IntegraçãodoTOTVSFluigcomTOTVSiPaaS-FalandodeintegraçãodoTOTVSFluigcomTOTVSiPaaS...)\n- 2 [Iniciando um diagrama TOTVS iPaaS pelo TOTVS Fluig](#IntegraçãodoTOTVSFluigcomTOTVSiPaaS-IniciandoumdiagramaTOTVSiPaaSpeloTOTVSFluig)\n - 2.1 [Cadastrando o serviço no TOTVS Fluig](#IntegraçãodoTOTVSFluigcomTOTVSiPaaS-CadastrandooserviçonoTOTVSFluig)\n - 2.2 [Chamando o serviço](#IntegraçãodoTOTVSFluigcomTOTVSiPaaS-Chamandooserviço)\n - 2.3 [Usando o TOTVS iPaaS para movimentar uma solicitação no TOTVS Fluig](#IntegraçãodoTOTVSFluigcomTOTVSiPaaS-UsandooTOTVSiPaaSparamovimentarumasolicitaçãonoTOTVSFluig)\n - 2.4 [Cadastrando um aplicativo para comunicação com o TOTVS Fluig](#IntegraçãodoTOTVSFluigcomTOTVSiPaaS-CadastrandoumaplicativoparacomunicaçãocomoTOTVSFluig)\n - 2.5 [Cadastrando o serviço SOAP do TOTVS Fluig](#IntegraçãodoTOTVSFluigcomTOTVSiPaaS-CadastrandooserviçoSOAPdoTOTVSFluig)\n - 2.6 [Cadastrando o serviço da API Pública do TOTVS Fluig](#IntegraçãodoTOTVSFluigcomTOTVSiPaaS-CadastrandooserviçodaAPIPúblicadoTOTVSFluig)\n - 2.7 [Adicionando uma conta OAUTH a API](#IntegraçãodoTOTVSFluigcomTOTVSiPaaS-AdicionandoumacontaOAUTHaAPI)\n - 2.8 [Criando um projeto e realizando a integração com o TOTVS Fluig](#IntegraçãodoTOTVSFluigcomTOTVSiPaaS-CriandoumprojetoerealizandoaintegraçãocomoTOTVSFluig)\n\n# Falando de integração do TOTVS Fluig com TOTVS iPaaS...\n\n---\n\nO objetivo do TOTVS iPaaS é ser uma plataforma Low Code, feita para facilitar a construção e manutenção de integrações, para perfis de usuários com baixo aprofundamento técnico e também para usuários com grande experiência em desenvolvimento.\n\nO TOTVS Fluig permite a conexão com vários outros sistemas e entre elas o TOTVS iPaaS.\n\nÉ possível fazer a comunicação nas duas vias: associando uma integração do TOTVS iPaaS ou sendo acionado pelo TOTVS iPaaS para efetuar uma ação.\n\nLembrando que a integração com o TOTVS iPaaS funciona de forma **assíncrona**, ou seja, o TOTVS Fluig envia os dados e **não espera um resultado**. Sendo assim, não deve ser usado em casos onde você precisa de algum tipo de retorno como um id ou uma mensagem de validação.\n\nCaso não conheça o TOTVS iPaaS, [clique aqui](https://tdn.totvs.com/x/HBkAHw) e saiba mais.\n\n# Iniciando um diagrama TOTVS iPaaS pelo TOTVS Fluig\n\n---\n\nCom este exemplo, você será capaz de chamar o TOTVS iPaaS enviando dados fixos ou de campos do formulário." }, { "metadata": { "title": "Integração do TOTVS Fluig com TOTVS iPaaS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=773513926", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração do TOTVS Fluig com TOTVS iPaaS.md" }, "content": "Integração do TOTVS Fluig com TOTVS iPaaS\n\n## Cadastrando o serviço no TOTVS Fluig\n\n---\n\n**01**. Primeiramente, precisaremos criar um diagrama. Para isso, vá em **Integrações**, selecione um projeto já existente ou crie um novo e então clique em **Criar diagrama**.\n\nCom o diagrama configurado no TOTVS iPaaS com o componente de início do tipo *webhook*, você deve copiar a url. O TOTVS Fluig é compatível com os dois tipos de autenticação: via token e via URL. \n\nVocê pode usar via URL quando tiver a necessidade de alterar essas chaves futuramente ou via autenticação quando quiser limitar um pouco mais o acesso ao serviço ou quando não quiser que a pessoa que cadastre o serviço tenha acesso a essa chave.\n\n![](..\\..\\..\\images\\integra%C3%A7%C3%A3o%20fluig%20x%20ipaas.png)\n\n**02**. No TOTVS Fluig, acesse o **Painel de Controle** e no grupo **Desenvolvimento** acesse a opção **Serviços**.\n\n![](..\\..\\..\\images\\painel%20de%20controle.PNG)\n\n**03**. Clique no botão **Novo Serviço**.\n\n![](..\\..\\..\\images\\Novo%20servi%C3%A7o.PNG)\n\n**04**. Selecione o tipo de serviço **REST** e preencha os campos código e descrição conforme o tipo de integração. Lembre-se que você deve ter um cadastro de serviço para cada diagrama, então use um nome que seja significativo.\n\n![](..\\..\\..\\images\\novo%20servi%C3%A7o%20rest.PNG)\n\nHá a possibilidade de fazer, como citado, o cadastro usando a autenticação via token. Neste caso, podemos cadastrar somente o domínio sem autenticação:\n\n![](..\\..\\..\\images\\dominio.PNG)\n\nOu ainda, podemos cadastrar o domínio e selecionar a autenticação “**custom**” informando “**apiKey: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx**”\n\n![](..\\..\\..\\images\\dominio%20custom.PNG)\n\n## Chamando o serviço" }, { "metadata": { "title": "Integração do TOTVS Fluig com TOTVS iPaaS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=773513926", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração do TOTVS Fluig com TOTVS iPaaS.md" }, "content": "Integração do TOTVS Fluig com TOTVS iPaaS\n\n\n---\n\nEste código pode ser usado tanto em um dataset quanto em um processo. No nosso exemplo é uma atividade de serviço que manda dados do formulário para o TOTVS iPaaS.\n\n```\nvar serviceName = 'connector-cadastro-centro-custos-rm';\n\n//Caso não tenha informado a API KEY no cadastro de serviço, preencha na linha abaixo\nvar apiKey = ''; //'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'\n\n//Neste objeto são os dados que são enviados para o TOTVS iPaaS. Neste exemplo, apenas um campo de formulário está sendo enviado.\n//Note: em Strings retornadas pelos nossos métodos (hAPI, getValue) deve ser adicionado a concatenação com uma String vazia (+ ''). \n//Caso não seja feito isso, o comando JSON.stringify retornará um erro.\nvar data = {\n\t'processId': hAPI.getCardValue(\"processId\") + ''\n}\t\n\n// a partir daqui o código deve ser mantido\nvar clientService = fluigAPI.getAuthorizeClientService();\nvar vo = {\n\tcompanyId : getValue(\"WKCompany\") + '',\n\tserviceCode : serviceName, // código usado no cadastro do serviço\n\tendpoint : '',\n\tmethod : 'post',\n\ttimeoutService: '3000', // timeout do serviço em ms, neste caso, 3 segundos.\n\tparams : data ,\n\toptions : {\n\t\tencoding : 'UTF-8',\n\t\tmediaType: 'application/json'\n\t},\n\theaders: {\n\t\t\"Content-Type\": 'application/json;charset=UTF-8'\n\t}\n};\n\t\nif (apiKey) {\n\tvo.headers.apiKey = apiKey;\n}\n\ntry {\n\t// O objeto data montado para realizar a requisição precisa ser convertido para um texto para ser enviado\n\tvar result = clientService.invoke(JSON.stringify(vo));\n\t\n\tif (result.getHttpStatusResult() >= 200 && result.getHttpStatusResult() < 300) {\n\t\t// o Connector funciona de maneira assíncrona então vai retornar um 202 (Accepted).\n\t\tlog.info(\"connector retornou ok\");\n\t} else if (result.getHttpStatusResult() == 401) {\n\t\tlog.info(\"Ocorreu um erro ao comunicar com o TOTVS iPaaS. Confira a URL do serviço e a API KEY utilizada\");\n\t\tthrow \"Error 401\";\n\t} else if (result.getHttpStatusResult() == 0 && result.getDescription() != null && result.getDescription().startsWith(\"ERROR CALLING SERVICE\")) {\n\t\tlog.info(\"Ocorreu um erro ao chamar o serviço. Confira se o serviço foi criado com o nome: \" + data.serviceCode)\n\t\tthrow \"Error 404\"\n\t} else {\n\t\tlog.info(\"Ocorreu algum erro desconhecido\")\n\t\tlog.dir(result);\n\t\t\n\t\tthrow \"Error UNK\";\n\t}\n} catch (e) {\n\tthrow \"Ocorreu um erro. Entre em contato com a administração do fluig (\" + e + \")\";\n}\n```" }, { "metadata": { "title": "Integração do TOTVS Fluig com TOTVS iPaaS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=773513926", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração do TOTVS Fluig com TOTVS iPaaS.md" }, "content": "Integração do TOTVS Fluig com TOTVS iPaaS\n\n## Usando o TOTVS iPaaS para movimentar uma solicitação no TOTVS Fluig\n\n---\n\nCom este exemplo, você será capaz de chamar o TOTVS Fluig através do TOTVS iPaaS enviando dados fixos ou os dados de entrada de um *webhook*. O TOTVS Fluig possui API’s do tipo SOAP e REST e ambas podem ser utilizadas, porém, por questões de autenticação, para movimentar uma solicitação é aconselhável usar a API SOAP. \n\nApesar do TOTVS iPaaS possuir conectores que permitem fazer apenas a configuração de variáveis, vamos mostrar como cadastrar ambos os tipos de serviço.\n\n## Cadastrando um aplicativo para comunicação com o TOTVS Fluig\n\n---\n\n**01**. No TOTVS IPaaS, acesse **Aplicativos** e em seguida **Cadastrar aplicativo**:\n\n![](..\\..\\..\\images\\integra%C3%A7%C3%A3o%20fluig%20x%20ipaas%201.png)\n\n**02**. Preencha os dados:\n\n![](..\\..\\..\\images\\integra%C3%A7%C3%A3o%20fluig%20x%20ipaas%202.png)\n\nAo concluir o cadastro, você será redirecionado novamente para a tela de listagem de aplicativos. \n\n## Cadastrando o serviço SOAP do TOTVS Fluig" }, { "metadata": { "title": "Integração do TOTVS Fluig com TOTVS iPaaS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=773513926", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração do TOTVS Fluig com TOTVS iPaaS.md" }, "content": "Integração do TOTVS Fluig com TOTVS iPaaS\n\n\n---\n\nNo cadastro de aplicativos, selecione o aplicativo que você criou do TOTVS Fluig para incluir os serviços. Para os serviços SOAP, você pode visualizar todos os serviços disponíveis acessando o endereço do seu TOTVS Fluig e adicionando /services. Por exemplo, caso o seu TOTVS Fluig seja acessível através do endereço **https://empresa/** os serviços disponíveis estão listados em **https://empresa/**services. Para a movimentação de solicitações, vamos usar o SOAP de Workflow: **https://empresa/**webdesk/ECMWorkflowEngineService?wsdl.\n\nPara isso, na edição do aplicativo no TOTVS IPaaS, acesse Serviços e clique em cadastrar serviço. Preencha os dados selecionando o tipo de serviço como SOAP.\n\n![](..\\..\\..\\images\\servi%C3%A7o%20SOAP.PNG)\n\nAvance para “Recursos” e informe o endereço “wsdl” do serviço, no caso **https://empresa/webdesk/ECMWorkflowEngineService?wsdl.**\n\nA importação leva alguns segundos que é o tempo necessário para que o TOTVS IpaaS valide o endereço e consiga trazer todos os dados desse serviço. Ao finalizar, você verá que todos os métodos do wsdl estão listados:\n\n![](..\\..\\..\\images\\m%C3%A9todos%20wsdl.PNG)\n\nPara a lista completa dos serviços e dos recursos de cada serviço pode ser consultada em \n\n## Cadastrando o serviço da API Pública do TOTVS Fluig" }, { "metadata": { "title": "Integração do TOTVS Fluig com TOTVS iPaaS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=773513926", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração do TOTVS Fluig com TOTVS iPaaS.md" }, "content": "Integração do TOTVS Fluig com TOTVS iPaaS\n\n\n---\n\nNo cadastro de aplicativos, selecione o aplicativo que você criou do TOTVS Fluig para incluir os serviços. Para os serviços da API Pública, você pode visualizar todos os serviços disponíveis acessando o endereço do seu TOTVS Fluig e adicionando /api-rest. Por exemplo, caso o seu TOTVS Fluig seja acessível através do endereço **https://empresa/** os serviços disponíveis estão listados em **https://empresa/****api-rest**. Para a movimentação de solicitações, vamos usar a api de Process Managemento SOAP de Workflow: **https://empresa/process-management/swagger-ui/**\n\nPara isso, na edição do aplicativo no TOTVS IPaaS, acesse Serviços e clique em cadastrar serviço. Preencha os dados selecionando o tipo de serviço como REST. Ao selecionar esta opção, irá pedir o Ambiente. \n\n![](..\\..\\..\\images\\servi%C3%A7o%20api%20p%C3%BAblica.PNG)\n\nVocê pode selecionar um ambiente pré-cadastrado, ou adicionar selecionando a opção Cadastrar ambiente. A autenticação pode ser feita tanto por token quanto por OAUTH1, que é a forma que iremos abordar. Para as APIs públicas do TOTVS Fluig, você não deve informar apenas a URL, sendo necessário utilizar o que chamamos de “Base URL” da api. Neste caso, a URL ficaria **https://empresa/process-management/api.** \nOnde **https://empresa/** é o endereço da empresa e process-management/api é a Base URL da api do TOTVS Fluig. \n\nApós preenchido as informações clique em Cadastrar.  \n\n![](..\\..\\..\\images\\cadastrar%20servi%C3%A7o%202.PNG)\n\nCada serviço do TOTVS Fluig tem um Base URL próprio, e pode ser consultado na página da própria API:\n\n![](..\\..\\..\\images\\API.PNG)\n\nNesta página também está o arquivo “*swagger.json*” que iremos usar para importar os recursos. No TOTVS iPaaS, avance para a parte de recursos e clique no botão importar recurso e informe a URL do arquivo *json* mencionado.\n\nA importação leva alguns segundos que é o tempo necessário para que o TOTVS iPaaS valide o endereço e consiga trazer todos os dados desse serviço. Ao finalizar, você verá que todos os métodos da API estão listados:\n\n![](..\\..\\..\\images\\m%C3%A9todos%20API.PNG)\n\nLogo após, clique em **Concluir**." }, { "metadata": { "title": "Integração do TOTVS Fluig com TOTVS iPaaS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=773513926", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração do TOTVS Fluig com TOTVS iPaaS.md" }, "content": "Integração do TOTVS Fluig com TOTVS iPaaS\n\n## Adicionando uma conta OAUTH a API\n\n---\n\nAo contrário do SOAP que recebe o usuário e a senha a cada método, a API Pùblica se conecta através da autenticação OAUTH. Para utilizar essa autenticação é necessário cadastrar um aplicativo no TOTVS Fluig e configurar um usuário integrador, conforme essa [documentação](https://tdn.totvs.com/display/public/fluig/Fluig+API#FluigAPI-Cadastraraplicativonofluigapp).\n\nApós o cadastro, acesse na tela do aplicativo a parte de Contas e clique em Cadastrar Conta.\n\n![](..\\..\\..\\images\\conta%20oauth%20e%20API.PNG)\n\nSelecione o ambiente da API e a autenticação como OAUTH1 e informe os dados de *consumer key, consumer secret, access token e token secret* conforme o cadastro realizado no TOTVS Fluig.\n\n![](..\\..\\..\\images\\oauth%20e%20API%202.PNG)\n\nLogo após, clique em **Concluir**.\n\n## Criando um projeto e realizando a integração com o TOTVS Fluig" }, { "metadata": { "title": "Integração do TOTVS Fluig com TOTVS iPaaS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=773513926", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração do TOTVS Fluig com TOTVS iPaaS.md" }, "content": "Integração do TOTVS Fluig com TOTVS iPaaS\n\n\n---\n\nAcesso no TOTVS iPaaS o menu Integrações e acesse a opção **Projetos & Pacotes**. Você pode utilizar projetos já existentes ou clicar em criar um projeto novo. No projeto, crie um novo diagrama e preencha o nome e a descrição.\n\nApós selecionar o tipo de início do diagrama, na aba aplicativos selecione o aplicativo do TOTVS Fluig e arraste para o diagrama. Clique no ícone da engrenagem para habilitar a tela de configurações.\n\nPara o SOAP, dê um nome ao recurso, selecione o serviço e o recurso (por exemplo, *simpleStartProcess* para iniciar uma solicitação) e no campo **Conta**, mantenha a opção **Sem conta**, pois não é necessária essa configuração. Clique em **Avançar**, e na tela seguinte, já serão exibidos todos os dados aceitos pelo serviço. Basta informar os parâmetros necessários e clicar em **Concluir**. Em caso de dúvidas, acesse a documentação dos [webservices do TOTVS Fluig](../Utilização de Webservices/Documentação dos Web Services.md).\n\nPara API Pública, selecione o serviço e recurso (por exemplo, *Processes - /v2/processes/{{{processId}}}/start - Start request* para iniciar uma solicitação) e selecione a conta que será usada para a autenticação.\n\nAssim como no SOAP, na tela seguinte exibida todos os dados aceitos pelo serviço. Note que existem parâmetros *InPath* que são os itens da URL (neste caso, o *{{{processId}}}*) e os parâmetros *InBody* que são os dados do “corpo” da requisição. Em caso de dúvida sobre os parâmetros, você pode acessar também a documentação das [API’s do TOTVS Fluig](https://api.fluig.com/latest/index.html)." }, { "metadata": { "title": "Integração", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=71336118", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração.md" }, "content": "Integração" }, { "metadata": { "title": "Personificação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=567579891", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Personificação.md" }, "content": "Personificação" }, { "metadata": { "title": "Personificação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=567579891", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Personificação.md" }, "content": "Personificação\n\n\n- [Objetivo](#Personificação-Objetivo)\n- [Conceito](#Personificação-Conceito)\n- [Utilização](#Personificação-Utilização)\n- [Itens que receberam controle de personificação](#Personificação-Itensquereceberamcontroledepersonificação)\n - [Services](#Personificação-Services)\n - [APIs](#Personificação-APIs)\n - [Endpoints](#Personificação-Endpoints)\n - [Datasets](#Personificação-Datasets)\n- [Exemplo de uso via API Rest](#Personificação-ExemplodeusoviaAPIRest)\n- [Configurando a personificação](#Personificação-Configurandoapersonificação)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar o conceito de personificação, e listar os serviços que receberam o controle de personificação.\n\n# Conceito\n\n---\n\nPersonificação é quando uma pessoa executa ações em nome de outra. A plataforma possui serviços (APIs, datasets, webservices) que permitem que o usuário do contexto seja diferente do usuário logado. Por exemplo, o usuário acessa a API de workflow com o id \"user1\" e chama o método que movimenta uma solicitação workflow. Porém esse método tem um parâmetro que informa a partir de qual usuário será feita a movimentação, nesse caso pode ser passado o  id \"user2\", possibilitando que o user1 consiga movimentar uma solicitação que está com o user2.  \nEsse recurso é essencial para automatizar alguns processos, no caso de ter um usuário \"Integrador\" que movimenta as solicitações atrasadas automaticamente. \n\n# Utilização\n\n---\n\nO recurso de Personificação está disponível no TOTVS Fluig Plataforma a partir da **atualização 1.7.1 (Crystal Lake)**. \n\nÉ possível controlar as permissões de acesso deste recurso pelo Painel de controle da plataforma, acessando o item Permissões e buscando a seguinte configuração:\n\n- **Tipo**: [Personification](https://tdn.totvs.com/pages/viewpage.action?pageId=593435351)\n- **Nome do recurso**: Personificação de usuários\n- **Permissão**: Personificar: Quando ativada, permite executar ações utilizando o ID de outro usuário.\n\n# Itens que receberam controle de personificação\n\n---\n\nAlém de ter a permissão liberada, é necessário que o serviço desejado tenha sido implementado com o controle de personificação. Confira a seguir a lista completa de webservices, APIs e datasets que suportam esse recurso:" }, { "metadata": { "title": "Personificação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=567579891", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Personificação.md" }, "content": "Personificação\n\n## Services" }, { "metadata": { "title": "Personificação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=567579891", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Personificação.md" }, "content": "Personificação\n\n\n| Webservice | Método | Observações |\n| --- | --- | --- |\n| *ECMCardIndexService* | - getCardIndexesWithoutApprover - updateSimpleCardIndex - updateSimpleCardIndexWithDataset - updateSimpleCardIndexWithDatasetAndGeneralInfo - updateSimpleCardIndexWithRelatedDatasets - createSimpleCardIndex - createSimpleCardIndexWithDataset - createSimpleCardIndexWithDatasetPersisteType - createSimpleCardIndexWithRelatedDatasets - getCardIndexContent - getActiveCardIndex | |\n| *ECMCardService* | - getCardVersion | |\n| *ECMColleagueGroupService* | - getColleagueGroupsByColleagueId - getColleagueGroup - deleteColleagueGroup | |\n| *ECMColleagueService* | - getColleague - colab - removeColleague - activateColleague | |\n| *ECMDashBoardService* | - Todos os métodos menos o **getUrlEcm** que não usa personificação | |\n| *ECMDatasetService* | - getDataset | |\n| *ECMDocumentService* | - getActiveDocument - getDocumentContent - getDocumentVersion - getDocumentByExternalId - createSimpleDocument - findMostPopularDocuments - findMostPopularDocumentsOnDemand - deleteDocument - destroyDocument - findRecycledDocuments - restoreDocument - copyDocumentToUploadArea - updateSimpleDocument - moveDocument - updateGroupSecurityType - destroyDocumentApproval - approveDocument | |\n| *ECMFavoritesService* | - findFavorites - findFavoritesProcess - addProcessToFavorites - addDocumentToFavorites - removeFavoriteDocument - removeFavoriteProcess - isFavoriteDocument | |\n| *ECMKnowledgeService* | - findLastDocumentsByUser | |\n| *ECMOutstandingService* | - transfer | |\n| *ECMReportService* | - getReportContent | |\n| *ECMSearchDocumentServiceService* | - searchDocuments - searchFavoritesDocuments - advancedSearchDocuments - advancedSearchDocumentsWithMetadata | |\n| *ECMWorkflowEngineService* | - cancelInstance - cancelInstanceByReplacement - calculateDeadLineHours - calculateDeadLineTime - getAttachments - getAvailableProcess - getAvailableProcessOnDemand - getCardValue - getInstanceCardDataResponse - startProcess - startProcessClassic - saveAndSendTask - saveAndSendTaskByReplacement - saveAndSendTaskClassic - searchProcess - setAutomaticDecisionClassic - takeProcessTask - takeProcessTaskByReplacement - setTasksComments - createWorkFlowProcessVersion - releaseProcess - getHistories - getActualThread - getAllActiveStates - getAvailableStates - getAvailableUsers - getAllProcessAvailableToExport - getAllProcessAvailableToImport - getAvailableUsersStart - getAvailableUsersStartOnDemand - getProcessFormId - getWorkFlowProcessVersion | |\n| *ECMOutstandingService* | - transfer | |\n| *ECMDashBoardService* | - findMyDocumentsOnDemand | |\n| *ECMColleagueReplacementService* | | |\n| *ECMCardIndexService* | - getAttachmentsList - getCustomizationEvents - getFormDatasets - getFormFields | |" }, { "metadata": { "title": "Personificação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=567579891", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Personificação.md" }, "content": "Personificação\n\n## APIs\n\n| API | Método | Observações |\n| --- | --- | --- |\n| */**ecm/document* | - /create - /createDocument | |\n| */2.0/documents* | - createDocument - createPrivateDocument - updateFile | |\n| /v2/documents | - (PATCH) /{id}/users/{userCode}/hits - (PATCH) /{id}/users/{userCode}/version/{version}/hits | |\n| */2.0/favorites* | - findFavoritesDocuments/{colleagueId}/ - findFavoritesProcess/{colleagueId}/ | |\n| */2.0/folderdocuments* | - create | |\n| */2.0/security* | - changeUserPassword | |\n| */2.0/users* | - changeUserPassword | |\n| *hAPI* | - publishWorkflowAttachment | |\n\n## Endpoints" }, { "metadata": { "title": "Personificação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=567579891", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Personificação.md" }, "content": "Personificação\n\n\nVeja a seguir quais os endpoints que recebem personificação:\n\n- *Content Management*, que envolve a parte ECM/Documentos.\n- *Process Management*, que envolve a parte de BPM/Processos.\n\nPara consultar as APIs disponíveis, [acesse aqui](https://api.fluig.com/latest/process-management/swagger-ui/).\n\n| Endpoint | Usercode | Observações |\n| --- | --- | --- |\n| *Process* | - ProcessRest-GET /v2/processes/{processId}/activities - ProcessRest-GET /v2/processes/{processId}/process-versions/{processVersion}/activities - ProcessRest-GET /v2/processes/{processId}/process-versions/{processVersion}/requests - ProcessRest-GET /v2/processes/{processId}/process-versions/{processVersion}/requests/tasks - ProcessRest-GET /v2/processes/{processId}/requests - ProcessRest-GET /v2/processes/{processId}/requests/tasks - ProcessRest-GET /v2/processes/{processId}/requests/tasks/resume - ProcessRest-POST /start | |\n| *Request* | - RequestRest-GET /v2/requests/{processInstanceId}/tasks - RequestRest-GET /v2/requests/{processInstanceId}/possible-assignees - RequestRest-POST /v2/requests/{processInstanceId}/move - RequestRest-GET /v2/requests/{processInstanceId}/histories - RequestRest-GET /v2/requests/{processInstanceId}/attachments/{attachmentSequence}/download - RequestRest-GET /v2/requests/{processInstanceId}/attachments/download - RequestRest-GET /v2/requests/{processInstanceId} - RequestRest-GET /v2/requests/{processInstanceId}/activities - RequestRest-GET /v2/requests/{processInstanceId}/attachments | |\n| *Activities* | - ActivityRest-GET /v2/activities | |\n| *Tasks* | - TaskRest-GET /v2/tasks | |\n| *Documents* | - Documents-GET /v2/documents/{id}/users/{userCode}/hits - Documents-GET /v2/documents/{id}/users/{userCode}/version/{version}/hits | |\n\n## Datasets" }, { "metadata": { "title": "Personificação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=567579891", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Personificação.md" }, "content": "Personificação\n\n\n- Document\n- Colleague\n\n**Chamadas de datasets que usem:**\n\n- CardIndexDataset\n- MetaListDataset\n\n# Exemplo de uso via API Rest\n\n---\n\nPara utilizar a personificação via API Rest é necessário acessar o serviço. Ao acessar a ferramenta configure os *endpoints* que deseja acessar.\n\n**EXEMPLO**\n\n[http://seudominio/process-management/api/v2/processes/seguranca/start](http://suaempresa/process-management/api/v2/processes/seguranca/start)\n\n- O endpoint utilizado no exemplo serve para iniciar uma solicitação.\n\n**Configurando o token do usuário**\n\n---\n\nExemplo utilizando jwt.token.\n\n![](..\\..\\..\\images\\Personifica%C3%A7%C3%A3o.png)\n\n**O que é jwt.token?**\n\nJWT é um padrão aberto de mercado definido pela RFC 7519 como um formato compacto e auto suficiente para transmitir informações entre as partes como um objeto JSON.\n\nDependendo do endpoint que esteja consumindo, será necessário passar as informações no body da requisição.\n\n# Configurando a personificação\n\n---\n\nQual a função do header em requisições HTTP?\n\nO *header* (cabeçalho) é um conjunto de informações adicionais enviadas junto à requisição HTTP. Ele funciona como a 'etiqueta de uma encomenda': não contém os dados principais (que ficam no *body*), mas sim metadados importantes: como o tipo de conteúdo, autorização ou instruções que orientam o servidor sobre como interpretar e processar a mensagem. Abaixo temos alguns exemplos de utilização do Header:\n\n**Autenticação:** inclui um token de acesso para o servidor saber quem está chamando a API. \nEXEMPLO Authorization: Bearer \n\n**Formato de dados:** indica que o conteúdo enviado/recebido é JSON. \nEXEMPLO Content-Type: application/json\n\n**Idioma ou customização:** informa preferências de resposta. \nEXEMPLO Accept-Language: pt-BR\n\nNo Postman, o *header* (cabeçalho) é utilizado para configurar informações complementares que acompanham a requisição. Nele podem ser definidos, por exemplo, o tipo de conteúdo enviado (JSON, XML, etc.), dados de autorização para acesso à API e outras instruções necessárias para que o servidor interprete corretamente a requisição antes de processar os dados.\n\nAbaixo vamos mostrar o passo a passo para a configuração do recurso personificação.\n\n**01.** Na aba **Headers** adicione a chave \"**X-Personification-UserCode**\" \\*\\* e o valor \"**usuárioComPermissãoDePersonificação**”.\n\nA chave utilizada para a configuração é **X-Personification-UserCode**\n\n**02.** Após realizaras configurações, qualquer ação realizada, será feita no nome do usuário que foi utilizado na configuração de personificação.\n\nEXEMPLO\n\nEstou realizando o login com o usuário A, mas iniciei uma solicitação com o usuário B, logo, ao acessar a Central de Tarefas do usuário B a solicitação estará inicializada por ele.\n\nAbaixo temos alguns exemplos visuais utilizando a personificação\n\n![](..\\..\\..\\images\\Personifica%C3%A7%C3%A3o%201.png)\n\n![](..\\..\\..\\images\\unnamed.png)" }, { "metadata": { "title": "Acessar API através do cliente OAuth", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=198952866", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Acessar API através do cliente OAuth.md" }, "content": "Acessar API através do cliente OAuth" }, { "metadata": { "title": "Acessar API através do cliente OAuth", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=198952866", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Acessar API através do cliente OAuth.md" }, "content": "Acessar API através do cliente OAuth\n\n\n# Índice\n\n- 1 [Índice](#AcessarAPIatravésdoclienteOAuth-Índice)\n- 2 [Objetivo](#AcessarAPIatravésdoclienteOAuth-Objetivo)\n- 3 [Pré-requisitos](#AcessarAPIatravésdoclienteOAuth-Pré-requisitos)\n- 4 [Cadastro das chaves](#AcessarAPIatravésdoclienteOAuth-Cadastrodaschaves)\n- 5 [Utilização](#AcessarAPIatravésdoclienteOAuth-Utilização)\n- 6 [Exemplo](#AcessarAPIatravésdoclienteOAuth-Exemplo)\n\n# Objetivo\n\n---\n\nEste guia irá auxiliar a acessar a API pública através do cliente OAuth.\n\n# Pré-requisitos\n\n---\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre o fluig\n- Visão geral sobre o [fluig API](../Fluig API.md)\n\n# Cadastro das chaves\n\n---\n\nTendo em mão as *consumer keys*, é necessário cadastrá-las no fluig como um *OAuth App*, utilizando o *provider* padrão, as chaves criptografadas são informadas no cadastro, as descriptografadas são utilizadas no cliente.\n\n# Utilização\n\n---\n\n- Para utilizar o cliente é necessário incluir a dependência:\n\n**Dependência**\n\n```\n\n com.fluig\n oauth-client\n 1.0\n\n```\n\n- Crie e configure o client para o domínio desejado.\n\n```\n// Cria o client e atribui domínio e consumer keys\nOAuthClient oAuthClient = new OAuthClient(domainProvider, FLUIG_CONSUMER_KEY, FLUIG_CONSUMER_SECRET);\n```\n\n- Realize o processo de autenticação, é necessário informar o usuário e senha para autorizar o acesso.\n\n```\n// O retorno da negociação e autenticação do usuário.\nLoginResult result = oAuthClient.prepareResources(user, password);\nHttpHelper.closeResource(result.getConnection());\n\n// Checa o código de retorno\nif (HttpHelper.returnSuccess(result.getConnection())) {\n System.out.println(\"Sucesso!\");\n}\n```\n\n- É possível recuperar os *tokens* de acesso, após a autenticação.\n\n```\noAuthClient.getToken();\noAuthClient.getTokenSecret();\n```\n\n- Após autenticado o cliente permite assinar outras conexões do tipo *HttpURLConnection*, isso permite fazer realizar chamadas REST.\n\n```\nURL url = new URL(\"http://...\");\nHttpURLConnection connection = (HttpURLConnection) urlProvisioningTenant.openConnection();\n//configurações da requisição ....\n\n// Assina a conexão\noAuthClient.sign(connection);\n```\n\n# Exemplo\n\n---\n\nO projeto de exemplo está disponível no [git.fluig.com](http://git.fluig.com). Para fazer *download* do arquivo **oauth-client** [clique aqui](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse)." }, { "metadata": { "title": "APIs SLA", "source": "https://tdn.totvs.com/display/fluig/APIs+SLA", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\APIs SLA.md" }, "content": "APIs SLA" }, { "metadata": { "title": "APIs SLA", "source": "https://tdn.totvs.com/display/fluig/APIs+SLA", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\APIs SLA.md" }, "content": "APIs SLA\n\n\n# - 1 - 2 [Objetivo](#APIsSLA-Objetivo) - 3 [APIs de SLA](#APIsSLA-APIsdeSLA)\n\n# Objetivo\n\n---\n\nEste conteúdo tem como objetivo auxiliar na referência da atualização da API de SLAs na versão 2.0, para pesquisa de solicitações, juntamente com informações referentes a seus prazos e resumo de contagem sobre tais informações.\n\n# APIs de SLA\n\n---\n\n| APIs | Parâmetros |\n| --- | --- |\n| **/api/2.0/workflows/requests/sla/resume** O que faz: Retorna, agrupado por status da solicitação e do SLA, a contagem de solicitações naquela situação. | **processes** - Código dos processos a serem filtrados, separados por vírgula em caso de mais de um. **cardFilters** - Campos de formulário a serem filtrados, os campos DEVEM pertencer ao formulário atrelado ao processo. Os campos devem ser separados por CHAVE:VALOR e separados por vírgula entre estes agrupamentos. **countersRequired** - Quais contadores são requeridos, não informar caso deseje todos. Eles podem ser: - finishedRequests: Solicitações finalizadas em geral - finishedExpiredRequests: Solicitações finalizadas e expiradas - finishedOnTimeRequests: Solicitações finalizadas e com SLA em dia - finishedWarningRequests: Solicitações finalizadas que entraram no tempo de aviso - canceledRequests: Solicitações canceladas - canceledExpiredRequests: Solicitações canceladas expiradas - canceledOnTimeRequests: Solicitações canceladas com SLA em dia - canceledWarningRequests: Solicitações canceladas no tempo de aviso - openRequests: Solicitações abertas - openExpiredRequests: Solicitações abertas expiradas - openOnTimeRequests: Solicitações abertas no prazo - openWarningRequests: Solicitações abertas no tempo de aviso **initialStartDate** - Data inicial para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalStartDate** - Data final para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialDeadlineDate** - Data inicial para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalDeadlineDate** - Data final para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialWarningDate** - Data inicial para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalWarningDate** - Data final para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd **requester** - Requisitante da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. **assignee** - Responsável de uma das tarefas atuais da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. **manager** - Gestor do processo da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. Deve ser um Gestor válido segundo as regras atuais. |\n| **/api/2.0/workflows/requests/sla/resume/requester/me** O que faz: Retorna, agrupado por status da solicitação e do SLA, a contagem de solicitações naquela situação. Neste REST o parâmetro requester é omitido, assumindo que o usuário logado é o requisitante solicitado. | **processes** - Código dos processos a serem filtrados, separados por vírgula em caso de mais de um. **cardFilters** - Campos de formulário a serem filtrados, os campos DEVEM pertencer ao formulário atrelado ao processo. Os campos devem ser separados por CHAVE:VALOR e separados por vírgula entre estes agrupamentos. **countersRequired** - Quais contadores são requeridos, não informar caso deseje todos. Eles podem ser: - finishedRequests: Solicitações finalizadas em geral - finishedExpiredRequests: Solicitações finalizadas e expiradas - finishedOnTimeRequests: Solicitações finalizadas e com SLA em dia - finishedWarningRequests: Solicitações finalizadas que entraram no tempo de aviso - canceledRequests: Solicitações canceladas - canceledExpiredRequests: Solicitações canceladas expiradas - canceledOnTimeRequests: Solicitações canceladas com SLA em dia - canceledWarningRequests: Solicitações canceladas no tempo de aviso - openRequests: Solicitações abertas - openExpiredRequests: Solicitações abertas expiradas - openOnTimeRequests: Solicitações abertas no prazo - openWarningRequests: Solicitações abertas no tempo de aviso **initialStartDate** - Data inicial para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalStartDate** - Data final para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialDeadlineDate** - Data inicial para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalDeadlineDate** - Data final para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialWarningDate** - Data inicial para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalWarningDate** - Data final para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **assignee** - Responsável de uma das tarefas atuais da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. **manager** - Gestor do processo da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. Deve ser um Gestor válido segundo as regras atuais. |\n| **/api/2.0/workflows/requests/sla/resume/assignee/me** O que faz: Retorna, agrupado por status da solicitação e do SLA, a contagem de solicitações naquela situação. Neste REST o parâmetro assignee é omitido, assumindo que o usuário logado é um dos responsáveis da tarefa das solicitações. | **processes** - Código dos processos a serem filtrados, separados por vírgula em caso de mais de um. **cardFilters** - Campos de formulário a serem filtrados, os campos DEVEM pertencer ao formulário atrelado ao processo. Os campos devem ser separados por CHAVE:VALOR e separados por vírgula entre estes agrupamentos. **countersRequired** - Quais contadores são requeridos, não informar caso deseje todos. Eles podem ser: - finishedRequests: Solicitações finalizadas em geral - finishedExpiredRequests: Solicitações finalizadas e expiradas - finishedOnTimeRequests: Solicitações finalizadas e com SLA em dia - finishedWarningRequests: Solicitações finalizadas que entraram no tempo de aviso - canceledRequests: Solicitações canceladas - canceledExpiredRequests: Solicitações canceladas expiradas - canceledOnTimeRequests: Solicitações canceladas com SLA em dia - canceledWarningRequests: Solicitações canceladas no tempo de aviso - openRequests: Solicitações abertas - openExpiredRequests: Solicitações abertas expiradas - openOnTimeRequests: Solicitações abertas no prazo - openWarningRequests: Solicitações abertas no tempo de aviso **initialStartDate** - Data inicial para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalStartDate** - Data final para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialDeadlineDate** - Data inicial para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalDeadlineDate** - Data final para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialWarningDate** - Data inicial para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalWarningDate** - Data final para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **requester** - Requisitante da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. **manager** - Gestor do processo da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. Deve ser um Gestor válido segundo as regras atuais. |\n| **/api/2.0/workflows/requests/sla/resume/manager/me** O que faz: Retorna, agrupado por status da solicitação e do SLA, a contagem de solicitações naquela situação. Neste REST o parâmetro manager é omitido, assumindo que o usuário logado é um dos gestores do processo das solicitações. | **processes** - Código dos processos a serem filtrados, separados por vírgula em caso de mais de um. **cardFilters** - Campos de formulário a serem filtrados, os campos DEVEM pertencer ao formulário atrelado ao processo. Os campos devem ser separados por CHAVE:VALOR e separados por vírgula entre estes agrupamentos. **countersRequired** - Quais contadores são requeridos, não informar caso deseje todos. Eles podem ser: - finishedRequests: Solicitações finalizadas em geral - finishedExpiredRequests: Solicitações finalizadas e expiradas - finishedOnTimeRequests: Solicitações finalizadas e com SLA em dia - finishedWarningRequests: Solicitações finalizadas que entraram no tempo de aviso - canceledRequests: Solicitações canceladas - canceledExpiredRequests: Solicitações canceladas expiradas - canceledOnTimeRequests: Solicitações canceladas com SLA em dia - canceledWarningRequests: Solicitações canceladas no tempo de aviso - openRequests: Solicitações abertas - openExpiredRequests: Solicitações abertas expiradas - openOnTimeRequests: Solicitações abertas no prazo - openWarningRequests: Solicitações abertas no tempo de aviso **initialStartDate** - Data inicial para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalStartDate** - Data final para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialDeadlineDate** - Data inicial para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalDeadlineDate** - Data final para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialWarningDate** - Data inicial para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalWarningDate** - Data final para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **requester** - Requisitante da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. **assignee** - Responsável de uma das tarefas atuais da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. |\n| **/api/2.0/workflows/requests/sla/** O que faz: Retorna uma lista das informações primárias de cada solicitação referente a seu SLA. | **processes** - Código dos processos a serem filtrados, separados por vírgula em caso de mais de um. **cardFilters** - Campos de formulário a serem filtrados, os campos DEVEM pertencer ao formulário atrelado ao processo. Os campos devem ser separados por CHAVE:VALOR e separados por vírgula entre estes agrupamentos. **statusRequired** - Quais contadores são requeridos, não informar caso deseje todos. Eles podem ser: - finishedRequests: Solicitações finalizadas em geral - finishedExpiredRequests: Solicitações finalizadas e expiradas - finishedOnTimeRequests: Solicitações finalizadas e com SLA em dia - finishedWarningRequests: Solicitações finalizadas que entraram no tempo de aviso - canceledRequests: Solicitações canceladas - canceledExpiredRequests: Solicitações canceladas expiradas - canceledOnTimeRequests: Solicitações canceladas com SLA em dia - canceledWarningRequests: Solicitações canceladas no tempo de aviso - openRequests: Solicitações abertas - openExpiredRequests: Solicitações abertas expiradas - openOnTimeRequests: Solicitações abertas no prazo - openWarningRequests: Solicitações abertas no tempo de aviso **initialStartDate** - Data inicial para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalStartDate** - Data final para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialDeadlineDate** - Data inicial para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalDeadlineDate** - Data final para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialWarningDate** - Data inicial para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalWarningDate** - Data final para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **requester** - Requisitante da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. **assignee** - Responsável de uma das tarefas atuais da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. **manager** - Gestor do processo da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. Deve ser um Gestor válido segundo as regras atuais. **expand** - Campo padrão que indica se as coleções no objeto de retorno serão listadas. actualTasks retorna os dados dos usuários e do estado das atividades correntes da solicitação caso aberta. cardFields retorna os campos do formulário referentes a solicitação. Esses campos podem ser agrupados separados por vírgula. **order** - Ordenação do resultado. Para ordenação decrescente colocar o símbolo (-) antes do atributo a ser ordenado. Para múltipla ordenação separar os campos por vírgula. Os campos possíveis de se ordenar são: processInstanceId, deadlineDate, processId, requesterCode, requesterName, startDate e endDate. **calculate** - Se os dados calculáveis da solicitação serão calculados. Estes campos são: remainingTime, fullTime e percentageConcluded. Por padrão este campo é true, colocá-lo para false omite os valores calculáveis, mas torna a resposta mais veloz. **page** - Página atual de resultados para paginação. **pageSize** - Quantidade de registros por página. |\n| **/api/2.0/workflows/requests/sla/requester/me** O que faz: Retorna uma lista das informações primárias de cada solicitação referente a seu SLA. Neste REST o parâmetro requester é omitido, assumindo que o usuário logado é o requisitante solicitado. | **processes** - Código dos processos a serem filtrados, separados por vírgula em caso de mais de um. **cardFilters** - Campos de formulário a serem filtrados, os campos DEVEM pertencer ao formulário atrelado ao processo. Os campos devem ser separados por CHAVE:VALOR e separados por vírgula entre estes agrupamentos. **statusRequired** - Quais contadores são requeridos, não informar caso deseje todos. Eles podem ser: - finishedRequests: Solicitações finalizadas em geral - finishedExpiredRequests: Solicitações finalizadas e expiradas - finishedOnTimeRequests: Solicitações finalizadas e com SLA em dia - finishedWarningRequests: Solicitações finalizadas que entraram no tempo de aviso - canceledRequests: Solicitações canceladas - canceledExpiredRequests: Solicitações canceladas expiradas - canceledOnTimeRequests: Solicitações canceladas com SLA em dia - canceledWarningRequests: Solicitações canceladas no tempo de aviso - openRequests: Solicitações abertas - openExpiredRequests: Solicitações abertas expiradas - openOnTimeRequests: Solicitações abertas no prazo - openWarningRequests: Solicitações abertas no tempo de aviso **initialStartDate** - Data inicial para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalStartDate** - Data final para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialDeadlineDate** - Data inicial para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalDeadlineDate** - Data final para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialWarningDate** - Data inicial para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalWarningDate** - Data final para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **assignee** - Responsável de uma das tarefas atuais da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. **manager** - Gestor do processo da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. Deve ser um Gestor válido segundo as regras atuais. **expand** - Campo padrão que indica se as coleções no objeto de retorno serão listadas. actualTasks retorna os dados dos usuários e do estado das atividades correntes da solicitação caso aberta. cardFields retorna os campos do formulário referentes a solicitação. Esses campos podem ser agrupados separados por vírgula. **order** - Ordenação do resultado. Para ordenação decrescente colocar o símbolo (-) antes do atributo a ser ordenado. Para múltipla ordenação separar os campos por vírgula. Os campos possíveis de se ordenar são: processInstanceId, deadlineDate, processId, requesterCode, requesterName, startDate e endDate. **calculate** - Se os dados calculáveis da solicitação serão calculados. Estes campos são: remainingTime, fullTime e percentageConcluded. Por padrão este campo é true, colocá-lo para false omite os valores calculáveis, mas torna a resposta mais veloz. **page** - Página atual de resultados para paginação. **pageSize** - Quantidade de registros por página. |\n| **/api/2.0/workflows/requests/sla/assignee/me** O que faz: Retorna uma lista das informações primárias de cada solicitação referente a seu SLA. Neste REST o parâmetro assignee é omitido, assumindo que o usuário logado é um dos responsáveis da tarefa das solicitações. | **processes** - Código dos processos a serem filtrados, separados por vírgula em caso de mais de um. **cardFilters** - Campos de formulário a serem filtrados, os campos DEVEM pertencer ao formulário atrelado ao processo. Os campos devem ser separados por CHAVE:VALOR e separados por vírgula entre estes agrupamentos. **statusRequired** - Quais contadores são requeridos, não informar caso deseje todos. Eles podem ser: - finishedRequests: Solicitações finalizadas em geral - finishedExpiredRequests: Solicitações finalizadas e expiradas - finishedOnTimeRequests: Solicitações finalizadas e com SLA em dia - finishedWarningRequests: Solicitações finalizadas que entraram no tempo de aviso - canceledRequests: Solicitações canceladas - canceledExpiredRequests: Solicitações canceladas expiradas - canceledOnTimeRequests: Solicitações canceladas com SLA em dia - canceledWarningRequests: Solicitações canceladas no tempo de aviso - openRequests: Solicitações abertas - openExpiredRequests: Solicitações abertas expiradas - openOnTimeRequests: Solicitações abertas no prazo - openWarningRequests: Solicitações abertas no tempo de aviso **initialStartDate** - Data inicial para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalStartDate** - Data final para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialDeadlineDate** - Data inicial para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalDeadlineDate** - Data final para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialWarningDate** - Data inicial para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalWarningDate** - Data final para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **requester** - Requisitante da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. **manager** - Gestor do processo da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. Deve ser um Gestor válido segundo as regras atuais. **expand** - Campo padrão que indica se as coleções no objeto de retorno serão listadas. actualTasks retorna os dados dos usuários e do estado das atividades correntes da solicitação caso aberta. cardFields retorna os campos do formulário referentes a solicitação. Esses campos podem ser agrupados separados por vírgula. **order** - Ordenação do resultado. Para ordenação decrescente colocar o símbolo (-) antes do atributo a ser ordenado. Para múltipla ordenação separar os campos por vírgula. Os campos possíveis de se ordenar são: processInstanceId, deadlineDate, processId, requesterCode, requesterName, startDate e endDate. **calculate** - Se os dados calculáveis da solicitação serão calculados. Estes campos são: remainingTime, fullTime e percentageConcluded. Por padrão este campo é true, colocá-lo para false omite os valores calculáveis, mas torna a resposta mais veloz. **page** - Página atual de resultados para paginação. **pageSize** - Quantidade de registros por página. |\n| **/api/2.0/workflows/requests/sla/manager/me** O que faz: Retorna uma lista das informações primárias de cada solicitação referente a seu SLA. Neste REST o parâmetro manager é omitido, assumindo que o usuário logado é um dos gestores do processo das solicitações. | **processes** - Código dos processos a serem filtrados, separados por vírgula em caso de mais de um. **cardFilters** - Campos de formulário a serem filtrados, os campos DEVEM pertencer ao formulário atrelado ao processo. Os campos devem ser separados por CHAVE:VALOR e separados por vírgula entre estes agrupamentos. **statusRequired** - Quais contadores são requeridos, não informar caso deseje todos. Eles podem ser: - finishedRequests: Solicitações finalizadas em geral - finishedExpiredRequests: Solicitações finalizadas e expiradas - finishedOnTimeRequests: Solicitações finalizadas e com SLA em dia - finishedWarningRequests: Solicitações finalizadas que entraram no tempo de aviso - canceledRequests: Solicitações canceladas - canceledExpiredRequests: Solicitações canceladas expiradas - canceledOnTimeRequests: Solicitações canceladas com SLA em dia - canceledWarningRequests: Solicitações canceladas no tempo de aviso - openRequests: Solicitações abertas - openExpiredRequests: Solicitações abertas expiradas - openOnTimeRequests: Solicitações abertas no prazo - openWarningRequests: Solicitações abertas no tempo de aviso **initialStartDate** - Data inicial para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalStartDate** - Data final para pesquisa pelo início da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialDeadlineDate** - Data inicial para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalDeadlineDate** - Data final para pesquisa pelo prazo da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **initialWarningDate** - Data inicial para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **finalWarningDate** - Data final para pesquisa pelo prazo de aviso da solicitação. O formato a ser passado no GET é yyyy-MM-dd. **requester** - Requisitante da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. **assignee** - Responsável de uma das tarefas atuais da solicitação. Neste parâmetro deve ser enviado a matrícula do usuário. **expand** - Campo padrão que indica se as coleções no objeto de retorno serão listadas. actualTasks retorna os dados dos usuários e do estado das atividades correntes da solicitação caso aberta. cardFields retorna os campos do formulário referentes a solicitação. Esses campos podem ser agrupados separados por vírgula. **order** - Ordenação do resultado. Para ordenação decrescente colocar o símbolo (-) antes do atributo a ser ordenado. Para múltipla ordenação separar os campos por vírgula. Os campos possíveis de se ordenar são: processInstanceId, deadlineDate, processId, requesterCode, requesterName, startDate e endDate. **calculate** - Se os dados calculáveis da solicitação serão calculados. Estes campos são: remainingTime, fullTime e percentageConcluded. Por padrão este campo é true, colocá-lo para false omite os valores calculáveis, mas torna a resposta mais veloz. **page** - Página atual de resultados para paginação. **pageSize** - Quantidade de registros por página. |\n| **/api/2.0/workflows/requests/{processInstanceId}/sla/manager/me** O que faz: Retorna os dados referentes ao SLA de uma solicitação específica. | **processInstanceId** - Código da solicitação específica. **expand** - Campo padrão que indica se as coleções no objeto de retorno serão listadas. actualTasks retorna os dados dos usuários e do estado das atividades correntes da solicitação caso aberta. cardFields retorna os campos do formulário referentes a solicitação. Esses campos podem ser agrupados separados por vírgula. **calculate** - Se os dados calculáveis da solicitação serão calculados. Estes campos são: remainingTime, fullTime e percentageConcluded. Por padrão este campo é true, colocá-lo para false omite os valores calculáveis, mas torna a resposta mais veloz. |\n| **API: /content-management/api/v2/documents/publish** O que faz: Publicar um documento na pasta | **Campos Obrigatórios:** **parentDocumentId:** Pasta onde o documento vai ser publicado **phisicalFile:** Nome do arquivo que vai ser publicado |\n| **API:****/content-management/api/v2/documents/{documentId}** O que faz: Deleta um documento publicado ``` ``` | **Campos Obrigatórios:** **documentID:** ID do documento |\n| **API: /content-management/api/v2/documents/upload/{fileName}** O que faz: Deleta um documento publicado | **Campos Obrigatórios:** **fileName:** Nome do arquivo **file**: Local do arquivo que vai ser enviado ``` ``` |\n| | |\n\nInformações\n\nPara maiores detalhes, acesse o conteúdo das APIs de SLA em [Fluig API](http://api.fluig.com)." }, { "metadata": { "title": "Autorização para client de Serviços REST", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239041233", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Autorização para client de Serviços REST.md" }, "content": "Autorização para client de Serviços REST" }, { "metadata": { "title": "Autorização para client de Serviços REST", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239041233", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Autorização para client de Serviços REST.md" }, "content": "Autorização para client de Serviços REST\n\n\n# Índice\n\n- 1 [Objetivo](#AutorizaçãoparaclientdeServiçosREST-Objetivo)\n- 2 [Cadastro de client para chamada a serviços externos](#AutorizaçãoparaclientdeServiçosREST-Cadastrodeclientparachamadaaserviçosexternos)\n - 2.1 [Métodos HTTP suportados](#AutorizaçãoparaclientdeServiçosREST-MétodosHTTPsuportados)\n - 2.2 [OAuth 1](#AutorizaçãoparaclientdeServiçosREST-OAuth1)\n - 2.3 [OAuth 2](#AutorizaçãoparaclientdeServiçosREST-OAuth2)\n - 2.4 [Basic Authentication](#AutorizaçãoparaclientdeServiçosREST-BasicAuthentication)\n - 2.5 [Custom Authentication](#AutorizaçãoparaclientdeServiçosREST-CustomAuthentication)\n - 2.6 [None Authentication](#AutorizaçãoparaclientdeServiçosREST-NoneAuthentication)\n- 3 [Testando configurações de autorização do client cadastrado](#AutorizaçãoparaclientdeServiçosREST-Testandoconfiguraçõesdeautorizaçãodoclientcadastrado)\n- 4 [Consumindo o serviço com autenticação OAuth 1, OAuth 2, Basic Authentication, Custom Authentication e None Authentication](#AutorizaçãoparaclientdeServiçosREST-ConsumindooserviçocomautenticaçãoOAuth1,OAuth2,BasicAuthentication,CustomAuthenticationeNoneAuthentication)\n - 4.1 [Chamada via JavaScript](#AutorizaçãoparaclientdeServiçosREST-ChamadaviaJavaScript)\n - 4.2 [Chamada via componente SDK](#AutorizaçãoparaclientdeServiçosREST-ChamadaviacomponenteSDK)\n\n# Objetivo\n\n---\n\nPara acessar com segurança recursos e serviços externos ao fluig (seja a partir de [Desenvolvimento de Workflow](../../../Recurso de Processos (BPM).md)/Desenvolvimento de Workflow.md) ou desenvolvimentos sobre a plataforma), pode-se utilizar o recurso **Serviços REST** no fluig.\n\nEste consiste em um cadastro de configurações de acesso e segurança do serviço externo a ser consumido, ou seja, para cada caso de protocolo de segurança sendo OAuth 1, OAuth 2 ou *Basic* *Authentication**,*serão informados e cadastrados os *tokens* de acesso, chaves, usuário, senha, etc.\n\nNa atualização 1.6.2 do fluig disponibilizamos as autorizações *Custom e None Authentication. Com a Custom*é possível realizar o cadastro de acesso e segurança do serviço externo a ser consumido de forma personalizada, não obedecendo o cadastro padrão fixo do protocolo HTTP. Para acessar um serviço interno que não necessite de autenticação, utilize o *None Authentication*. \n\n# Cadastro de *client* para chamada a serviços externos\n\n---\n\nPara exibir o cadastro de **serviços REST****,**acesse o fluig com o usuário administrador, acione o menu **Painel de Controle**, localize o agrupador **Desenvolvimento** e acione a opção **Serviços**. O recurso contém opções para inclusão, alteração, exclusão, consulta e teste dos *clients*.\n\n![](..\\..\\..\\..\\images\\Servi%C3%A7os%20165.png)\n\nEm atualizações anteriores à **1.6.5 (Liquid)**, esse recurso está disponível no agrupador **Gerais** do ****Painel de Controle****.\n\nDependendo do *client* de serviço a ser cadastrado, pode-se utilizar mecanismos de autenticação distintos, como OAuth 1, OAuth 2, *Basic, Custom* e até sem autenticação, com o *NONE*. Para cada tipo de autenticação existem informações específicas, que deverão ser preenchidas.\n\nImportante!\n\nA escolha do protocolo a ser utilizado fica a cargo do cliente, bem como a obtenção dos *tokens* e demais informações necessárias para o cadastro do *client*." }, { "metadata": { "title": "Autorização para client de Serviços REST", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239041233", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Autorização para client de Serviços REST.md" }, "content": "Autorização para client de Serviços REST\n\n## Métodos HTTP suportados\n\n---\n\n- Para tipo de autorização OAuth 1, os métodos HTTP disponíveis são: *PUT, POST, GET, DELETE*.\n- Para tipo de autorização OAuth 2, os métodos HTTP disponíveis são: *PUT, POST, GET, DELETE, PATCH*.\n- Para tipo de autorização *Basic*, os métodos HTTP disponíveis são: *PUT, POST, GET, DELETE, PATCH*.\n- Para tipo de autorização *Custom*, os métodos HTTP disponíveis são: *PUT, POST, GET, DELETE, PATCH*.\n- Em Nenhuma Autorização (None), os métodos HTTP disponíveis são: *PUT, POST, GET, DELETE, PATCH*.\n\n## OAuth 1\n\n---\n\n\n\n- Para cadastrar *client* com o tipo de autorização OAuth 1, informar os campos:\n\n| Campo | Condição |\n| --- | --- |\n| Código do Serviço | Obrigatório |\n| Domínio | Obrigatório |\n| Tipo de Autenticação | Obrigatório |\n| *Consumer Key* | Obrigatório |\n| *Consumer Secret* | Obrigatório |\n| *Token* de acesso | Obrigatório |\n| *Token* secreto | Obrigatório |\n| URL *Token* de acesso | Obrigatório |\n| URL solicitação de *Token* | Obrigatório |\n| URL Autorização de Usuário | Obrigatório |\n| URL para teste de Serviço | Opcional |\n\n![](..\\..\\..\\..\\images\\image2016-6-17%2085515.png)\n\n![](..\\..\\..\\..\\images\\image2016-6-17%2085551.png)\n\n## OAuth 2" }, { "metadata": { "title": "Autorização para client de Serviços REST", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239041233", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Autorização para client de Serviços REST.md" }, "content": "Autorização para client de Serviços REST\n\n\n---\n\n\n\nO uso de Refresh Token e da URL Refresh Token se fazem obrigatório para o OAuth 2.0 quando utilizado com um access Token passivo de expiração.\n\n- Para cadastrar *client* com o tipo de autorização OAuth 2, informar os campos:\n\n| Campo | Condição |\n| --- | --- |\n| Código do Serviço | Obrigatório |\n| Domínio | Obrigatório |\n| Tipo de Autenticação | Obrigatório |\n| Id Cliente | Obrigatório |\n| *Client Secret* | Obrigatório |\n| *Refresh Token* | Apenas se disponibilizado pelo Serviço |\n| *Token* de acesso | Obrigatório |\n| URL *Refresh Token* | Apenas se disponibilizado pelo Serviço |\n| URL para teste de Serviço | Opcional |\n\nNota\n\nPara o OAuth 2 utilizamos a autenticação do tipo Baerer\n\n![](..\\..\\..\\..\\images\\cadastro_1.png)\n\n![](..\\..\\..\\..\\images\\cadastro_2.png)\n\n## *Basic Authentication*\n\n---\n\n\n\n- Para cadastrar *client* com o tipo de autorização *Basic*, informar os campos:\n\n| Campo | Condição |\n| --- | --- |\n| Código do Serviço | Obrigatório |\n| Domínio | Obrigatório |\n| Tipo de Autenticação | Obrigatório |\n| Usuário | Obrigatório |\n| Senha | Obrigatório |\n| Confirmação da Senha | Obrigatório |\n| URL para teste do Serviço | Opcional |\n\n![](..\\..\\..\\..\\images\\image2016-6-17%2092029.png)\n\n## *Custom**Authentication*\n\n---\n\n\n\n- Para cadastrar *client* com o tipo de autorização *Custom*, informar os campos:\n\n| Campo | Condição |\n| --- | --- |\n| Código do Serviço | Obrigatório |\n| Domínio | Obrigatório |\n| Tipo de Autenticação | Obrigatório |\n| Personalizado | Obrigatório |\n| URL para teste do Serviço | Opcional |\n\n![](..\\..\\..\\..\\images\\customAuthentication.jpg)\n\n## *None Authentication*" }, { "metadata": { "title": "Autorização para client de Serviços REST", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239041233", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Autorização para client de Serviços REST.md" }, "content": "Autorização para client de Serviços REST\n\n\n---\n\n\n\n- Para cadastrar *client* com o tipo Nenhuma *(None*) autorização, informar os campos:\n\n| Campo | Condição |\n| --- | --- |\n| Código do Serviço | Obrigatório |\n| Domínio | Obrigatório |\n| Tipo de Autenticação | Obrigatório |\n| URL para teste do Serviço | Opcional |\n\n![](..\\..\\..\\..\\images\\Image%209.jpg)\n\n# Testando configurações de autorização do *client* cadastrado\n\n---\n\nApós o cadastro do *client*, é possível testar as configurações de acesso utilizando a URL para teste do Serviço (*Endpoint GET*) cadastrado. Basta selecionar o *client* e clicar no botão**Testar Serviço:**\n\n![](..\\..\\..\\..\\images\\TesteServi%C3%A7oRest.PNG)\n\n# Consumindo o serviço com autenticação OAuth 1, OAuth 2, *Basic Authentication, Custom Authentication e None Authentication*\n\n---\n\n### Chamada via JavaScript\n\nPara consumo do serviço a partir do [desenvolvimento de *workflows*](../../../Recurso de Processos (BPM).md)/Desenvolvimento de Workflow.md) ou de desenvolvimento sobre a plataforma, deve-se informar os seguintes parâmetros no Javascript:\n\n#### Como montar os parâmetros?" }, { "metadata": { "title": "Autorização para client de Serviços REST", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239041233", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Autorização para client de Serviços REST.md" }, "content": "Autorização para client de Serviços REST\n\n\nPara envio dos parâmetros no JSON, é obrigatório utilizar o nome das chaves conforme descrito abaixo.\n\n- ***companyId:** Id da empresa. (sempre com o valor: getValue(\"WKCompany\") + '') em versões recentes este parâmetro é opcional.*\n- ***serviceCode*:** Chave única cadastrada.\n- ***endpoint*:** *Endpoint* que será chamado.\n- **timeoutService:** definir limite de tempo (em segundos) durante a chamada ao serviço, parâmetro opcinal.\n\nPara *endpoint*'s que recebem QueryParam e PathParam, os parâmetros devem ser incluídos diretamente no *endpoint*. (endpoint : '/api/public/2.0/users/create?queryParam=exemple',)\n\n- ***method*:** Método HTTP do serviço. (opcional, padrão sendo GET)\n- ***params*:** Existem duas maneiras de utilizar este parâmetro, sendo: **params** utilizado para passar o valor em JSON e **strParams**, no caso da utilização deste, o valor a ser passado precisa estar em String.\n- ***options*:** Parâmetros em formato JSON para configuração do *request* (se o mesmo não for definido ele vai com as opções padrões que seria encoding: UTF-8 e mediaType: application/json).\n- **headers:** Parâmetros em formato JSON para configuração do *header* do *request*\n\nPara habilitar a utilização de serviços REST pelo protocolo SSL, na propriedade **options** é necessário informar **useSSL: true.**\n\n#### Exemplo de chamada aos serviços com HTTP*method**POST*no JavaScript do desenvolvimento" }, { "metadata": { "title": "Autorização para client de Serviços REST", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239041233", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Autorização para client de Serviços REST.md" }, "content": "Autorização para client de Serviços REST\n\n\n```\n\ttry{\n\t\tvar clientService = fluigAPI.getAuthorizeClientService();\n\t\tvar data = {\n\t\t\tcompanyId : getValue(\"WKCompany\") + '',\n\t\t\tserviceCode : 'bamboo',\n\t\t\tendpoint : '/api/public/2.0/users/create',\n\t\t\tmethod : 'post',// 'delete', 'patch', 'put', 'get' \n\t\t\ttimeoutService: '100', // segundos\n\t\t\tparams : {\n\t\t\t\tlogin : 'authorize.client',\n\t\t\t\temail : 'authorize.client@fluig.com',\n\t\t\t\tcode : 'authorize.client',\n\t\t\t\tfirstName : 'authorize',\n\t\t\t\tlastName : 'client',\n\t\t\t\tfullName : 'authorize client',\n\t\t\t\tpassword : '123',\n\t\t\t\textData :{\n\t\t\t\t\t'addicional-data':'123456'\n\t\t\t\t}\n\t\t\t},\n options : {\n encoding : 'UTF-8',\n\t\t\t mediaType: 'application/json',\n\t\t\t useSSL : true\n },\n\t\t headers: {\n \t\t\t Content-Type: 'application/json;charset=UTF-8'\n\t\t }\n\t\t}\n\t\t// OU \n\t\tvar data = {\n\t\t\tcompanyId : getValue(\"WKCompany\") + '',\n\t\t\tserviceCode : 'google',\n\t\t\tendpoint : '/userinfo/v2/me',\n\t\t\tmethod : 'get',\n\t\t\ttimeoutService: '100' // segundos\n\t\t}\n\t\t// OU\n\t\tvar data = { \n\t\t\tcompanyId : getValue(\"WKCompany\") + '',\n\t\t\tserviceCode : 'fluig-local-basic', \n\t\t\tendpoint : '/api/public/2.0/testauthorizeclient/put', \n\t\t\tmethod : 'put', // 'delete', 'patch', 'post', 'get' \n\t\t\ttimeoutService: '100', // segundos\n\t\t\tparams : { \n\t\t\t\t\tteste : 'teste' \n\t\t\t} \n\t\t} \n // OU\n\t\tvar data = { \n\t\t\tcompanyId : getValue(\"WKCompany\") + '',\n\t\t\tserviceCode : 'fluig-local-basic', \n\t\t\tendpoint : '/api/public/2.0/testauthorizeclient/put', \n\t\t\tmethod : 'put', // 'delete', 'patch', 'post', 'get' \n\t\t\ttimeoutService: '100', // segundos\n\t\t\tstrParams : '{ \"teste\" : \"teste\" }'                                                                     \n\t \t} \n \n\t\tvar vo = clientService.invoke(JSON.stringify(data));\n\n\t\tif(vo.getResult()== null || vo.getResult().isEmpty()){\n\t\t\tthrow new Exception(\"Retorno está vazio\"); \n\t\t}else{\n\t\t\tlog.info(vo.getResult());\n\t\t}\n\t} catch(err) {\n\t\tthrow new Exception(err); \n\t}\n```" }, { "metadata": { "title": "Autorização para client de Serviços REST", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=239041233", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Autorização para client de Serviços REST.md" }, "content": "Autorização para client de Serviços REST\n\n#### Retorno da chamada\n\nA chamada \"clientService.invoke(JSON.stringify(data));\" retorna um objeto com os parâmetros abaixo:\n\n- ***companyId:** Id da empresa. (sempre com o valor: getValue(\"WKCompany\") + '')*\n- ***serviceCode*:** Chave única cadastrada.\n- ***description*:** Informa o *serviceCode* e se obteve sucesso. Ex: \"google:SUCCESS\".\n- ***endopint*:** *Endpoint* chamado.\n- ***result*:** *String* com o resultado retornado.\n- ***method*:** Método http do serviço.\n- **strParams:** Parâmetros em formato *String*.\n- ***params*:** Parâmetros em formato *Map*<*String*, *Object*> utilizados.\n\n### Chamada via componente SDK\n\nO recurso para consumo do serviço externo também está disponível no componente SDK através do [AuthorizeClientSdkService.](https://api.fluig.com/old/sdk/com/fluig/sdk/service/AuthorizeClientSdkService.html)\n\nVeja a seguir o exemplo para a chamado ao serviço no SDK:\n\n```\nprivate getAuthorizeClientSdkService getAuthorizeClientSdkService() throws SDKException {\n\treturn new FluigAPI().getAuthorizeClientSdkService();\n}\n```" }, { "metadata": { "title": "Consumo de serviços na API pública e no componente SDK", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=198934765", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Consumo de serviços na API pública e no componente SDK.md" }, "content": "Consumo de serviços na API pública e no componente SDK" }, { "metadata": { "title": "Consumo de serviços na API pública e no componente SDK", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=198934765", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Consumo de serviços na API pública e no componente SDK.md" }, "content": "Consumo de serviços na API pública e no componente SDK\n\n\nAtenção\n\nEsta página foi revisada para considerar as novas configurações de server do fluig para a atualização 1.6.\n\nCaso possua uma atualização anterior do fluig escolha a aba da versão 1.5.13 e anteriores nesta página.\n\n# Índice\n\n- 1 [Objetivo](#ConsumodeserviçosnaAPIpúblicaenocomponenteSDK-Objetivo)\n- 2 [Consumindo um serviço na API pública](#ConsumodeserviçosnaAPIpúblicaenocomponenteSDK-ConsumindoumserviçonaAPIpública)\n - 2.1 [Consumindo um serviço do componente SDK a partir de eventos de JavaScript](#ConsumodeserviçosnaAPIpúblicaenocomponenteSDK-ConsumindoumserviçodocomponenteSDKapartirdeeventosdeJavaScript)\n - 2.2 [Exemplos para utilização do componente SDK via eventos de JavaScript](#ConsumodeserviçosnaAPIpúblicaenocomponenteSDK-ExemplosparautilizaçãodocomponenteSDKviaeventosdeJavaScript)\n- 3 [Consumindo um serviço no componente SDK](#ConsumodeserviçosnaAPIpúblicaenocomponenteSDK-ConsumindoumserviçonocomponenteSDK)\n - 3.1 [Serviços disponíveis no componente SDK](#ConsumodeserviçosnaAPIpúblicaenocomponenteSDK-ServiçosdisponíveisnocomponenteSDK)\n - 3.2 [Exemplo para Instanciar Serviço do SDK](#ConsumodeserviçosnaAPIpúblicaenocomponenteSDK-ExemploparaInstanciarServiçodoSDK)\n- 4 [Auto completar eventos da fluigAPI](#ConsumodeserviçosnaAPIpúblicaenocomponenteSDK-AutocompletareventosdafluigAPI)\n\n# Objetivo\n\n---\n\nPara utilizar os recursos do componente SDK, existem alguns pré-requisitos e exigências a serem seguidos, como:\n\n- Esta documentação é destinada ao desenvolvedor cliente e parceiro do fluig que deseja consumir interna e externamente os recursos disponíveis na API Pública e no componente SDK.\n\n- As operações na API Pública estão disponíveis através de chamadas REST, que são consumidas via HTTP.\n\n- As operações no componente SDK estão disponíveis após configuração do **fluig-sdk-api** no **classpath** da aplicação dessa forma, através de um **ServiceLocator**, é realizada a chamada ao serviço desejado.\n\n# Consumindo um serviço na API pública\n\n---\n\nPara utilizar um serviço da API Pública, deve ser utilizado o **protocolo OAuth** de autenticação, que através das chaves **Consumer Key**, **Consumer Secret**, configurados no **OAuth App** é gerado através do **OAuth Provider** com um novo **Token Access** e um **Token Secret**.\n\n- O **client** deve ser desenvolvido para suportar autenticação **OAuth 1.0a**." }, { "metadata": { "title": "Consumo de serviços na API pública e no componente SDK", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=198934765", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Consumo de serviços na API pública e no componente SDK.md" }, "content": "Consumo de serviços na API pública e no componente SDK\n\n## Consumindo um serviço do componente SDK a partir de eventos de JavaScript\n\n---\n\nEventos de Workflow e Eventos de Personalização Social\n\nEste recurso está disponível para eventos javascript de Workflow (que podem ser encontrados [aqui](http://tdn.totvs.com/display/fluig/Desenvolvimento+de+Workflow)) e também para Eventos Sociais (que podem ser encontrados [aqui](../../../Recurso de Comunidades (Social).md)/Eventos Sociais.md)).\n\n## Exemplos para utilização do componente SDK via eventos de JavaScript" }, { "metadata": { "title": "Consumo de serviços na API pública e no componente SDK", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=198934765", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Consumo de serviços na API pública e no componente SDK.md" }, "content": "Consumo de serviços na API pública e no componente SDK\n\n\n---\n\n**Exemplo 1**\n\n```\nfunction beforeTaskCreate(colleagueId){\n\tlog.info(fluigAPI.getUserService().getCurrent());\n}\n```\n\n**Exemplo 2**\n\n```\nfunction beforeStateEntry(sequenceId) {\n if (sequenceId == 4) {\n var groupService = fluigAPI.getGroupService();\n \n var cardData = hAPI.getCardData(getValue(\"WKNumProces\"));\n var groupId = hAPI.getCardValue(\"groupId\");\n var users = new java.util.ArrayList();\n \n var it = cardData.keySet().iterator();\n while(it.hasNext()) {\n var field = it.next();\n if (field.startsWith(\"userName__\")) {\n var user = cardData.get(field);\n if (!groupService.containsUser(groupId, user)) {\n users.add(user);\n }\n }\n }\n if (!users.isEmpty()) {\n groupService.addUsers(groupId, users);\n }\n }\n}\n```\n\nObservação\n\nVeja também o [exemplo de uma aplicação web utilizando o fluig SDK](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse/web-sdk) através do artefato **web-sdk**. Diponível no **[git.fluig](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse)**.\n\n# Consumindo um serviço no componente SDK\n\n---\n\nPara utilizar o recursos do componente SDK, existem alguns pré-requisitos e exigências a serem seguidos, como:\n\n- Incluir as configurações do servidor do nexus no Maven para realizar o *download* de artefatos de dependência.\n\n Importante!\n\n Para que as dependências sejam baixadas corretamente, é necessário fazer a autenticação no Nexus. Para isso, basta solicitar as credenciais de acesso ao Nexus para o time de Atendimento Fluig. [Clique aqui](https://tdn.totvs.com/pages/viewpage.action?pageId=870389961) e saiba como solicitar e utilizar as credenciais.\n\n**settings.xml**\n\n```\n\n\n\t\n\t \n \tnexus\n\t inserir_o_usuário_fornecido\n \tinserir_a_senha_fornecida\n\t \n\t\n\t\n\t\t\n\t\t\tnexus\n\t\t\t*\n\t\t\tFluig Nexus Repository.\n\t\t\thttp://nexus.fluig.com/content/groups/public\n\t\t\n\t\n\n```\n\n- Configurar o componente **fluig-sdk-api** no **classpath**.\n- No caso de criação de um novo projeto WEB ou Widget, seguir o seguinte padrão de projeto Maven**[fluigsdk.sample](https://tdn.totvs.com/download/attachments/198934765/fluigsdk.sample.zip?version=2&modificationDate=1495206493000&api=v2)**.\n- O novo projeto Maven deve ter por padrão as seguintes configurações no **pom.xml**:\n\n**pom.xml**\n\n```\n\n \n\t\n\t\t\n\t\t\t\n\t\t\t\tcom.fluig\n\t\t\t\tfluig-sdk-bom\n\t\t\t\t1.6.0\n\t\t\t\tpom\n\t\t\t\timport\n\t\t\t\n\t\t\n\t\n \t\t\t\t\n\t\t\n\t\t\tcom.fluig\n\t\t\tfluig-sdk-api\n\t\t\n\t\t\n\t\t\tcom.fluig\n\t\t\tfluig-sdk-common\n\t\t\n\t\t\n\t\t\tjavax\n\t\t\tjavaee-api\n\t\t\tprovided\n\t\t\n\t\n\t\n\t\tfluigsdk.sample\n\t\t\n\t\t\t\n\t\t\t\torg.apache.maven.plugins\n\t\t\t\tmaven-war-plugin\n\t\t\t\t2.2\n\t\t\t\t\n\t\t\t\t\ttrue\n\t\t\t\t\tfalse\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\torg.slf4j, com.fluig.api, com.fluig.api.common\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n```\n\n**pom.xml**\n\n```\n\n \n\t\n\t\t\n\t\t\t\n\t\t\t\tcom.fluig\n\t\t\t\tfluig-sdk-bom\n\t\t\t\t1.5.0\n\t\t\t\tpom\n\t\t\t\timport\n\t\t\t\n\t\t\n\t\n \t\t\n\t\t\n\t\t\tcom.fluig\n\t\t\tfoundation-security-authentication-saml\n\t\t\tcompile\n\t\t\n\t\t\n\t\t\tcom.fluig\n\t\t\tfluig-sdk-api\n\t\t\n\t\t\n\t\t\tcom.fluig\n\t\t\tfluig-sdk-common\n\t\t\n\t\t\n\t\t\tjavax\n\t\t\tjavaee-api\n\t\t\tprovided\n\t\t\n\t\n\t\n\t\tfluigsdk.sample\n\t\t\n\t\t\t\n\t\t\t\torg.apache.maven.plugins\n\t\t\t\tmaven-war-plugin\n\t\t\t\t2.2\n\t\t\t\t\n\t\t\t\t\ttrue\n\t\t\t\t\tfalse\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\torg.slf4j, com.fluig.api, com.fluig.api.common\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n```\n\n- Se atentar para as configurações **padrão de autenticação** e **security-role** localizadas no**jboss-web.xml** e **web.xml**conforme abaixo:\n\n**jboss-web.xml**\n\n```\n\n\n\t/sample\n\tfalse\n\tTOTVSTech\n\t\n\t\tuser\n\t\ttotvstech\n\t\n\t\n\t\ttotvstech\n\t\ttotvstech\n\t\n\t\n\t\tsysadmin\n\t\twcmadmin\n\t\n\t\n\t\tadmin\n\t\twcmadmin\n\t\t\n\n```\n\n**jboss-web.xml**\n\n```\n\n\n\t/sample\n\tfalse\n\tTOTVSTech\n\t\n\t\tuser\n\t\ttotvstech\n\t\n\t\n\t\ttotvstech\n\t\ttotvstech\n\t\n\t\n\t\tsysadmin\n\t\twcmadmin\n\t\n\t\n\t\tadmin\n\t\twcmadmin\n\t\n\t\n\t\tcom.totvs.technology.auth.saml.TOTVSAuthenticatorValve\n\t\n\n```\n\n- No arquivo **web.xml:**\n\n**web.xml**\n\n```\n\n\t\tREST\n\t\t\n\t\t\tREST\n\t\t\tREST\n\t\t\t/api/rest/*\n\t\t\n\t\t\n\t\t\tREST\n\t\t\tuser\n\t\t\n\t\n\t\n\t\tFORM,FLUIGAUTH\n\t\tTOTVSTech\n\t\t\n\t\t\t/login.jsp\n\t\t\t/loginfail.jsp\n\t\t\n\t\n \n\t\n\t\ttotvstech\n\t\n\t\n\t\tuser\n\t\n\t\n\t\tsysadmin\n\t\n```\n\n**web.xml**\n\n```\n\n\t\ttotvstech\n\t\n\t\n\t\tuser\n\t\n\t\n\t\tsysadmin\n\t\n```\n\n- Realizar **lookup** do serviço via **ServiceLocator**. Seguir padrão da **Super Classe fluigAPI**." }, { "metadata": { "title": "Consumo de serviços na API pública e no componente SDK", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=198934765", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Consumo de serviços na API pública e no componente SDK.md" }, "content": "Consumo de serviços na API pública e no componente SDK\n\n## Serviços disponíveis no componente SDK" }, { "metadata": { "title": "Consumo de serviços na API pública e no componente SDK", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=198934765", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Consumo de serviços na API pública e no componente SDK.md" }, "content": "Consumo de serviços na API pública e no componente SDK\n\n\n---\n\n- - [ArticleService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/ArticleService.html)\n - [CardIndexService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/CardIndexService.html)\n - [CardService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/CardService.html)\n - [CollaborationSDKService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/CollaborationSDKService.html)\n - [CommunityService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/CommunityService.html)\n - [ContentFilesService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/ContentFilesService.html)\n - [DocumentService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/DocumentService.html)\n - [FavoritesService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/FavoritesService.html)\n - [FolderDocumentService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/FolderDocumentService.html)\n - [GlobalParameterService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/GlobalParameterService.html)\n - [GroupService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/GroupService.html)\n - [I18NService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/I18NService.html)\n - [PageService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/PageService.html)\n - [PostService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/PostService.html)\n - [SecurityService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/SecurityService.html)\n - [SocialBreadcrumbService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/SocialBreadcrumbService.html)\n - [TasksService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/TasksService.html)\n - [TenantService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/TenantService.html)\n - [UserService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/UserService.html)\n - [WorkflowService](https://api.fluig.com/old/sdk/com/fluig/sdk/service/WorkflowAPIService.html)" }, { "metadata": { "title": "Consumo de serviços na API pública e no componente SDK", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=198934765", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Consumo de serviços na API pública e no componente SDK.md" }, "content": "Consumo de serviços na API pública e no componente SDK\n\n## Exemplo para Instanciar Serviço do SDK\n\n---\n\nVeja a seguir o exemplo para a chamado ao serviço no SDK:\n\n```\nprivate UserService getUserServiceSDK() throws SDKException {\n\treturn new FluigAPI().getUserService();\n}\n```\n\n# Auto completar eventos da fluigAPI\n\n---\n\nEste serviço permite visualizar no **Studio** uma lista com todos os métodos disponíveis no **fluigAPI**. Digitando \"**fluigAPI.**\" e em seguida apertando o atalho **CTRL + Espaço**, a lista de métodos será apresentada.\n\nPor exemplo, ao usar um método com retorno, **fluigAPI.getWorkflowService()** o usuário poderá listar os métodos deste retorno, como **fluigAPI.getWorkflowService().createObervation()**.\n\nTambém é possível criar facilmente os objetos que são utilizados nos métodos.\n\nPara isso, basta digitar, por exemplo, **new ProcessObservationVO** e acionar **CTRL + Espaço** que o plugin irá alterar o trecho automaticamente para **new com.fluig.sdk.api.workflow.ProcessObservationVO();**\n\n![](..\\..\\..\\..\\images\\fluigAPI.png)\n\nAtenção!\n\nEste serviço está disponível a partir da [Atualização 1.5.13](https://tdn.totvs.com/pages/viewpage.action?pageId=267801630) da plataforma. Siga os procedimentos do [Guia de atualização fluig Studio](../../../Instalação e Atualização/Guia de atualização Fluig Studio.md) para atualizar o plugin." }, { "metadata": { "title": "Plataforma | APIs", "source": "https://tdn.totvs.com/display/fluig/Plataforma+%7C+APIs", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Fluig API\\Plataforma APIs.md" }, "content": "Plataforma | APIs\n\n\n![](..\\..\\..\\..\\images\\guia-estilos.png)\n\n---\n\nAs APIs permitem criar desenvolvimentos sobre a plataforma TOTVS Fluig, integrando ou aprimorando os recursos de acordo com a necessidade.\n\n \n\n![](..\\..\\..\\..\\images\\guia-estilos.png)\n\n# [Acesse as APIs](https://api.fluig.com/latest/index.html)\n\nVeja a documentação completa das APIs disponíveis." }, { "metadata": { "title": "Experiências de uso", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244921490", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Experiências de uso.md" }, "content": "Experiências de uso\n\n\n[![](..\\..\\..\\..\\images\\Banner%20-%20UX.png)](http://tdn.totvs.com/x/tAtFCg)\n\nNota\n\nLembramos que as documentações de integração e procedimentos disponíveis pertencem a cada ERP e em caso de dúvidas o time de atendimento do RM deve ser acionado." }, { "metadata": { "title": "Integração com outros sistemas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=307824256", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas.md" }, "content": "Integração com outros sistemas" }, { "metadata": { "title": "Mapa de Integrações TOTVS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73083721", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Mapa de Integrações TOTVS.md" }, "content": "Mapa de Integrações TOTVS" }, { "metadata": { "title": "Mapa de Integrações TOTVS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73083721", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Mapa de Integrações TOTVS.md" }, "content": "Mapa de Integrações TOTVS\n\n\n| Painel de Integração com Fluig | | Linha Microsiga Protheus | | RM | | Datasul | | Logix | |\n| Versão/Release | Documentação | Versão/Release | Documentação | Versão/Release | Documentação | Versão/Release | Documentação |\n| GED | Publicação de Relatórios no Fluig ECM | TOTVS 11 | | TOTVS 11.80 | | TOTVS 11.5.10 | | TOTVS 12 | http://tdn.totvs.com.br/pages/viewpage.action?pageId=39682542 |\n| Publicação de documentos pelo ERP | TOTVS 11 | 1) Disponível no HelpOnLine do produto, na seção Padrão de Operação (http://www.totvs.com/mktfiles/tdiportais/helponlineprotheus/portuguese/padrao\\_de\\_operacao.htm) 2) A parametrização é feita pela rotina do configurador 'Wizard do Ged'/CFGXGED (http://www.totvs.com/mktfiles/tdiportais/helponlineprotheus/portuguese/sigacfg.htm) | TOTVS 11.20 | | TOTVS 11.5.10 | 1) Publicação de documentos pelo ECM ( http://tdn.totvs.com/pages/viewpage.action?pageId=81789095 ) 2) Parametrização da integração entre ERP e ECM ( http://tdn.totvs.com/pages/viewpage.action?pageId=35750187 ) | TOTVS 12 | 1) Publicação de documentos pelo ECM (http://tdn.totvs.com/pages/viewpage.action?pageId=108660019) 2) Parametrização da integração do ERP com o ECM (http://tdn.totvs.com/pages/viewpage.action?pageId=108659933) |\n| Publicação de documentos pelo ECM com visibilidade no ERP | TOTVS 11 | Disponível através da especificação externalDocumentnId do documento ECM e da inclusão na pasta correlata da Rotina do ERP. O ERP necessita que o externalDocumentnId tenha o seu conteudo preenchido com a PrimaryKey da tabela | RoadMap | | TOTVS 11.5.10 | | TOTVS 12 | Disponível através do Visualizador de Relatórios do Logix, a partir da inclusão dos documentos na pasta correlata da empresa. |\n| WorkFlow | A partir de um evento no ERP, interagir com um workflow (iniciar, movimentar, finalizar, atualizar dados do formulário) | TOTVS 11 | 1) Disponível no HelpOnLine do módulo Configurador - Rotina 'Regras de WorkFlow' / CFGA110 (http://www.totvs.com/mktfiles/tdiportais/helponlineprotheus/portuguese/sigacfg.htm) | RoadMap | | TOTVS 11.5.10 | | TOTVS 12 | |\n| Wizard de geração automática de formulários do ERP | TOTVS 11 | 1) Disponível no HelpOnLine do módulo Configurador - Rotina 'Wizard do WorkFlow' / CFGXWF (http://www.totvs.com/mktfiles/tdiportais/helponlineprotheus/portuguese/sigacfg.htm) | Não disponível | | Não disponível | | Não disponível | |\n| A partir do ECM permitir a chamada de uma rotina do ERP | TOTVS 11 | | RoadMap | | TOTVS 11.5.10 | | TOTVS 12 | |\n| A integração do ERP com o Formulário do ECM tem a capacidade de popular os dados do formulário | TOTVS 11 | http://tdn.totvs.com/display/fluig/Linha+Microsiga+Protheus | RoadMap | | TOTVS 11.5.10 | | TOTVS 12 | |\n| A integração do ERP com o formulário do ECM permite o uso de LookUp/Consulta em campos chaves do formulário | RoadMap | | RoadMap | | TOTVS 11.5.10 | | TOTVS 12 | |\n| A integração do ERP com o formulário do ECM permite a validação das regras de negócio (BO) | TOTVS 11 | http://tdn.totvs.com/display/fluig/Linha+Microsiga+Protheus | RoadMap | | TOTVS 11.5.10 | | TOTVS 12 | |\n| A integração do ERP com o formulário do ECM permite a atualização, exclusão ou inclusão de uma transação no ERP | TOTVS 10 | http://tdn.totvs.com/display/fluig/Linha+Microsiga+Protheus | Todos os objetos de negócio CRUD estão disponíveis, mais informação em: http://wikihelp.totvs.com.br/WikiHelp/CON3/INT.comunicacaoWebServices.aspx http://wikihelp.totvs.com.br/WikiHelp/CON3/INT.comunicacaoWebServicesTBC.aspx http://tdn.totvs.com/download/attachments/143655277/DataServer+para+WebServices.rar | | TOTVS 11.5.10 | | TOTVS 12 | |" }, { "metadata": { "title": "Tipos de integração", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=306842691", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Tipos de integração.md" }, "content": "Tipos de integração\n\n\n- [Integração assíncrona via processos workflow](Tipos de integração/Integração assíncrona via processos workflow.md)\n- [Integração consumindo XML](Tipos de integração/Integração consumindo XML.md)\n- [Integração de Módulos Customizados](Tipos de integração/Integração de Módulos Customizados.md)" }, { "metadata": { "title": "Habilitando Experiências de Uso", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=181964698", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Experiências de uso\\Habilitando Experiências de Uso.md" }, "content": "Habilitando Experiências de Uso\n\n\n# Índice\n\n- 1 [Objetivo](#HabilitandoExperiênciasdeUso-Objetivo)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é habilitar as Experiências de Uso no TOTVS Fluig Plataforma.\n\nPara utilização das Experiências de Uso mencionadas abaixo, é imprescindível que tanto a plataforma Fluig quanto o ERP estejam previamente integrados com o TOTVS Identity:\n\n- **#1 - Single Sign-on**\n- **#3 - Acesso Centralizado**\n- **#4 - Widgets de Gestão**\n- **#5 - Consulta Rápida**\n\nFazer *log out* no TOTVS Fluig Plataforma e acessar a URL do Fluig adicionando: */portal/home?wcmadmin=true*\n\n**Exemplo:** *minhaempresa.fluig.com/portal/home?wcmadmin=true*\n\nAo aparecer a tela para informar o login, utilize os dados para entrar no Fluig Plataforma:\n\n![](..\\..\\..\\..\\..\\images\\wcmadmin1.png)\n\nApós fazer *login* na plataforma Fluig, acessar: **Painel de Controle >** agrupador **WCM > Empresas**.\n\nSelecione a empresa e clique em editar.\n\n![](..\\..\\..\\..\\..\\images\\wcmadmin2.png)\n\nClique em ***Cadastrar Dados Adicionais***\n\n![](..\\..\\..\\..\\..\\images\\wcmadmin3.png)\n\nNo cadastro de dados adicionais, adicionar o registro com a chave/valor.\n\nChave: **USER-EXPERIENCE-ACTIVE**\n\nValor: **true**\n\nEm alguns sistemas (RM e Logix, por exemplo), pode ser necessária a inclusão de outras duas chaves, referentes à autenticação no ERP, para utilização do *widget* de consulta rápida:\n\nChave: **QUICKVIEW-AUTH-USER**\n\nValor: Usuário \"mestre\" do ERP\n\nChave: **QUICKVIEW-AUTH-PASSWORD**\n\nValor: Senha do usuário \"mestre\" do ERP\n\n**![](..\\..\\..\\..\\..\\images\\wcmadmin4.png)**\n\nEm seguida verifique que o registro foi incluído e clique em Salvar.\n\n![](..\\..\\..\\..\\..\\images\\wcmadmin5.png)\n\nSalve os dados da empresa e a plataforma Fluig está pronta para ser utilizada com as Experiências de Uso." }, { "metadata": { "title": "Linhas", "source": "https://tdn.totvs.com/display/fluig/Linhas", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Experiências de uso\\Linhas.md" }, "content": "Linhas\n\n\n[Linha Datasul](http://tdn.totvs.com/x/PQDgB)\n\n[Linha Logix](http://tdn.totvs.com/x/mwR6Bg)\n\n[Linha Microsiga Protheus](http://tdn.totvs.com/x/XCtbB)\n\n[Linha SARA](https://tdn.totvs.com/pages/viewpage.action?pageId=185735669)" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n\n- [Introdução](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Introdução)\n- [Pré-requisitos](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Pré-requisitos)\n- [Passo 1: Cadastre o serviço REST no Fluig](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo1:CadastreoserviçoRESTnoFluig)\n- [Passo 2: Configure o projeto no eclipse](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo2:Configureoprojetonoeclipse)\n- [Passo 3: Crie o dataset customizado (GET)](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo3:Crieodatasetcustomizado(GET))\n- [Passo 4: Modele o processo BPMN](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo4:ModeleoprocessoBPMN)\n- [Passo 5: Crie o formulário com campo zoom](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo5:Crieoformuláriocomcampozoom)\n- [Passo 6: Auto-preencha os Campos (setSelectedZoomItem)](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo6:Auto-preenchaosCampos(setSelectedZoomItem))\n- [Passo 7: Limpe os Campos (removedZoomItem )](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo7:LimpeosCampos(removedZoomItem))\n- [Passo 8: Vincular formulário com o diagrama](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo8:Vincularformuláriocomodiagrama)\n- [Passo 9: Alterar o centro de custo via atividade de serviço (PUT)](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo9:Alterarocentrodecustoviaatividadedeserviço(PUT))\n- [Passo 10: Tratamento de limite de caracteres (PUT)](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo10:Tratamentodelimitedecaracteres(PUT))\n- [Passo 11: Valide os erros de negócio do ERP na tela](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo11:ValideoserrosdenegóciodoERPnatela)\n- [Passo 12: Adapte o formulário para criar e alterar (POST e PUT)](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo12:Adapteoformulárioparacriarealterar(POSTePUT))\n- [Passo 13: Adapte o processo para criar e alterar (POST e PUT)](#BásicoIntegraçãoFluigxProtheus:Centrodecusto-Passo13:Adapteoprocessoparacriarealterar(POSTePUT))" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n## Introdução\n\n---\n\nEste é um exemplo inicial e simplificado para fornecer a compreensão fundamental do conceito e da mecânica da integração entre o TOTVS Fluig e o TOTVS Protheus. Ao dominar este fluxo, você terá a base necessária para evoluir o conceito e personalizar essa lógica para atender a outros cenários de negócio. \n\n## Pré-requisitos\n\n---\n\nAntes de iniciar o desenvolvimento, verifique se o seu ambiente atende aos seguintes requisitos de acesso e versão:\n\n- **Versão Mínima do Protheus:** Certifique-se de que o Protheus esteja na versão **12.1.21** ou superior. Você pode verificar isso abrindo o Protheus, acessando o SIGACFG e, em seguida, **Ajuda** > **Sobre**.\n- **Acesso à API REST do Protheus:**\n\n- Obtenha a **URL base** do REST do Protheus (exemplo: http://[seu\\_localhost]:[8084]/[rest]).\n- O endpoint específico para **Centro de Custo** é /api/ctb/v1/cost-center (disponível a partir do Protheus 12.1.21).\n- Consulte a documentação completa da API em: [api.totvs.com.br](https://api.totvs.com.br/apidetails/CostCenter_v1_000.json).\n\n- **Credenciais de Acesso:** Você precisará de um **usuário e senha** válidos do Protheus com as permissões necessárias para acessar a API.\n\n![](..\\..\\..\\..\\..\\images\\0.versaoapicc_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n![](..\\..\\..\\..\\..\\images\\0.versaoprotheus_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n## Passo 1: Cadastre o serviço REST no Fluig" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n\n---\n\nO serviço REST centraliza as credenciais e a URL base da integração diretamente no painel do Fluig. Isso evita que você deixe senhas expostas no código e facilita a manutenção caso o endereço do ERP mude no futuro. É a fundação segura da nossa integração.\n\nAcesse a documentação de apoio: [Plataforma ❙ Serviços](https://tdn.totvs.com/pages/releaseview.action?pageId=243660796).\n\n![](..\\..\\..\\..\\..\\images\\1.cadastroservicorestfluig_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n- Acesse o Fluig com um usuário administrador.\n\n- Vá em **Painel de Controle** > **Serviços** e clique em **Adicionar Novo Serviço**.\n\n- Selecione o tipo **REST**.\n\n- Preencha os campos exatamente assim:\n - **Nome do Serviço:** API\\_PROTHEUS\\_REST (Este é o ID que usaremos no código).\n - **Descrição:** API Protheus Rest.\n - **Domínio:** http://[seu\\_localhost]:[8084]/[rest] (mude os [parâmetros] de acordo com seu ambiente).\n - **Autenticação:** Selecione **BASIC** e insira as credenciais do Protheus.\n\n- Em **URL para teste**, insira /api/ctb/v1/cost-center e salve.\n\n- Nas **Propriedades** da atividade **Integração**, vá na aba **Geral** e marque a Execução como **Automatizada**. Configure as tentativas (ex: 5 tentativas a cada 30 minutos).\n\n- Na lista de serviços, clique em **Testar**. O Fluig deve retornar o JSON com os centros de custo.\n\n## Passo 2: Configure o projeto no eclipse" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n\n---\n\nO Eclipse com o plugin do Fluig Studio é a nossa principal ferramenta de desenvolvimento. Precisamos conectar a IDE ao servidor do Fluig para criar e exportar os arquivos do projeto diretamente para o ambiente.\n\nAcesse a documentação de apoio: [Guia de instalação Fluig Studio](https://tdn.totvs.com/pages/releaseview.action?pageId=73078179).\n\n![](..\\..\\..\\..\\..\\images\\2.cadastroservidorprojetofluig_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n- No Eclipse, acesse **Window** > **Open Perspective** > **Other** > **Fluig**.\n\n- Na aba **Fluig Servers**, clique com o botão direito e vá em **New** > **Fluig Server**.\n\n- Após inserir os dados do servidor (host, porta, usuário e senha), efetue um clique duplo para confirmar o status como **Disponível**.\n\n- Crie o projeto: **File** > **New** > **Projeto Fluig** e nomeie como **fluig\\_protheus**.\n\n## Passo 3: Crie o dataset customizado (GET)" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n\n---\n\nDatasets no Fluig são scripts escritos em JavaScript executados no backend que consultam dados (APIs, Web Services e entre outros...) e os padronizam em linhas e colunas. Vamos criar um para consumir o serviço REST do Protheus e buscar os centros de custo disponíveis. É esse dataset que alimentará a nossa interface depois.\n\nAcesse a documentação de apoio: [Desenvolvimento de Datasets](../../../Desenvolvimento de Datasets.md).\n\n![](..\\..\\..\\..\\..\\images\\3.cadastrodatasetcustomizado_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n- No Eclipse, clique com o botão direito no projeto e selecione **New** > **Dataset customizado Fluig**.\n\n- Nomeie como **ds\\_get\\_costcenter\\_protheus**.\n\n- Escreva o script :\n\n**ds\\_get\\_costcenter\\_proteus.js**\n\n```javascript\nfunction defineStructure() {}\n\nfunction onSync(lastSyncDate) {}\n\nfunction createDataset(fields, constraints, sortFields) {\n    var dataset = DatasetBuilder.newDataset();\n    \n    dataset.addColumn(\"InternalId\");\n    dataset.addColumn(\"CompanyInternalId\");\n    dataset.addColumn(\"CompanyId\");\n    dataset.addColumn(\"RegisterSituation\");\n    dataset.addColumn(\"Class\");\n    dataset.addColumn(\"Code\");\n    dataset.addColumn(\"Name\");\n\n    var sendData = {    \n        companyId: String(fluigAPI.getSecurityService().getCurrentTenantId()),\n        serviceCode: \"API_PROTHEUS_REST\",\n        endpoint: \"/api/ctb/v1/costcenters/\",\n        method: \"GET\"\n    };\n\n    // Fornece acesso aos serviços externos com autenticação oauth, documentação: http://127.0.0.1:8080/api/sdk/com/fluig/sdk/service/AuthorizeClientSdkService.html\n    var clientService = fluigAPI.getAuthorizeClientService(); \n    \n // Realizar a integração\n // Documentação da API: https://api.totvs.com.br/apidetails/CostCenter_v1_000.json\n    var vo = clientService.invokeService(JSON.stringify(sendData));\n // Armazenar o status HTTP da integração, esse passo é muito importante para idenficar se tudo ocorreu como deveria!\n // Fique atento!!! Cada API pode ter um retorno diferente, a melhor prática é consultar documentação oficial em api.totvs.com.br e checar \n // os seus respectivos métodos e retornos possíveis.\n // O método getHttpStatusResult é da classe AuthorizeClientSdkServiceVO (Variavel clientService do nosso código)\n // Documentação completa: http://127.0.0.1:8080/api/sdk/com/fluig/sdk/api/authorizeclient/AuthorizeClientSdkServiceVO.html\n    var status = String(vo.getHttpStatusResult());\n    if (status == \"200\") {\n        var jsonResponse = JSON.parse(vo.getResult());       \n        if (jsonResponse.items && jsonResponse.items.length > 0) {\n            for (var i = 0; i < jsonResponse.items.length; i++) {\n                var item = jsonResponse.items[i];                \n                dataset.addRow(new Array(\n                 item.InternalId,\n                 item.CompanyInternalId,\n                 item.CompanyId,\n                 item.RegisterSituation,\n                 item.Class,\n                 item.Code,\n                 item.Name\n                ));\n            }\n        }\n    } else {\n        var errorMsg = \"Erro desconhecido durante a integracao.\";\n        try {\n            var parseResult = JSON.parse(vo.getResult());\n            var parseError = JSON.parse(parseResult.errorMessage);\n            errorMsg = parseError.detailedMessage;\n        } catch (e) {\n            errorMsg = vo.getResult();\n        }\n        \n        dataset.addRow(new Array(\n            status,\n            errorMsg,\n            \"\", \"\", \"\", \"\", \"\"\n        ));\n    }\n  \n    return dataset;\n}\n\nfunction onMobileSync(user) {}\n```\n\n- Exporte para o servidor, para isso, clique com o botão direito no arquivo > **Export** > **Exportar para servidor Fluig**.\n\n- Após, teste no Eclipse na aba **Visualização de Dataset**, digite **ds\\_get\\_costcenter\\_protheus** e clique em **Finish**.\n\nDica\n\n**Paginação:** Se a base for grande, adicione parâmetros de paginação (page, pageSize) no endpoint. Consulte este e outros parâmetros na documentação oficial da API do Protheus: [api.totvs.com.br](https://api.totvs.com.br/apidetails/CostCenter_v1_000.json)\n\n**Dataset Offline:** Isso faz o Fluig salvar os dados do ERP no próprio Fluig, assim poupando o Protheus de requisições excessivas. Acesse a documentação: [Sincronização de datasets](https://tdn.totvs.com/pages/releaseview.action?pageId=212899013)" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n## Passo 4: Modele o processo BPMN\n\n---\n\nO diagrama BPMN desenha o fluxo de trabalho visualmente e orquestra a execução da integração no Fluig. Vamos usar uma Atividade de Serviço automatizada para fazer a comunicação com o ERP, e um Evento de Erro para desviar o processo caso a API do Protheus rejeite o envio. \n\nAcesse as documentações de apoio:\n\n- [Como criar um diagrama no fluig Studio](https://tdn.totvs.com/display/public/fluig/Como+criar+um+diagrama+no+fluig+Studio#1-4)\n- [Configuração de Processos com Componentes Avançados (BPMN 2.0)](https://tdn.totvs.com/pages/releaseview.action?pageId=126714181)\n\n![](..\\..\\..\\..\\..\\images\\4.modelagemprocessobpmn_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n- No Eclipse, vá em **New** > **Diagrama Fluig** e nomeie como **centro\\_de\\_custo**.\n\n- Renomeie a Pool para **Centro de Custo**\n\n- Crie duas raias (Swimlanes): **Solicitante** e **TOTVS Protheus**.\n\n- Configure as atividades:\n - Arraste uma **Atividade de Serviço** para a raia do TOTVS Protheus e nomeie como **Integração**.\n - Arraste um **Evento Intermediário de Captura de Erro** (ícone de raio) para as bordas da atividade de Integração.\n - Crie uma atividade comum na raia do Solicitante chamada **Manutenção**.\n - Crie um componente Fim raia do TOTVS Protheus chamado **Fim**.\n\n- Ligue o fluxo:\n - **Início** ➔ **Integração**\n - **Captura de Erro** ➔ **Manutenção**\n - **Manutenção** ➔ **Integração**\n - **Integração** ➔ **Fim**\n\n- Nas **Propriedades** da atividade **Integração**, vá na aba **Geral** e marque a Execução como **Automatizada**.\n\n- Salve o diagrama.\n\n## Passo 5: Crie o formulário com campo zoom" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n\n---\n\nO formulário é a interface HTML onde o usuário vai interagir com os dados. Vamos utilizar um componente nativo do Fluig, que cria um campo de busca dinâmico consumindo o Dataset criado no **passo 3**. É a ponte visual entre o usuário e a tabela do Protheus.\n\nAcesse a documentação de apoio: [Formulários - Campo Pesquisa (zoom)](https://tdn.totvs.com/pages/releaseview.action?pageId=872686733)\n\n![](..\\..\\..\\..\\..\\images\\5.criarformcomzoom_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n- Clique com o botão direito no projeto > **New** > **Formulário**. Nomeie o arquivo como **form\\_costcenter**.\n\n- Adicione os seguintes campos no HTML do formulário.\n\n**form\\_costcenter.html**\n\n```\n\n\n    \n    \n    \n    \n    \n\n\n
\n    
\n        
\n            
\n                

Dados do Centro de Custo (Protheus)

\n            
\n            
\n                
\n                    
\n                        
\n                            \n                            \n                            \n                        
\n                    
\n                    
\n                        
\n                            \n                            \n                        
\n                    
\n                
\n                
\n                    
\n                        
\n                            \n                            \n                        
\n                    
\n                
\n                
\n                    
\n                        
\n                            \n                            \n                        
\n                    
\n                    
\n                        
\n                            \n                            \n                        
\n                    
\n                
\n            
\n        
\n    
\n
\n\n\n```\n\n- Exporte o formulário para o servidor. \n - Formulário: Formulário centro de custo\n - Nome dataset: ds\\_form\\_costcenter\n - Pasta destino: Formulários do Fluig **(Código 2)**." }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n## Passo 6: Auto-preencha os Campos (setSelectedZoomItem)" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n\n---\n\nPara uma boa usabilidade, o usuário não deve digitar dados que já existem no ERP. Para isso, usamos a função nativa **setSelectedZoomItem** para interceptar o momento em que o usuário seleciona um item no Zoom e, em seguida, injetamos as propriedades desse item nos outros campos da tela automaticamente. Trata-se do conceito de autopreenchimento baseado na seleção do usuário.\n\nAcesse a documentação de apoio: [Formulários - Campo Pesquisa (zoom)](https://tdn.totvs.com/pages/releaseview.action?pageId=872686733).\n\n![](..\\..\\..\\..\\..\\images\\6.autopreenchacampossetselectedzoomitem_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n- No Eclipse, clique com o botão direito na pasta do seu formulário form\\_costcenter e selecione **New > File**. Nomeie como **main.js**.\n\n- No seu arquivo HTML, importe o JavaScript recém-criado adicionando a seguinte tag no :\n\n**form\\_costcenter.html**\n\n```\n\n```\n\n- No arquivo **main.js**, utilizaremos a função nativa do Fluig chamada setSelectedZoomItem. Ela detecta qualquer seleção feita em campos Zoom na tela.\n\n- Crie a lógica verificando o ID do campo Zoom (**name\\_cost\\_center**) e preencha os demais campos usando manipulação de DOM (document.querySelector):\n\n**main.js**\n\n```\nfunction setSelectedZoomItem(item) {\n   // Verifica se o zoom disparado foi o do Centro de Custo\n   if(item.inputId == \"name_costcenter\") {\n       console.log(item);\n       // Preenche os campos da tela buscando as propriedades que vieram do dataset\n       document.querySelector(\"#code_costcenter\").value = item.Code;\n       document.querySelector(\"#desc_costcenter\").value = item.Name;\n       document.querySelector(\"#class_costcenter\").value = item.Class;\n       document.querySelector(\"#blocked_costcenter\").value = item.RegisterSituation;\n       document.querySelector(\"#internalId_costcenter\").value = item.InternalId;\n   }\n}\n```\n\n- Exporte o formulário novamente e teste no navegador: ao selecionar o centro de custo \"Controladoria\" no Zoom, os campos de código, descrição, classe e bloqueio devem ser preenchidos automaticamente com os dados do Protheus." }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n## Passo 7: Limpe os Campos (removedZoomItem )" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n\n---\n\nSe o usuário apagar a seleção do Zoom clicando no ícone \"X\", os campos preenchidos devem ser limpos imediatamente para evitar o envio de dados fantasmas (ID vazio com dados residuais na tela). A função nativa removedZoomItem permite interceptar isso e esvaziar os inputs visuais manipulando o DOM.\n\nAcesse a documentação de apoio:[Formulários - Campo Pesquisa (zoom)](https://tdn.totvs.com/pages/releaseview.action?pageId=872686733).\n\n![](..\\..\\..\\..\\..\\images\\7.limpeoscamposremovedzoomitem_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n- Abra o arquivo **main.js** criado no **Passo 6**.\n\n- Adicione a função nativa do Fluig chamada removedZoomItem. Assim como a função anterior, ela detecta as interações na tela, mas é disparada especificamente quando o usuário clica no \"X\" para remover um item do Zoom.\n\n- Crie a lógica para verificar o ID do campo Zoom (**name\\_costcenter**) e limpe os valores dos campos dependentes:\n\n**main.js**\n\n```\n// ... código do setSelectedZoomItem criado anteriormente ...\nfunction removedZoomItem(removedItem) {\n    // Verifica se o zoom de onde o item foi removido é o de Centro de Custo\n    if(removedItem.inputId === \"name_costcenter\") {\n        \n        // Limpa os campos da tela manipulando o DOM\n        document.querySelector(\"#code_costcenter\").value = \"\";\n        document.querySelector(\"#desc_costcenter\").value = \"\";\n        document.querySelector(\"#class_costcenter\").value = \"\";\n        document.querySelector(\"#blocked_costcenter\").value = \"\";\n        document.querySelector(\"#internalId_costcenter\").value = \"\";\n    }\n}\n```\n\nDica\n\nImplemente o removedZoomItem quando utilizar o setSelectedZoomItem. Isso evita que um formulário seja enviado com um Centro de Custo em branco, mas com os campos de código e descrição preenchidos com os dados da seleção anterior.\n\n- Exporte o formulário novamente para o servidor do Fluig.\n\n- Teste no navegador:\n - Selecione um item no Zoom de Centro de Custo (os campos devem preencher).\n - Clique no \"X\" do componente Zoom para remover a seleção.\n - Valide se os campos de código, descrição, classe e bloqueio foram esvaziados instantaneamente." }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n## Passo 8: Vincular formulário com o diagrama\n\n---\n\nFormulários e processos nascem separados no projeto e precisam ser vinculados manualmente. Essa vinculação diz ao Fluig qual interface HTML deve ser renderizada na tela quando o usuário iniciar uma solicitação desse fluxo BPMN específico.\n\n**![](..\\..\\..\\..\\..\\images\\8.vincularformulariodiagrama_1920px_8fps_128c_none_bicubic_rectangle.gif)**\n\n- No Eclipse, abra o diagrama **centro\\_de\\_custo**.\n\n- Clique na área em branco do diagrama, acesse a aba **Properties** > **Formulário**. Selecione o formulário **form\\_costcenter**.\n\n- Exporte o diagrama.\n\n- No Fluig, vá em **Processos** > **Iniciar Solicitação**, abra o seu fluxo e pesquise no Zoom. O auto-preenchimento deve ocorrer nos respectivos campos.\n\n## Passo 9: Alterar o centro de custo via atividade de serviço (PUT)" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n\n---\n\nA Atividade de Serviço executa scripts backend (Javascript/Rhino) de forma transparente para o usuário durante a movimentação do processo. Vamos usar a hAPI para ler os dados do formulário preenchido e montar o payload JSON da requisição PUT. Nesta etapa, ocorre o tráfego das informações entre as plataformas e a efetiva persistência dos dados no banco de dados do Protheus.\n\n![](..\\..\\..\\..\\..\\images\\9.alterarcentrocustoviaatividadeservico_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n- No diagrama, selecione a atividade **Integração**.\n\n- Nas propriedades, vá na aba **Geral** e clique em **Editar script da tarefa**.\n\n- Insira o código de envio:\n\n**servicetask.js**\n\n```\n// Substituia o [X] pelo código da sua atividade de serviço. \n// Por exemplo: servicetask10 (attempt, message) {\nfunction servicetask[X](attempt, message) {\n    try {\n        // 1. Usa a hAPI para pegar o que o usuário preencheu no form\n        var internalId = String(hAPI.getCardValue(\"internalId_costcenter\"));\n        \n        // 2. Monta o payload respeitando o contrato de campos da API TOTVS\n        var parametros = {\n            \"CompanyId\": \"99\",\n            \"Code\": String(hAPI.getCardValue(\"code_costcenter\")),\n            \"InternalId\": internalId,\n            \"RegisterSituation\": String(hAPI.getCardValue(\"blocked_costcenter\")),\n            \"Name\": String(hAPI.getCardValue(\"desc_costcenter\")),\n            \"Class\": String(hAPI.getCardValue(\"class_costcenter\"))\n        };\n        // 3. Monta o endpoint do PUT incluindo o ID do recurso\n        var endpointEncodado = encodeURI(\"/api/ctb/v1/costcenters/\" + internalId);\n        \n        var sendData = {\n            companyId: String(fluigAPI.getSecurityService().getCurrentTenantId()),\n            serviceCode: \"API_PROTHEUS_REST\",\n            endpoint: endpointEncodado,\n            method: \"PUT\", \n            params: parametros\n        };\n        // 4. Dispara a requisição\n        var clientService = fluigAPI.getAuthorizeClientService();\n        var vo = clientService.invokeService(JSON.stringify(sendData));\n \n        var status = String(vo.getHttpStatusResult());\n        var result = vo.getResult();\n        // 5. Tratamento de Exceções e Regras de Negócio do Protheus\n        //  Nota: Todos os status http são mapeados na documentação da api aqui: https://api.totvs.com.br/apidetails/CostCenter_v1_000.json\n        if (status != \"200\") {\n            var msg = result;\n            \n            try {\n                var parseResult = JSON.parse(result);\n                // Extrai a mensagem de erro específica que o ERP mandou\n                if (parseResult.errorMessage) {\n                    msg = JSON.parse(parseResult.errorMessage).detailedMessage || parseResult.errorMessage;\n                } else if (parseResult.detailedMessage) {\n                    msg = parseResult.detailedMessage;\n                }\n            } catch (e) {\n                msg = result;\n            }\n           \n            // O throw aciona automaticamente o Evento de Erro no BPMN\n            throw msg;\n        }\n    } catch (err) {\n        throw err.toString();\n    }\n}\n```\n\nDica\n\nO bloco try...catch com throw é fundamental em tarefas de integração. É ele que avisa o Workflow que a integração falhou, desviando o processo para a atividade de \"Manutenção\" desenhada no diagrama.\n\n- Exporte o diagrama para o servidor liberando a versão.\n\n- Inicie uma solicitação, altere a **descrição** do Centro de Custo, envie a tarefa. Acesse o Protheus e valide no módulo SIGACTB se o nome foi atualizado." }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n## Passo 10: Tratamento de limite de caracteres (PUT)" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n\n---\n\nBancos de dados de ERPs possuem restrições estritas quanto ao dimensionamento das colunas, e o envio de dados que excedam esse limite causa falhas na integração. Identificar o limite do campo no Protheus e replicá-lo no front-end do Fluig via atributos HTML é uma estratégia de validação altamente eficiente e de baixo esforço de implementação.\n\n![](..\\..\\..\\..\\..\\images\\10.tratamentolimitecaracter_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\nEXEMPLO\n\nVocê digita \"ADMINISTRAÇÃO DE GENTE - ALTERADO VIA FLUIG\" no campo **Descrição** do Fluig.\n\n![](..\\..\\..\\..\\..\\images\\campodescricaoccfluig.jpg)\n\nMas no Protheus a informação é salva como \"ADMINISTRAÇÃO DE GENTE - ALTERADO VIA F\".\n\n![](..\\..\\..\\..\\..\\images\\limitecaractercampoprotheus.jpg)\n\nIsso acontece porque o campo no banco de dados do Protheus possui um limite de caracteres menor do que o Fluig permite digitar por padrão. Em integrações de sistemas, é responsabilidade garantir que o dado enviado (payload) respeite as restrições do sistema de destino.\n\nPara resolver isso, trave o limite de digitação direto na tela do Fluig:\n\n- Descubra o tamanho máximo aceito pelo campo de destino.\n\nDica\n\nNa tela de cadastro do Protheus, posicione o cursor dentro do campo que será integrado e pressione **F1** (ou **Shift + F1**). O Protheus abrirá a janela de Help detalhando as propriedades do campo, incluindo o seu tamanho exato. Neste exemplo, a consulta mostrará que o limite é de 40 caracteres. Recomendamos essa dica prática para mapear os limites de qualquer outro campo na sua integração.\n\n- No Eclipse, abra o arquivo HTML do formulário.\n\n- Localize a tag do campo em questão (ex: descrição).\n\n- Adicione o atributo **maxlength** com o valor limite descoberto no Protheus.\n\n**form\\_costcenter.html** Expandir origem\n\n```\n
\n    \n    \n
\n```\n\n- **Teste o formulário no navegador**: cole ou digite um texto extenso no campo de descrição modificado. O formulário deve impedir a entrada de dados assim que atingir o valor limite definido. Depois, realize um teste de envio e valide no Protheus se o texto chegou íntegro, sem cortes indesejados." }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n## Passo 11: Valide os erros de negócio do ERP na tela\n\n---\n\nUma integração eficaz deve ir além da simples transferência de dados, respeitando rigorosamente as regras de negócio do sistema de destino. No Protheus, por exemplo, a alteração da classe de um centro de custo já cadastrado é uma operação restrita. Para assegurar a integridade do processo, o Fluig deve replicar esse comportamento, exibindo ao usuário o retorno de erro do ERP. Como já implementamos o tratamento de exceções em nossa *Service Task* (através do bloco try/catch que captura a errorMessage), validaremos agora se a arquitetura está processando essas mensagens corretamente.\n\n![](..\\..\\..\\..\\..\\images\\11.valideerrosdenegocioerpnofluig_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n- No navegador, abra o Fluig e inicie uma nova solicitação do seu processo.\n\n- Selecione um Centro de Custo válido utilizando o campo Zoom.\n\n- Altere propositalmente o valor do campo **Classe**.\n\n- Clique em **Enviar** para movimentar a tarefa para a atividade de serviço (integração).\n\n- O Fluig deve impedir que a solicitação avance para a próxima etapa. Acesse a aba **Histórico** da solicitação.\n\n- Verifique se o log de erro exibe a mensagem nativa rejeitada pelo Protheus, semelhante a esta:\n\n```\nFalha ao executar evento de serviço. Processo: centro_de_custo - Atividade: 10 - Tentativa: 1 - Erro java.lang.Exception: AJUDA:NALTCLASSE Por motivos de seguranca e integridade dos dados, não e permitida a alteração da classe da conta. Tabela CTT 2026-04-07T15:42:34.000-0300\n```\n\nDica\n\nO script back-end que fizemos anteriormente fez a requisição PUT. A API do Protheus processou o payload, identificou a quebra da regra de negócio e retornou um HTTP Status de erro (ex: 400 Bad Request) com a mensagem no corpo do JSON. O nosso script capturou essa resposta, deu um throw no texto exato e o BPMN do Fluig registrou isso no histórico da solicitação." }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n## Passo 12: Adapte o formulário para criar e alterar (POST e PUT)" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n\n---\n\nAté o momento, a interface desenvolvida foca na consulta (GET) e atualização (PUT) de registros. Para expandir a funcionalidade e permitir a inclusão de novos Centros de Custo (POST), adaptaremos o formulário para suportar ambas as operações de forma dinâmica. A abordagem recomendada utiliza seletores do tipo Radio Button para definir o modo de operação; com base nessa escolha, aplicamos a manipulação do DOM para exibir ou ocultar os campos pertinentes a cada ação.\n\n![](..\\..\\..\\..\\..\\images\\12.adaptandoformcriaralterar_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\n- No Eclipse, abra o arquivo HTML do formulário.\n\n- Insira o bloco de Radio Buttons no topo do painel e adicione as tags **id**e **class**nos elementos que vamos ocultar ou travar.\n- Substitua o HTML por esta versão atualizada:\n\n**form\\_costcenter.html**\n\n```\n\n\n    \n    \n    \n    \n    \n    \n\n\n\n
\n    
\n        
\n            
\n                

Dados do Centro de Custo (Protheus)

\n            
\n            
\n                \n                
\n                    
\n                        
\n                            \n                            \n                        
\n                        
\n                            \n                            \n                        
\n                    
\n                
\n                
\n                    
\n                        
\n                            \n                            \n                            \n                        
\n                    
\n                    
\n                        
\n                            \n                            \n                        
\n                    
\n                
\n                
\n                    
\n                        
\n                            \n                            \n                        
\n                    
\n                
\n                
\n                    
\n                        
\n                            \n                            \n                        
\n                    
\n                    
\n                        
\n                            \n                            \n                        
\n                    
\n                
\n            
\n        
\n    
\n
\n\n\n```\n\n- Abra o arquivo **main.js**.\n\n- Adicione a função **toggleActionType** no final do arquivo para controlar a exibição dos campos sempre que o usuário trocar de opção.\n\n**main.js**\n\n```\n// ... funções setSelectedZoomItem e removedZoomItem mantidas aqui ...\nfunction toggleActionType() {\n    var action = document.querySelector('input[name=\"action_type\"]:checked').value;\n    var zoomContainer = document.getElementById('zoom_container');\n    var codeInput = document.getElementById('code_costcenter');\n    // 1. Limpeza dos campos nativos (Inputs e Selects)\n    document.getElementById('code_costcenter').value = '';\n    document.getElementById('desc_costcenter').value = '';\n    document.getElementById('class_costcenter').value = '';\n    document.getElementById('blocked_costcenter').value = '';\n    document.getElementById('internalId_costcenter').value = '';\n    // 2. Limpeza específica do componente Zoom do Fluig\n    window['name_costcenter'].clear();\n    // 3. Aplica as lógicas de visibilidade e bloqueio\n    if (action === 'new') {\n        zoomContainer.classList.add('fs-display-none');\n        codeInput.removeAttribute('readonly');\n    } else {\n        zoomContainer.classList.remove('fs-display-none');\n        codeInput.setAttribute('readonly', 'readonly');\n    }\n}\n```\n\nDica\n\n- A classe fs-display-none é uma classe utilitária do Fluig [Style Guide](https://style.fluig.com/css.html#helpers).\n- O componente Zoom do Fluig injeta um objeto global no window com o mesmo ID do campo. Para limpar a seleção dele via código, você deve usar o método nativo **.clear()**, e não apenas passar o value como vazio.\n\n- Exporte o formulário para o servidor do Fluig.\n\n- Teste o formulário:\n - Inicie uma nova solicitação.\n - Clique na opção **Criar novo centro de custo** e verifique se o campo Zoom desaparece liberando o campo de código para digitação.\n - Alterne de volta para **Alterar um centro de custo existente** e verifique se o campo Zoom reaparece na tela, o código fica bloqueado e todos os valores preenchidos anteriormente são apagados por segurança.\n\n- Com a interface preparada para comportar ambas as ações, o próximo passo é atualizar o back-end para que a integração entenda qual caminho seguir." }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n## Passo 13: Adapte o processo para criar e alterar (POST e PUT)" }, { "metadata": { "title": "Básico - Integração Fluig x Protheus: Centro de custo", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1058451590", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Básico - Integração Fluig x Protheus Centro de custo.md" }, "content": "Básico - Integração Fluig x Protheus: Centro de custo\n\n\n---\n\nAo receber o parâmetro **action\\_type**, a Atividade de Serviço passará a operar de forma condicional. O script será responsável por processar essa variável para alternar dinamicamente entre os métodos **POST** e **PUT**, definir a construção das rotas (com ou sem o identificador do registro) e validar o **HTTP Status** correspondente (201 ou 200). Dessa forma, centralizamos a gestão do ciclo de vida do dado no ERP em um único ponto lógico.\n\n![](..\\..\\..\\..\\..\\images\\13.adaptandoprocessocriaralterar_1920px_8fps_128c_none_bicubic_rectangle.gif)\n\nAs principais diferenças que o seu código precisa tratar:\n\n- **Verbo HTTP:** POST para novo, PUT para existente.\n- **Endpoint:** O POST é feito na raiz da API (/api/ctb/v1/costcenters), enquanto o PUT exige o ID do recurso na URL (/api/ctb/v1/costcenters/{internalId}).\n- **Status de Sucesso:** A criação retorna o HTTP Status 201 (Created), enquanto a atualização retorna 200 (OK).\n\n- Abra o arquivo do script de evento no Eclipse (ex: servicetask10.js) e substitua pelo código abaixo.\n\n**servicetask.js**\n\n```\n// Substitua o X pelo código da sua atividade de serviço\nfunction servicetask[X](attempt, message) { \n    try {\n        // 1. Usa a hAPI para descobrir a ação escolhida no formulário (new ou existing)\n        var actionType = String(hAPI.getCardValue(\"action_type\"));\n        var internalId = String(hAPI.getCardValue(\"internalId_costcenter\"));\n        \n        // Mantém a trava máxima de 40 caracteres via script (Passo 11)\n        var description = String(hAPI.getCardValue(\"desc_costcenter\"));\n        \n        // 2. Monta o payload base respeitando o contrato da API TOTVS\n        var parametros = {\n            \"CompanyId\": \"99\", // Altere para o código da sua empresa no Protheus\n            \"Code\": String(hAPI.getCardValue(\"code_costcenter\")),\n            \"RegisterSituation\": String(hAPI.getCardValue(\"blocked_costcenter\")),\n            \"Name\": description, \n            \"Class\": String(hAPI.getCardValue(\"class_costcenter\"))\n        };\n        // 3. Define variáveis dinâmicas com base na ação\n        var metodoHttp = \"\";\n        var endpoint = \"\";\n        var statusEsperado = \"\";\n        if (actionType === \"new\") {\n            // Configuração para CRIAR (POST)\n            metodoHttp = \"POST\";\n            endpoint = \"/api/ctb/v1/costcenters\"; // Endpoint raiz\n            statusEsperado = \"201\"; // Created\n        } else {\n            // Configuração para ALTERAR (PUT)\n            metodoHttp = \"PUT\";\n            endpoint = \"/api/ctb/v1/costcenters/\" + internalId; // Endpoint com ID\n            statusEsperado = \"200\"; // OK\n            parametros[\"InternalId\"] = internalId; // O ID interno é exigido no corpo do PUT\n        }\n        // 4. Prepara os dados para o serviço nativo de integração do Fluig\n        var sendData = {\n            companyId: String(fluigAPI.getSecurityService().getCurrentTenantId()),\n            serviceCode: \"API_PROTHEUS_REST\",\n            endpoint: encodeURI(endpoint),\n            method: metodoHttp, \n            params: parametros\n        };\n        // 5. Dispara a requisição\n        var clientService = fluigAPI.getAuthorizeClientService();\n        var vo = clientService.invokeService(JSON.stringify(sendData));\n        \n        var status = String(vo.getHttpStatusResult());\n        var result = vo.getResult();\n        // 6. Tratamento de Exceções validando contra o status dinâmico (200 ou 201)\n        if (status !== statusEsperado) {\n            var msg = result;\n            \n            try {\n                var parseResult = JSON.parse(result);\n                // Extrai a mensagem de erro específica do ERP (Ex: \"Já existe registro com esta informação\")\n                if (parseResult.errorMessage) {\n                    msg = JSON.parse(parseResult.errorMessage).detailedMessage || parseResult.errorMessage;\n                } else if (parseResult.detailedMessage) {\n                    msg = parseResult.detailedMessage;\n                }\n            } catch (e) {\n                msg = result;\n            }\n            \n            // O throw aciona o Evento de Erro no BPMN\n            throw msg;\n        }\n    } catch (err) {\n        throw err.toString();\n    }\n}\n```\n\nDica\n\nSempre consulte a documentação da API antes de montar o payload. As regras e status esperados estão documentados no Swagger oficial do Protheus ().\n\n- Exporte o script atualizado para o servidor do Fluig.\n\n- Inicie uma nova solicitação.\n\n- Selecione **Criar novo centro de custo**.\n\n- Preencha um código que já existe no Protheus e clique em **Enviar**. O Fluig deve capturar o erro 400 do Protheus avisando que o registro já existe (Validando o comportamento de erro do POST).\n\n- Inicie outra solicitação.\n\n- Selecione **Criar novo centro de custo**, preencha com um código inédito e envie. Valide no Protheus se o novo centro de custo foi criado com sucesso (Validando o sucesso do POST).\n\n- Inicie uma última solicitação, selecione a opção de alterar o Centro de Custo recém-criado, modifique a descrição e envie. Valide no Protheus se a alteração foi aplicada (Validando o sucesso do PUT)." }, { "metadata": { "title": "Configuração de certificado para consultar serviço com conexão HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=539698864", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Configuração de certificado para consultar serviço com conexão HTTPS.md" }, "content": "Configuração de certificado para consultar serviço com conexão HTTPS" }, { "metadata": { "title": "Configuração de certificado para consultar serviço com conexão HTTPS", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=539698864", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Configuração de certificado para consultar serviço com conexão HTTPS.md" }, "content": "Configuração de certificado para consultar serviço com conexão HTTPS\n\n\n# Índice\n\n- 1 [Objetivo](#ConfiguraçãodecertificadoparaconsultarserviçocomconexãoHTTPS-Objetivo)\n- 2 [Visão geral](#ConfiguraçãodecertificadoparaconsultarserviçocomconexãoHTTPS-Visãogeral)\n- 3 [Listar os certificados instalados](#ConfiguraçãodecertificadoparaconsultarserviçocomconexãoHTTPS-Listaroscertificadosinstalados)\n- 4 [Adicionar certificados](#ConfiguraçãodecertificadoparaconsultarserviçocomconexãoHTTPS-Adicionarcertificados)\n- 5 [Remover certificados](#ConfiguraçãodecertificadoparaconsultarserviçocomconexãoHTTPS-Removercertificados)\n- 6 [Como obter o certificado para adicionar à keystore?](#ConfiguraçãodecertificadoparaconsultarserviçocomconexãoHTTPS-Comoobterocertificadoparaadicionaràkeystore?)\n- 7 [Saiba mais](#ConfiguraçãodecertificadoparaconsultarserviçocomconexãoHTTPS-Saibamais)\n\n# Objetivo\n\n---\n\nEssa documentação apresenta os passos necessários para realizar a importação do certificado de outros sistemas nas pastas de configuração do JDK do TOTVS Fluig Plataforma.\n\n# Visão geral\n\n---\n\nCada JVM possui uma configuração de certificados digitais reconhecidos. Ao consumir algum serviço ou endereço disponíveis em HTTPS via JAVA, podem ocorrer falhas de *handshake* ou comunicação ao consumir um endereço com certificado não reconhecido *(PKIX)*.\n\nNormalmente os certificados ficam armazenados no arquivo **\\jdk-64\\lib\\security\\cacerts**. Atenção, cada instalação de JAVA possui um arquivo *cacerts*. Ao trabalhar com certificados na JVM, importante especificar o caminho do arquivo *cacerts* correto.\n\nPara interagir com o arquivo *cacerts*, existe uma ferramenta padrão JAVA chamada *keytool*. Para interagir com o arquivo *cacerts* via *keytool*, é preciso especificá-lo bem como a senha de acesso.  A senha padrão é **changeit**.\n\n# Listar os certificados instalados\n\n---\n\nA partir da atualização 1.7:\n\n```\n\\jdk-64\\bin\\keytool -list -v -keystore \\jdk-64\\lib\\security\\cacerts\n```\n\nAté a atualização 1.6.5:\n\n```\n\\jdk-64\\jre\\bin\\keytool -list -v -keystore \\jdk-64\\jre\\lib\\security\\cacerts\n```\n\nSendo que:\n\n- ****é o caminho da raiz de instalação do fluig (por exemplo: /opt/fluig ou C:\\fluig)\n\nImportante!\n\nÉ importante rodar o console de execução em modo administrador. A senha padrão é **changeit**.\n\n# Adicionar certificados\n\n---\n\nA partir da atualização 1.7:\n\n```\n\\jdk-64\\bin\\keytool -import -alias -keystore \\jdk-64\\lib\\security\\cacerts -file \n```\n\nAté a atualização 1.6.5:\n\n```\n\\jdk-64\\jre\\bin\\keytool -import -alias -keystore \\jdk-64\\jre\\lib\\security\\cacerts -file \n```\n\nSendo que:\n\n- ****é o caminho da raiz de instalação do Fluig (por exemplo: /opt/fluig ou C:\\fluig)\n- **** é um nome para referência, por exemplo caso você precise apagar o certificado posteriormente.\n- **** é o caminho completo do arquivo de certificado que você fará importação.\n\nImportante!\n\nÉ importante rodar o console de execução em modo administrador. A senha padrão é **changeit**.\n\nPara ter efeito, após a configuração é necessário reiniciar os serviços da plataforma.\n\n# Remover certificados\n\n---\n\nA partir da atualização 1.7:\n\n```\n\\jdk-64\\bin\\keytool -delete -alias -keystore \\jdk-64\\lib\\security\\cacerts\n```\n\nAté a atualização 1.6.5:\n\n```\n\\jdk-64\\jre\\bin\\keytool -delete -alias -keystore \\jdk-64\\jre\\lib\\security\\cacerts\n```\n\nSendo que:\n\n- ****é o caminho da raiz de instalação do Fluig (por exemplo: /opt/fluig ou C:\\fluig)\n- **** é um nome para referência, por exemplo caso você precise apagar o certificado posteriormente.\n\nImportante!\n\nÉ importante rodar o console de execução em modo administrador. A senha padrão é **changeit**.\n\n# Como obter o certificado para adicionar à keystore?\n\n---\n\nPara saber qual certificado precisa ser adicionado, siga o passo a passo abaixo:\n\n- Acessar a URL do serviço no Chrome e clicar no Cadeado.\n\n![](..\\..\\..\\..\\..\\images\\image1.png)\n\n- Clicar na opção do **Certificado**, para exibir suas propriedades.\n\n![](..\\..\\..\\..\\..\\images\\image2.png)\n\n- Na aba **Detalhes**, clicar em **Copiar para Arquivo.**\n\n![](..\\..\\..\\..\\..\\images\\image3.png)\n\n- Exportar com a opção de binário codificado.\n\n![](..\\..\\..\\..\\..\\images\\image4.png)\n\n# Saiba mais\n\n---\n\nMais informações podem ser obtidas em:\n\n- *[Keytool command examples Java - add view ssl certificate in keyStore trustStore](http://www.java67.com/2012/09/keytool-command-examples-java-add-view-certificate-ssl.html#ixzz58EuQmZFw)* (em Inglês);\n\n- [Resolução de inconsistência (PKIX *path validation failed*) ao cadastrar serviço](https://centraldeatendimento.fluig.com/hc/pt-br/articles/4404174167575-Fluig-Plataforma-DES-Ao-cadastrar-servi%C3%A7o-retorna-o-erro-PKIX-path-validation-failed)." }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n\n# Índice\n\n- 1 [Considerações Gerais](#IntegraçãocomAplicativosExternos-ConsideraçõesGerais)\n- 2 [Visão Geral](#IntegraçãocomAplicativosExternos-VisãoGeral)\n- 3 [WebServices](#IntegraçãocomAplicativosExternos-WebServices)\n - 3.1 [Acessando os WebServices do TOTVS Fluig Plataforma](#IntegraçãocomAplicativosExternos-AcessandoosWebServicesdoTOTVSFluigPlataforma)\n - 3.1.1 [Via Apache Flex®](#IntegraçãocomAplicativosExternos-ViaApacheFlex®)\n - 3.1.2 [Via Java™](#IntegraçãocomAplicativosExternos-ViaJava™)\n - 3.1.3 [Via Progress® 4GL](#IntegraçãocomAplicativosExternos-ViaProgress®4GL)\n - 3.2 [Acessando WebServices a partir do TOTVS Fluig Plataforma](#IntegraçãocomAplicativosExternos-AcessandoWebServicesapartirdoTOTVSFluigPlataforma)\n - 3.2.1 [WebServices com Autenticação Básica](#IntegraçãocomAplicativosExternos-WebServicescomAutenticaçãoBásica)\n - 3.2.1.1 [WebServices com Autenticação Básica no acesso ao WSDL](#IntegraçãocomAplicativosExternos-WebServicescomAutenticaçãoBásicanoacessoaoWSDL)\n - 3.2.1.2 [Consumindo WebServices com Autenticação Básica](#IntegraçãocomAplicativosExternos-ConsumindoWebServicescomAutenticaçãoBásica)\n - 3.2.1.3 [Exemplo com Instantiate:](#IntegraçãocomAplicativosExternos-ExemplocomInstantiate:)\n - 3.2.2 [WebService com client personalizado](#IntegraçãocomAplicativosExternos-WebServicecomclientpersonalizado)\n - 3.2.3 [Resolvendo conflitos utilizando arquivos de bind JAXB](#IntegraçãocomAplicativosExternos-ResolvendoconflitosutilizandoarquivosdebindJAXB)\n- 4 [Integrações Assíncronas em Solicitações](#IntegraçãocomAplicativosExternos-IntegraçõesAssíncronasemSolicitações)\n\n# Considerações Gerais\n\n---\n\nAs informações contidas neste documento têm por objetivo demonstrar como realizar a integração entre o TOTVS Fluig Plataforma e aplicativos externos. Para que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre o TOTVS Fluig Plataforma\n- Visão geral sobre integração de sistemas\n- JavaScript\n- WebServices\n- SOAP\n- Datasets (Fluig)\n- Java™\n- Apache Flex®\n\nEm várias partes deste documento serão apresentados trechos de códigos em diferentes linguagens de programação, com o intuito de demonstrar o uso das capacidades de integração do Fluig Plataforma. Entretanto, este documento não tem por objetivo capacitar o leitor no uso destas tecnologias além do propósito acima descrito, sendo responsabilidade do leitor buscar informações aprofundadas sobre estas linguagens.\n\nCom o objetivo de facilitar o entendimento das informações apresentadas e a simulação dos conceitos apresentados, os exemplos citados neste documento utilizam a funcionalidade de [Datasets](../../../Desenvolvimento de Datasets.md) como exemplo de uso das capacidades de integração do produto. Entretanto, é importante ressaltar que outros pontos da plataforma possuem disponíveis as mesmas características de integração existentes nos [Datasets](../../../Desenvolvimento de Datasets.md), em especial as personalizações de processos e formulários.\n\n# Visão Geral\n\n---\n\nAinda que empíricos, toda empresa possui processos de negócios que permitem à empresa cumprir o seu objetivo, seja ele a prestação de um serviço, a produção de bens materiais ou o comércio de mercadorias. Uma empresa possui uma infinidade de processos, sendo que cada pessoa na organização obrigatoriamente participa em pelo menos um destes processos, e todos eles trocam informações entre si em algum momento. Os processos podem ser formais (como a contratação de um profissional) ou informais (como um incentivo à inovação), críticos (faturamento) ou satélites (controle de envio de cartões de aniversários).\n\nCom o advento das tecnologias de Sistema da Informação, vários sistemas passaram a dar apoio a estes processos de negócio, especialmente aqueles considerados mais críticos para a operação da empresa. O melhor exemplo disto é a adoção dos sistemas de ERP que dão suporte aos processos de várias áreas da empresa.\n\nO Fluig tem como objetivo ser uma plataforma agnóstica de gestão de processos, documentos e identidades através de uma interface de comunicação colaborativa. Isto pode ser percebido em maior ou menor grau em cada uma das suas funcionalidades, desde as mais simples (como colaboração) até as mais complexas (como BPM).\n\nEntretanto, parte destes processos têm alta dependência dos sistemas de informação já existentes na empresa e, por isso, a arquitetura da plataforma Fluig é planejada para permitir integrar-se a estes sistemas, possibilitando que os processos modelados tenham maior valor agregado.\n\nO Fluig permite tanto o acesso pelo produto aos sistemas externos (para consultar ou alimentar informações), bem como aceita que outros sistemas venham a conectar-se para a consulta de informações ou para execução de operações transacionais.\n\n![](..\\..\\..\\..\\..\\images\\image2013-8-20%20153342.png)\n\nO principal canal de integração da plataforma é através de [WebServices](../../../Utilização de Webservices.md), que vêm se tornando o padrão mais comum de integração com qualquer aplicativo. Através deles, é possível ter acesso às funcionalidades do Fluig Plataforma e dar acesso à aplicativos externos. Este documento dedica uma seção específica sobre integração via [WebServices](../../../Utilização de Webservices.md).\n\n# WebServices\n\n---\n\nA integração via [WebServices](../../../Utilização de Webservices.md) utiliza o protocolo SOAP e, por ser um padrão aberto, permite que sistemas desenvolvidos em plataformas totalmente diferentes como Java™, Microsoft® .Net, C, C++, PHP, Ruby, Pearl, Python, entre outras, possam trocar informações entre si de forma transparente." }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n### Acessando os WebServices do TOTVS Fluig Plataforma\n\nO Fluig disponibiliza um conjunto de [WebServices](../../../Utilização de Webservices.md) que permitem o acesso às informações da plataforma ou a execução de tarefas, como iniciar solicitações de processos por exemplo. Para ter a lista dos [WebServices](../../../Utilização de Webservices.md) disponíveis, acesse o endereço: \n\n```\nhttp://:/services \n```\n\nCada link apresentado direciona o navegador para a URL do WSDL do serviço. O WSDL (Web Service Description Language) possui a descrição do serviço no formato XML e é utilizado pelas ferramentas de desenvolvimento para a criação dos componentes que representarão este serviço.\n\nAtente para cada tipo de atributo que é esperado, por exemplo, o atributo expirationDate do objeto DocumentDto[] é uma data, porém cada linguagem interpreta de maneira diferente, veja alguns exemplos abaixo:\n\n- C#: **dateTime**\n- Java™: **XMLGregorianCalendar**\n- Progress®: **DATETIME-TZ**\n\n##### Via Apache Flex®" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n\nComo a grande maioria das ferramentas de desenvolvimento, o Apache Flex® permite criar stubs para o acesso a WebServices. Estes stubs encapsulam todas as operações de empacotamento e desempacotamento das informações do padrão XML para os tipos nativos da plataforma.\n\nUtilize o passo-a-passo para visualizar o processo de criação dos stubs para um serviço disponibilizado pelo Fuig Plataforma:\n\nA criação dos stubs no Flex® é feito através do menu **Data** > **Import WebService(WSDL)**, conforme a imagem abaixo.\n\n![](..\\..\\..\\..\\..\\images\\image2013-8-21%2010303.png)\n\nNa primeira janela, é solicitada a pasta dentro do projeto corrente onde devem ser gerados os stubs.\n\n![](..\\..\\..\\..\\..\\images\\image2013-8-21%20103429.png)\n\nNa tela a seguir, deve ser informado o endereço do WSDL onde se encontra o serviço. Também é possível definir se ele será acessado da estação cliente ou do servidor LifeCycle Data Services.\n\n![](..\\..\\..\\..\\..\\images\\image2013-8-21%20103618.png)\n\nNa última tela, deve-se informar o package que será utilizado e qual o nome da classe principal (já sugeridos pelo Flex™ Builder™).\n\n![](..\\..\\..\\..\\..\\images\\image2013-8-21%20103919.png)\n\nUma vez finalizado o processo, o Flex™ Builder™ adicionará ao projeto um conjunto de classes que serão utilizadas pelo programador para invocar os serviços, conforme a figura abaixo:\n\n![](..\\..\\..\\..\\..\\images\\image2013-8-21%20105740.png)\n\nPara o exemplo apresentado abaixo, foi utilizado a IDE Adobe® Flex™ Builder™ 3.0 com Flex® SDK 3.2. Para outras versões da IDE e/ou SDK, o processo para criação dos stubs pode sofrer algumas variações.\n\nO trecho de código abaixo apresenta um exemplo de invocação do [WebService](../../../Utilização de Webservices.md) de acesso aos [Datasets](../../../Desenvolvimento de Datasets/Datasets internos.md) da plataforma Fluig:\n\n**ECMDatasetServiceClient.mxml**\n\n```\n\n\n\t\n\t\t\n\t\n\t\n\n```\n\nExiste um bug do Flex® que impede o funcionamento correto de serviços que trabalhem com matrizes multidimensionais de dados, como no exemplo acima, onde é retornado um array (de linhas do Dataset) de array (das colunas de cada registro).\n\nPara contornar este problema, é preciso alterar a classe gerada pelo Flex™ Builder™ que irá encapsular o array multidimensional. No exemplo acima, esta classe é a DatasetDto, que deverá ser alterada (linha 11) conforme o exemplo abaixo:\n\n```\npublic class DatasetDto\n{\n\t/**\n\t * Constructor, initializes the type class\n\t */\n\tpublic function DatasetDto() {}\n \n\t[ArrayElementType(\"String\")]\n\tpublic var columns:Array;\n\t[ArrayElementType(\"ValuesDto\")]\n\tpublic var values:Array = new Array(); //iniciando o array\n}\n```\n\nOutros serviços que não trabalhem com arrays multidimensionais não exigem alterações no código gerado." }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n##### Via Java™" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n\nExistem muitas implementações de uso de WebServices em Java™ e neste exemplo vamos utilizar as bibliotecas disponíveis no Java™ 7.\n\nDa mesma forma como no exemplo anterior, em Apache Flex®, o primeiro passo consiste em utilizar o endereço WSDL para a geração dos stubs em Java™. O comando abaixo apresenta um exemplo de como gerar estes stubs:\n\n```\nwsimport -d \n```\n\nAtravés deste comando são gerados os stubs no diretório de destino (output\\_directory), conforme a descrição do arquivo wsdl (wsdl\\_url).\n\n![](..\\..\\..\\..\\..\\images\\image2013-8-20%201602.png)\n\nA partir dos stubs gerados, é possível consumir o WebService como no exemplo abaixo:\n\n**ECMDatasetServiceClient.java**\n\n```\npackage com.fluig.examples;\n\nimport javax.xml.ws.BindingProvider;\n\nimport net.java.dev.jaxb.array.StringArray;\n\nimport com.totvs.technology.ecm.dataservice.ws.DatasetDto;\nimport com.totvs.technology.ecm.dataservice.ws.DatasetService;\nimport com.totvs.technology.ecm.dataservice.ws.ECMDatasetServiceService;\nimport com.totvs.technology.ecm.dataservice.ws.SearchConstraintDtoArray;\nimport com.totvs.technology.ecm.dataservice.ws.ValuesDto;\n\n/*\n * Classe para invocar serviço DatasetService\n */\npublic class ECMDatasetServiceClient {\n\n\t//Instancia DatasetServiceService.\n\tprivate ECMDatasetServiceService ecmDatasetServiceService = new ECMDatasetServiceService();\n\tprivate DatasetService service = ecmDatasetServiceService.getDatasetServicePort();\n\t\n\t//Inicia execução da classe\n\tpublic static void main(String[] args) {\n\t\tECMDatasetServiceClient client = new ECMDatasetServiceClient();\n\t\t\n\t\t//Configura acesso ao WebServices.\n\t\tBindingProvider bp = (BindingProvider) client.service;\n\t\tbp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, \n\t\t\t\t\"http://localhost:8080/webdesk/ECMDatasetService\");\n\n\t\ttry {\n\t\t\tclient.getDataset();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\tpublic void getDataset() throws Exception {\n\t\t\n\t\t//Cria os parâmetros utilizados na chamada\n\t\tint companyId = 1;\n\t\tString username = \"adm\";\n\t\tString password = \"adm\";\n\t\tString name = \"colleague\";\n\t\tStringArray fields = new StringArray();\n\t\tSearchConstraintDtoArray constraints = new SearchConstraintDtoArray();\n\t\tStringArray order = new StringArray();\n\t\t\n\t\t//Invoca o serviço de dataset\n\t\tDatasetDto result = service.getDataset(\n\t\t\t\tcompanyId, username, password, name, fields, constraints, order);\n\t\t\n\t\t//Apresenta o cabeçalho\n\t\tfor (String columnName : result.getColumns()) {\n\t\t\tSystem.out.print(columnName + \"\\t\");\n\t\t}\n\t\tSystem.out.println();\n\t\t\n\t\t//Apresenta as linhas do dataset\n\t\tfor (ValuesDto row : result.getValues()) {\n\t\t\tfor (Object value : row.getValue()) {\n\t\t\t\tSystem.out.print(value + \"\\t\");\n\t\t\t}\n\t\t\tSystem.out.println();\n\t\t}\n\t}\n\n}\n```\n\nAo utilizar os WebServices via Java™, deve-se atentar para o tipo de cada atributo e para o tipo de retorno do WebService. Por exemplo, para valores do tipo **data** deve ser utilizado a classe **XMLGregorianCalendar:**\n\n```\nDocumentDto document = new DocumentDto();\n\nXMLGregorianCalendar date = DatatypeFactory.newInstance().newXMLGregorianCalendar();\ndate.setYear(2013);\ndate.setMonth(10);\ndate.setDay(16);\ndate.setHour(0);\ndate.setMinute(0);\ndate.setSecond(0);\n\ndocument.setExpirationDate(date);\n```" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n##### Via Progress® 4GL" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n\nAssim como nos exemplos anteriores, o primeiro passo para consumir um WebService em Progress® é usar um utilitário que irá ler o endereço WSDL e gerar as informações necessárias para acessá-lo. Diferente do Java™ e Flex®, o Progress® não gera objetos de stub, mas apenas uma documentação sobre como consumir os serviços descritos no arquivo WSDL. Embora em algumas situações seja possível manipular os tipos nativos do Progress® como parâmetros, dependendo do tipo de dado utilizado é preciso manipular o XML SOAP para extrair ou enviar uma informação.\n\nPara gerar a documentação de um serviço, deve-se empregar o utilitário **bprowsdldoc** como no exemplo abaixo:\n\n```\nbprowsdldoc \n```\n\nCom a execução deste utilitário, serão gerados alguns arquivos HTML com as informações sobre como consumir o serviço. Esta documentação apresenta informações e exemplos de como realizar a conexão com o serviço e a utilizar os métodos e datatypes do serviço.\n\nO código abaixo apresenta um exemplo de como consumir o serviço:\n\n**wsECMDatasetService.p**\n\n```\n/* Parte I - Invocar o WebService */\nDEFINE VARIABLE hWebService AS HANDLE NO-UNDO.\nDEFINE VARIABLE hDatasetService AS HANDLE NO-UNDO.\n\nDEFINE VARIABLE cFields AS CHARACTER EXTENT 0 NO-UNDO.\nDEFINE VARIABLE cOrder AS CHARACTER EXTENT 0 NO-UNDO.\nDEFINE VARIABLE cDataset AS LONGCHAR NO-UNDO.\n\nDEFINE TEMP-TABLE item NO-UNDO\n NAMESPACE-URI \"\"\n FIELD contraintType AS CHARACTER\n\tFIELD fieldName AS CHARACTER\n\tFIELD finalValue AS CHARACTER\n\tFIELD initialValue AS CHARACTER.\n \nDEFINE DATASET dConstraints NAMESPACE-URI \"http://ws.dataservice.ecm.technology.totvs.com/\"\n\tFOR item.\n\nCREATE SERVER hWebService.\nhWebService:CONNECT(\"-WSDL 'http://localhost:8080/webdesk/ECMDatasetService?wsdl'\").\nRUN DatasetService SET hDatasetService ON hWebService.\n\nRUN getDataset IN hDatasetService(INPUT 1,\n INPUT \"adm\",\n INPUT \"adm\",\n INPUT \"colleague\",\n INPUT cFields,\n INPUT DATASET dConstraints,\n INPUT cOrder,\n OUTPUT cDataset).\n\nDELETE OBJECT hDatasetService.\nhWebService:DISCONNECT().\nDELETE OBJECT hWebService.\n\n/* Parte II - Faz o parser do XML e criar um arquivo texto separado por tabulacao */\nDEFINE VARIABLE iCount AS INTEGER NO-UNDO.\nDEFINE VARIABLE iCount2 AS INTEGER NO-UNDO.\nDEFINE VARIABLE hDoc AS HANDLE NO-UNDO.\nDEFINE VARIABLE hRoot AS HANDLE NO-UNDO.\nDEFINE VARIABLE hValues AS HANDLE NO-UNDO.\nDEFINE VARIABLE hEntry AS HANDLE NO-UNDO.\nDEFINE VARIABLE hText AS HANDLE NO-UNDO.\nDEFINE VARIABLE cValue AS CHARACTER NO-UNDO.\n\nOUTPUT TO c:\\dataset.txt.\n\nCREATE X-DOCUMENT hDoc.\nCREATE X-NODEREF hRoot.\nCREATE X-NODEREF hEntry.\nCREATE X-NODEREF hText.\nCREATE X-NODEREF hValues.\n\nhDoc:LOAD(\"longchar\", cDataset, FALSE).\nhDoc:GET-DOCUMENT-ELEMENT(hRoot).\n\n/* Percorre as colunas */ \nDO iCount = 1 TO hRoot:NUM-CHILDREN WITH 20 DOWN:\n hRoot:GET-CHILD(hEntry, iCount).\n IF hEntry:NAME <> \"columns\" THEN\n NEXT.\n\n hEntry:GET-CHILD(hText, 1).\n PUT UNFORMATTED hText:NODE-VALUE \"~t\".\n DOWN.\nEND.\nPUT UNFORMATTED SKIP.\n\n/* Percorre os registros */\nDO iCount = 1 TO hRoot:NUM-CHILDREN WITH 20 DOWN:\n hRoot:GET-CHILD(hValues, iCount).\n IF hValues:NAME <> \"values\" THEN\n NEXT.\n\n /* Percorre os campos */\n DO iCount2 = 1 TO hValues:NUM-CHILDREN:\n hValues:GET-CHILD(hEntry, iCount2).\n\n IF hEntry:NUM-CHILDREN = 0 THEN\n cValue = \"\".\n ELSE DO:\n hEntry:GET-CHILD(hText, 1).\n cValue = hText:NODE-VALUE.\n END.\n PUT UNFORMATTED cValue \"~t\".\n END.\n\n PUT UNFORMATTED SKIP.\nEND.\n\nOUTPUT CLOSE.\n\nDELETE OBJECT hValues.\nDELETE OBJECT hText.\nDELETE OBJECT hEntry.\nDELETE OBJECT hRoot.\nDELETE OBJECT hDoc.\n```" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n### Acessando WebServices a partir do TOTVS Fluig Plataforma" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n\nA plataforma permite fazer chamadas a WebServices de terceiros através do cadastro de **Serviços** na **Visualização de Serviços** do **Fluig Studio**.\n\nAtenção\n\nPara que um usuário que não é administrador da empresa possa criar, editar e remover serviços é necessário que ele possua a permissão \"**Configurar Serviços**\". Esta permissão pode ser concedida pelo administrador através do item \"**Permissões**\" disponível no agrupador **Pessoas** do **Painel de Controle** da plataforma Fluig.\n\nSaiba como realizar esse procedimento [clicando aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=269431879).\n\nPara adicionar um novo WebService, é preciso clicar na opção **Incluir Serviço,**abrindo o assistente **Novo Serviço**, e informar o servidor do Fluig onde será adicionado o serviço, um código identificador para ele, sua descrição, a URL para o WSDL e o seu tipo (neste caso WebService). No exemplo abaixo, será utilizado um WebService público para consulta à tabela periódica, cujo endereço do WSDL é .\n\n![](..\\..\\..\\..\\..\\images\\acesso-ws-1.png)\n\nCom base nestas informações, a plataforma Fluig irá extrair as informações sobre o WebService informado e finalizará o cadastro deste serviço.\n\nUma vez que o serviço esteja cadastrado, é possível visualizar as classes e métodos disponíveis neste serviço e que serão utilizados nos códigos JavaScript que farão uso do mesmo. A tela abaixo apresenta um exemplo de visualização de WebService.\n\n![](..\\..\\..\\..\\..\\images\\acesso-ws-2.png)\n\nOs serviços adicionados na plataforma podem ser instanciados e utilizados nos pontos onde o produto permite personalização utilizando-se JavaScript, como nos scripts para eventos globais, eventos de processos, eventos de definição de formulário ou Datasets. No exemplo a seguir, será criado um Dataset que fará uso deste serviço para trazer os dados da tabela periódica.\n\nO código abaixo apresenta uma implementação de exemplo do uso de um serviço na construção de um [Dataset](../../../Desenvolvimento de Datasets.md):\n\n**periodicTable.js**\n\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\t// Cria o dataset\n\tvar dataset = DatasetBuilder.newDataset();\n\tdataset.addColumn(\"Element Name\");\n\tdataset.addColumn(\"Symbol\");\n\tdataset.addColumn(\"Atomic Number\");\n\tdataset.addColumn(\"Atomic Weight\");\n\t// Conecta o servico e busca os livros\n\tvar periodicService = ServiceManager.getService('PeriodicTable');\n\tvar serviceHelper = periodicService.getBean();\n\tvar serviceLocator = periodicService.instantiate('net.webservicex.Periodictable');\n\tvar service = serviceLocator.getPeriodictableSoap();\n\t// Invoca o serviço\n\ttry {\n\t\tvar result = service.getAtomicNumber(\"sodium\"); // O termo \"sodium\" corresponde ao parâmetro do tipo String esperado na assinatura do método getAtomicNumber\n\t\tvar xml = new XML(result);\n\t\tfor ( var index in xml.Table) {\n\t\t\tvar element = xml.Table[index];\n\t\t\tdataset.addRow(new Array(element.ElementName.toString(), element.Symbol.toString(), element.AtomicNumber\n\t\t\t\t.toString(), element.AtomicWeight.toString()));\n\t\t}\n\t} catch (erro) {\n\t\tdataset.addRow(new Array(erro));\n\t}\n\treturn dataset;\n}\n```\n\nO primeiro passo para invocar o serviço é solicitar à plataforma Fluig que carregue-o, a partir do método **ServiceManager.getService('PeriodicTable')**. O valor passado como parâmetro, deve ser o código utilizado quando cadastrado o serviço.\n\nUma vez que o serviço tenha sido carregado, é utilizado o método **getBean()** para retornar um utilitário para acesso às classes do serviço, através do método **instantiate**. Através deste utilitário, é possível instanciar as classes disponíveis e que estão listadas no cadastro do Serviço (conforme imagem vista anteriormente).\n\nUma vez que se tenha instanciado o objeto utilitário do serviço, as classes que devem ser instanciadas e os métodos que devem ser invocados dependem de cada WebService utilizado, e deve-se recorrer à sua documentação para mais informações.\n\nPara o serviço da tabela periódica é necessário realizar os seguintes passos:\n\n```\nvar serviceLocator = serviceHelper.instantiate('net.webservicex.Periodictable');\nvar service = serviceLocator.getPeriodictableSoap();\nvar result = service.getAtoms();\n```\n\nOnde:\n\n- **Passo 1**: Instanciar a classe **net.webservicex.Periodictable** para ter acesso ao localizador do serviço;\n- **Passo 2**: Invocar o método **getPeriodictableSoap** para instanciar o serviço;\n- **Passo 3**: Invocar o método **getAtoms** para ter a lista dos elementos.\n\nNo caso deste serviço, o método **getAtoms** retorna uma string contendo um XML com a lista de todos os elementos, conforme o exemplo abaixo:\n\n```\n\n\t\n\t\tActinium\n\t
\n\t\n\t\tAluminium\n\t
\n\t...\n
\n```\n\nFique atento\n\nCaso o WebService seja construído via Axis, o modo de chamar o método muda um pouco. Para acessar o método getAtoms é necessário recuperar a instância de PeriodictableSoap através do ServiceLocator, conforme exemplo abaixo:\n\n```\n\tvar periodicService = ServiceManager.getService('PeriodicTable');\n var serviceHelper = periodicService.getBean();\n var serviceLocator = serviceHelper.instantiate('NET.webserviceX.www.PeriodictableLocator');\n var service = serviceLocator.getperiodictableSoap();\n log.info(service.getAtoms());\n```\n\nPara percorrer o XML e extrair o dados disponíveis, são utilizadas as funcionalidades de tratamento de XML do JavaScript que facilita a manipulação de dados deste tipo. Para mais informações sobre esta funcionalidade, acesse:  ou .\n\nO exemplo abaixo apresenta o código utilizado para percorrer o XML retornado:\n\n```\nvar NewDataSet = new XML(result);\nfor (var index in NewDataSet.Table) {\n\tvar element = NewDataSet.Table[index];\n dataset.addRow(new Array(element.ElementName.toString()));\n}\n```\n\nUma vez implementado o código do Dataset, é possível visualizá-lo, conforme a figura abaixo:\n\n![](..\\..\\..\\..\\..\\images\\acesso-ws-3.png)\n\nAbaixo segue outro exemplo de utilização de serviços, empregando campos complexos na passagem de parâmetros. Este serviço é responsável por alterar o valor do campo de um registro de formulário:\n\n**periodicTable.js**\n\n```\n\t\t//Servico \"/webdesk/ECMCardService?wsdl\"cadastrado com o código \"CardService\"\n var cardServiceProvider = ServiceManager.getServiceInstance(\"CardService\");\n var cardServiceLocator = cardServiceProvider.instantiate(\"com.totvs.technology.ecm.dm.ws.ECMCardServiceServiceLocator\");\n var cardService = cardServiceLocator.getCardServicePort();\n var cardFieldDtoArray = cardServiceProvider.instantiate(\"com.totvs.technology.ecm.dm.ws.CardFieldDtoArray\");\n var cardField = cardServiceProvider.instantiate(\"com.totvs.technology.ecm.dm.ws.CardFieldDto\");\n \n //Seta valor no campo com name = 'nome'\n cardField.setField(\"nome\");\n cardField.setValue(\"Valor alterado via WS dentro de um evento workflow\");\n \n var vetCardFields = new Array();\n vetCardFields.push(cardField);\n cardFieldDtoArray.setItem(vetCardFields);\n \n //Altera o(s) campo(s) do registro de formulário.\n //updateCardData(tenantId, login, senha, codRegistroForm, cardFieldDtoArray);\n cardService.updateCardData(1, \"adm\", \"adm\", 8, cardFieldDtoArray);\n```" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n##### WebServices com Autenticação Básica\n\nAtenção\n\nEsta opção é válida apenas para serviços criados utilizando a API CXF.\n\n###### WebServices com Autenticação Básica no acesso ao WSDL\n\nPara criar serviços de WebServices que utilizam Autenticação Básica no acesso ao seu WSDL, é necessário marcar a opção **Requer Autenticação** no cadastro de serviços do Fluig Plataforma, conforme exemplo abaixo:\n\n![](..\\..\\..\\..\\..\\images\\autenticacao-basica1.png)\n\nPara finalizar o cadastro será apresentada a janela para autenticação abaixo:\n\n![](..\\..\\..\\..\\..\\images\\autenticacao-basica2.png)\n\n###### Consumindo WebServices com Autenticação Básica" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n\nPara consumir WebServices que fazem uso de autenticação básica, é necessário utilizar o método **getBasicAuthenticatedClient**localizado no provider do serviço (o mesmo que é obtido via **ServiceManager).**Este método disponibiliza um client autenticado.\n\nApesar de na hora do cadastro você informar um usuário e senha, ele é exclusivo para o momento do cadastro do serviço buscando os dados do WSDL para gerar os Stubs. As suas chamadas no serviço devem sempre utilizar o método **getBasicAuthenticatedClient.**\n\nOs parâmetros que devem ser informados no método seguem a ordem abaixo:\n\n1. Instância do serviço;\n2. Nome da classe do serviço;\n3. Usuário para a autenticação;\n4. Senha para a autenticação.\n\nUtilizando o exemplo do serviço **PeriodicTable**apresentado anteriormente, o código da chamada teria as alterações abaixo:\n\n```\nvar serviceLocator = serviceHelper.instantiate('net.webservicex.Periodictable');\nvar service = serviceLocator.getPeriodictableSoap();\nvar authenticatedService = serviceHelper.getBasicAuthenticatedClient(service, \"net.webservicex.PeriodictableSoap\", 'usuario', 'senha');\nvar result = authenticatedService.getAtoms();\n```\n\nAtenção\n\nOs métodos estáticos não podem ser chamados através de uma instância de objeto. Portanto, é necessário utilizar o método \"serviceHelper.instantiate\" para criar uma instância do objeto e atribuir um valor, sendo necessário informar como parâmetros o nome da classe, o método da classe, o tipo do valor e o próprio valor. Veja o exemplo a seguir:\n\n###### Exemplo com Instantiate:" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n\n```\n// Obtém a instância do serviço 'WorkflowEngineService'\nvar workflowEngineServiceProvider = ServiceManager.getServiceInstance(\"WorkflowEngineService\");\n\n// Instância o serviço\nvar workflowEngineServiceLocator = workflowEngineServiceProvider.instantiate(\"com.totvs.technology.ecm.workflow.ws.ECMWorkflowEngineServiceService\");\nvar workflowEngineService = workflowEngineServiceLocator.getWorkflowEngineServicePort();\n\n// Instância objeto de Array de anexos\nvar processAttachmentDtoArray = workflowEngineServiceProvider.instantiate(\"com.totvs.technology.ecm.workflow.ws.ProcessAttachmentDtoArray\");\n\n//Exemplo executeStaticMethod:\n\n// Obtém a instância do serviço 'wsTerceiro'\nvar periodicService = ServiceManager.getServiceInstance(\"wsTerceiro\");\n// Instancia o serviço\nvar serviceHelper = periodicService.getBean();\nvar serviceLocator = periodicService.instantiate(\"br.com.webformat.webservices.Retorno\");\nvar service = serviceLocator.getRetornoSoap();\n\n// Neste caso, é preciso autenticar no ws\nvar authService = serviceHelper.getBasicAuthenticatedClient(service, \"br.com.webformat.webservices.RetornoSoap\", usuario, senha);\n\n// Faz a chamada do método para criar o Enum\nvar loadStatus = serviceHelper.executeStaticMethod(\"br.com.webformat.webservices.LoadStatus\", \"fromValue\", [\"java.lang.String\"], [pLoadStatus]);\n\n//Chamada do ws\nvar response = authService.sendLoadStatusItem(pWsKey, pErpCode, loadStatus, pDescription, pCodSolicitacao);\n```\n\n##### WebService com client personalizado" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n\nAtenção\n\nEsta técnica é válida para o TOTVS Fluig Plataforma 1.3.7 ou superior.\n\nEm integrações que utilizem serviços criados com o CXF com sistemas que não suportam o protocolo HTTP/1.1 (Protheus, por exemplo), é necessário utilizar este método configurando o parâmetro \"disable.chunking\" com o valor \"true\".\n\nPara personalizar o client que acessa os serviços, é necessário utilizar o método **getCustomClient**, localizado no provider do serviço (o mesmo que é obtido via **ServiceManager**). Esta configuração exige a criação de um mapa de parâmetros com seus respectivos valores para passar ao método, conforme snippet abaixo:\n\n```\n\t\tvar properties = {};\n\t\tproperties[\"basic.authorization\"] = \"true\";\n\t\tproperties[\"basic.authorization.username\"] = \"username\";\n\t\tproperties[\"basic.authorization.password\"] = \"password\";\n\t\tproperties[\"disable.chunking\"] = \"true\";\n\t\tproperties[\"log.soap.messages\"] = \"true\";\n\t\t//A propriedade receive.timeout está disponível a partir da versão 1.4.10\n\t\tproperties[\"receive.timeout\"] = \"60000\";\n\t\t\n\t\tvar supplierService = ServiceManager.getService('[Nome do serviço]');\n \t\tvar serviceHelper = supplierService.getBean();\n\t\tvar serviceLocator = serviceHelper.instantiate('net.webservicex.Periodictable');\n\t\tvar service = serviceLocator.getPeriodictableSoap();\n\t\tvar customClient = serviceHelper.getCustomClient(service, \"net.webservicex.PeriodictableSoap\", properties);\n\t\tvar result = customClient.getAtoms();\n```\n\nOs parâmetros que podem ser definidos são os seguintes:\n\n| Propriedade | Função |\n| --- | --- |\n| ```basic.authorization ``` | Quando definido como \"true\", faz o mesmo que o método **getBasicAuthenticatedClient**, porém permite aplicar as configurações de autenticação juntamente com as demais personalizações abaixo. Para configurar a autenticação, as propriedades com \"username\" e \"password\" abaixo também precisam ser definidas. |\n| ``` basic.authorization.username ``` | Usuário a ser utilizado para autenticação básica. |\n| ``` basic.authorization.password ``` | Senha do usuário utilizado para autenticação básica. |\n| ``` disable.chunking ``` | Quando definido como \"true\", desabilita o envio de requisições grandes em \"pedaços\" menores. Pode ser útil quando o serviço chamado não suporta este tipo de requisição. |\n| ``` log.soap.messages ``` | Quando definido como \"true\", permite que as mensagens SOAP utilizadas nas requisições feitas aos serviços sejam apresentadas no log do servidor, facilitando a depuração em caso de falhas. |\n| receive.timeout | Definir o timeout da requisição. Por default, o tempo de timeout são 30 segundos. Para alterar o valor deve ser informado o valor em milissegundos. Caso queira que o timeout seja ilimitado, atribuir o valor 0 para esta propriedade. **\\* Leia nota abaixo** |\n\nImportante\n\nO tempo de timeout de requisição padrão da plataforma deveria ser suficiente para a realização de uma integração convencional. Antes de aumentar o tempo de timeout de integrações da plataforma Fluig verifique o fato que levou a esta decisão.\n\n**Por exemplo,** revise códigos e dimensionamento do servidor que recebe as integrações. Otimizações de códigos podem reduzir o tempo necessário para realizar uma transação e oferecer as pessoas que utilizam a plataformacFluig uma navegação mais fluida." }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n##### Resolvendo conflitos utilizando arquivos de bind JAXB" }, { "metadata": { "title": "Integração com Aplicativos Externos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73082260", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração com Aplicativos Externos.md" }, "content": "Integração com Aplicativos Externos\n\n\nAtenção\n\nEsta técnica é válida apenas para serviços criados utilizando a API CXF.\n\nAo criar serviços no Fluig Plataforma podem ocorrer alguns conflitos impedindo a geração dos stubs. Normalmente isso ocorre quando temos um elemento do schema do WSDL com duas ou mais propriedades com o mesmo identificador ou nome, o que impede a criação da Classe Java desse elemento.\n\nPara resolver esse conflitos podem ser utilizados arquivos de bind JAXB, conforme a figura abaixo:\n\n![](..\\..\\..\\..\\..\\images\\Binding.png)\n\nEsse arquivo tem o propósito de personalizar a geração dos stubs alterando o nome das propriedades conflitantes.\n\n- A seguir temos dois exemplos de utilização desses arquivos:\n\n**Exemplo 1 :**\n\nDurante a criação do serviço ocorreu o seguinte erro :\n\n```\nNão foi possível salvar os stubs para acesso ao serviço: \nhttp://localhost:8080/pcliente/CHAMTEC.apw?WSDL [2255,11]: Two declarations cause a collision in the ObjectFactory class.\nhttp://localhost:8080/pcliente/CHAMTEC.apw?WSDL [2245,11]: (Related to above error) This is the other declaration.\n```\n\nO que indica que temos duas declarações de propriedades conflitantes, conforme o fragmento do WSDL abaixo:\n\n```\n\n\t\n\t\t...\n\t\t\n\t\t...\n\t\t\n\t\t...\t\n\t\n\n```\n\nOs identificadores **\"\\_A1COD\\_MUN\"** e **\"\\_A1CODMUN\"** são considerados iguais pela API de geração dos stubs, e fazem parte do mesmo tipo complexo **\"STRUCT\\_SA1\"**.\n\nPara resolver esse conflito, pode ser utilizado o arquivo de bind abaixo :\n\n```\n\n\n \n \n \n \n \n\n```\n\nEsse arquivo faz com que o elemento **\"\\_A1COD\\_MUN\"** contido no tipo complexo **\"STRUCT\\_SA1\"** assuma o nome **\"\\_A1COD\\_MUN2\"**, resolvendo assim o conflito na geração dos stubs.\n\n**Exemplo 2 :**\n\nDurante a criação do serviço ocorreu o seguinte erro :\n\n```\nNão foi possível salvar os stubs para acesso ao serviço: \nhttp://localhost:8080/tbc/wsConsultaSQL.asmx?WSDL [49,19]: Property \"Any\" is already defined. Use <jaxb:property> to resolve this conflict.\nhttp://localhost:8080/tbc/wsConsultaSQL.asmx?WSDL [50,19]: The following location is relevant to the above error\nhttp://localhost:8080/tbc/wsConsultaSQL.asmx?WSDL [75,19]: Property \"Any\" is already defined. Use <jaxb:property> to resolve this conflict.\nhttp://localhost:8080/tbc/wsConsultaSQL.asmx?WSDL [76,19]: The following location is relevant to the above error\n```\n\nO que indica que temos duas propriedades com a identificação **\"any\"** no nosso elemento, conforme o fragmento do arquivo WSDL abaixo:\n\n```\n\n \n \n \n \n \n \n \n \n \n \n \n \n\n...\n\n \n \n \n \n \n \n \n \n \n \n \n \n\n```\n\nEssa situação ocorre em dois elementos do arquivo WSDL, o **\"RealizarConsultaSQLDataTableResponse\"** e o **\"RealizarConsultaSQLDataTableAuthResponse\"**.\n\nPara resolver esse conflito, pode ser utilizado o arquivo de bind abaixo :\n\n```\n\n\n \n \n \n \n \n \n \n \n\n```\n\nEsse arquivo faz com que a segunda propriedade **\"any\"** de cada um dos elementos assuma o nome **\"any2\"**, resolvendo assim o conflito na geração dos stubs.\n\nMaiores informações sobre personalizações via JAXB Bindings em \n\nImportante\n\nAlém de WebServices o Fluig também pode realizar chamadas Progress. Entretanto essa técnica está descontinuada, e nossa recomendação é usar serviços SOAP.\n\nCaso seu projeto já utilize essa técnica acesse a [documentação depreciada](https://tdn.totvs.com/pages/viewpage.action?pageId=237378575).\n\n# Integrações Assíncronas em Solicitações\n\n---\n\nPara a realização de integrações assíncronas em processos Workflow, a recomendação atual é a utilização de atividades do tipo Serviço configuradas com execução automatizada, onde é possível selecionar a mensagem de sucesso e a quantidade de tentativas que o script tentará executar antes de seguir a um fluxo de erro.\n\nEste tipo de integração comporta a utilização de serviços externos e serve exatamente para que haja a possibilidade de realizar manobras alternativas quando uma solicitação apresentar um erro de integração. Para maiores informações, acessar o link a seguir: [Integração Assíncrona via Processos Workflow.](http://tdn.totvs.com/x/9mUmDg)" }, { "metadata": { "title": "Integração SAP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=173083652", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração SAP.md" }, "content": "Integração SAP\n\n\n# Índice\n\n- 1 [Objetivo](#IntegraçãoSAP-Objetivo)\n- 2 [Pré-requisitos](#IntegraçãoSAP-Pré-requisitos)\n- 3 [Fluig acessando ERP SAP](#IntegraçãoSAP-FluigacessandoERPSAP)\n - 3.1 [Comunicação via RFC (Remote Function Call)](#IntegraçãoSAP-ComunicaçãoviaRFC(RemoteFunctionCall))\n - 3.2 [Comunicação via WebServices SOAP do SAP](#IntegraçãoSAP-ComunicaçãoviaWebServicesSOAPdoSAP)\n- 4 [ERP SAP acessando Fluig](#IntegraçãoSAP-ERPSAPacessandoFluig)\n- 5 [Third Party Trademarks](#IntegraçãoSAP-ThirdPartyTrademarks)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar as características e a configuração da integração do TOTVS Fluig Plataforma com o ERP SAP.\n\n# Pré-requisitos\n\n---\n\nConhecimento prévio em determinados pontos, sendo estes:\n\n- Visão geral sobre TOTVS Fluig Plataforma\n- Visão geral sobre integração de sistemas\n\n# Fluig acessando ERP SAP\n\n---\n\nO processo de integração do Fluig Plataforma com o ERP SAP possui duas formas: uma utilizando o componente de integração RFC (*Remote Function Call*) e outra utilizando o processo por *WebServices* padrão SOA.\n\nA utilização de uma forma ou de outra depende de como foi definido pelo ERP SAP as integrações com outros sistemas. A seguir é apresentada a característica de cada uma das integrações.\n\n## Comunicação via RFC (*Remote Function Call*)" }, { "metadata": { "title": "Integração SAP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=173083652", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração SAP.md" }, "content": "Integração SAP\n\n\nNeste tipo de integração RFC é necessário criar um serviço intermediário para transformar requisições RFC para *WebServices*, pois o padrão *Web* Serviços é nativamente tratado pela plataforma Fluig.\n\nO serviço intermediário precisa ser construído em um projeto em JAVA de acordo com os seguintes passos:\n\n**Preparação de ambiente de desenvolvimento**\n\n- Utilizar as classes padrão de integração que estão em programa Java (JAR) fornecido pela SAP. Este JAR de nome “JCO SAP *Connector*” pode ser obtido pelo cliente no portal de *downloads* do SAP.\n- Colocar o JAR “JCO SAP *Connector*” na raiz do projeto JAVA no Fluig *Studio* (IDE).\n- Adicionar o caminho ao JAR “JCO SAP *Connector*” no *Buildpath* do projeto JAVA no Fluig *Studio* (IDE).\n- Configurar o arquivo “.properties” do “JCO SAP *Connector*” com os dados de conexão com o servidor SAP. A documentação da configuração do JCO SAP *Connector* está disponível no *site* de referência da SAP ().\n\n**Desenvolvimento do componente de integração com RFC**\n\n- Desenvolver os métodos que façam chamadas as classes do JCO SAP *Connector* que fazem a interface com RFC correspondentes a necessidade de integração. A documentação dos métodos do “JCO SAP *Connector*” está disponível no *site* de referência da SAP ().\n- Expor os métodos desenvolvidos para chamada da RFC por meio do padrão SOAP.\n- Compilar o projeto Fluig *Studio* (IDE) obtendo, assim, o WAR do componente de integração com RFC.\n\n**Preparação do ambiente de execução da integração**\n\n- Instalar o WAR do componente de integração RFC no servidor de aplicação do Fluig (WildFly). Caminho da instalação “[Instalação fluig]\\appserver\\apps”.\n\n Importante!\n\n Não utilizar o recurso de central de componentes.\n\n**Utilizando o componente de integração com RFC**\n\n- Cadastrar um serviço do tipo *WebServices* dentro do Fluig Plataforma pelo Fluig *Studio* (opção Incluir Serviços na aba Visualizar Serviços) apontando para WSDL gerado para o componente de integração RFC.\n- Utilizar o serviço cadastrado nos pontos requeridos no escopo da integração.\n\n **Exemplo:** eventos de formulário, eventos de *workflow* e *datasets*.\n\n Nota\n\n Mais informações sobre customização da plataforma Fluig podem ser obtidas em [Customização de *Workflow*](http://tdn.totvs.com/pages/viewpage.action?pageId=73082818)." }, { "metadata": { "title": "Integração SAP", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=173083652", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Integração com outros sistemas\\Integração SAP.md" }, "content": "Integração SAP\n\n## Comunicação via *WebServices* SOAP do SAP\n\nNeste tipo de integração utilizando *WebService* padrão SOAP disponibilizado pelo SAP, o acesso da plataforma Fluig a estes serviços é direto.\n\nA seguir são apresentadas as configurações da plataforma para acesso ao *WebService* padrão SOAP:\n\n- Cadastrar um serviço do tipo *WebServices* dentro do Fluig Plataforma pelo Fluig *Studio* (opção Incluir Serviços na aba Visualizar Serviços) apontando para WSDL do *WebService* SAP disponibilizado para integração.\n\n- Utilizar o serviço cadastrado nos pontos requeridos no escopo da integração.\n\n **Exemplo:** eventos de formulário, eventos de *workflow* e *datasets*.\n\n Nota\n\n Mais informações sobre customização da plataforma Fluig podem ser obtidas em [Customização de *Workflow*](http://tdn.totvs.com/pages/viewpage.action?pageId=73082818).\n\n# ERP SAP acessando Fluig\n\n---\n\nO processo de integração do ERP SAP com o Fluig Plataforma ocorre por chamada dos *WebServices* Fluig padrão SOA pelo ERP SAP.\n\nNota\n\nMais informações sobre os *WebServices* da plataforma Fluig podem ser obtidas em [Utilização de *WebServices*](http://tdn.totvs.com/x/ZyxbB).\n\n# *Third Party Trademarks*\n\nSAP, JCO SAP Connector e outros produtos e serviços da SAP aqui mencionados, bem como seus respectivos logotipos, são marcas comerciais ou marcas registradas pertencentes à SAP AG na Alemanha e em outros países." }, { "metadata": { "title": "Integração assíncrona via processos workflow", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=237397494", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Tipos de integração\\Integração assíncrona via processos workflow.md" }, "content": "Integração assíncrona via processos workflow" }, { "metadata": { "title": "Integração assíncrona via processos workflow", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=237397494", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Tipos de integração\\Integração assíncrona via processos workflow.md" }, "content": "Integração assíncrona via processos workflow\n\n\n# Índice\n\n- 1 [Objetivo](#Integraçãoassíncronaviaprocessosworkflow-Objetivo)\n- 2 [Pré-requisitos](#Integraçãoassíncronaviaprocessosworkflow-Pré-requisitos)\n- 3 [Visão Geral](#Integraçãoassíncronaviaprocessosworkflow-VisãoGeral)\n- 4 [Atividade de Serviço](#Integraçãoassíncronaviaprocessosworkflow-AtividadedeServiço)\n - 4.1 [Configurando atividade de serviço com execução Automatizada](#Integraçãoassíncronaviaprocessosworkflow-ConfigurandoatividadedeserviçocomexecuçãoAutomatizada)\n - 4.2 [Executando atividade de serviço com execução Imediata](#Integraçãoassíncronaviaprocessosworkflow-ExecutandoatividadedeserviçocomexecuçãoImediata)\n\n# Objetivo\n\n---\n\nAs informações neste documento são destinadas a auxiliar e informar o usuário sobre os modos de realizar processamentos assíncronos por meio de solicitações workflow.\n\nNeste documento serão apresentados conceitos relacionados a modelagem de processos utilizando-se de atividades que são executadas pelo servidor para que a integração necessária seja transparente para o usuário que esteja movimentando a atividade.\n\nAtenção\n\nA Integração assíncrona via processos workflow está disponível no TOTVS Fluig Plataforma a partir da [Atualização 1.5.9](https://tdn.totvs.com/pages/viewpage.action?pageId=235596849).\n\n# Pré-requisitos\n\n---\n\nConhecimento prévio em determinados pontos, sendo estes:\n\n- Visão geral sobre a plataforma Fluig\n- Visão geral sobre integração de sistemas\n- Conhecimento sobre modelagem de processos\n- JavaScript\n\n# Visão Geral\n\n---\n\nEm vários casos, o usuário pode encontrar situações em suas regras de negócio ou necessidades do dia a dia em que uma solicitação Workflow deve executar alguma integração ou processamento em que o próprio usuário inicial não precise ficar esperando para receber a resposta do servidor, sendo que estas atividades devem ser executadas em paralelo ao uso cotidiano do sistema e apenas ser movimentada ao fim do mesmo.\n\nPara este tipo de situação existem atividades que auxiliam nestas configurações, possibilitando que uma solicitação fique aguardando a execução de um processamento programado ou que tenha meios de recuperação de erros na execução de um evento assíncrono para que o usuário tenha como modelar alternativas no caso de falha. Estes procedimentos serão melhor detalhados neste documento, explicando meios de como realizar modelar tais atividades e em quais tipos de situações elas podem ser úteis.\n\n# Atividade de Serviço\n\n---\n\nA atividade serviço é utilizada quando se há a necessidade de um script a parte que execute uma integração com um determinado serviço, servindo para realizar a integração com este serviço em específico, porém pode ser utilizado para basicamente qualquer objetivo que envolva a integração de um script a parte com um processo workflow. Existem dois modos de configuração para esta atividade:\n\n- Execução **Automatizada**\n\nÉ o modelo de execução assíncrona. Quando uma solicitação entra na atividade de serviço configurada como *Automatizada*, uma requisição é enviada de maneira assíncrona para o servidor onde se manterá em uma fila para execução. No momento que o servidor capturar esta requisição o script associado a atividade será executado e, em caso de sucesso, a atividade será movimentada automaticamente para a próxima atividade, caso contrário ela será movimentada  para o fluxo de erro, indicado pelo **Evento Intermediário de Captura de Erro**, onde pode ser configurada uma atividade nova para que o usuário possa averiguar seus erros e enviar de volta a atividade de serviço ou então seguir um outro fluxo caso desejado.\n\nVamos nos ater, nesta página, a este tipo de atividade, já que ele representa bem o objetivo de desenvolver conhecimento sobre como realizar integrações assíncronas por meio de processos Workflow, portanto a partir deste momento toda informação nos tópicos seguintes irão referenciar a atividade de serviço configurada como execução *Automatizada.*\n\n- Execução **Imediata**\n\nÉ o modelo de execução síncrona, onde seu script executa logo após o evento *afterStateEntry* da solicitação Workflow. Em caso de sucesso,a movimentação irá passar da atividade imediata direto para a atividade seguinte, dando sequência ao fluxo. Em caso de erro, este modelo simplesmente irá retornar o erro encontrado para o usuário e cancelará a movimentação, exigindo uma nova interação do usuário ou averiguação dos erros de imediato. Este tipo de execução está disponível a partir da versão 1.6.5\n\nVeja o exemplo (**create-advanced-folder**) que está no [repositório do Fluig](https://git.fluig.com/projects/SAMPLES) clicando **[aqui](https://git.fluig.com/projects/SAMPLES/repos/projetos/browse/create-advanced-folder)**." }, { "metadata": { "title": "Integração assíncrona via processos workflow", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=237397494", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Tipos de integração\\Integração assíncrona via processos workflow.md" }, "content": "Integração assíncrona via processos workflow\n\n## Configurando atividade de serviço com execução Automatizada" }, { "metadata": { "title": "Integração assíncrona via processos workflow", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=237397494", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Tipos de integração\\Integração assíncrona via processos workflow.md" }, "content": "Integração assíncrona via processos workflow\n\n\nPara realizar a configuração de uma atividade de serviço Automatizada primeiramente é preciso, dentro de um processo Workflow, adicionar uma atividade de serviço. Ao clicar sobre a atividade aparecerá algumas opções para configuração.\n\n![](..\\..\\..\\..\\..\\images\\propriedade.png)\n\n1. ***Código***:É pré-fixado, sendo o código da atividade. É com base nesta nomenclatura (*servicetask9*) que o Script e a função do serviço devem ser criadas.\n2. ***Nome***:É o nome da atividade, ou seja, a label que aparecerá na exibição do diagrama ou na seleção de atividades para movimentar.\n3. ***Execução***: É a configuração que indica se o Script terá execução Automatizada ou Imediata a movimentação. Para configurar uma atividade de serviço como assíncrona a opção selecionada deve ser **Automatizada**.\n4. ***Tentativas***: É a quantidade de vezes que o servidor tentará executar o Script caso ocorram erros durante a execução. Caso essa quantidade for excedida, a atividade de serviço será movimentada para o fluxo de erro. A cada tentativa com problemas o script irá gerar um novo complemento no histórico da solicitação informando a tentativa e o erro causado.\n5. ***Mensagem***: Mensagem que será gravada no complemento do histórico caso haja sucesso na execução da atividade.\n6. ***Serviço***: Serviço base que será chamado pelo Script da atividade. Ao lado deste parâmetro há o link *Editar Script da Tarefa* que, ao ser clicado, irá gerar um Script JS já com seu nome configurado e um Snippet gerado para iniciar o desenvolvimento com base no serviço selecionado neste combo.\n\nApós configurar todas as opções e clicar em *Editar Script da Tarefa*, um Script será gerado para que a personalização necessária possa ser feita, sendo que este Script deve ser programado em JavaScript puro e suporta todas as bibliotecas convencionais que são utilizadas durante os eventos de Workflow. Como base, teremos um Script semelhante a este:\n\n```\nfunction servicetask(\"Número da atividade\") (attempt, message) {\n try {\n\t var Service = ServiceManager.getService('ServiceID');\n\t var serviceHelper = Service.getBean();\n //var serviceLocator = serviceHelper.instantiate('classe.locator');\n } catch(error) { \n\tlog.error(error);\n\tthrow error;\n }\n}\n```\n\nÉ a partir deste Script que a customização necessária deve ser customizada. Note que existem dois parâmetros na função que o Script chama que são exclusivos para atividades de serviço configuradas como execução Imediata. Estas são:\n\n1. ***Attempts***: Número da tentativa atual, oscilando entre 1 e N, sendo N um número de 1 a 20 configurado nas opções da atividade de serviço no parâmetro *Tentativas.*\n2. ***Message***: Última mensagem de erro desta atividade. Na primeira execução, este parâmetro é *null.* Ele serve para que o modelador possa tratar mensagens específicas de erro nas execuções subsequentes a primeira.\n\nRealizado os moldes do Script, é então hora de definir os fluxos da atividade de serviço com execução Imediada. Por regra, essa atividade permite apenas um fluxo de saída, que é para onde a solicitação será movimentada caso o Script retorne com sucesso. Para o caso de erro é necessário anexar a atividade um *Evento Intermediário de Captura de Erro,*para tal, basta selecionar o evento em questão e arrastá-lo para cima da atividade de serviço. Uma vez lá, ele demandará um fluxo saindo a partir dele para uma outra atividade qualquer, que será a atividade cuja solicitação será movimentada caso a quantidade de vezes que o Script foi rodado exceda o número de tentativas configuradas pelo usuário. O fluxo, portanto, ficaria semelhante ao abaixo em um modelo básico.\n\n![](..\\..\\..\\..\\..\\images\\Processo%20Nota%20Fiscal.png)\n\nNote que neste caso o fluxo de erro está programado para seguir a uma atividade extra (sub processo) que será utilizada para que o usuário possa visualizar o problema, corrigir e então reenviar a atividade de serviço para uma nova execução, que é o modelo padrão, porém essa atividade também pode ser utilizada para que o processo siga um fluxo completamente diferente caso o modelo de negócio exija de tal forma.\n\nÉ altamente recomendado que tanto a atividade após a atividade de serviço e a configurada no fluxo de erro possuam mecanismos de atribuição configurados, pois, como é uma atividade que será concluída automaticamente, o usuário atribuído será o primeiro da lista recuperada caso não haja tal configuração." }, { "metadata": { "title": "Integração assíncrona via processos workflow", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=237397494", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Tipos de integração\\Integração assíncrona via processos workflow.md" }, "content": "Integração assíncrona via processos workflow\n\n## Executando atividade de serviço com execução Imediata" }, { "metadata": { "title": "Integração assíncrona via processos workflow", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=237397494", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Tipos de integração\\Integração assíncrona via processos workflow.md" }, "content": "Integração assíncrona via processos workflow\n\n\nAo ser executada, a atividade de serviço de execução Imediata fica parada e o usuário a quem a mesma está atribuída fica como *System:Auto*, o mesmo utilizado no caso de Gateways. Ela ficará aguardando a conclusão do script relacionado para então ser movimentada ou para o fluxo de sucesso ou para o de erro dependendo do resultado das tentativas de execução do script. É importante ressaltar que caso haja um gestor configurado para a solicitação o mesmo somente poderá movimentar a atividade sem que haja a conclusão da tarefa de serviços para o fluxo de sucesso, pois a atividade de serviço não possui um fluxo direto com o evento intermediário de captura de erro, sendo que apenas o script, atualmente, poderá ser responsável por movimentar a solicitação para o fluxo de erro.\n\nPara o desenvolvimento do script da atividade de serviços os seguintes recursos estão ativos:\n\n| Recurso | Descrição |\n| --- | --- |\n| **hAPI** | Recurso para manipulação de formulários e Workflow. Para maiores informações acessar: [hAPI](http://tdn.totvs.com/display/public/fluig/hAPI). |\n| **docAPI** | Recurso para manipulação de documentos. Para maiores informações acessar: [Desenvolvimento de Workflow.](../../../../Recurso de Processos (BPM).md)/Desenvolvimento de Workflow.md) |\n| **log** | Recurso para log no console do sistema. |\n| **ServiceManager** | Recurso para acesso via WebService SOAP. Para maiores informações acessar: [Integração Com Aplicativos Externos.](http://tdn.totvs.com/x/lCVbB) |\n| **datasetManager** | Objeto que permite carregar datasets entro das customizações. |\n| **DatasetFactory** | Serve como \"porta de entrada\" para o acesso a qualquer Dataset. Maiores detalhes sobre este item se encontram no artigo sobre [construção de datasets.](http://tdn.totvs.com/display/fluig/Desenvolvimento+de+Datasets) |\n| **DatasetBuilder** | É semelhante ao DatasetFactory, servindo ao propósito de construir o objeto de datasets. Maiores detalhes sobre este item se encontram no artigo sobre [construção de datasets.](http://tdn.totvs.com/display/fluig/Desenvolvimento+de+Datasets) |\n| **ConstraintType** | Determina o tipo de constraint a ser utilizada em uma condição do dataset. Maiores detalhes sobre este item se encontram no artigo sobre [construção de datasets.](http://tdn.totvs.com/display/fluig/Desenvolvimento+de+Datasets) |\n| **notifier** | Permite realizar notificações extras em eventos e scripts. Para maiores informações acessar: [Personalização de e-mail.](http://tdn.totvs.com/x/m4HzCg) |\n| **WKParams** | Coleção de parâmetros que podem ser utilizados dentro dos scripts como o WKCompany e WKUser. Para maiores informações acessar: [Desenvolvimento de processos workflow](http://tdn.totvs.com/display/fluig/Desenvolvimento+de+Workflow). As variáveis suportadas neste script são: - WKCurrentState - WKNumState - WKDef - WKNumProces - WKVersDef - WKCompany - WKIdentityCompany - WKUser - WKCompletTask - WKCardId - WKFormId - WKNextState |\n| **fluigAPI** | Recurso que consome classes internas do Fluig Plataforma e prepara métodos utilitários diversos. Para maiores informações acessar: [Fluig API.](http://tdn.totvs.com/x/d4RXBQ) |\n\n**IMPORTANTE:** A transação inicia no momento em que o script começa a ser executado e somente acaba após o script ser finalizado e retornar para o produto. Sendo assim, por padrão, o script deve rodar durante cinco minutos ou então irá dar erro indicando que o tempo de transação excedeu. Outro comentário importante é que qualquer exceção durante a execução do script que chegue ao código do produto irá efetuar Rollback da transação, ou seja, todos os dados salvos até então na base da plataforma Fluig serão perdidos como, por exemplo, campos de formulário alterados com hAPI.setCardValue." }, { "metadata": { "title": "Integração consumindo XML", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=152798259", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Tipos de integração\\Integração consumindo XML.md" }, "content": "Integração consumindo XML" }, { "metadata": { "title": "Integração consumindo XML", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=152798259", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Tipos de integração\\Integração consumindo XML.md" }, "content": "Integração consumindo XML\n\n\n# Índice\n\n- 1 [Objetivo](#IntegraçãoconsumindoXML-Objetivo)\n- 2 [Pré-requisitos](#IntegraçãoconsumindoXML-Pré-requisitos)\n- 3 [Manipulação de arquivos XML](#IntegraçãoconsumindoXML-ManipulaçãodearquivosXML)\n- 4 [O XML que será importado](#IntegraçãoconsumindoXML-OXMLqueseráimportado)\n- 5 [Carregando o conteúdo do XML para uma variável JavaScript](#IntegraçãoconsumindoXML-CarregandooconteúdodoXMLparaumavariávelJavaScript)\n- 6 [Removendo informações desnecessárias para o parser XML JavaScript](#IntegraçãoconsumindoXML-RemovendoinformaçõesdesnecessáriasparaoparserXMLJavaScript)\n- 7 [Realizando a conversão de String para documento XML JavaScript](#IntegraçãoconsumindoXML-RealizandoaconversãodeStringparadocumentoXMLJavaScript)\n- 8 [Manipulando o documento XML](#IntegraçãoconsumindoXML-ManipulandoodocumentoXML)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é demonstrar a técnica padrão para manipulação de arquivos XML dentro dos *scripts* personalizados do TOTVS Fluig Plataforma.\n\n# Pré-requisitos\n\n---\n\nConhecimento prévio em determinados pontos, sendo estes:\n\n- Visão geral sobre a plataforma fluig\n- Visão geral sobre integração de sistemas\n- JavaScript\n\n# Manipulação de arquivos XML\n\n---\n\nNeste exemplo carregaremos um XML externo ao fluig via java e faremos a leitura e manipulação do mesmo via JavaScript.\n\nDesta maneira fica mais fácil tratar o XML e realizar integrações.\n\n# O XML que será importado\n\n---\n\nO XML que estaremos carregando é uma representação de catálogo de CDs.\n\n```\n\n \n Empire Burlesque\n Bob Dylan\n USA\n Columbia\n 10.90\n 1985\n \n \n Hide your heart\n Bonnie Tyler\n UK\n CBS Records\n 9.90\n 1988\n \n\n```\n\nEsta é apenas parte do conteúdo do arquivo XML que será consumido neste exemplo. Note que ele possui três camadas:\n\n1. A primeira é representada pela *tag * e representa a coleção inteira de CDs.\n2. No segundo nível temos a *tag * que representa um CD de todo o catálogo.\n3. As outras *tags* internas à *tag * representam os dados do CD e formam a terceira camada deste exemplo.\n\nA compreensão dessa estruturação se faz necessária para entender o exemplo como um todo.\n\nPara verificar o conteúdo completo do XML, clique neste [link](http://www.w3schools.com/xml/cd_catalog.xml).\n\n# Carregando o conteúdo do XML para uma variável JavaScript\n\n---\n\nO próximo passo é carregar o conteúdo desse XML para uma variável JavaScript. Faremos a carga de alguns objetos java para conseguirmos carregar o XML (funções do pacote [java.net](http://java.net).URL).\n\n**Carregando documento**\n\n```\nvar url = new java.net.URL(\"http://www.w3schools.com/xml/cd_catalog.xml\");\nvar connection = url.openConnection();\nconnection.setRequestMethod(\"GET\");\nconnection.setRequestProperty(\"Accept\", \"text/plain\");\nif (connection.getResponseCode() != 200) {\n\tthrow \"Failed : HTTP error code : \" + connection.getResponseCode();\n}\nvar br = new java.io.BufferedReader(new java.io.InputStreamReader(connection.getInputStream()));\n```\n\nO código acima ir carregar para variável *br* o conteúdo do XML provindo do endereço [www.w3schools.com/xml/cd\\_catalog.xml](http://www.w3schools.com/xml/cd_catalog.xml) . Note que existem tratamentos para situações onde não foi possível carregar o documento (getResponseCode() != 200) . Atente-se a esses tratamentos para retornar uma mensagem de erro amigável para o usuário, dependendo do momento e local onde esta técnica é utilizada. Antes de mandarmos para o *parser* JavaScript teremos que fazer alguns tratamentos e este será o nosso próximo passo.\n\n# Removendo informações desnecessárias para o *parser* XML JavaScript\n\n---\n\nAntes de enviarmos para o *parser,* será necessário remover algumas *tags* ou informações que não são aceitas pelo parser XML do JavaScript. Abaixo temos uma demonstração do bloco que remove esses itens em nosso XML de exemplo.\n\n**Carregando documento**\n\n```\nvar result = \"\";\nwhile ((output = br.readLine()) != null) {\n\t// Removendo cabeçalhos e comentários iniciais do xml exemplo\n\tif (output.indexOf(\" -1 || output.indexOf(\" -1) {\n\t\tcontinue;\n\t}\n\tresult += output;\n}\n```\n\nCom o código acima acabamos de remover linhas que começam com \" \n\n```\n\nNeste exemplo tivemos esses dois elementos que foram removidos para que o XML fosse aceito pelo *parser* XML. Mas em alguns XML os elementos deverão ser tratados antes de serem submetidos ao *parser*.\n\n**Atenção** especial a documentos XML que contenham a *tag .*\n\nEm casos como este deverá ser feito um tratamento removendo essas propriedades para que seja possível converter o XML da resposta da URL em um documento XML JavaScript válido.\n\nObservação\n\nTags com nome \"class\" não poderão ter propriedades internas definidas na própria *tag* de abertura .\n\nEx: **.\n\n \n\n# Realizando a conversão de String para documento XML JavaScript\n\n---\n\nApós a remoção e tratamento de \"impurezas\" da *string* XML, chegamos ao ponto mais crítico: a transformação ou *parsing* da *string* XML para um documento JavaScript XML.\n\nO código para essa transformação é bem simples e poderá ser visto no bloco abaixo\n\n**Realizando o Parsing do xml para variável javascript**\n\n```\nvar doc = new XML(result);\n```\n\nNesta parte iremos descobrir se o XML passado para o JavaScript é válido como documento XML e se o mesmo está apto para consulta e manipulação. Em caso negativo será gerada uma mensagem de erro no log do WildFly da plataforma Fluig e a execução do evento em questão será anulada.\n\nObservação\n\nCaso a execução do evento Fluig tenha sido anulada antes de gerar os resultados esperados, verifique o log do WildFly Fluig para possíveis erros de *parser* do XML enviado.\n\n \n\n# Manipulando o documento XML\n\n---\n\nAgora temos a variável *doc* carregada com o XML a partir do primeiro nível, ou seja, a variável *doc* representa a *tag * da string XML do documento que foi enviado. Para vermos a quantidade de CDs que temos no catálogo basta usarmos o seguinte comando : *doc.CD.length()* .\n\nLembrado que o caso das letras deverá seguir o mesmo existente dentro do XML. Neste exemplo nós pegamos a quantidade de ocorrências existente dentro da coleção CD existente dentro do *doc* (que representa **. No bloco abaixo temos exemplos de consulta, criação e eliminação de campos dentro de todos os registros de CD existentes no documento XML.\n\n**Manipulando xml**\n\n```\n log.info(\"Foram encontrados \" + doc.CD.length() + \" discos no XML\");\n // Fazendo a leitura de todos os CDs que vieram no xml\n for (y in doc.CD) {\n\t// Exibindo uma propriedade de um dos itens do xml\n\tlog.info(\"Nome do disco: \" + doc.CD[y].TITLE);\n\t// inserindo novo campo que conterá o valor do campo price convertido para o preco em real\n\tdoc.CD[y].VALORBRL = \"R$ \" + (doc.CD[y].PRICE * 2);\n\n\t// Removendo campo Year do xml \n\tdelete doc.CD[y].YEAR;\n}\n```\n\nApós a execução desta lógica *for* a variável*doc*já conterá o XML alterado e poderá ser utilizada para quaisquer fins necessários, entre eles o reenvio para uma aplicação externa à plataforma Fluig.\n\nObservação\n\nLembre-se que manipulação de XML é *case-sensitive* com a denominação original do documento XML.\n\nInformações\n\nEm anexo a este artigo temos esta mesma lógica descrita neste arquivo implementada como evento de formulário . Lembrando que esta mesma lógica também poderá ser implementada como evento de processo ou um dataset.\n\nDownload: [displayFields.js](https://tdn.totvs.com/download/attachments/152798259/displayFields.js?version=1&modificationDate=1408479720000&api=v2)\n\nObservação\n\nEsta técnica não pode ser utilizada para desenvolvimento de Datasets (Método *createDataset*), pois a classe XMLList não implementa a interface *serializable,* causando erro na execução deste método. O XML será lido e interpretado, porém não será produzido nenhum resultado." }, { "metadata": { "title": "Integração de Módulos Customizados", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=123602165", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Integrações\\Integração\\Tipos de integração\\Integração de Módulos Customizados.md" }, "content": "Integração de Módulos Customizados\n\n\n# Índice\n\n- 1 [Objetivo](#IntegraçãodeMódulosCustomizados-Objetivo)\n- 2 [Pré-requisitos](#IntegraçãodeMódulosCustomizados-Pré-requisitos)\n- 3 [Integração de Módulos Customizados](#IntegraçãodeMódulosCustomizados-IntegraçãodeMódulosCustomizados)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é sanar dúvidas referentes a integração de módulos customizados com o TOTVS Fluig Plataforma.\n\n# Pré-requisitos\n\n---\n\nPara desenvolver a integração em .NET, PHP ou outra linguagem, é necessário ter o ambiente de desenvolvimento da respectiva linguagem instalado.\n\n# Integração de Módulos Customizados\n\n---\n\nAcompanhe a seguir, dois exemplos de integrações desenvolvimentos em .NET e um de integração PHP.\n\n- Exemplo [CreateDocument.cs](https://tdn.totvs.com/download/attachments/123602165/CreateDocument.cs?version=1&modificationDate=1392381888000&api=v2)  \n Este exemplo envia um determinado documento via protocolo FTP para a área de *upload* do usuário, e após concluído o envio, realiza a publicação de documento através do método *createDocument* do WebService *DocumentService* enviado uma segurança customizada.\n\n- Exemplo [WorkflowEngineService.cs](https://tdn.totvs.com/download/attachments/123602165/WorkflowEngineService.cs?version=1&modificationDate=1392381902000&api=v2) \n Este exemplo realiza a movimentação de um processo workflow e incluindo anexos através do método *saveAndSendTask* do WebService *WorkflowEngineService*.\n\nImportante\n\nNotem que em alguns campos além de informar o valor da variável, é necessário definir a variável como *Specified*, caso contrário o valor não é enviado pela requisição WebService.\n\n- Exemplo [getColleagueDataset.php](https://tdn.totvs.com/download/attachments/123602165/getColleagueDataset.php?version=1&modificationDate=1392381911000&api=v2) \n Este é um exemplo de integração da linguagem PHP com os WebServices do Fluig Plataforma." }, { "metadata": { "title": "Análise de Log", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=268800700", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log.md" }, "content": "Análise de Log\n\n\nAqui você encontra todas as documentações reunidas referentes à Análise de log." }, { "metadata": { "title": "Cadastro de serviço", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=644720026", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Cadastro de serviço.md" }, "content": "Cadastro de serviço" }, { "metadata": { "title": "Cadastro de serviço", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=644720026", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Cadastro de serviço.md" }, "content": "Cadastro de serviço\n\n\n- [Objetivo](#Cadastrodeserviço-Objetivo)\n- [Tipos de serviços](#Cadastrodeserviço-Tiposdeserviços)\n- [Cadastrando o serviço](#Cadastrodeserviço-Cadastrandooserviço)\n- [Testando o serviço](#Cadastrodeserviço-Testandooserviço)\n- [Habilitando o log de serviço](#Cadastrodeserviço-Habilitandoologdeserviço)\n\n# Objetivo\n\n---\n\nO objetivo desse guia é mostrar a criação de serviços SOAP, REST e JDBC, que possibilitam integração com sistemas terceiros.\n\n# Tipos de serviços\n\n---\n\n| Serviço | Descrição |\n| --- | --- |\n| SOAP | É um protocolo padrão projetado originalmente para possibilitar a comunicação entre aplicações desenvolvidas em diferentes linguagens e plataformas. Quando uma solicitação de dados é enviada a um serviço SOAP, ela pode ser processada por meio do protocolo HTTP (em navegadores da web) por exemplo. As mensagens SOAP são documentos XML que aderem a uma especificação W3C. |\n| REST | Utiliza do protocolo HTTP para fazer comunicação e pode retornar dados em JSON, XML, texto simples e HTML. |\n| JDBC | É um conjunto de classes e interfaces ( API ) escritas em Java para execução e manipulação de resultados de instruções SQL para banco de dados relacional. Para cada Banco de dados há um driver JDBC. |\n\n# Cadastrando o serviço\n\n---\n\nAcesse o TOTVS Fluig com usuário administrador, no **Painel de controle** localize o agrupador **Desenvolvimento** e acione a opção **Serviços**.\n\nSelecione a opção novo serviço:\n\n**[\nYour browser does not support the HTML5 video element\n](/download/attachments/644720026/cadastrar-serviço.mp4)**\n\nSelecionado o tipo de serviço SOAP é preciso inserir as informações solicitadas, os campos destacados com um asterisco (**\\***) são de preenchimento obrigatório:\n\n| Campo | Descrição |\n| --- | --- |\n| **Nome\\*** | Neste campo, adicione um nome para o serviço que deseja cadastrar. |\n| **Descrição\\*** | Neste campo, adicione uma descrição para o serviço. |\n| **URL\\*** | Neste campo, adicione a URL do *webservice* que deseja utilizar. |\n| **Arquivo de *binding*** | Somente será utilizado o arquivo de *binding*para serviços criados utilizando a API CXF. Para incluir, basta acionar **Escolher arquivo** no campo **Arquivo de Binding** e incluir. |\n| ***Package*** | Neste campo, informe o local onde as classes do serviço devem ser geradas. EXEMPLO com.fluig Nota: Se não for informando um local, as classes serão geradas dentro do local padrão indicado pelo wsdl do serviço. |\n| **Tipo de autenticação\\*** | Neste campo, selecione o tipo de autenticação que deseja: - **None**: quando selecionado, determina que não haverá autenticação na requisição do serviço; - **Basic**: quando selecionado, determina que a autenticação será feita a partir de um usuário e uma senha enviados no *header* da requisição do serviço. |\n| **Usuário\\*** | Neste campo, informe o usuário que será enviado no *header* da requisição do serviço para ser utilizado na autenticação. Esse campo somente é exibido ao selecionar o tipo de autenticação Basic. |\n| **Senha\\*** | Neste campo, informe a senha do usuário que será enviada no *header* da requisição do serviço para ser utilizada na autenticação. Esse campo somente é exibido ao selecionar o tipo de autenticação Basic. |\n\nAcionar opção **Salvar.**\n\n**[\nYour browser does not support the HTML5 video element\n](/download/attachments/644720026/cadastrar-serviço-soap.mp4)**\n\nDica!\n\nMais detalhes referente a *binding*, você encontra na documentação técnica de [Integração com Aplicativos Externos](https://tdn.totvs.com/pages/releaseview.action?pageId=73082260#Integra%C3%A7%C3%A3ocomAplicativosExternos-ResolvendoconflitosutilizandoarquivosdebindJAXB).\n\nImportante!\n\nO TOTVS Fluig Plataforma possui suporte apenas para leitura do swagger 2.0 no cadastro do serviço REST.\n\nSelecionado o tipo de serviço REST é preciso inserir as informações solicitadas, os campos destacados com um asterisco (**\\***) são de preenchimento obrigatório:\n\n| Campo | Descrição |\n| --- | --- |\n| **Nome\\*** | Neste campo, adicione um nome para o serviço que deseja cadastrar. |\n| **Descrição\\*** | Neste campo, adicione uma descrição para o serviço. |\n| ***Swagger*** | Neste campo, adicione um endereço para um arquivo no formato JSON. |\n| **Domínio\\*** | Neste campo, adicione o domínio do serviço. |\n| **Tipo de autenticação\\*** | Neste campo, selecione o tipo de autenticação que deseja: - None. - Rest oauth 1. - Rest oauth 2. - Custom. - Basic. |\n| **URL para teste de serviço** | neste campo, insira o *endpoint* GET para teste de autenticação *provider*. |\n\nAcionar opção **Salvar.**\n\n![](..\\..\\..\\images\\image2021-10-25_14-39-1.png)\n\nSelecionado o tipo de serviço JDBC é preciso inserir as informações solicitadas, os campos destacados com um asterisco (**\\***) são de preenchimento obrigatório:\n\n| Campo | Descrição |\n| --- | --- |\n| **Nome\\*** | Neste campo, adicione um nome para o serviço que deseja cadastrar. |\n| **Descrição\\*** | Neste campo, adicione uma descrição para o serviço. |\n| **Driver\\*** | Neste campo, será selecionado o *driver* desejado: MySQL, SQL Server ou Oracle. Após a gravação do serviço, o *driver* não pode ser editado. |\n| **URL\\*** | Neste campo, informe os dados do servidor de banco de dados. |\n| **Usuário\\*** | Usuário de acesso ao banco de dados. |\n| **Senha\\*** | Senha de acesso ao banco de dados. |\n\nAcionar opção **Salvar.**\n\n![](..\\..\\..\\images\\image2021-10-11_11-53-29.png)\n\nImportante!\n\nQuando o banco Oracle utilizar nome do serviço na autenticação, utilizar a URL: `jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE`\n\n# Testando o serviço\n\n---\n\nA janela de Testar serviço irá apresentar um campo contendo o retorno do teste, em caso de sucesso ou erro.\n\nO teste só é realizado para serviços REST ou JDBC.\n\nNo serviço criado, selecione a opção **Testar serviço** ![Testar serviço](..\\..\\..\\images\\fluigicon-computernetwork.png) :\n\n![](..\\..\\..\\images\\image2021-10-25_14-40-37.png)\n\nImportante!\n\nO teste somente será possível caso o campo **URL para teste de serviço** esteja preenchido no cadastro de serviço.\n\nNo serviço criado, selecione a opção **Testar conexão** ![Testar serviço](..\\..\\..\\images\\fluigicon-computernetwork.png) :\n\n![](..\\..\\..\\images\\image2021-10-11_12-7-14.png)\n\n# Habilitando o log de serviço\n\n---\n\nCom o *log* habilitado, a quantidade de requisições será apresentada pelo serviço específico.\n\nPara habilitar o mesmo, selecione a opção ![Estatísticas de uso](..\\..\\..\\images\\ecm_painelcontrole_dark.png), nesse momento será aberto o modal onde deverá ser preenchido as informações:\n\n| Campo | Descrição |\n| --- | --- |\n| Ativar log completo | Selecionar **ON** para ativar o *log.* |\n| Tempo de expiração | Configura o tempo de expiração do *log*, o mesmo pode variar entre 1 e 24 horas. |\n\nAs requisições realizadas pelo serviço serão disponibilizadas em um arquivo de log, para baixar o mesmo deverá selecionar o serviço e acionar o botão Download do log.\n\nImportante!\n\nHabilitando o log, pode causar uma maior utilização de espaço em disco." }, { "metadata": { "title": "Mecanismo de atribuição", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270921079", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição.md" }, "content": "Mecanismo de atribuição" }, { "metadata": { "title": "Mecanismo de atribuição", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270921079", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição.md" }, "content": "Mecanismo de atribuição\n\n\n- 1 [Sobre mecanismo de atribuição](#Mecanismodeatribuição-Sobremecanismodeatribuição)\n - 1.1 [Como criar um mecanismo de atribuição](#Mecanismodeatribuição-Comocriarummecanismodeatribuição)\n - 1.2 [Exemplo de mecanismo de atribuição Por associação](#Mecanismodeatribuição-ExemplodemecanismodeatribuiçãoPorassociação)\n\n# Sobre mecanismo de atribuição\n\n---\n\nOs mecanismos de atribuição são instrumentos utilizados durante um processo de *workflow* que permitem criar, segundo um critério estabelecido pelo próprio mecanismo, uma lista de possíveis usuários para uma atividade. Esta lista pode ser utilizada em dois momentos:\n\n1. na inicialização do processo, onde o sistema verifica se o usuário corrente faz parte desta lista e, portanto, pode iniciá-lo;\n2. no momento do encaminhamento de uma tarefa, quando esta lista é apresentada ao usuário corrente com opções de encaminhamento da solicitação.\n\nNo primeiro caso, a lista é gerada de acordo com o mecanismo de atribuição existente na primeira atividade do processo (que representa a atividade inicial). Nas demais atividades é adotado o segundo procedimento. Quando não houver um mecanismo de atribuição associado a uma atividade (seja ela inicial ou não), todos os usuários são considerados válidos.\n\nO fluig possui alguns mecanismos de atribuição padrão, conforme abaixo:\n\n| Mecanismo de Atribuição | Descrição |\n| --- | --- |\n| Para um papel (Pool) | Permite atribuir tarefas a um **papel** e não apenas a um usuário. Assim, qualquer um dos usuários neste **papel** pode assumir as tarefas para completá-las. |\n| Para um grupo (Pool) | Permite atribuir tarefas a um **grupo** e não apenas a um usuário. Assim, qualquer um dos usuários deste **grupo** pode assumir as tarefas para completá-las. |\n| Por associação | Permite compor lógicas complexas de atribuição por intermédio da associação de vários mecanismos. Essa função não aceita mecanismos customizados. |\n| Por campo de formulário | Permite atribuir tarefas ao usuário informado em um campo do formulário do processo. |\n| Por executor de atividade | Permite selecionar os usuários que executaram uma atividade anterior. |\n| Por grupo | Permite selecionar no momento da movimentação da atividade apenas os usuários que façam parte de um determinado **grupo**. |\n| Por grupos do usuário | Permite filtrar apenas os usuários que pertençam a um dos grupos do usuário corrente, ou do usuário que iniciou o processo (solicitante). Também permite filtrar apenas os usuários cujo grupo de trabalho seja o mesmo do usuário (corrente ou solicitante). |\n| Por papel | Permite selecionar no momento da movimentação da atividade apenas os usuários que possuam um determinado **papel**. |\n| Por usuário | Permite atribuir tarefas a um usuário específico. |\n\nMais informações\n\nOs mecanismos \"Por executor de atividade\" e \"Por usuário\", selecionam um usuário específico, seja ele pré-determinado (Por usuário) ou variável conforme o fluxo da solicitação (Por executor). Caso o usuário destino esteja inativo, a atividade vai ser enviada ao gestor do processo." }, { "metadata": { "title": "Mecanismo de atribuição", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270921079", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição.md" }, "content": "Mecanismo de atribuição\n\n## Como criar um mecanismo de atribuição" }, { "metadata": { "title": "Mecanismo de atribuição", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270921079", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição.md" }, "content": "Mecanismo de atribuição\n\n\n---\n\nA criação de um mecanismo de atribuição é realizada pelo fluig Studio, sendo necessário já existir um projeto fluig.\n\nMais informações\n\nPara que um usuário que não é administrador da empresa possa criar, importar, editar e remover mecanismos, é necessário que ele possua a permissão \"Configurar Mecanismos\". Esta permissão pode ser concedida pelo administrador através do item \"Permissões\" disponível na aba \"Gerais\" do Painel de Controle do fluig.\n\nSaiba como realizar esse procedimento [clicando aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=269423844).\n\nUtilize o passo-a-passo para conhecer o processo de criação de um mecanismo de atribuição de exemplo:\n\n- Para criar um novo mecanismo de atribuição desenvolvido sob a plataforma, clicar com o botão direito do *mouse* no projeto do fluig, acessar a opção *New* e então a opção *Other*. No assistente aberto, selecionar a opção \"Mecanismo customizado fluig\" presente na pasta fluig e clicar no botão *Next*:\n\n![](..\\..\\..\\images\\mecatrib-porarea-new.png)\n\n- O assistente **Novo mecanismo fluig** é aberto. Informar o código e uma descrição e clicar no botão *Finish*:\n\n![](..\\..\\..\\images\\mecatrib-porarea.png)\n\n- O arquivo JavaScript do mecanismo de atribuição é adicionado ao projeto na pasta **mechanisms** e aberto para edição.\n- Este *script* deve retornar uma lista dos usuários que podem assumir a tarefa. Abaixo temos um exemplo de implementação:\n\n```\nfunction resolve(process, colleague) {\n\tvar userList = new java.util.ArrayList();\n\n\tvar managerId = fluigAPI.getUserService().getCurrent().getCode();\n\n\tvar c1 = DatasetFactory.createConstraint(\"cdGestor\", managerId, managerId, ConstraintType.MUST); \n\tvar constraints = new Array(c1);\n\t\n\tvar dataset = DatasetFactory.getDataset(\"dsResponsaveisArea\", null, constraints, null);\n\t\n\tfor (var i = 0; i < dataset.rowsCount; i++) {\n\t\tuserList.add(dataset.getValue(i, \"cdUsuarioResp\"));\n\t}\n\t\n\treturn userList;\n}\n```\n\nÉ possível acessar Datasets e Serviços cadastrados no fluig no desenvolvimento do mecanismo de atribuição sob a plataforma.\n\n- Por fim, o mecanismo de atribuição desenvolvido sob a plataforma deve ser exportado para o servidor do fluig e ao realizar a exportação deve ser informado obrigatoriamente seu código e nome, e opcionalmente uma descrição:\n\n![](..\\..\\..\\images\\mecatrib-porarea-export.png)" }, { "metadata": { "title": "Mecanismo de atribuição", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270921079", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição.md" }, "content": "Mecanismo de atribuição\n\n## Exemplo de mecanismo de atribuição Por associação" }, { "metadata": { "title": "Mecanismo de atribuição", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270921079", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição.md" }, "content": "Mecanismo de atribuição\n\n\n---\n\nDemonstração de como utilizar um mecanismo de atribuição por Associação com Grupos do Colaborador e Papel, podendo adaptá-lo conforme sua necessidade.\n\n- Nas propriedades da atividade, em **Mecanismo de atribuição**, selecione **Atribuição por Associação** e clique em **Configurar**. Selecione **Atribuição por Grupos do Colaborador** e clique em incluir. Selecione o registro incluído e clique em **Editar**.\n\n![](..\\..\\..\\images\\image2017-4-11%208288.png)\n\n- Na tela de **Grupos do colaborador**, no campo **Busca Usuários nos Grupos**informe **do Usuário corrente**  e marque **Apenas Grupos de Trabalho**.\n- Logo depois acione **Confirmar**.\n\n![](..\\..\\..\\images\\image2017-4-11%208304.png)\n\n- Em sequência inclua um novo mecanismo, agora como **Atribuição por Papel**, pois queremos enviar esta atividade para o papel **Líderes** onde está o líder deste usuário. Selecione o novo registro e clique em **Editar**.\n\n![](..\\..\\..\\images\\image2017-4-11%2083127.png)\n\n- Selecione o código do papel **Líderes** e logo depois acione **Confirmar**.\n\n![](..\\..\\..\\images\\image2017-4-11%2083210.png)\n\n- Selecione o tipo de associação como **Somente usuários selecionados em todos os mecanismos**, para que apenas os usuários que estejam presentes tanto no Grupo de trabalho do colaborador quanto no Papel **Líderes** sejam aptos a receber a solicitação.\n\n![](..\\..\\..\\images\\image2017-4-11%2083345.png)\n\n- Para que no momento de enviar a solicitação seja mostrada a tela de seleção do usuário apenas quando houver mais de uma opção, o que não é o caso agora, pois existe apenas um usuário que está no Grupo de trabalho do usuário corrente e também no Papel **Líderes**, selecione o campo **Quando houver mais de uma opção** nas propriedades da atividade.\n\n![](..\\..\\..\\images\\image2017-4-11%2083440.png)\n\n- No fluig você pode ter um Papel com os líderes de todas as áreas da empresa e um Grupo onde estão todos os usuários de determinada equipe, inclusive o Líder. Para utilizar o mecanismo de Grupos de trabalho do Colaborador, você precisará adicionar no cadastro do usuário este Grupo em dois locais: **Grupos** e **Grupo de trabalho workflow**.\n- No exemplo abaixo o Grupo de trabalho é **suporte**. Desta forma, quando um usuário iniciar uma solicitação, a atividade configurada conforme acima irá ser direcionada diretamente para o Líder do usuário corrente, desde que ele esteja no Papel de líderes e também no Grupo de trabalho do usuário.\n\n![](..\\..\\..\\images\\imagem001.png)" }, { "metadata": { "title": "Controle de Log", "source": "https://tdn.totvs.com/display/fluig/Controle+de+Log", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log\\Controle de Log.md" }, "content": "Controle de Log" }, { "metadata": { "title": "Controle de Log", "source": "https://tdn.totvs.com/display/fluig/Controle+de+Log", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log\\Controle de Log.md" }, "content": "Controle de Log\n\n\n# Índice\n\n- 1 [Objetivo](#ControledeLog-Objetivo)\n- 2 [Pré-requisitos](#ControledeLog-Pré-requisitos)\n- 3 [Ativando o Controle de Log por Usuário](#ControledeLog-AtivandooControledeLogporUsuário)\n- 4 [Baixar log do servidor](#ControledeLog-Baixarlogdoservidor)\n- 5 [Ambiente de Alta Disponibilidade - Cluster](#ControledeLog-AmbientedeAltaDisponibilidade-Cluster)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é auxiliar os usuários administradores da plataforma a ativar o controle de log por usuário e a extrair o log completo da plataforma.\n\nO log de usuário tem por objetivo registrar as ações executadas por determinados usuários, com a finalidade de auxiliar no diagnóstico de situações que estejam prejudicando o uso da plataforma. Sua ativação somente pode ser feita por usuários administradores, selecionando individualmente os usuários dos quais as ações devem ser registradas em um arquivo de log separado.\n\nO administrador também pode extrair o log completo da plataforma através desta página para análise de erros e envio do arquivo para o suporte fluig.\n\n# Pré-requisitos\n\n---\n\nPara entender melhor o processo, o administrador deve ter domínio sobre a [Gestão de logs](Gestão de logs.md) do fluig.\n\n# Ativando o Controle de Log por Usuário\n\n---\n\nPara ativar a geração de logs das ações de um determinado usuário na plataforma em um arquivo de log separado, é necessário acessar o **Painel de Controle**, agrupador **Segurança e acesso**, na opção **Controle de Log**.\n\nA partir desta tela é possível selecionar quais usuários terão este recurso ativo, bem como configurar, clicando sobre o ícone de engrenagem (![](..\\..\\..\\..\\images\\Image%206.jpg)), o período que este permanecerá ativo, que pode ser de até 7 dias corridos. Este período corresponde ao tempo que as ações do usuário serão registradas em um arquivo de log específico **a partir do próximo login**, sendo que, uma vez registradas, permanecerão no arquivo até que o mesmo seja removido ou alterado manualmente.\n\n![](..\\..\\..\\..\\images\\Image%205.jpg)\n\nEste arquivo ficará na pasta configurada para persistência dos logs **por padrão em [Instalação fluig]/appserver/domain/servers//log/user-logging/.log**. A limpeza deste arquivo **não** é feita de forma automática, para permitir a avaliação das informações mesmo após o período de ativação. Para facilitar a análise, no início de cada registro é informada a data e a hora, no formato \"yyyy-MM-dd HH:mm:ss,SSS\".\n\nPara fazer *download* do log de cada usuário com este recurso ativo, dê um clique sobre o ícone ![](..\\..\\..\\..\\images\\Image%204.jpg) posicionado na coluna 'Download' do respectivo usuário.\n\nAlém disso, também é permitido filtrar pelo nome dos usuários ou pelos usuários que possuem o controle de log ativo.\n\nAtenção\n\nSe o usuário já estiver autenticado na plataforma, a ativação não terá efeito até o próximo *login*. Nesse caso pode-se solicitar que o mesmo efetue *logoff* e *login* novamente.\n\n![](..\\..\\..\\..\\images\\image2016-4-25%20141255.png)\n\n# Baixar log do servidor\n\n---\n\nPara efetuar o *download* do arquivo \"server.log\" contendo o log completo da plataforma fluig, basta clicar na opção **Baixar log do servidor completo** localizada em **Painel de controle >** agrupador **Segurança e acesso > Controle de log**\n\nAtenção\n\nAs mensagens detalhadas informadas no final do log, além das informações padrões do log estarão disponíveis a partir da atualização **fluig 1.6.4-180508**\n\n![](..\\..\\..\\..\\images\\controle%20de%20log%201.PNG)\n\nAlém das mensagens padrão do log, serão apresentadas ao final do log, informações relevantes do ambiente e da infraestrutura do servidor conforme o exemplo abaixo:\n\n**Arquivo de log**\n\n```\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) =======================LOG CONFIGS=================================\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) FLUIG_VERSION = 1.6.5 120318\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) INSTALL_ROOT = /opt/fluigX/appserver\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) JBOSS_SERVER_NAME = fluig1\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) OS_NAME = Linux\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) JAVA_HOME = /opt/fluigX/jdk-64/jre\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) DATABASE_NAME = MySQL\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) DATABASE_VERSION = 5.7.21-0ubuntu0.16.04.1\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) DRIVER_NAME = MySQL Connector Java\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) DRIVER_VERSION = mysql-connector-java-5.1.44 ( Revision: b3cda4f864902ffdde495b9df93937c3e20009be )\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) SERVER_URL = https://suaempresa.fluig.com:443\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) SERVER_IP_ADRESS = 100.17.75.21\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) SERVER_IP_PORT = 8080\n2018-04-09 16:28:15,962 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) LS_ENABLED = true\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) LS_HOST = 100.17.75.22\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) LS_PORT = 5555\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) NODE_EXTERNAL_URL = 100.17.75.21:7777\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) NODE_INTERNAL_URL = 100.17.75.21:8888\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) SOLR_URL = http://100.17.75.21:8983/solr\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) SOLR_CLOUD = false\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) SOLR_REMOTE = false\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) OO_ENABLED = false\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) OO_DIRECTORY = /opt/fluigX/OpenOffice-linux-64\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) OO_PORT = 15001,15002\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) FTP_ENABLED = false\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) FTP_PORT = 21\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) FTP_PORT_RANGE = \n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) FTP_PRIVATEFOLDER_PORT = 8021\n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) FTP_PRIVATEFOLDER_PORT_RANGE = \n2018-04-09 16:28:15,963 INFO [com.totvs.technology.foundation.common.logger.ConfigLogger] (default task-11) ===================================================================\n```\n\n# Ambiente de Alta Disponibilidade - Cluster\n\n---\n\nO recurso de controle de log de usuário - quando em um ambiente de [alta disponibilidade](../../../Configuração/Configuração de Ambiente/Alta disponibilidade e balanceamento de carga.md) - tem seu acesso com usuário de perfil administrador. Para que este funcione adequadamente em ambientes com múltiplas instâncias, é necessário que ambos os acessos (usuário e administrador) sejam executados diretamente de um dos servidores, e não pelo endereço de balanceamento de carga (load balancer*)*.\n\n****Exemplo****\n\n---\n\nVamos considerar o seguinte cenário:\n\n- Acesso principal (load balancer) \n http://minhaempresa.fluig.com\n- Servidor 01 no seguinte endereço \n http://servidor1.fluig.com:8080\n- Servidor 02 no seguinte endereço \n http://servidor2.fluig.com:8082\n\nE que o Servidor 02 seja escolhido como controle de log para o usuário João Carlos, sendo assim:\n\n- Administrador deve fazer download dos logs do usuário João Carlos em http://servidor2.fluig.com:8082\n- Usuário João Carlos deve acessar o fluig pelo endereço http://servidor2.fluig.com:8082" }, { "metadata": { "title": "Ferramentas de Análise de Log", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=235336390", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log\\Ferramentas de Análise de Log.md" }, "content": "Ferramentas de Análise de Log\n\n\n# Índice\n\n- 1 [Objetivo](#FerramentasdeAnálisedeLog-Objetivo)\n- 2 [Pré-requisitos](#FerramentasdeAnálisedeLog-Pré-requisitos)\n- 3 [Ferramentas indicadas](#FerramentasdeAnálisedeLog-Ferramentasindicadas)\n - 3.1 [glogg](#FerramentasdeAnálisedeLog-glogg)\n - 3.2 [BareTail](#FerramentasdeAnálisedeLog-BareTail)\n\n# Objetivo\n\n---\n\nO objetivo desta página é compartilhar ferramentas que podem auxiliar e agilizar a análise dos arquivos de log do fluig.\n\n# Pré-requisitos\n\n---\n\nPara ativar e monitorar as mensagens de log, é importante conhecer o procedimento de [Gestão de logs](http://tdn.totvs.com/pages/viewpage.action?pageId=203764136).\n\n# Ferramentas indicadas\n\n---\n\nAs ferramentas indicadas para análise do log são:\n\n- glogg\n- BareTail\n\nAtenção\n\nEssas ferramentas são desenvolvidas por terceiros e sua utilização é apenas uma sugestão, portanto a equipe de atendimento do fluig não presta suporte a nenhuma delas.\n\n## glogg\n\n---\n\nO glogg é uma aplicação multiplataforma (Windows / Ubuntu / Fedora) que permite o acompanhamento em tempo real, criação de filtros, pesquisa em arquivos de log extensos ou complexos. Abaixo veremos alguns recursos disponíveis:\n\n- Possui filtros, que possibilitam alterar a cor da fonte e a cor de fundo de um determinado texto:\n\n![](..\\..\\..\\..\\images\\image2016-4-13%2022953.png)\n\n- Possui um painel exclusivo para buscar informações:\n\n![](..\\..\\..\\..\\images\\image2016-4-13%20221536.png)\n\n- Também disponibiliza um busca rápida, por meio da opção **Ctrl + F** ou tecla barra (**/**):\n\n![](..\\..\\..\\..\\images\\image2016-4-13%20221854.png)\n\n- O programa permite selecionar várias linhas para compará-las em um painel exclusivo:\n\n![](..\\..\\..\\..\\images\\image2016-4-13%20222356.png)\n\n- No [site oficial do projeto](http://glogg.bonnefon.org/index.html) glogg, que é open source, estão disponíveis a [documentação](http://glogg.bonnefon.org/documentation.html) e o link para [download.](http://glogg.bonnefon.org/download.html)\n\n## BareTail" }, { "metadata": { "title": "Ferramentas de Análise de Log", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=235336390", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log\\Ferramentas de Análise de Log.md" }, "content": "Ferramentas de Análise de Log\n\n\n---\n\nO BareTail permite o acompanhamento em tempo real e também a criação de filtros, para facilitar a leitura do log. No entanto, o recurso de busca não está disponível na versão gratuita*,* o que muitas vezes acaba dificultando as análises.  O download do programa em sua versão gratuita pode ser feito no [site oficial](https://www.baremetalsoft.com/baretail/). \n\n![](..\\..\\..\\..\\images\\image2016-4-13%20224534.png)" }, { "metadata": { "title": "Gestão de logs", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=203764136", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log\\Gestão de logs.md" }, "content": "Gestão de logs" }, { "metadata": { "title": "Gestão de logs", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=203764136", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log\\Gestão de logs.md" }, "content": "Gestão de logs\n\n\nFique atento!\n\nEsta página é válida a partir da atualização **Voyager (2.0)** do TOTVS Fluig.\n\nSe você utiliza uma atualização anterior, acesse [Como gerenciar os logs da plataforma da atualização **1.6 até 1.8.2**](https://tdn.totvs.com/pages/viewpage.action?pageId=941245905).\n\n- [Introdução](#Gestãodelogs-Introdução)\n- [Como funciona?](#Gestãodelogs-Comofunciona?)\n- [Configuração via interface de gerenciamento do servidor de aplicação](#Gestãodelogs-Configuraçãoviainterfacedegerenciamentodoservidordeaplicação)\n - [Usuário do servidor de aplicação](#Gestãodelogs-Usuáriodoservidordeaplicação)\n - [Adicionando Classe ou Pacote](#Gestãodelogs-AdicionandoClasseouPacote)\n- [Visualizando o log de debug](#Gestãodelogs-Visualizandoologdedebug)\n\n# Introdução\n\n---\n\nEm alguns casos, para obter mais informações sobre um determinado erro, pode ser necessário ativar um *log* mais detalhado.\n\n# Como funciona?\n\n---\n\nAs configurações de *log* são realizadas por instalação da plataforma e são definidas no arquivo **standalone.xml** localizado em [Instalação fluig]/appserver/standalone/configuration.\n\nImportante!\n\nNo caso de um ambiente em alta disponibilidade, as alterações nas configurações de *log* devem ser efetuadas em todas as máquinas do *cluster*.\n\nA configuração de *log* consiste basicamente em dois tipos de itens: **handlers** e **loggers**.\n\nO **handler** é responsável pela forma de processamento/armazenamento dos registros de*log*, enquanto o **logger** é responsável por definir o nível de um pacote específico e por quais **handlers** este pacote será tratado.\n\nEXEMPLO \nO **handler** do arquivo de *log* padrão da plataforma (**server.log**) possui a seguinte configuração:\n\n**standalone.xml**\n\n```\n\n \n \n \n \n \n \n \n\n```\n\nBasicamente, esta configuração define que o arquivo de *log* definido na propriedade **** (server.log), será rotacionado no final de cada dia, ou seja, o conteúdo que estava no arquivo será salvo em outro arquivo contendo a data como sufixo, seguindo o padrão definido na propriedade **** e o arquivo original será zerado para registrar as próximas mensagens.\n\nÉ importante verificar que a propriedade **** deste **handler** possui, por padrão, o valor \"INFO\". Isso significa que este handler irá registrar apenas mensagens de nível INFO ou superior. Sendo assim, mesmo que existam pacotes enviando mensagens em nível de DEBUG, eles não serão registrados, pois DEBUG é um nível mais baixo que INFO. Caso deseje visualizar mensagens em nível de DEBUG no arquivo server.log, é necessário primeiramente alterar a configuração de para .\n\nOs níveis de *log* seguem a seguinte ordem, sendo do nível mais baixo ao mais alto:\n\n1. ALL\n2. FINEST\n3. FINER\n4. TRACE\n5. DEBUG\n6. FINE\n7. CONFIG\n8. INFO\n9. WARN\n10. WARNING\n11. ERROR\n12. SEVERE\n13. FATAL\n\nEXEMPLO \nSe um handler for definido com *level* igual a INFO, irá registrar apenas mensagens de nível INFO, WARN, WARNING, ERROR, SEVERE e FATAL. Além dos níveis acima, também pode ser configurado o nível **OFF**, nos casos em que nenhuma mensagem deve ser registrada.\n\nCada configuração de **logger** está atrelada a um ou mais **handlers**. Quando esta informação não é configurada na declaração de um **logger**, é considerada a configuração realizada para o **root-logger** que, no caso do Fluig, possui a configuração abaixo:\n\n**standalone.xml**\n\n```\n\n \n \n \n \n \n \n\n```\n\nNeste caso, todos os loggersque não definirem um handlerespecífico, serão processados por estes três **handlers**: CONSOLE (caso seja iniciado via *script* no terminal do sistema operacional), FILE (arquivo server.log) e USERLOGGING (ver [aqui](Controle de Log.md)).\n\nA configuração de um **logger** normalmente é feita conforme abaixo:\n\n**standalone.xml**\n\n```\n\n \n\n```\n\n- O parâmetro **category** indica o pacote ou o nome completo da classe que este **logger** está configurando.\n\n- O parâmetro **level** indica o nível mínimo das mensagens que serão apresentadas para esta categoria (pacote ou classe). Neste caso, as mensagens de *log* enviadas pelo pacote **io.undertow.request** serão registradas apenas se forem do nível FATAL.\n\n# Configuração via interface de gerenciamento do servidor de aplicação\n\n---\n\nA seguir são descritos os passos necessários para criar um usuário de gerenciamento do servidor de aplicação e para adicionar uma classe ou pacote." }, { "metadata": { "title": "Gestão de logs", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=203764136", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log\\Gestão de logs.md" }, "content": "Gestão de logs\n\n## Usuário do servidor de aplicação\n\n---\n\nCaso não possua um usuário de gerenciamento do servidor de aplicação, é necessário criá-lo:\n\n**01.** No **prompt de comando** do Windows ou no **console** do Linux, navegue até o diretório **bin** do servidor de aplicação ([Instalação do fluig]/appserver/bin).\n\n**02.** Executar o script **add-user.bat** ou **add-user.sh**.\n\n**03.** Na primeira pergunta exibida, apenas pressione **ENTER**.\n\n**04.** Informe o**nome do usuário** na segunda pergunta.\n\n**05.** Escolha uma **senha** e digite-a na terceira e quarta perguntas.\n\n**06.** Após a confirmação da senha, pressione **ENTER** na quinta pergunta.\n\n**07.** Na sexta e sétima perguntas é necessário digitar **Sim** (ou Yes*,* se o console estiver em inglês) e confirmar com a tecla **ENTER**.\n\n## Adicionando Classe ou Pacote\n\n---\n\n**01.** Acesse http://[IP ou hostname]**:9990** e informe o **usuário** e **senha** criados no passo anterior.\n\n**02.** Acesse **Configuration** → **Profiles** → **full** → **Logging → View**.\n\n**03.** Na tela de log, acesse a aba **Log Categories**.\n\n**04.** Clique em **Add**.\n\n**05.** Em **name** informe o pacote ou classe a ser monitorada (Ex.: com.datasul.technology.webdesk.workflow.engine).\n\n**06.** Defina a opção **Debug** no**Level,**selecione a opção **Use parent handlers** e **Salve**.\n\nVeja um exemplo dos procedimentos citados acima: criando Usuário do servidor de aplicação e Adicionando Classe ou Pacote:\n\n![](..\\..\\..\\..\\images\\arq5.gif)\n\n# Visualizando o *log* de *debug*\n\n---\n\nApós realizada as configurações, o *log* pode ser monitorado a partir do arquivo [Instalação fluig]/appserver/standalone/log/server.log.\n\nUse uma das [ferramentas de análise recomendadas](http://tdn.totvs.com/pages/viewpage.action?pageId=235336390) para visualizar o arquivo ou, caso o sistema operacional seja Linux, é possível usar o comando:\n\n**standalone.xml**\n\n```\ntail -f [Instalação fluig]/appserver/standalone/log/server.log\n```" }, { "metadata": { "title": "Log de acesso aos recursos", "source": "https://tdn.totvs.com/display/fluig/Log+de+acesso+aos+recursos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log\\Log de acesso aos recursos.md" }, "content": "Log de acesso aos recursos" }, { "metadata": { "title": "Log de acesso aos recursos", "source": "https://tdn.totvs.com/display/fluig/Log+de+acesso+aos+recursos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log\\Log de acesso aos recursos.md" }, "content": "Log de acesso aos recursos\n\n\nFique atento!\n\nEsta página é válida para atualizações **1.7.0-210504** e **superiores** do TOTVS Fluig.\n\n- [Objetivo](#Logdeacessoaosrecursos-Objetivo)\n- [Pré-requisitos](#Logdeacessoaosrecursos-Pré-requisitos)\n- [Ativando o modo DEBUG](#Logdeacessoaosrecursos-AtivandoomodoDEBUG)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é auxiliar o suporte e desenvolvedores da plataforma a ativar as mensagens de *log* que trazem informações relevantes sobre os acessos a algumas URLs importantes do produto. Essencialmente, esse *log* ajuda a identificar se a plataforma está lenta porque está recebendo muitas requisições.\n\n# Pré-requisitos\n\n---\n\nPara ativar e monitorar as mensagens de *log*, é importante conhecer o procedimento de [Gestão de *logs*](Gestão de logs.md).\n\n# Ativando o modo DEBUG\n\n---\n\nPara habilitar, siga os passos abaixo:\n\n**01**. Acesse o arquivo **standalone.xml** localizado em **[diretório\\_instalação]/appserver/standalone/configuration/** e procure por:\n\n```\n         \n           \n           \n             \n           \n        \n```\n\n**02**. Em seguida, altere a linha: **** para: ****.\n\n**03**. Reinicie os serviços do Fluig.\n\n**01**. Acesse o arquivo **domain.xml** localizado em **[diretório\\_instalação]/appserver/domain/configuration/** e procure por:\n\n```\n         \n           \n           \n             \n           \n        \n```\n\n**02**. Em seguida, altere a linha: **** para: ****.\n\n**03**. Reinicie os serviços do Fluig.\n\nCom isso, será criado um novo arquivo na pasta de *logs*, chamado **logurl.log**.\n\nImportante!\n\nA ativação do modo Debug pode causar impacto na performance da plataforma, portanto habilite-a apenas quando necessário e desative-a ao concluir a análise." }, { "metadata": { "title": "Mensagens de log para processos", "source": "https://tdn.totvs.com/display/fluig/Mensagens+de+log+para+processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log\\Mensagens de log para processos.md" }, "content": "Mensagens de log para processos" }, { "metadata": { "title": "Mensagens de log para processos", "source": "https://tdn.totvs.com/display/fluig/Mensagens+de+log+para+processos", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Análise de Log\\Mensagens de log para processos.md" }, "content": "Mensagens de log para processos\n\n\n# Índice\n\n- 1 [Objetivo](#Mensagensdelogparaprocessos-Objetivo)\n- 2 [Pré-requisitos](#Mensagensdelogparaprocessos-Pré-requisitos)\n- 3 [Ativando o modo Debug nos pacotes que possuem o novo padrão de mensagem.](#Mensagensdelogparaprocessos-AtivandoomodoDebugnospacotesquepossuemonovopadrãodemensagem.)\n- 4 [Mensagens de ações em tela](#Mensagensdelogparaprocessos-Mensagensdeaçõesemtela)\n- 5 [Mensagens exibidas antes e depois da execução de um evento de customização de processo](#Mensagensdelogparaprocessos-Mensagensexibidasantesedepoisdaexecuçãodeumeventodecustomizaçãodeprocesso)\n- 6 [Mensagens exibidas na invocação dos métodos de personalização de processo](#Mensagensdelogparaprocessos-Mensagensexibidasnainvocaçãodosmétodosdepersonalizaçãodeprocesso)\n- 7 [Mensagens exibidas na consulta de datasets](#Mensagensdelogparaprocessos-Mensagensexibidasnaconsultadedatasets)\n- 8 [Filtrando as novas mensagens de log](#Mensagensdelogparaprocessos-Filtrandoasnovasmensagensdelog)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é auxiliar o suporte e desenvolvedores da plataforma a ativar e compreender um novo conjunto de mensagens de log que trazem informações relevantes sobre a solicitação de processo durante as fases de abertura e movimentação, passando por eventos de processo e datasets que venham a ser consultados dentro desses eventos.\n\nOs tópicos a seguir irão demonstrar como ativar essas mensagens e farão uma breve descrição de todos os campos retornados.\n\n# Pré-requisitos\n\n---\n\nPara ativar e monitorar as mensagens de log, é importante conhecer o procedimento de [Gestão de logs](Gestão de logs.md).\n\n# Ativando o modo Debug nos pacotes que possuem o novo padrão de mensagem.\n\nPara ativação das mensagens o analista ou desenvolvedor deverá ter executado previamente os passos do guia [Ativar log em nível de debug de uma classe ou pacote](Gestão de logs.md).\n\nAtenção\n\nA ativação do modo Debug pode causar impacto na performance da plataforma, portanto habilite-a apenas quando necessário e desative-a ao concluir a análise.\n\nFeitos estes passos é necessário cadastrar três categorias de log:\n\n| | |\n| --- | --- |\n| *com.datasul.technology.webdesk.customization* | DEBUG |\n| *com.datasul.technology.webdesk.dataset* | DEBUG |\n| *com.datasul.technology.webdesk.workflow.engine* | DEBUG |\n\nCadastradas as 3 categorias, as mensagens no novo formato irão começar a aparecer no log.\n\n# Mensagens de ações em tela\n\n---\n\nAs mensagens de ações em tela irão começar trazendo o número da solicitação no inicio da mensagem. Supondo que a solicitação que estamos monitorando tenha o número 107 então o começo da linha será formado desta forma:\n\n*\"[Solicitacao: 107]\"*\n\nVeja a seguir os campos que acompanham a mensagem:\n\n| Campo | Descrição |\n| --- | --- |\n| Evento | Acontecimento realizado pelo usuário através da interface do fluig executado dentro do motor de Workflow. São exemplos de eventos: - Completando tarefa do usuário[TAR\\_PROCES] - Verificando se atividade 4 é automática. - Criando tarefa para a thread 0 e movimento 3 - Completando histórico do movimento 2 |\n| Atividade Atual | Traz informações sobre a tarefa atual. Geralmente é retornado o código da atividade que pode ser verificado nos modeladores de workflow do fluig. As vezes também é retornado o nome da atividade. |\n| Usuário Executor | Usuário que executou a tarefa. ColleagueId do usuário que executou a tarefa. O usuário que executou a tarefa não necessariamente é o usuário responsável. Lembre-se que o gestor e o substituto podem executar tarefas em nome do usuário responsável. |\n| Gestor | Retorna se o usuário executor é gestou ou não |\n| Substituto | Retorna se o usuário é substituto ou não. |\n\n# Mensagens exibidas antes e depois da execução de um evento de customização de processo\n\n---\n\nAlém do cabeçalho inicial já citado no tópico anterior são impressas as seguintes informações:\n\n| Campo | Descrição |\n| --- | --- |\n| Processo | Código e descrição do processo. |\n| Versão | Versão do processo da onde está sendo executado aquele evento. |\n| Atividade | Atividade aonde o evento está sendo executado. |\n| Usuário Executor | Usuário que irá executar o evento do processo. |\n| Gestor | Retorna se o usuário executor é gestou ou não |\n| Substituto | Retorna se o usuário é substituto ou não. |\n| Evento | Código do Evento. |\n| Mensagem | Mensagem extra que trará informações diferentes de acordo com o evento executado ou retornará a mensagem de erro caso ocorra algum. |\n\n# Mensagens exibidas na invocação dos métodos de personalização de processo\n\n---\n\nEssas mensagens são executadas no exato momento em que o motor de JavaScript será invocado para rodar os scripts passando informações de motor de *workflow* como parâmetro.\n\nAlém do cabeçalho inicial já citado no tópico anterior são impressas as seguintes informações:\n\n| Campo | Descrição |\n| --- | --- |\n| Processo | Código e descrição do processo. |\n| Versão | Versão do processo da onde está sendo executado aquele evento. |\n| Atividade | Atividade aonde o evento está sendo executado. |\n| Usuário Executor | Usuário que irá executar o evento do processo. |\n| Gestor | Retorna se o usuário executor é gestou ou não |\n| Substituto | Retorna se o usuário é substituto ou não. |\n| Estado atual | Código do estado atual da solicitação workflow. Trará apenas o código e não a descrição da atividade. |\n| Estado Destino | Trará o código do estado destino (quando possível). Trará apenas o código e não a descrição da atividade. |\n| Evento executado | Retornará o nome do evento que está sendo executado naquele momento. |\n| Parâmetros | Trará a lista de parâmetros que estão sendo passados para o evento. Exemplo de lista de parametros passados para o evento BeforeTaskComplete: Parâmetros: *[param1=claudia,param2=4,param3=[Andressa]]* |\n\n# Mensagens exibidas na consulta de datasets\n\n---\n\nEssas mensagens serão exibidas na consulta de qualquer dataset independente da forma e do local em que ela é feita. Consultas realizadas pelo plugin do fluig Studio, por eventos de processo, por *zooms*, em chamadas XMLRPC dentro do formulário ou mesmo dentro de eventos do processo.\n\nDatasets não possuem um relacionamento direto com solicitações workflow. Neste caso as linhas de datasets consumidos começam com a string \"Executando Dataset\".\n\nSegue a lista de colunas que serão exibidas ao consultar um dataset no fluig.\n\n| Campo | Valor |\n| --- | --- |\n| Executando Dataset | Código - Descrição do dataset sendo consultado |\n| Tipo | Tipo do dataset. Os datasets podem ser: *internos*, *simples* ou *avançados*. Para conhecer as diferenças sobre esses tipos, acesse a documentação [Desenvolvimento de Datasets](../../Desenvolvimento de Datasets.md). |\n| Tipo de acesso a dados | Retorna dois tipos possíveis de acessos a dados: - *Online* - Acesso online. No caso de datasets customizados toda vez que o dataset for consultado serão executados scripts de retorno que podem fazer acessos a bancos de dados externos, webservices e informações provindas das mais diversas naturezas. - *Offline* - Acesso ao cache - Significa que o dataset possui sincronização com o servidor e que as consultas feitas neste dataset estão sendo repassadas para tabelas internas do fluig previamente populadas. |\n| Campos Solicitados | Lista de campos que foram solicitados para o dataset retornar. |\n| Constraints | Lista de Constraints que foram passadas para a consulta do dataset. Os campos que uma constraint possuem são: - **Campo**: Campo aonde a constraint será operada - **Valor Inicial**: Valor inicial do Range da constraint - **Valor Final**: Valor final do Range da constraint - **Tipo de Constraint**: Tipos de constraint como **MUST**, **SHOULD** e **SHOULD\\_NOT** |\n\nPara datasets do tipo *offline*, além das informações acima também são trazidos os seguintes campos:\n\n| Campo | Valor |\n| --- | --- |\n| Última sincronização | Data e hora da última sincronização desse dataset. |\n| Taxa de aderência | Nível de aderência que aquele dataset possui para sincronização com o mobile. |\n| Id metalista | Id da metalista onde estão sendo armazenados os valores daquele dataset. |\n| Cache mobile | Retorna se, para aquele dataset, está habilitada a opção de uso do cache em dispositivos móveis. |\n\n# Filtrando as novas mensagens de log\n\n---\n\nAtravés da Strings \"[Solicitacao: Número da solicitação]\"  e \"Executando Dataset=Código do dataset\" é possível rastrear o comportamento de uma solicitação workflow ou verificar e replicar todos os tipos de acesso que um dataset teve dentro da plataforma fluig.\n\nAconselhamos o uso de ferramentas de log que trabalhem com os conceitos de Filtros e *Highlighting* (Realce) para facilitar a compreensão do que está acontecendo dentro do ambiente do seu cliente.\n\nDurante o desenvolvimento inicial deste novo padrão de mensagens foi utilizada a ferramenta LogExpert que implementa esses conceitos e trabalha com a Licença MIT, podendo ser utilizado gratuitamente por profissionais dos mais diversos perfis.\n\n![](..\\..\\..\\..\\images\\logExpert.png)\n\nOutras ferramentas para análise de log podem ser encontradas no guia [Análise de log](Ferramentas de Análise de Log.md) do dev.fluig.com.\n\nObservação\n\nEm futuras versões do fluig serão implementadas mais - e melhores - mensagens que irão facilitar o dia a dia dos desenvolvedores que precisam localizar a causa de uma inconsistência dentro dos desenvolvimentos sobre a plataforma fluig." }, { "metadata": { "title": "Mecanismo de atribuição personalizado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=142804157", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição\\Mecanismo de atribuição personalizado.md" }, "content": "Mecanismo de atribuição personalizado" }, { "metadata": { "title": "Mecanismo de atribuição personalizado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=142804157", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição\\Mecanismo de atribuição personalizado.md" }, "content": "Mecanismo de atribuição personalizado\n\n\n# Índice\n\n- 1 [Objetivo](#Mecanismodeatribuiçãopersonalizado-Objetivo)\n- 2 [Pré-requisitos](#Mecanismodeatribuiçãopersonalizado-Pré-requisitos)\n- 3 [Construindo um Mecanismo Personalizado](#Mecanismodeatribuiçãopersonalizado-ConstruindoumMecanismoPersonalizado)\n - 3.1 [Retornando uma Listagem de Usuários](#Mecanismodeatribuiçãopersonalizado-RetornandoumaListagemdeUsuários)\n - 3.2 [Utilizando hAPI](#Mecanismodeatribuiçãopersonalizado-UtilizandohAPI)\n - 3.2.1 [Exibindo usuários conforme campo selecionado](#Mecanismodeatribuiçãopersonalizado-Exibindousuáriosconformecamposelecionado)\n - 3.3 [Utilizando parâmetros](#Mecanismodeatribuiçãopersonalizado-Utilizandoparâmetros)\n - 3.4 [Utilizando Datasets](#Mecanismodeatribuiçãopersonalizado-UtilizandoDatasets)\n - 3.5 [Utilizando Serviços / Webservices](#Mecanismodeatribuiçãopersonalizado-UtilizandoServiços/Webservices)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é orientar como construir um *script* com a finalidade de resolver os responsáveis por uma tarefa do processo *workflow* e/ou gestor de processo.\n\nAtenção\n\nPara que um usuário que não é administrador da empresa possa criar, importar, editar e remover mecanismos, é necessário que ele possua a permissão **Configurar Mecanismos**. Esta permissão pode ser concedida pelo administrador através do item **Permissões** disponível no agrupador **Pessoas** do **Painel de Controle** do fluig.\n\nSaiba como realizar esse procedimento [clicando aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=269423844).\n\n# Pré-requisitos\n\n---\n\n- Conhecimento da linguagem JavaScript;\n- Conhecimento sobre a construção de fluxos de processo Workflow Fluig;\n- Conceitos sobre [Desenvolvimento de Datasets](../../Desenvolvimento de Datasets.md);\n- Entendimento sobre serviços da Web, Web services, SOAP e XML;\n- Familiaridade com a ferramenta de desenvolvimento, TOTVS Developer Studio ou Eclipse;\n- Instalação do Fluig Studio.\n\n# Construindo um Mecanismo Personalizado\n\n---\n\nEm algumas situações é necessário utilizar lógicas mais complexas e específicas sobre quem será(ão) o(s) responsável(is) pela execução da atividade na solicitação de processo workflow. Para isto, existe o \"Mecanismo de Atribuição Customizado\".\n\n- Para iniciar sua construção, deve-se em um projeto existente, acesse a pasta **mechanisms** e acesse o menu **Arquivo** > **Novo** > **Outros**... (acessível pelas teclas de atalho CTRL+N)\n- Expanda o grupo (pasta) Fluig e selecione a opção **Mecanismo Customizado Fluig**, após isso, clique em **Avançar**.\n- Na tela seguinte, indique o código no campo respectivo e sua descrição igualmente, após isso, clique em **Concluir**.\n\nO código é obrigatório e não pode ser alterado posteriormente.\n\nNota\n\nO código para o mecanismo deve seguir a especificação de padronização conforme o documento [Nomenclatura e Estrutura de Formulários](../../../Recurso de Documentos (ECM).md)/Desenvolvimento de Formulários/Nomenclatura e Estrutura de Formulários.md).\n\nCom isto, será criada a função básica que deve ser implementada: \n\n```\nfunction resolve(process,colleague){\n\n\tvar userList = null; /* Para adicionar novos usuários, deve ser um ArrayList, conforme exemplos a seguir */\n\n\treturn userList;\n\n}\n```\n\nA função acima **não** **retorna nenhum usuário**. Sua execução não possibilitará escolher ninguém, por isto, esta função deve ser complementada.\n\nA função **deve** retornar uma listagem, do tipo ***ArrayList*** com as **matrículas** dos usuários. A matrícula não é necessariamente igual ao login deste usuário. A matrícula corresponde ao valor existente no campo de mesmo nome no cadastro deste usuário e à coluna *colleaguePK.colleagueId* do Dataset *colleague*.\n\nAtenção\n\nSe ocorrer qualquer erro de sintaxe ou na execução do mecanismo, este será interrompido e, consequentemente, não devolverá nenhum responsável para próxima tarefa/atividade do processo. É importante que toda a implementação passe por um tratamento de erros e proteção de execução. Uma boa prática é utilizar as cláusulas *try catch*.\n\nNota\n\nNenhuma mensagem de erro pode ser emitida ao usuário durante sua execução, pois estes mecanismos podem ser invocados sem que haja a interação com o usuário, como por exemplo, as chamadas ao webservice *ECMWorkflowEngineService* por meio das integrações externas." }, { "metadata": { "title": "Mecanismo de atribuição personalizado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=142804157", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição\\Mecanismo de atribuição personalizado.md" }, "content": "Mecanismo de atribuição personalizado\n\n## Retornando uma Listagem de Usuários\n\n---\n\nAbaixo temos um exemplo de retorno de uma relação fixa de usuários:\n\n```\nfunction resolve(process,colleague){\n\n\tvar userList = new java.util.ArrayList();\n\n\tuserList.add('matricula_1');\n\tuserList.add('matricula_2');\n\tuserList.add('matricula_3');\n\n\treturn userList;\n\n}\n```\n\n## Utilizando hAPI" }, { "metadata": { "title": "Mecanismo de atribuição personalizado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=142804157", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição\\Mecanismo de atribuição personalizado.md" }, "content": "Mecanismo de atribuição personalizado\n\n\n---\n\nAtenção\n\nA utilização da hAPI só está disponível a partir da Atualização 1.5.12\n\nÉ possível obter informações da API de *Workflow* utilizando a variável global **hAPI**. Não utilizar em solicitações que estejam na atividade inicial, indicado utilizar em solicitações já iniciadas, uma vez que a hAPI depende dos dados do formulário gravado na solicitação.\n\nOs seguintes métodos são recomendados para utilização:\n\n| Método | Especificação |\n| --- | --- |\n| getCardValue(\"nomeCampo\") | Permite acessar o valor de um campo do formulário do processo, onde: - nomeCampo: nome do campo do formulário. Dica Campos do tipo *checkbox* retornam os valores *on* para marcado ou \"\" (vazio) para não marcado. Para trabalhar de uma maneira mais fácil, é possível transformá-los em booleanos. Exemplo: ```var campoCheckbox = hAPI.getCardValue(\"campoCheckbox\") == \"on\" ? true : false; ``` |\n| getCardData(numProcesso) | Retorna um Mapa com todos os campos e valores do formulário da solicitação. - numProcesso: número da solicitação de processo. Para formulários pai e filho, os campos são identificados da seguinte forma: **campo1\\_\\_\\_1**, sendo **campo1** o nome atribuído ao campo através da tag *name* do campo HTML + **\\_\\_\\_** (3 *underlines*) + **número sequencial do registro**. Por exemplo, em um formulário de nota fiscal com os seguintes campos: - Formulário pai: - Número da Nota - numNota; - Formulário filho: - Código do item - codItem; - Descrição do item - desItem; - Quantidade do item - qtdItem; O retorno do Mapa seria: - numNota = 99999 - codItem\\_\\_\\_1 = 91 - desItem\\_\\_\\_1 = Caneta - qtdItem\\_\\_\\_1 = 100 - codItem\\_\\_\\_2 = 92 - desItem\\_\\_\\_2 = Lápis - qtdItem\\_\\_\\_2 = 200 - codItem\\_\\_\\_3 = 93 - desItem\\_\\_\\_3 = Borracha - qtdItem\\_\\_\\_3 = 150 |\n\nA hAPI dispõe de outro métodos, que são abordados na documentação de [Desenvolvimento de Workflow](../../../Recurso de Processos (BPM).md)/Desenvolvimento de Workflow.md). Contudo apenas os métodos mencionados acima são recomendados para o desenvolvimento de Mecanismos de atribuição." }, { "metadata": { "title": "Mecanismo de atribuição personalizado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=142804157", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição\\Mecanismo de atribuição personalizado.md" }, "content": "Mecanismo de atribuição personalizado\n\n### Exibindo usuários conforme campo selecionado\n\n---\n\nAbaixo temos um exemplo de utilização da **hAPI**, onde será retornado um usuário considerando o campo selecionado no formulário da solicitação:\n\n```\nfunction resolve(process, colleague) {\n\tvar userList = new java.util.ArrayList();\n\tvar setor = hAPI.getCardValue(\"setor\");\n\t//Criando constraints para retornar os usuário do grupo\n\tvar cGrupo = DatasetFactory.createConstraint(\"colleagueGroupPK.groupId\",\n\t\t\tsetor, setor, ConstraintType.MUST);\t\n\tvar constraintsGroup = new Array(cGrupo);\n\t//Chamando dataset \"colleagueGroup\" para retornar os usuários\n\tvar colleagues = DatasetFactory.getDataset(\"colleagueGroup\", null,\n\t\t\tconstraintsGroup, null);\n\t\n\tfor (var i = 0; i < colleagues.values.length; i++) {\n\t\t//Adicionando usuário como opção de responsável\n\t\tuserList.add(colleagues.getValue(i, \"colleagueGroupPK.colleagueId\"));\n\t}\n\treturn userList;\n}\n```\n\n## Utilizando parâmetros\n\n---\n\nAtenção\n\nA utilização dos Parâmetros só estão disponíveis a partir da Atualização 1.6.3\n\nAcesse a documentação de [parâmetros](http://tdn.totvs.com/x/BuYlE) para mais detalhes.\n\nAbaixo temos um exemplo de como exibir diferentes usuários para seleção utilizando a variável \"WKIsTransfer\", que permite saber se o usuário está ou não transferindo uma tarefa:\n\n```\nfunction resolve(process, colleague) {\n\tvar userList = new java.util.ArrayList();\n\tvar isTransfer = getValue(\"WKIsTransfer\");\n\n\tif (isTransfer !== null) {\n\t\tif (JSON.parse(isTransfer)) {\n\t\t\tuserList.add(\"gestor\");\n\t\t} else {\n\t\t\tuserList.add(\"user\");\n\t\t}\n\t} else {\n\t\tuserList.add(\"gestor\");\n\t\tuserList.add(\"user\");\n\t}\n\n\treturn userList;\n}\n```\n\n## Utilizando Datasets" }, { "metadata": { "title": "Mecanismo de atribuição personalizado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=142804157", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição\\Mecanismo de atribuição personalizado.md" }, "content": "Mecanismo de atribuição personalizado\n\n\n---\n\nÉ possível realizar a consulta a um *Dataset* da plataforma, a fim de elaborar o resultado final dos usuários que poderão ser listados para escolha da execução da próxima atividade. Este procedimento pode ser realizado conforme o exemplo a seguir:\n\n```\nfunction resolve(process,colleague){\n\n\tvar userList = new java.util.ArrayList();\n\n\t//-- CONSULTA A UM DATASET, DE GRUPO DE USUARIOS FLUIG\n\tvar dtsGroup = DatasetFactory.getDataset('group',null,null,null);\n\tfor(var g = 0; g < dtsGroup.values.length; g++){\n\t\tuserList.add( 'Pool:Group:'+dtsGroup.getValue(g.toString(),\"groupPK.groupId\") );\n\t}\n\t\n\t//-- CONSULTA A UM DATASET, DE PAPEIS DE USUARIOS FLUIG\n\tvar dtsRole = DatasetFactory.getDataset('workflowRole',null,null,null);\n\tfor each(papel in dtsRole.values){\n\t\tuserList.add( 'Pool:Role:'+papel[\"workflowRolePK.roleId\"] );\n\t}\n\t\n\treturn userList;\n\n}\n```\n\nNo exemplo acima, para que o(s) **Grupo(s)** seja(m) listado(s) é necessária a inclusão do prefixo ***\"Pool:Group:\"*** concatenado ao código deste Grupo. Com isto, ao selecionar o grupo, a atividade é atribuída ao Grupo e uma pessoa deste deverá assumi-la. Da mesma forma ocorre para o(s) **Papel(éis) Workflow**, porém o prefixo deve ser ***\"Pool:Role:\"*** mais o código do Papel.\n\n## Utilizando Serviços / Webservices" }, { "metadata": { "title": "Mecanismo de atribuição personalizado", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=142804157", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Primeiros passos\\Mecanismo de atribuição\\Mecanismo de atribuição personalizado.md" }, "content": "Mecanismo de atribuição personalizado\n\n\n---\n\nA construção de um mecanismo ainda possibilita a utilização de um **Serviço de Integração Fluig**, que poderá consumir um **webservice** do tipo **SOAP** ou do tipo **Progress**para obter os responsáveis, de acordo com uma regra de negócio provida pelo ERP, por exemplo. Este método pode seguir o modelo abaixo:\n\n```\nfunction resolve(process,colleague){\n\n\tvar userList = new java.util.ArrayList();\n\n\t//-- CHAMADA A UM SERVICO DE INTEGRACAO FLUIG, COM UM WEBSERVICE ESPECIFICADO\n\tvar biblioteca = ServiceManager.getService('ECMColleagueService').getBean();\n\tvar endpoint = biblioteca.instantiate('com.totvs.technology.ecm.foundation.ws.ECMColleagueServiceServiceLocator');\n\tvar webservice = endpoint.getColleagueServicePort();\n\tvar usuariosDtoArray = webservice.getSummaryColleagues(1);\n\tfor each(usuario in usuariosDtoArray.getItem()){\n\t\tuserList.add( usuario.getColleagueId().toString() );\n\t}\n\t\n\treturn userList;\n\n}\n```\n\nEm que os parâmetros \"process\" e \"colleague\" se referem, respectivamente, aos objetos WorkflowProcess process e Colleague colleague.\n\n| WorkflowProcess | |\n| --- | --- |\n| Parâmetro | Tipo |\n| workflowProcessPK - long companyId - int processInstanceId | WorkflowProcessPK |\n| processId | String |\n| version | Integer |\n| requesterId | String |\n| active | Boolean |\n| attachmentSeqId | Integer |\n| sourceProcess | Integer |\n| sourceThreadSequence | Integer |\n| UUID | String |\n\n| Colleague | |\n| --- | --- |\n| Parâmetro | Tipo |\n| colleaguePK - long companyId - private String colleagueId | ColleaguePK |\n| userTenantId | long |\n| colleagueName | String |\n| mail | String |\n| login | String |\n| passwd | String |\n| active | Boolean |\n| adminUser | Boolean |\n| groupId | String |\n\nO exemplo acima utilizou o webservice ***ECMColleagueService*** da própria plataforma e o **Serviço** foi criado utilizando a **API Axis**." }, { "metadata": { "title": "Consumo de um WS SOAP de um Widget", "source": "https://tdn.totvs.com/display/fluig/Consumo+de+um+WS+SOAP+de+um+Widget", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Consumo de um WS SOAP de um Widget.md" }, "content": "Consumo de um WS SOAP de um Widget" }, { "metadata": { "title": "Consumo de um WS SOAP de um Widget", "source": "https://tdn.totvs.com/display/fluig/Consumo+de+um+WS+SOAP+de+um+Widget", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Consumo de um WS SOAP de um Widget.md" }, "content": "Consumo de um WS SOAP de um Widget\n\n\n# Índice\n\n- 1 [Objetivo](#ConsumodeumWSSOAPdeumWidget-Objetivo)\n- 2 [Pré-requisitos](#ConsumodeumWSSOAPdeumWidget-Pré-requisitos)\n- 3 [Consumir um WS SOAP de um Widget](#ConsumodeumWSSOAPdeumWidget-ConsumirumWSSOAPdeumWidget)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar um exemplo de como consumir um *WebService*SOAP de um *widget*.\n\n# Pré-requisitos\n\n---\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre o fluig\n- Visão geral sobre integração de sistemas\n- WebServices\n- SOAP\n\nInformação:\n\nChamadas SOAP realizadas dentro de uma página (via widget) utilizam a sessão atual do usuário, ou seja, assumem o usuário logado. Porém, caso um login seja informado na chamada, a plataforma verifica se ele corresponde ao usuário da sessão.\n\n# Consumir um WS SOAP de um *Widget*\n\n---\n\nNeste exemplo é utilizado o *WebService* ECMCardService, método Create para criar um registro de formulário.\n\nAntes de iniciar, é necessário existir um *template* de formulário publicado no fluig, como o modelo a seguir:\n\n**Template de formulário**\n\n```\n\n \n
\n
\n
\n
\n \n\n```\n\nA seguir é apresentado um exemplo de código JavaScript para consumir o WS de dentro de um *widget* no Fluig:\n\n**Exemplo para consumir WS de dentro de um widget**\n\n```\n//URL do Serviço\nvar wsUrl = WCMAPI.serverURL + \"/webdesk/ECMCardService?wsdl\";\n\n//Modelo da Requisição\nvar soapRequest = 'campo_nomecampo_ramal';\n\n//Convertendo para XML, para facilitar a manipulação\nvar parser=new DOMParser();\nvar xmlRequest=parser.parseFromString(soapRequest,\"text/xml\");\n\n//Código da empresa\nxmlRequest.getElementsByTagName(\"companyId\")[0].innerHTML = WCMAPI.organizationId;\n\n//Código do template de formulário, já publicado\nxmlRequest.getElementsByTagName(\"parentDocumentId\")[0].innerHTML = 81;\n\n//Valores para os campos\nxmlRequest.getElementsByName(\"campo_nome\")[0].innerHTML = \"Meu nome...\";\nxmlRequest.getElementsByName(\"campo_ramal\")[0].innerHTML = \"9999\";\n\n//Enviando a requisição\nWCMAPI.Create({\n url: wsUrl,\n contentType: \"text/xml\",\n dataType: \"xml\",\n data: xmlRequest,\n success: function(data){\n var xmlResp=parser.parseFromString(data.firstChild.innerHTML,\"text/xml\");\n console.log(\"Documento Publicado: \" + xmlResp.getElementsByTagName(\"documentId\")[0].innerHTML);\n }\n});\n```\n\nDica\n\nConsulte a documentação da [WCMAPI](../../Recurso de Páginas e Widgets (WCM).md)/WCMAPI.md) para conhecer as demais propriedades dessa biblioteca." }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n- 1 [Objetivo](#DocumentaçãodosWebServices-Objetivo)\n- 2 [Pré-requisitos](#DocumentaçãodosWebServices-Pré-requisitos)\n- 3 [ECMAttributionMecanismService](#DocumentaçãodosWebServices-ECMAttributionMecanismService)\n - 3.1 [Métodos](#DocumentaçãodosWebServices-Métodos)\n - 3.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização)\n- 4 [ECMBusinessPeriodService](#DocumentaçãodosWebServices-ECMBusinessPeriodService)\n - 4.1 [Métodos](#DocumentaçãodosWebServices-Métodos.1)\n - 4.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.1)\n- 5 [ECMCardIndexService](#DocumentaçãodosWebServices-ECMCardIndexService)\n - 5.1 [Métodos](#DocumentaçãodosWebServices-Métodos.2)\n - 5.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.2)\n- 6 [ECMCardService](#DocumentaçãodosWebServices-ECMCardService)\n - 6.1 [Exemplos de utilização](#DocumentaçãodosWebServices-Exemplosdeutilização)\n - 6.2 [Métodos](#DocumentaçãodosWebServices-Métodos.3)\n- 7 [ECMColleagueGroupService](#DocumentaçãodosWebServices-ECMColleagueGroupService)\n - 7.1 [Métodos](#DocumentaçãodosWebServices-Métodos.4)\n - 7.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.3)\n- 8 [ECMColleagueReplacementService](#DocumentaçãodosWebServices-ECMColleagueReplacementService)\n - 8.1 [Métodos](#DocumentaçãodosWebServices-Métodos.5)\n - 8.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.4)\n- 9 [ECMColleagueService](#DocumentaçãodosWebServices-ECMColleagueService)\n - 9.1 [Métodos](#DocumentaçãodosWebServices-Métodos.6)\n - 9.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.5)\n- 10 [ECMCompanyService](#DocumentaçãodosWebServices-ECMCompanyService)\n - 10.1 [Métodos](#DocumentaçãodosWebServices-Métodos.7)\n - 10.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.6)\n- 11 [ECMCustomFieldsService](#DocumentaçãodosWebServices-ECMCustomFieldsService)\n - 11.1 [Métodos](#DocumentaçãodosWebServices-Métodos.8)\n - 11.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.7)\n- 12 [ECMDashBoardService](#DocumentaçãodosWebServices-ECMDashBoardService)\n - 12.1 [Métodos](#DocumentaçãodosWebServices-Métodos.9)\n - 12.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.8)\n- 13 [ECMDataServiceService](#DocumentaçãodosWebServices-ECMDataServiceService)\n - 13.1 [Métodos](#DocumentaçãodosWebServices-Métodos.10)\n- 14 [ECMDatasetService](#DocumentaçãodosWebServices-ECMDatasetService)\n - 14.1 [Métodos](#DocumentaçãodosWebServices-Métodos.11)\n - 14.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.9)\n- 15 [ECMDocumentService](#DocumentaçãodosWebServices-ECMDocumentService)\n - 15.1 [Métodos](#DocumentaçãodosWebServices-Métodos.12)\n - 15.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.10)\n- 16 [ECMFavoritesService](#DocumentaçãodosWebServices-ECMFavoritesService)\n - 16.1 [Métodos](#DocumentaçãodosWebServices-Métodos.13)\n - 16.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.11)\n- 17 [ECMFolderService](#DocumentaçãodosWebServices-ECMFolderService)\n - 17.1 [Métodos](#DocumentaçãodosWebServices-Métodos.14)\n - 17.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.12)\n- 18 [ECMGlobalParamService](#DocumentaçãodosWebServices-ECMGlobalParamService)\n - 18.1 [Métodos](#DocumentaçãodosWebServices-Métodos.15)\n - 18.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.13)\n- 19 [ECMGroupService](#DocumentaçãodosWebServices-ECMGroupService)\n - 19.1 [Métodos](#DocumentaçãodosWebServices-Métodos.16)\n - 19.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.14)\n- 20 [ECMOutstandingService](#DocumentaçãodosWebServices-ECMOutstandingService)\n - 20.1 [Métodos](#DocumentaçãodosWebServices-Métodos.17)\n- 21 [ECMReportService](#DocumentaçãodosWebServices-ECMReportService)\n - 21.1 [Métodos](#DocumentaçãodosWebServices-Métodos.18)\n - 21.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.15)\n- 22 [ECMSearchDocumentService](#DocumentaçãodosWebServices-ECMSearchDocumentService)\n - 22.1 [Métodos](#DocumentaçãodosWebServices-Métodos.19)\n - 22.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.16)\n- 23 [ECMSignalService](#DocumentaçãodosWebServices-ECMSignalService)\n - 23.1 [Métodos](#DocumentaçãodosWebServices-Métodos.20)\n - 23.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.17)\n- 24 [ECMTokenService](#DocumentaçãodosWebServices-ECMTokenService)\n - 24.1 [Métodos](#DocumentaçãodosWebServices-Métodos.21)\n - 24.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.18)\n- 25 [ECMWorkflowEngineService](#DocumentaçãodosWebServices-ECMWorkflowEngineService)\n - 25.1 [Métodos](#DocumentaçãodosWebServices-Métodos.22)\n - 25.2 [Exemplo de utilização](#DocumentaçãodosWebServices-Exemplodeutilização.19)\n- 26 [ECMWorkflowRoleService](#DocumentaçãodosWebServices-ECMWorkflowRoleService)\n - 26.1 [Métodos](#DocumentaçãodosWebServices-Métodos.23)\n\n# Objetivo\n\nO objetivo deste documento é descrever os Web Services Soap do Fluig, com seus métodos, parâmetros e retornos\n\n# Pré-requisitos\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre o fluig\n- Visão geral sobre integração de sistemas\n- Web Services\n\nInformação:\n\nChamadas SOAP realizadas dentro de uma página (via widget) utilizam a sessão atual do usuário, ou seja, assumem o usuário logado. Porém, caso um login seja informado na chamada, a plataforma verifica se ele corresponde ao usuário da sessão.\n\n# ECMAttributionMecanismService\n\nWebservice responsável por realizar operações referentes aos mecanismos de atribuição cadastrados no fluig. Pode ser utilizado para pesquisar os mecanismos de atribuição de uma determinada empresa." }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Métodos\n\n| | |\n| --- | --- |\n| getAttributionMecanism | Retorna os mecanismos de atribuição da empresa. Método: getAttributionMecanism(String user, String password, int companyId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: [AttributionMecanismDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-AttributionMecanismDto). |\n\n**Quadro 2: Métodos da** **AttributionMecanismService.**\n\n#### Exemplo de utilização\n\nFaça o download da classe [ECMAttributionMecanismService.java](https://git.fluig.com/projects/SAMPLES/repos/samples-webservice/browse/src/samples/ECMAttributionMecanismService.java), esta exemplifica a utilização dos principais métodos da classe AttributionMecanismService.\n\n# ECMBusinessPeriodService\n\nWebservice responsável por realizar operações referentes aos expedientes cadastrados no fluig. Pode ser utilizado para pesquisar os expedientes de uma determinada empresa.\n\n#### Métodos\n\n| | |\n| --- | --- |\n| getBusinessPeriods | Retorna os expedientes da empresa. Método: getBusinessPeriods(String user, String password, int companyId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: [BusinessPeriodDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-BusinessPeriodDto). |\n\n**Quadro 3: Métodos da BusinessPeriodService.**\n\n#### Exemplo de utilização\n\nFaça o download da classe [ECMBusinessPeriodService.java](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse/webservice/src/samples/ECMBusinessPeriodService.java), esta exemplifica a utilização dos principais métodos da classe BusinessPeriodService.\n\n# ECMCardIndexService\n\nWebservice responsável por realizar operações referentes aos formulários cadastrados no fluig.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createSimpleCardIndex | Criação simples de um formulário. Método: createSimpleCardIndex (String user, String password, int companyId, int parentDocumentId, String publisherId, String documentDescription, String cardDescription, AttachmentArray attachments, CardEventDtoArray customEvents) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - parentDocumentId: número do formulário. - publisherId: código do autor. - documentDescription: descrição. - cardDescription: nome. - attachments: arquivo anexo. - customEvents: eventos. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Cadastro de clientes 271 1000 ok ``` Estrutura de retorno com erro ``` 0 0 0 Usuário sem permissão para publicar documento nesta pasta! ``` |\n| createSimpleCardIndexWithDataset | Criação simples de um formulário com datasets. Método: createSimpleCardIndexWithDataset (String user, String password, int companyId, int parentDocumentId, String publisherId, String documentDescription, String cardDescription, String datasetName, AttachmentArray attachments, CardEventDtoArray customEvents) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - parentDocumentId: número do formulário. - publisherId: código do autor. - documentDescription: descrição. - cardDescription: nome. - datasetName: nome do dataset. - attachments: arquivo anexo. - customEvents: eventos. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Cadastro de clientes 271 1000 ok ``` Estrutura de retorno com erro ``` 0 0 0 Usuário sem permissão para publicar documento nesta pasta! ``` |\n| createSimpleCardIndexWithDatasetPersisteType | Criação simples de um formulário com datasets determinando o tipo da persistência (Formulário ou Lista). createSimpleCardIndexWithDatasetPersisteType (String user, String password, int companyId, int parentDocumentId, String publisherId, String documentDescription, String cardDescription, String datasetName, AttachmentArray attachments, CardEventDtoArray customEvents, Integer persistenceType) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa; - parentDocumentId: número do formulário. - publisherId: código do autor. - documentDescription: descrição. - cardDescription: nome. - datasetName: nome do dataset. - attachments: arquivo anexo. - customEvents: eventos. - persistenceType: tipo da persistência que será utilizada (0 = Formulário / 1 = Lista). Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray) . Estrutura de retorno com sucesso ``` 1 Cadastro de clientes 271 1000 ok ``` Estrutura de retorno com erro ``` 0 0 0 Usuário sem permissão para publicar documento nesta pasta! ``` |\n| getActiveCardIndex | Retorna o formulário ativo. Método: getActiveCardIndex (String user, String password, int companyId, int documentId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do formulário. - colleagueId: número do usuário. Retorno: [DocumentDtoArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto). |\n| getAttachmentsList | Retorna a lista de anexos do formulário. Método: getAttachmentsList (String user, String password, int companyId, int documentId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do formulário. Retorno: StringArray, com o nome dos anexos. |\n| getCardIndexContent | Retorna o conteúdo de um formulário. Método: getCardIndexContent (String user, String password, int companyId, int documentId, String colleagueId, int version, String nomeArquivo) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do formulário. - colleagueId : matrícula do usuário para a verificação de permissão nos formulários. - version: número da versão do formulário. - nomeArquivo: nome do arquivo anexo. Retorno: Uma lista de byte[]. |\n| getCardIndexesWithoutApprover | Retorna os formulários sem aprovadores que o usuário tenha permissão. Método: getCardIndexesWithoutApprover(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId : matrícula do usuário para a verificação de permissão nos formulários. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getCustomizationEvents | Retorna os eventos do formulário. Método: getCustomizationEvents (String user, String password, int companyId, int documentId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do formulário. Retorno: [CardEventDtoArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-CardEventDtoArray). |\n| getFormFields | Retorna os campos do formulário. Método: getFormFields(String user, String password, int companyId, int documentId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do formulário. Retorno: Lista de String[] com o ID de cada campo do formulário. |\n| updateSimpleCardIndex | Atualização simples do formulário. Método: updateSimpleCardIndex (String user, String password, int companyId, int documentId, String publisherId, String cardDescription, String descriptionField, AttachmentArray attachments, CardEventDtoArray customEvents) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do formulário. - publisherId: código do autor. - cardDescription: nome. - descriptionField: descrição. - attachments: arquivo anexo. - customEvents: eventos. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Cadastro de clientes 271 1000 ok ``` Estrutura de retorno com erro ``` 0 0 0 Usuário sem permissão para publicar documento nesta pasta! ``` |\n| updateSimpleCardIndexWithDataset | Atualização simples do formulário com datasets. Método: updateSimpleCardIndexWithDataset (String user, String password, int companyId, int documentId, String publisherId, String cardDescription, String descriptionField, String datasetName, AttachmentArray attachments, CardEventDtoArray customEvents) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do formulário. - publisherId: código do autor. - cardDescription: nome. - descriptionField: descrição. - datasetName: nome do dataset. - attachments: arquivo anexo. - customEvents: eventos. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Cadastro de clientes 265 3000 ok ``` Estrutura de retorno com erro ``` 0 0 0 Usuário sem permissão para publicar documento nesta pasta! ``` |\n\n**Quadro 4: Métodos da CardIndexService.**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [CardIndexServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/CardIndexServiceClient.java?version=1&modificationDate=1378474739000&api=v2), esta exemplifica a utilização dos principais métodos da classe CardIndexService.\n\n# ECMCardService\n\nWebservice responsável por realizar operações referentes a formulários no fluig. Pode ser utilizado para criar, alterar, excluir e pesquisar formulários, entre outros recursos.\n\n#### Exemplos de utilização\n\nFaça o download da classe [CardServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/CardServiceClient.java?version=1&modificationDate=1378474773000&api=v2), esta exemplifica a utilização dos principais métodos da classe CardService, que identifica os parametros a serem passados no carddtos.\n\nPara visualizar um exemplo de montagem do xml, clique em [download](https://tdn.totvs.com/download/attachments/73084007/cardService.xml?version=1&modificationDate=1526308021000&api=v2).\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| create | Cria um registro de formulário. Método: create(int companyId, String user, String password, CardDto[] carddtos) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - carddtos: formulário que será criado. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Cliente 01 287 1000 ok ``` Estrutura de retorno com erro ``` 0 0 0 Usuário sem permissão para publicar documento nesta pasta! ``` |\n| deleteCard | Exclui um formulário e envia para a lixeira. Método: deleteCard(int companyId, String user, String password, int cardId) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - cardId: número do formulário. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t \t 286 \t 0 \t ok \t ``` Estrutura de retorno com erro ``` 0 0 0 Ficha não encontrada: 287 ``` |\n| getCardVersion | Retorna a versão de um formulário. Método: getCardVersion(int companyId, String user, String password, int nrDocumentId, int version, String colleagueId) Método: Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - nrDocumentId: número do formulário. - version: versão do formulário. - colleagueId: matrícula do usuário. Retorno: CardDto[], lista com ID do campo e seus valores. |\n| updateCard | Altera os metadados de um formulário. Método: updateCard(int companyId, String user, String password, CardDto[] cardDtos, Attachment[] attachs, [DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)[] docsecurity, ApproverDto[] docapprovers, RelatedDocumentDto[] reldocs) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - cardDtos: formulário que será alterado. - attachs: anexos do formulário. - docsecurity: segurança do formulário. - docapprovers: aprovadores do formulário. - reldocs: documentos relacionados do formulário. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Cliente 01 287 2000 ok ``` Estrutura de retorno com erro ``` 0 0 0 Usuário sem permissão para publicar documento nesta pasta! ``` |\n| updateCardData | Altera os campos de um formulário. Método: updateCardData(int companyId, String user, String password, int cardId, CardFieldDto[] [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData)) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - cardId: número do formulário. - [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData): campos do formulário que serão alterados. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Cliente 01 287 2000 ok ``` Estrutura de retorno com erro ``` 0 0 0 Usuário sem permissão para publicar documento nesta pasta! ``` |\n\n**Quadro 5: Métodos da CardService.**\n\n# ECMColleagueGroupService\n\nWebservice responsável por realizar operações referentes aos grupos de usuários no fluig. Pode ser utilizado para relacionar um usuário a um grupo de usuários e serve também para alterar, excluir e pesquisar esses relacionamentos criados." }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createColleagueGroup | Associa um usuário a um grupo. Método: createColleagueGroup(String username, String password, int companyId, ColleagueGroupDto[] grupo\\_colaborador) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa; - grupo\\_colaborador: grupo que estará associado a um usuário. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok null ``` |\n| deleteColleagueGroup | Exclui um usuário de um grupo. Método: deleteColleagueGroup(String username, String password, int companyId, String groupId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - groupId: código do grupo. - colleagueId: matrícula do usuário. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok Não foi possível remover o colaborador: Administrador ``` |\n| getAllColleagueGroups | Retorna todos os grupos que possuem usuários relacionados. Método: getAllColleagueGroups(String username, String password, int companyId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: ColleagueGroupDto[]. |\n| getColleagueGroup | Retorna somente um grupo que determinado usuário participa. Método: getColleagueGroup(String username, String password, int companyId, String groupId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - groupId: código do grupo. - colleagueId: matrícula do usuário. Retorno: ColleagueGroupDto[]. Atributos de Retorno: - colleagueId - companyId - groupId |\n| getColleagueGroupsByColleagueId | Retorna os grupos que um usuário participa. Método: getColleagueGroupsByColleagueId(String username, String password, int companyId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: ColleagueGroupDto[]. Atributos de Retorno: - colleagueId - companyId - groupId |\n| getColleagueGroupsByGroupId | Retorna os usuários que participam de um grupo de usuários. Método: getColleagueGroupsByGroupId(String username, String password, int companyId, String groupId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - groupId: código do grupo. Retorno: ColleagueGroupDto[]. Atributos de Retorno: - colleagueId - companyId - groupId |\n| updateColleagueGroup | Atenção O método updateColleagueGroup foi depreciado, portanto não é recomendada a sua utilização em desenvolvimentos sobre a plataforma. Altera a associação de um usuário a um grupo. Método: updateColleagueGroup(String username, String password, int companyId, ColleagueGroupDto[] grupo\\_colaborador) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - grupo\\_colaborador: grupo de usuários que será alterado. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok null ``` |\n\n**Quadro 6: Métodos da ColleagueGroupService.**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [ColleagueGroupServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/GroupServiceClient.java?version=1&modificationDate=1409227367000&api=v2), esta exemplifica a utilização dos principais métodos da classe ColleagueGroupService.\n\n# ECMColleagueReplacementService\n\nWebservice responsável por realizar operações referentes a usuários substitutos no fluig. Pode ser utilizado para criar, alterar, excluir e pesquisar usuários substitutos, entre outros recursos.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createColleagueReplacement | Cria um substituto. Método: createColleagueReplacement (String username, String password, int companyId, [ColleagueReplacementDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueReplacementDto) crDto) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - crDto: cadastro do substituto. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` NOK Não foi possível criar o Substituto: Data de início do período deve ser menor que a data final! ``` |\n| deleteColleagueReplacement | Exclui o cadastro de um substituto. Método: deleteColleagueReplacement(String username, String password, int companyId, String colleagueId, String replacementId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário origem. - replacementId: matrícula do usuário substituto. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` result>NOK Não foi encontrado o substituto com os parâmetros informados! ``` |\n| getColleagueReplacement | Retorna um substituto de um usuário. Método: getColleagueReplacement(String username, String password, int companyId, String colleagueId, String replacementId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário origem. - replacementId: matrícula do usuário substituto. Retorno: [ColleagueReplacementDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueReplacementDto). |\n| getReplacementsOfUser | Retorna todos os substitutos de um usuário. Método: getReplacementsOfUser(String username, String password, int companyId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário origem. Retorno: [ColleagueReplacementDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueReplacementDto). |\n| getValidReplacedUsers | Retorna todos os usuário substituídos por um substituto válido. Método: getValidReplacedUsers(String username, String password, int companyId, String replacementId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa; - replacementId: matrícula do usuário substituto. Retorno: [ColleagueReplacementDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueReplacementDto). |\n| getValidReplacement | Retorna um substituto válido de um usuário. Método: getValidReplacement(String username, String password, int companyId, String colleagueId, String replacementId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário origem. - replacementId: matrícula do usuário substituto. Retorno: [ColleagueReplacementDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueReplacementDto). |\n| getValidReplacementsOfUser | Retorna todos os substitutos válidos de um usuário. Método: getValidReplacementsOfUser(String username, String password, int companyId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa; - colleagueId: matrícula do usuário origem. Retorno: [ColleagueReplacementDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueReplacementDto). |\n| updateColleagueReplacement | Altera o cadastro de um substituto. Método: updateColleagueReplacement (String username, String password, int companyId, [ColleagueReplacementDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueReplacementDto) crDto) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - crDto: cadastro do usuário. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` NOK Não foi encontrado o substituto com os parâmetros informados! ``` |\n\n**Quadro 7: Métodos da ColleagueReplacementService**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [ECMColleagueReplacementService.java](https://git.fluig.com/projects/SAMPLES/repos/samples-webservice/browse/src/samples/ECMColleagueReplacementService.java), esta exemplifica a utilização dos principais métodos da classe ColleagueReplacementService.\n\n# ECMColleagueService\n\nWebservice responsável por realizar operações referentes a usuários no fluig. Pode ser utilizado para criar, alterar, excluir e pesquisar usuários, entre outros recursos.\n\nAtenção!\n\nOs métodos createColleague, createColleaguewithDependencies, updateColleague e updateColleaguewithDependencies, em um dos seus parâmetros, recebe uma lista de [ColleagueDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto), nos objetos destas listas os valores para os campos de senha (*password*) devem ser criptografados com o algoritmo de *hash*MD5, exceto no caso de possuir o identity configurado, neste caso a senha deverá ser passada normalmente sem a criptografia.\n\nUtilizado o *hash*MD5 no e-mail contendo os dados do usuário criado, é regra de negócio o campo senha ser apresentado em branco.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createColleague | Cria um usuário. Método: createColleague(String username, String password, int companyId, [ColleagueDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto)[] colleagues) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagues: usuários. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok Administrador já cadastrado. ``` |\n| createColleaguewithDependencies | Cria um usuário com grupos e papéis. Método: createColleaguewithDependencies(String username, String password, int companyId, [ColleagueDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto)[] colleagues, [GroupDto](../Guia de Propriedades dos Objetos.md)[] grupos, [WorkflowRoleDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowRoleDto) papeis) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagues: usuários. - grupos: grupos. - papeis: papéis. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok Administrador já cadastrado. ``` |\n| getColleague | Retorna um usuário. Método: getColleague(String username, String password, int companyId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [ColleagueDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto)[]. |\n| getColleagueByLogin | Retorna o usuário a partir do login. Método: getColleagueByLogin(String username, String password) Parâmetros: - username: login do usuário. - password: senha do usuário. Retorno: [ColleagueDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto)[]. |\n| getColleagues | Retorna todos os usuários ativos. Método: getColleagues(String username, String password, int companyId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: [ColleagueDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto)[]. |\n| getColleaguesMail | Retorna um usuário utilizando um e-mail. Método: getColleaguesMail(String username, String password, int companyId, String mail) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - mail: e-mail do usuário. Retorno: [ColleagueDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto)[]. Estrutura de retorno com sucesso ``` true true adm Administrador 1 pt_BR PT_BR 3.0.35.0 true true Informática adm adm@mail.com 0 0 0.0 Default ``` |\n| getColleagueWithMap | Retorna uma mensagem informando se o usuário foi criado corretamente. Método: getColleagueWithMap(String colleagueXML, String username, String password) Parâmetros: - username: login do usuário. - password: senha do usuário. - colleagueXML: lista normalizada de documentos. Retorno: String. |\n| getGroups | Retorna os grupos que o usuário participa. Método: getGroups(String username, String password, int companyId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [GroupDto](../Guia de Propriedades dos Objetos.md)[]. |\n| getSimpleColleague | Retorna o usuário. Método: getSimpleColleague(String username, String password) Parâmetros: - username: login do usuário. - password: senha do usuário. Retorno: [ColleagueDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto)[]. |\n| getSummaryColleagues | Retorna todos os usuários ativos. Método: getSummaryColleagues(int companyId) Parâmetros: - companyId: código da empresa. Retorno: [ColleagueDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto)[]. |\n| removeColleague | Desativa um usuário. Método: removeColleague(String username, String password, int companyId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` Usuários do tipo 'administrador' não podem ser desativados! ``` |\n| activateColleague | Ativa um usuário. Método: activateColleague(String username, String password, int companyId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` Login e senha inválidos ``` |\n| updateColleague | Altera um usuário. Método: updateColleague(String username, String password, int companyId, [ColleagueDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto)[] colleagues) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagues: usuários. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok Volume Físico inexistente ou não é do tipo Meus Documentos ``` |\n| updateColleaguewithDependencies | Esse método altera um usuário com grupos e papéis, permite adicionar os papéis a um usuário. Método: updateColleaguewithDependencies(String username, String password, int companyId, [ColleagueDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ColleagueDto)[] colleagues, [GroupDto](../Guia de Propriedades dos Objetos.md)[] grupos, [WorkflowRoleDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowRoleDto) papeis) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagues: usuários. - grupos: grupos. - papeis: papéis. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok null ``` |\n| validateColleagueLogin | Valida o acesso de um usuário no produto. Método: validateColleagueLogin(int companyId, String colleagueId, String password) Parâmetros: - companyId: código da empresa. - colleagueId: matrícula do usuário. - password: senha do usuário. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` NOK Login e senha inválidos ``` |\n| getRoles | Retorna os papéis associados ao usuário Método: getRoles(String username, String password, int companyId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [WorkflowRoleDto[]](https://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowRoleDto). |\n\n**Quadro 8: Métodos da ColleagueService.**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [ColleagueServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/ColleagueServiceClient.java?version=4&modificationDate=1453899861000&api=v2), esta exemplifica a utilização dos principais métodos da classe ColleagueService.\n\n# ECMCompanyService\n\nWebservice responsável por realizar operações referentes à empresa no fluig. Pode ser utilizado para criar, alterar, excluir e pesquisar empresas, entre outros recursos.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createCompany | Cria uma empresa no fluig. Método: createCompany(String username, String password, String companyId, String description, String urlAccessName, String phisicalPath, String webdeskServer, String webPort) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - description: descrição da empresa. - urlAccessName: URL de acesso. - phisicalPath: caminho físico. - webdeskServer: servidor. - webPort: porta. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` NOK: Empresa com o Id 1 já cadastrado. ``` |\n| getCompanies | Retorna todas as empresas cadastradas no fluig. Método: getCompanies(String username, String password, String companyId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: CompanyDto[]. |\n| getCompany | Retorna uma empresa cadastrada no fluig. Método: getCompany(int companyId) Parâmetros: - companyId: código da empresa. Retorno: CompanyDto. |\n| updateCompany | Altera uma empresa no fluig. Método: updateCompany(String username, String password, String companyId, String description, String urlAccessName, String phisicalPath, String webdeskServer, String webPort) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - description: descrição da empresa. - urlAccessName: URL de acesso. - phisicalPath: caminho físico. - webdeskServer: servidor. - webPort: porta. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` NOK:Login e senha inválidos ``` |\n\n**Quadro 9: Métodos da CompanyService**\n\n#### Exemplo de utilização" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\nFaça o download da classe [CompanyServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/CompanyServiceClient.java?version=1&modificationDate=1378474967000&api=v2), esta exemplifica a utilização dos principais métodos da classe CompanyService.\n\n# ECMCustomFieldsService\n\nWebservice responsável por interagir com os campos customizados do fluig. Pode ser utilizado para criar, alterar, excluir e pesquisar campos customizados, entre outros recursos.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createCustomFields | Cria um campo customizado. Método: createCustomFields(String user, String password, int companyId, [CustomFieldsDto](../Guia de Propriedades dos Objetos.md)[] customFieldsDto) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - customFieldsDto: campo customizado que será criado. Retorno: String, retorna OK caso os parâmetros da requisição estejam corretos. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` ERROR: Ja existe um metadado customizado com este código! ``` |\n| getAllCustomField | Retorna todos os campos customizados. Método: getAllCustomField(String user, String password, int companyId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: [CustomFieldsDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-CustomFieldsDto). |\n| getAllDocumentCustomField | Retorna todos os campos customizados de um documento. Método: getAllDocumentCustomField(String user, String password, int companyId, int documentId, int version) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do documento. - version: versão do documento. Retorno: [DocumentCustomFieldsDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentCustomFieldsDto). |\n| removeCustomField | Exclui um campo customizado. Método: removeCustomField(String user, String password, int companyId, String customFieldsId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - customFieldsId: código do campo customizado. Retorno: String, retorna OK caso os parâmetros da requisição estejam corretos.  Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` ERROR: Metadado customizado não pode ser encontrado! ``` |\n| removeDocumentCustomField | Exclui um campo customizado de um documento. Método: removeDocumentCustomField(String user, String password, int companyId, String customFieldsId, int documentId, int version) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - customFieldsId: código do campo customizado. - documentId: número do documento. - version: versão do documento. Retorno: Retorno: String, retorna OK caso os parâmetros da requisição estejam corretos. . Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` ERROR: Metadado customizado não podem ser encontrado para este documento! ``` |\n| setDocumentCustomFields | Cria ou altera um campo customizado em um documento. Método: setDocumentCustomFields(String user, String password, int companyId, [DocumentCustomFieldsDto](../Guia de Propriedades dos Objetos.md)[] documentCustomFieldsDto) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentCustomFieldsDto: documento com campo customizado. Retorno: String, retorna OK caso os parâmetros da requisição estejam corretos.  Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` ERROR: Não foi possível incluir a entidade: Não existe metadado customizado cadastrado com este código ``` |\n| updateCustomFields | Altera um campo customizado. Método: updateCustomFields(String user, String password, int companyId, [CustomFieldsDto](../Guia de Propriedades dos Objetos.md)[] customFieldsDto) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - customFieldsDto: campo customizado que será alterado. Retorno: String, retorna OK caso os parâmetros da requisição estejam corretos.  Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` ERROR: Metadado customizado não podem ser encontrado! ``` |\n\n**Quadro 10: Métodos da CustomFieldsService**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [CustomFieldsServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/CustomFieldsClient.java?version=1&modificationDate=1378475008000&api=v2), esta exemplifica a utilização dos principais métodos da classe CustomFieldsService.\n\n# ECMDashBoardService\n\nWebservice responsável por interagir com a central de tarefas do fluig. Pode ser utilizado para pesquisar as informações que estão disponíveis na central de tarefas.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| findMyDocuments | Retorna os documentos do usuário que precisam ser aprovados. Método: findMyDocuments(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| findMyDocumentsOnDemand | Retorna os documentos do usuário que precisam ser aprovados, paginados. Método: findMyDocumentsOnDemand(String user, String password, int companyId, String colleagueId, int limit, int lastRowId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - limit: número de registros a serem retornados. - lastRowId: última linha retornada. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| findDocumentsToApprove | Retorna os documentos que o usuário precisa aprovar. Método: findDocumentsToApprove(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| findDocumentsToApproveOnDemand | Retorna os documentos que o usuário precisa aprovar, paginados. Método: findDocumentsToApproveOnDemand(String user, String password, int companyId, String colleagueId, int limit, int lastRowId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - limit: número de registros a serem retornados. - lastRowId: última linha retornada. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| findAgreementDocuments | Retorna os documentos do usuário que estão em consenso. Método: findAgreementDocuments(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| findCheckoutDocuments | Retorna os documentos do usuário que estão em checkout. Método: findCheckoutDocuments(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| findCancelledTasks | Retorna as tarefas atribuidas ao usuário que foram canceladas. Método: findCancelledTasks(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [WorkflowProcessDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowProcessDto). |\n| findCompletedTasks | Retorna as tarefas atribuidas ao usuário que foram finalizadas. Método: findCompletedTasks(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [WorkflowProcessDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowProcessDto). |\n| findConsensusTasks | Retorna as tarefas atribuidas ao usuário que estão em consenso. Método: findConsensusTasks(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [WorkflowProcessDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowProcessDto). |\n| findTransferredTasks | Retorna as tarefas atribuidas ao usuário que foram transferidas. Método: findTransferredTasks(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [WorkflowProcessDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowProcessDto). |\n| findWorkflowTasks | Retorna as tarefas do usuário que estão abertas. Método: findWorkflowTasks(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Atenção! O **colleagueId** pode ser preenchido com Pool:Role:Id ou Pool:Group:Id substituindo o Id pelo código de um papel ou de um grupo, respectivamente, para retornar as solicitações referentes a eles. Retorno: [WorkflowProcessDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowProcessDto). |\n| findWorkflowTasksOnDemand | Retorna as tarefas do usuário que estão abertas, paginadas. Método: findWorkflowTasksOnDemand(String user, String password, int companyId, String colleagueId, int limit, int lastRowId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - limit: número de registros a serem retornados. - lastRowId: última linha retornada. Atenção! O **colleagueId** pode ser preenchido com Pool:Role:Id ou Pool:Group:Id substituindo o Id pelo código de um papel ou de um grupo, respectivamente, para retornar as solicitações referentes a eles. Retorno: [WorkflowProcessDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowProcessDto). |\n| findMyRequests | Retorna as solicitações abertas que foram inicializadas pelo usuário. Método: findMyRequests(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [WorkflowProcessDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowProcessDto). |\n| findMyRequestsOnDemand | Retorna as solicitações abertas que foram inicializadas pelo usuário, paginadas. Método: findMyRequestsOnDemand(String user, String password, int companyId, String colleagueId, int limit, int lastRowId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - limit: número de registros a serem retornados. - lastRowId: última linha retornada. Retorno: [WorkflowProcessDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowProcessDto). |\n| findMyManagerTasks | Retorna as tarefas gerenciadas pelo usuário. Método: findMyManagerTasks(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [WorkflowProcessDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowProcessDto). |\n| findExpiredWorkflowTasks | Retorna as tarefas do usuário que estão em atraso Método: findExpiredWorkflowTasks(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Atenção! O **colleagueId** pode ser preenchido com Pool:Role:Id ou Pool:Group:Id substituindo o Id pelo código de um papel ou de um grupo, respectivamente, para retornar as solicitações referentes a eles. Retorno: [WorkflowProcessDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowProcessDto). |\n| fillStatusTask | Retorna a quantidade de tarefas atrasadas, no prazo e sem prazo de um usuário. Método: fillStatusTask(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Atenção! O **colleagueId** pode ser preenchido com Pool:Role:Id ou Pool:Group:Id substituindo o Id pelo código de um papel ou de um grupo, respectivamente, para retornar as solicitações referentes a eles. Retorno: List de int[], com a quantidade de tarefas atrasadas. |\n| fillChronoTasks | Retorna a quantidade de tarefas com prazo de conclusão que foram atribuídas ao usuário e não foram finalizadas. Método: fillChronoTasks(String user, String password, int companyId, String colleagueId, int yearIni, int yearFin, int mounthIni, int mounthFin, int dayIni, int dayFin, int kindTask) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - yearIni: ano inicial. - yearFin: ano final. - mounthIni: mês inicial. - mounthFin: mês final. - dayIni: dia inicial. - dayFin: dia final. - kindTask: tipo da tarefa. Atenção! O **colleagueId** pode ser preenchido com Pool:Role:Id ou Pool:Group:Id substituindo o Id pelo código de um papel ou de um grupo, respectivamente, para retornar as solicitações referentes a eles. Retorno: : Lista de int[], com a quantidade de tarefas com prazo de conclusão atribuída ao usuário. |\n| fillTypeTasks | Retorna os tipos de tarefas que o usuário possui. Método: fillTypeTasks(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [TaskVODto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-TaskVODto). |\n| fillTypeTasksOfReplacement | Retorna os tipos de tarefas que o usuário substituto possui. Método: fillTypeTasksOfReplacement(String user, String password, int companyId, String colleagueId, String replacementId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - replacementId: matrícula do usuário substituto. Retorno: [TaskVODto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-TaskVODto). |\n| getOpenTasksByColleagueGroups | Retorna as tarefas atribuídas a um grupo que o usuário participa. Método: getOpenTasksByColleagueGroups(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [WorkflowTaskDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowTaskDto). |\n| getOpenTasksByColleagueGroupsOnDemand | Retorna as tarefas atribuídas a um grupo que o usuário participa, paginadas. Método: getOpenTasksByColleagueGroupsOnDemand(String user, String password, int companyId, String colleagueId, int limit, int lastRowId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - limit: número de registros a serem retornados. - lastRowId: última linha retornada. Retorno: [WorkflowTaskDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowTaskDto). |\n| getOpenTasksByColleagueRoles | Retorna as tarefas atribuídas a um papel que o usuário participa. Método: getOpenTasksByColleagueRoles(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [WorkflowTaskDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowTaskDto). |\n| getOpenTasksByColleagueRolesOnDemand | Retorna as tarefas atribuídas a um papel workflow que o usuário participa, paginadas. Método: getOpenTasksByColleagueRolesOnDemand(String user, String password, int companyId, String colleagueId, int limit, int lastRowId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - limit: número de registros a serem retornados. - lastRowId: última linha retornada. Retorno: [WorkflowTaskDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowTaskDto). |\n| getSummaryRequests | Retorna os contadores de pendências da Home. Método: getSummaryRequests(int companyId, String user, String password, String colleagueId) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - colleagueId: matrícula do usuário. Atenção! O **colleagueId** pode ser preenchido com Pool:Role:Id ou Pool:Group:Id substituindo o Id pelo código de um papel ou de um grupo, respectivamente, para retornar as solicitações referentes a eles. Retorno: [HomeRequestSummaryDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-HomeRequestSummaryDto). |\n| getUrlEcm | Retorna a url do servidor. Método: getUrlEcm(long companyId) Parâmetros: - companyId: código da empresa. Retorno: String , com a url da empresa. |\n\n**Quadro 11: Métodos da ECMDashBoardService**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [ECMDashBoardService.java](https://git.fluig.com/projects/SAMPLES/repos/samples-webservice/browse/src/samples/ECMDashBoardService.java), esta exemplifica a utilização dos principais métodos da classe ECMDashBoardService.\n\n# ECMDataServiceService\n\nWebservice responsável por interagir com os serviços externos do fluig. Pode ser utilizado para criar, alterar, excluir e pesquisar os serviços externos existentes.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createDataService | Cria um serviço externo. Método: createDataService(int companyId, String user, String password, DataServiceDto[] dataServiceDto) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - dataServiceDto: serviço externo que será criado. Retorno: String. |\n| deleteDataService | Remove um serviço externo. Método: deleteDataService(int companyId, String user, String password, String dataServiceName) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - dataServiceName: nome do serviço externo que será removido. Retorno: void. |\n| getAllServices | Retorna todos os serviços externos cadastrados. Método: getAllServices(int companyId, String user, String password) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. Retorno: dataServiceDto[]. |\n| loadDataService | Retorna um serviço externo. Método: loadDataService(int companyId, String user, String password, String dataServiceName) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - dataServiceName: nome do serviço externo. Retorno: dataServiceDto. |\n| updateDataService | Atualiza um serviço externo. Método: updateDataService(int companyId, String user, String password, DataServiceDto[] dataServiceDto) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - dataServiceDto: serviço externo que será atualizado. Retorno: void. |\n| createDataServiceAuthenticated | Cria um serviço externo com autenticação Método: createDataServiceAuthenticated(int companyId, String user, String password, DataServiceDto[] dataServiceDto, OauthDTO oauthDTO) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - dataServiceDto: serviço externo que será criado. - oauthDTO:  objeto com as configurações para a autenticação no serviço. Retorno: String. |\n| updateDataServiceAuthenticated | Atualiza um serviço externo com autenticação Método: updateDataServiceAuthenticated(int companyId, String user, String password, DataServiceDto[] dataServiceDto, OauthDTO oauthDTO) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - dataServiceDto: serviço externo que será atualizado. - oauthDTO:  objeto com as configurações para a autenticação no serviço. Retorno: void. |\n\n**Quadro 12: Métodos da DataServiceService.**\n\n# ECMDatasetService\n\nWebservice responsável por interagir com os datasets do fluig. Pode ser utilizado para pesquisar os datasets existentes." }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| addDataset | Cria um dataset. Método: addDataset(int companyId, String user, String password, String datasetName, String description, String impl) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - datasetName: nome do dataset que será criado. - description: descrição do dataset. - impl: implementação para criação do dataset. Retorno: String. |\n| deleteDataset | Remove um dataset. Método: deleteDataset(int companyId, String user, String password, String datasetName) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - datasetName: nome do dataset que será removido. Retorno: void. |\n| getAvailableDatasets | Retorna todos os datasets disponíveis. Método: getAvailableDatasets(int companyId, String user, String password) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. Retorno: Object[]. |\n| getDataset | Retorna as informações de um dataset. Método: getDataset(int companyId, String user, String password, String name, String[] fields, SearchConstraintDto[] constraintsDto, String[] order) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - name: nome do dataset. - fields: campos que serão retornados do dataset. - constraintsDto: filtro dos registros que irão compor o dataset. - order: campos utilizados para ordenar o dataset. Retorno: DatasetDto. |\n| updateDataset | Atualiza um dataset. Método: updateDataset(int companyId, String user, String password, String datasetName, String description, String impl) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - datasetName: nome do dataset que será atualizado. - description: descrição do dataset. - impl: implementação do dataset. Retorno: void. |\n\n**Quadro 13: Métodos da DatasetService**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [DatasetServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/DatasetServiceClient.java?version=2&modificationDate=1378475205000&api=v2), esta exemplifica a utilização dos principais métodos da classe DatasetService.\n\n# ECMDocumentService\n\nWebservice responsável por realizar operações referentes a documentos do fluig. Pode ser utilizado para criar, alterar, excluir e procurar documentos, entre outros recursos.\n\nDica!\n\nPara transferir arquivos para a pasta de upload é recomendado a utilização do protocolo FTP. Para mais detalhes sobre o procedimento acesse a documentação [Utilizando o protocolo FTP](http://tdn.totvs.com/x/zABlDw).\n\nNão recomendamos passar *via webservice* arquivos convertidos em base 64 na tag ** pois existe uma limitação de quantidade da String. Indicamos a utilização em arquivos pequenos de no máximo 5mb\n\nFaça [download](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse/soap-xml-document-service) do exemplo contido em nosso repositório utilizando o arquivo **soap-xml-document-service**.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| approveDocument | Aprova ou reprova documento pendente de aprovação. Metodo: approveDocument(int companyId, String userId, String password, int documentId, int version, String approverId, boolean approved, String observation) Parâmetros: - user: código do usuário de integração. - password: senha do usuário de integração. - companyId: código da empresa. - documentId: código do documento a ser aprovado. - version: versão do documento a ser aprovado. - approverId: código do aprovador - approved: true se aprova o documento e false caso o documento sera reprovado. - observation: observação da aprovação ou rejeição. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 293 0 ok ``` Estrutura de retorno com erro ``` 0 0 0 Documento já está aprovado. ``` |\n| copyDocumentToUploadArea | Copia os arquivos (principal e anexos) de um documento para a area de upload do usuário. Isto permite que os documentos tornem-se acessíveis via FTP. Método: copyDocumentToUploadArea(String user, String password, int companyId, int documentId, int version, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do documento que será copiado. - version: versão do documento - colleagueId: matrícula do usuário cuja área de upload será utilizada Retorno: String[] nome dos arquivos que foram disponibilizados na área de upload Estrutura de retorno com sucesso ``` Política de uso.pdf ``` Estrutura de retorno com erro ``` O usuário não tem permissão para acessar o documento ou a versão do documento é inválida. ``` |\n| createDocument | Cria um documento. Método: createDocument(String user, String password, int companyId, [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[] docDtos, [Attachment](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-Attachment)[] attachs,  [DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)[] docSecurity, [ApproverDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApproverDto)[] docApprovers, [RelatedDocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-RelatedDocumentDto)[] relDocs) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - docDtos: documento que será publicado (mais detalhes do parâmetro [aqui](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)). - attachs: arquivo anexado na publicação (mais detalhes do parâmetro [aqui](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-Attachment)). - docSecurity: segurança do documento que será publicado (mais detalhes do parâmetro [aqui](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)). - docApprovers: aprovadores do documento que será publicado (mais detalhes do parâmetro [aqui](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApproverDto)). - relDocs: documentos relacionados ao documento que será publicado (mais detalhes do parâmetro [aqui](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-RelatedDocumentDto)). [Exemplo de XML](https://tdn.totvs.com/download/attachments/73084007/createDocument.xml?version=1&modificationDate=1559583184060&api=v2). Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Política de uso 295 1000 ok ``` Estrutura de retorno com erro ``` 0 0 0 Arquivo principal do documento deve ser informado! ``` Veja nosso exemplo no [repositório do fluig](https://git.fluig.com/projects/SAMPLES). Utilize o arquivo **[dataset-create-document](https://git.fluig.com/projects/SAMPLES/repos/datasets/browse/dataset-create-document)**. |\n| createDocumentWithApprovementLevels | Cria um documento com nível de aprovação. Método: createDocumentWithApprovementLevels(String user, String password, int companyId, [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[] docDtos, Attachment[] attachs, [DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)[] docSecurity, [ApproverWithLevelDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApproverWithLevelDto)[] docApproversLevels, [ApprovalLevelDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApprovalLevelDto)[] levels, RelatedDocumentDto[] relDocs) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - docDtos: documento que será publicado. - attachs: arquivo anexado na publicação. - docSecurity: segurança do documento que será publicado. - docApproversLevel: nível de aprovação que os aprovadores do documento estão inseridos. - levels: níveis de aprovação que o documento terá. - relDocs: documentos relacionados ao documento que será publicado. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Política de uso 296 1000 ok ``` Estrutura de retorno com erro ``` 0 0 0 Nao foi informado um ApprovalLevelDto com o levelId 1 ``` |\n| createSimpleDocument | Cria um documento simples. Método: createSimpleDocument(String user, String password, int company, int parentDocumentId, String publisherId, String documentDescription, Attachment[] attachments) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - parentDocumentId: número da pasta pai. - publisherId: matrícula do usuário que publicará o documento. - documentDescription: descrição do documento. - attachments: arquivo anexado na publicação (para utilização via TDS é necessário instanciar a classe Attachment. Confira um exemplo de utilização em [Criação de documento a partir do método createSimpleDocument](http://tdn.totvs.com/pages/viewpage.action?pageId=223914729)). Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t oioioi \t 299 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` 0 0 0 Arquivo Principal não encontrado C:\\fluig\\volume\\upload\\adm\\Política de uso.pdf\\ ``` |\n| createSimpleDocumentPrivate | Cria um documento simples na pasta particular. Método: createSimpleDocumentPrivate(String colleagueId, String password, int companyId, int parentDocumentId, String documentDescription, Attachment[] attachments) Parâmetros: - colleagueId: login do usuário. - password: senha do usuário. - companyId: código da empresa. - parentDocumentId: número da pasta pai. - documentDescription: descrição do documento. - attachments: arquivo anexado na publicação. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t oioioi \t 300 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` 0 0 0 Arquivo Principal não encontrado C:\\fluig\\volume\\upload\\adm\\Política de uso.pdf\\ ``` |\n| deleteDocument | Exclui um documento e o envia para a lixeira. Método: deleteDocument(String user, String password, int companyId, int documentId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do documento que será excluído. - colleagueId: matrícula do usuário. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t oioioi \t 300 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Documento inexistente ou permissão insuficiente. \t ``` |\n| destroyDocument | Exclui um documento da lixeira. Método: destroyDocument(String user, String password, int companyId, int documentId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do documento que será excluído. - colleagueId: matrícula do usuário. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t oioioi \t 300 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Por segurança, não é possível destruir o documento sem antes excluí-lo. \t ``` |\n| destroyDocumentApproval | Exclui documento pendente de aprovação. Metodo: destroyDocumentApproval(String userId, String password, int companyId, int documentId, String publisherId) Parâmetros: - user: código do usuário de integração. - password: senha do usuário de integração. - companyId: código da empresa. - documentId: código do documento a excluido. - publisherId: código do publicador. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t oioioi \t 298 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Documento não encontrado. \t ``` |\n| findMostPopularDocuments | Retorna os documentos mais acessados no fluig que o usuário tenha permissão de acesso. Método: findMostPopularDocuments(String user, String password, int companyId, String colleagueId, int nr\\_resultados) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - nr\\_resultados: quantidade de documentos que serão retornados. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. Atributos de Retorno: - accesCount - activeVersion - additionalComments - allowMuiltiCardsPerUser - approved - colleagueId - companyId - crc - createDate - datasetName - deleted - documentDescription - documentId - documentType - documentTypeId - downloadEnabled - draft - expirationDate - expires - iconId - imutable - indexed - inheritSecurity - isEncrypted - keyWord - lastModifiedDate - metaListId - metaListRecordId - parentDocumentId - permissionType - phisicalFile - phisicalFileSize - privateDocument - protectedCopy - publisherId - restrictionType - rowId - securityLevel - topicId - translated - UUID - updateIsoProperties - userNotify - validationStartDate - version - versionDescription - volumeId |\n| findMostPopularDocumentsOnDemand | Retorna os documentos mais acessados no fluig que o usuário tenha permissão de acesso, paginados. Método: findMostPopularDocuments(int companyId, String user, String password, String colleagueId, int limit, int lastRowId) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - colleagueId: matrícula do usuário. - limit: número de registros a serem retornados. - lastRowId: última linha retornada. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. Atributos de Retorno: - accesCount - activeVersion - additionalComments - allowMuiltiCardsPerUser - approved - colleagueId - companyId - crc - createDate - datasetName - deleted - documentDescription - documentId - documentType - documentTypeId - downloadEnabled - draft - expirationDate - expires - iconId - imutable - indexed - inheritSecurity - isEncrypted - keyWord - lastModifiedDate - metaListId - metaListRecordId - parentDocumentId - permissionType - phisicalFile - phisicalFileSize - privateDocument - protectedCopy - publisherId - restrictionType - rowId - securityLevel - topicId - translated - UUID - updateIsoProperties - userNotify - validationStartDate - version - versionDescription - volumeId |\n| findRecycledDocuments | Retorna os documentos da lixeira. Método: findRecycledDocuments(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. Atributos de Retorno: - accesCount - activeVersion - additionalComments - allowMuiltiCardsPerUser - approved - colleagueId - companyId - crc - createDate - datasetName - deleted - documentDescription - documentId - documentType - documentTypeId - downloadEnabled - draft - expirationDate - expires - iconId - imutable - indexed - inheritSecurity - isEncrypted - keyWord - lastModifiedDate - metaListId - metaListRecordId - parentDocumentId - permissionType - phisicalFile - phisicalFileSize - privateDocument - protectedCopy - publisherId - restrictionType - rowId - securityLevel - topicId - translated - UUID - updateIsoProperties - userNotify - validationStartDate - version - versionDescription - volumeId |\n| getActiveDocument | Retorna um documento ativo. Método: getActiveDocument(String user, String password, int companyId, int nrDocumentId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocumentId: número do documento. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getApprovers | Retorna os aprovadores de um documento. Método: getApprovers(String user, String password, int companyId, int nrDocumentId, int version) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocumentId: número do documento. - version: número da versão do documento. Retorno: [ApproverWithLevelDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApproverWithLevelDto)[]. Atributos de Retorno: - approverType - colleagueId - companyId - documentId - levelId - version |\n| getDocumentApprovalHistory | Retorna o histórico de aprovações do documento solicitado. Metodo: getDocumentApprovalHistory(String user, String password, int companyId, int documentId, int version) Parâmetros: - user: código do usuário de integração. - password: senha do usuário de integração. - companyId: código da empresa. - documentId: código do documento que se deseja visualizar o status. - version: versão do documento (caso seja informada a versão 0 sera solicitada a ultima versão do documento). Retorno: [DocumentApprovementHistoryDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentApprovementHistoryDto). Atributos de Retorno: - colleagueId - documentVersion - iterationSequence - levelId - movementSequence - observation - signed - status |\n| getDocumentApprovalStatus | Retorna o status do documento com relação a aprovação. O status do documento pode ser: 0 - Aprovado. 1 - Rejeitado. 2- Em aprovação. Método: getDocumentApprovalStatus(String user, String password, int companyId, int documentId, int version) Parâmetros: - user: código do usuário de integração. - password: senha do usuário de integração. - companyId: código da empresa. - documentId: código do documento que se deseja visualizar o status. - version: versão do documento (caso seja informada a versão 0 sera solicitada a ultima versão do documento). Retorno: [DocumentApprovalStatusDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentApprovalStatusDto). Atributos de Retorno: - companyId - documentId - status - version |\n| getDocumentByExternalId | Retorna um documento pelo código externo. Método: getDocumentByExternalId(String user, String password, int companyId, String externalDocumentId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - externalDocumentId: código externo do documento. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getDocumentContent | Retorna o byte do arquivo físico de um documento, caso o usuário tenha permissão para acessá-lo. Método: getDocumentContent(String user, String password, int companyId, int nrDocumentId, String colleagueId, int documentoVersao, String nomeArquivo) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocumentId: número do documento. - colleagueId: matrícula do usuário. - documentVersao: número da versão do documento. - nomeArquivo: nome do arquivo. Retorno: Lista de byte[]. |\n| getDocumentVersion | Retorna a versão de um documento. Método: getDocumentVersion(String user, String password, int companyId, int nrDocumentId, int version, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocumentId: número do documento. - version: número da versão do documento. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. Atributos de Retorno: - accesCount - activeVersion - additionalComments - allowMuiltiCardsPerUser - approved - colleagueId - companyId - crc - createDate - datasetName - deleted - documentDescription - documentId - documentType - documentTypeId - downloadEnabled - draft - expirationDate - expires - iconId - imutable - indexed - inheritSecurity - isEncrypted - keyWord - lastModifiedDate - metaListId - metaListRecordId - parentDocumentId - permissionType - phisicalFile - phisicalFileSize - privateDocument - protectedCopy - publisherId - restrictionType - rowId - securityLevel - topicId - translated - UUID - updateIsoProperties - userNotify - validationStartDate - version - versionDescription - volumeId |\n| getRelatedDocuments | Retorna todos os documentos relacionados de um documento. Método: getRelatedDocuments(String user, String password, int companyId, int nrDocumentId, int version) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocumentId: número do documento. - version: número da versão do documento. Retorno: [RelatedDocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-RelatedDocumentDto.1). Atributos de Retorno: - companyId - documentId - relatedDocumentId - version |\n| getReportSubjectId | Retorna o código do assunto de relatórios dentro do fluig. Método: getReportSubjectId(String user, String password, int companyId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: topicId : int. |\n| getSecurity | Retorna a segurança de um documento. Método: getSecurity(String user, String password, int company, int nrDocumentId, int version) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocumentId: número do documento. - version: número da versão do documento. Retorno: [DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)[]. Atributos de Retorno: - attributionType - attributionValue - companyId - documentId - permission - securityLevel - sequence - showContent - version |\n| getUserPermissions | Retorna as permissões do usuário sobre um documento. Método: getUserPermissions(int companyId, String user, int nrDocumentId, int version) Parâmetros: - companyId: código da empresa. - user: login do usuário. - nrDocumentId: número do documento. - version: número da versão do documento. Retorno: Integer, retorna o valor correspondente a permissão.. Atributos de Retorno: - result |\n| moveDocument | Move documentos para pasta destino. Método: moveDocument(String user, String password, int companyId, int[] documentIds, String colleagueId, int destfolder) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentIds: lista com os números dos documentos que serão movidos. - colleagueId: matrícula do usuário com permissão para mover o documento - destFolder: número da pasta de destino. Retorno: Lista String[]. Estrutura de retorno com sucesso ``` [OK] - 299 ``` Estrutura de retorno com erro ``` [NOK] - Usuário sem permissão para movimentar esse documento! Documento: 299. ``` |\n| removeSecurity | Remove a segurança de um documento. Método: removeSecurity(String user, String password, int companyId, int documentId, int version) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do documento. - version: número da versão do documento. Retorno: Não há retorno. |\n| restoreDocument | Restaura um documento da lixeira. Método: restoreDocument(String user, String password, int companyId, int documentId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número do documento que será restaurado. - colleagueId: matrícula do usuário. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t oioioi \t 297 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Usuário john não possui permissão para restaurar o documento 297 \t ``` |\n| updateDocument | Altera um documento. Método: updateDocument(String user, String password, int companyId, [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[] docDtos, [Attachment](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-Attachment)[] attachs,  [DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)[] docSecurity,[ApproverDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApproverDto)[] docApprovers, [RelatedDocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-RelatedDocumentDto)[] relDocs) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - docDtos: documento que será publicado (mais detalhes do parâmetro [aqui](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)). - attachs: arquivo anexado na publicação (mais detalhes do parâmetro [aqui](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-Attachment)). - docSecurity: segurança do documento que será publicado  (mais detalhes do parâmetro [aqui](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto) ). - docApprovers: aprovadores do documento que será publicado  (mais detalhes do parâmetro [aqui](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApproverDto) ). - relDocs: documentos relacionados ao documento que será publicado  (mais detalhes do parâmetro [aqui](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-RelatedDocumentDto) ). Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Política de uso 295 2000 ok ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t O usuário john não tem permissão para acessar o documento 295. \t ``` |\n| updateDocumentWithApprovementLevels | Altera um documento com nível de aprovação. Métodos: updateDocumentWithApprovementLevels(String user, String password, int companyId, [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[] docDtos, Attachment[] attach, [DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)[] docSecutiry, ApproverWithLevelDto[]  docApprovers, [ApprovalLevelDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApprovalLevelDto)[] levels, RelatedDocumentDto[] relDocs) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - docDtos: documento que será alterado. - attachs: arquivo anexado na alteração. - docSecurity: segurança do documento que será alterado. - docApprovers: nível de aprovação que os aprovadores do documento estão inseridos. - levels: níveis de aprovação que o documento terá. - relDocs: documentos relacionados ao documento que será alterado. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Política de uso 295 2000 ok ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t O usuário john não tem permissão para acessar o documento 295. \t ``` |\n| updateGroupSecurityType | Modifica o tipo da segurança dos grupos na permissão e na restrição. Existem duas opções que são representadas por um inteiro: 0 - TODOS os usuários dos Grupos. 1 - SOMENTE usuários comuns dos grupos. Método: updateGroupSecurityType(String user, String password, int companyId, int documentId, int version, int permissionType, int restrictionType, String colleagueId) Parâmetros: - user: código do usuário de integração. - password: senha do usuário de integração. - companyId: código da empresa. - documentId: código do documento. - version: versão do documento. - permissionType: tipo da permissão (0 - TODOS os usuários dos Grupos / 1 - SOMENTE usuários comuns dos grupos) - restrictionType: tipo da restrição (0 - TODOS os usuários dos Grupos / 1 - SOMENTE usuários comuns dos grupos) - colleagueId: matrícula do usuário Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Política de uso 295 2000 ok ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t O Documento herda segurança do pai, desmarque a opção para alterar esta propriedade! \t ``` |\n| updateSimpleDocument | Altera de forma simples um documento. Método: updateSimpleDocument(String username, String password, int companyId, int documentId, String publisherId, String documentDescription, Attachment[] attachments) Parâmetros: - username: login do usuário de integração. - password: senha do usuário de integração. - companyId: código da empresa. - documentId: número do documento que será alterado. - publisherId: matrícula do usuário que realizará a alteração do documento. - documentDescription: descrição do documento. - attachments: arquivos anexados na alteração. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Política de uso 295 3000 ok ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t O usuário john não tem permissão para acessar o documento 295. \t ``` |\n| validateIntegrationRequirements | Verifica a integração do usuário no fluig. Método: validateIntegrationRequirements (String user, String password, int companyId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` 1 Política de uso 295 3000 ok ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t O usuário john não tem permissão para acessar o documento 295. \t ``` |\n\n**Quadro 14: Métodos da DocumentService**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [DocumentServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/DocumentServiceClient.java?version=10&modificationDate=1435167467000&api=v2), esta exemplifica a utilização dos principais métodos da classe DocumentService.\n\nNota\n\nAlguns campos, entre eles *Approved*, *ApprovedDate*, *CreateDate*, *LastModifiedDate*, apesar de aparecerem no exemplo disposto não podem ser modificados, pois se tratam de campos de uso interno do sistema. \nOs campos são mantidos no objeto do Documento pois são necessários para o resgate dessas informações.\n\nIntegrações\n\nPara os métodos de criação de documento (createDocument, createSimpleDocument, etc...) pode-se utilizar um usuário para autenticação e outro para publicação, pois pode ser necessário validar a permissão de outro usuário no momento de criar o documento no fluig.\n\nNeste caso, quando o arquivo a ser publicado não é enviado na requisição (campo filecontent do parâmetro Attachment), ele poderá ser obtido na pasta de upload do usuário publicador, ou do usuário utilizado para autenticar no fluig via WS. Para isso, o documento deve estar na pasta de upload do usuário em questão, o que pode ser feito via FTP. Isso pode ser útil em integrações que utilizam o mesmo usuário (integrador) para autenticar no FTP e nos serviços.\n\n# ECMFavoritesService\n\nWebservice responsável por interagir com os documentos e processos favoritos do fluig. Pode ser utilizado para pesquisar os documentos e processos favoritos de cada usuário.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| addDocumentToFavorites | Adiciona um documento aos favoritos do usuário informado. Método: addDocumentToFavorites(String username, String password, int companyId, int nrDocument, int nrVersao,  String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocument: número do documento - nrVersao: versão do documento - colleagueId : matrícula do usuário. Retorno: void. |\n| addProcessToFavorites | Adiciona um processo aos favoritos do usuário informado. Método: addProcessToFavorites(String username, String password, int companyId,String processId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo - colleagueId : matrícula do usuário. Retorno: void. |\n| findFavorites | Retorna os documentos favoritos do usuário. Método: findFavorites(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId : matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| findFavoritesOnDemand | Retorna os documentos favoritos do usuário, paginados. Método: findFavoritesOnDemand(String user, String password, int companyId, String colleagueId, int limit, int lastRowId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId : matrícula do usuário. - limit: número de registros a serem retornados. - lastRowId: última linha retornada. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| findFavoritesProcess | Retorna os processos favoritos do usuário. Método: findFavoritesProcess (String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId : matrícula do usuário. Retorno: [ProcessDefinitionVersionDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessDefinitionVersionDto) . |\n| findFavoritesProcessOnDemand | Retorna os processos favoritos do usuário, paginados. Método: findFavoritesProcess (String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId : matrícula do usuário. - limit: número de registros a serem retornados. - lastRowId: última linha retornada. Retorno: [ProcessDefinitionVersionDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessDefinitionVersionDto) . |\n| isFavoriteDocument | Verifica se documento é favorito. Método: isFavoriteDocument(String username, String password, int companyId, int nrDocument, String colleagueId) Parâmetros: - username: login do usuário de integração. - password: senha do usuário. - companyId: código da empresa. - nrDocument: código do documento. - colleagueId: matricula do usuário. Retorno: Boolean, documento favoritado. |\n| removeFavoriteDocument | Remove um documento dos favoritos do usuário informado. Método: removeFavoriteDocument (String username, String password, int companyId, int nrDocument,  String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocument: número do documento - colleagueId : matrícula do usuário. Retorno: void. |\n| removeFavoriteProcess | Remove um processo dos favoritos do usuário informado. Método: addProcessToFavorites(String username, String password, int companyId,String processId, String colleagueId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. - colleagueId : matrícula do usuário. Retorno: void. |\n\n**Quadro 15: Métodos da FavoritesService**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [ECMFavoritesService.java](https://git.fluig.com/projects/SAMPLES/repos/samples-webservice/browse/src/samples/ECMFavoritesService.java), esta exemplifica a utilização dos principais métodos da classe FavoritesService.\n\n# ECMFolderService\n\nWebservice responsável por realizar operações referentes a pastas no fluig. Pode ser utilizado para criar, alterar, excluir e pesquisar pastas, entre outros recursos.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createFolder | Cria uma pasta. Método: createFolder(String user, String password, int companyId, [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[] docdtos, [DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)[] docsecurity, ApproverDto[] docapprovers ) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - docdtos: pasta que será criada. - docsecurity: segurança da pasta. - docapprovers: aprovadores da pasta. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-CardEventDtoArray). Estrutura de retorno com sucesso ``` \t \t 1 \t Clientes \t 303 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Login e senha inválidos \t ``` |\n| createFolderWithApprovementLevels | Cria uma pasta com nível de aprovação. Método: createFolderWithApprovementLevels(String user, String password, int companyId, [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[] docdtos, [DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)[] docsecurity, [ApproverWithLevelDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApproverWithLevelDto)[] docapprovers, [ApprovalLevelDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApprovalLevelDto)[] levels) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - docdtos: pasta que será criada. - docsecurity: segurança da pasta. - docapprovers: aprovadores em níveis. - levels: níveis de aprovação da pasta. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-CardEventDtoArray). Estrutura de retorno com sucesso ``` \t \t 1 \t Clientes \t 303 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Nao foi informado um ApprovalLevelDto com o levelId 1 \t ``` |\n| createSimpleFolder | Cria uma pasta simples. Método: createSimpleFolder(String user, String password, int companyId, int parentDocumentId, String publisherId, String documentDescription) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - parentDocumentId: número do documento pai. - publisherId: matrícula do usuário publicador. - documentDescription: descrição da pasta. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-CardEventDtoArray). Estrutura de retorno com sucesso ``` \t \t 1 \t Clientes \t 303 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Documento Pai Inválido \t ``` |\n| deleteDocument | Exclui uma pasta e envia para a lixeira. Método: deleteDocument(String user, String password, int companyId, int documentId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número da pasta. - colleagueId: matrícula do usuário. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-CardEventDtoArray). Estrutura de retorno com sucesso ``` \t \t 1 \t Clientes \t 303 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` 0 0 0 Documento não encontrado: 303 ``` |\n| destroyDocument | Exclui uma pasta da lixeira. Método: destroyDocument(String user, String password, int companyId, int documentId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número da pasta. - colleagueId: matrícula do usuário. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-CardEventDtoArray). Estrutura de retorno com sucesso ``` \t \t 1 \t Clientes \t 303 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Por segurança, não é possível destruir o documento sem antes excluí-lo. \t ``` |\n| findRecycledDocuments | Retorna todos os documentos da lixeira de um usuário. Método: findRecycledDocuments(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getApprovers | Retorna os aprovadores de uma pasta. Método: getApprovers(String user, String password, int companyId, int nrDocumentId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocumentId: número da pasta. Retorno: [ApproverWithLevelDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApproverWithLevelDto)[]. |\n| getChildren | Retorna todos os documentos de uma pasta. Método: getChildren(String user, String password, int companyId, int documentId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número da pasta. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getFolder | Retorna uma pasta. Método: getFolder(String user, String password, int companyId, int nrDocumentId, String colleagueId ) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocumentId: número da pasta. - colleagueId: matrícula do usuário origem. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getPrivateChildren | Retorna todos os documentos de uma pasta particular. Método: getPrivateChildren(String user, String password, int companyId, int parentDocumentId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número da pasta. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getRootFolders | Retorna as pastas root que um usuário tem acesso, exceto a pasta particular. Método: getRootFolders(String user, String password, int companyId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getSecurity | Retorna a segurança de uma pasta. Método: getSecurity(String user, String password, int companyId, int nrDocumentId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocumentId: número da pasta. Retorno: [DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)[]. |\n| getSubFolders | Retorna todas as subpastas e arquivos de um pasta. Método: getSubFolders(String user, String password, int companyId, int documentId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número da pasta. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getSubFoldersOnDemand | Retorna todas as subpastas e arquivos de uma pasta, paginados. Método: getSubFoldersOnDemand(int companyId, String user, String password, int documentId, boolean privatefolder, String[] documenttypes, int limit , int lastRowId, String colleagueId) Parâmetros: - companyId: código da empresa. - user: login do usuário. - password: senha do usuário. - documentId: número da pasta. - privatefolder: identifica se é uma pasta particular. - documenttypes: tipos de documentos das pastas. - limit: número de registros a serem retornados. - lastRowId: última linha retornada. - colleagueId: matrícula do usuário. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getSubFoldersPermission | Retorna todas as subspastas em que o usuário tenha a permissão informada. Método: getSubFoldersPermission(String user, String password, int companyId, int documentId, String colleagueId, int permission) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número da pasta particular. - colleagueId: matrícula do usuário. - permission: permissão sobre a pasta. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getSubPrivateFolders | Retorna todas as subpastas de uma pasta particular. Método: getSubPrivateFolders(String colleagueId, String password, int companyId, int documentId) Parâmetros: - colleagueId: matrícula do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número da pasta particular. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| getUserPermissions | Retorna a permissão de um usuário sobre uma pasta. Método: getUserPermissions(int companyId, String user, int nrDocumentId, int version) Parâmetros: - companyId: código da empresa. - user: matrícula do usuário. - nrDocumentId: número da pasta. - version: versão da pasta. Retorno: Integer, referente ao nível de permissão do usuário. |\n| restoreDocument | Restaura uma pasta da lixeira. Método: restoreDocument(String user, String password, int companyId, int documentId, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: número da pasta. - colleagueId: matrícula do usuário. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t \t 310 \t 0 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Documento não encontrado: 303 \t ``` |\n| updateFolder | Altera uma pasta. Método: updateFolder(String user, String password, int companyId, [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[] docdtos, [DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)[] docsecurity, ApproverDto[] docapprovers) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - docdtos: pasta que será alterada. - docsecurity: segurança da pasta. - docapprovers: aprovadores da pasta. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t \t 310 \t 0 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Documento não encontrado: 303 \t ``` |\n| updateFolderWithApprovementLevels | Altera uma pasta com nível de aprovação. Método: updateFolderWithApprovementLevels(String user, String password, int companyId, [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[] docdtos, [DocumentSecurityConfigDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentSecurityConfigDto)[] docsecurity, ApproverWithLevelDto[] docapprovers, [ApprovalLevelDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ApprovalLevelDto)[] levels) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - docdtos: pasta que será alterada. - docsecurity: segurança da pasta. - docapprovers: aprovadores em níveis. - levels: níveis de aprovação da pasta. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t \t 310 \t 0 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Documento não encontrado: 303 \t ``` |\n| updateSimpleFolder | Altera de forma simples uma pasta. Método: updateSimpleFolder(String user, String Password, int companyId, [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[] docdtos) Parâmetros: - user: login do usuário - password: senha do usuário - companyId: código da empresa - docdtos: pasta que será alterada. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t \t 310 \t 0 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Documento não encontrado: 303 \t ``` |\n\n**Quadro 16: Métodos da FolderService**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [FolderServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/FolderServiceClient.java?version=1&modificationDate=1378475537000&api=v2), esta exemplifica a utilização dos principais métodos da classe FolderService.\n\n# ECMGlobalParamService\n\nWebservice responsável por interagir com as configurações dos parâmetros gerais do fluig. Pode ser utilizado para criar, alterar e pesquisar os parâmetros gerais.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createGlobalParam | Cria parâmetros gerais para uma empresa. Método: createGlobalParam(String username, String password, int companyId, GlobalParamDto[] global) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - global: parâmetros gerais da empresa. Retorno: String. |\n| getGlobalParam | Retorna os parâmetros gerais de uma empresa. Método: getGlobalParam(String username, String password, int companyId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: GlobalParamDto[]. |\n| getVolumes | Retorna os volumes da empresa. Método: getVolumes(String user, String password, int companyId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: VolumeDto[]. |\n| updateConfigurations | Altera as configurações do sistema. Método: updateConfigurations( String username,String password, int companyId, String dbDriver, String dbUser, String dbPassword, String dbServer, String dbPort,String dbScheme, String dbInstance, String emailServer, String emailPort, String emailSender, boolean emailDefaultSender, String emailUser, String emailPassword, boolean emailTLS,String paramsRMTPTPort, String lsType, String paramsLSHost, String paramsLSPort, String paramsOpenOfficeDir, String paramsOpenOfficePorts, String portsSetName) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - dbDriver: driver do banco de dados (MySql- com.mysql.jdbc.Driver. SQLServer - net.sourceforge.jtds.jdbc.Driver. Oracle -oracle.jdbc.driver.OracleDriver) - dbUser: username banco de dados. - dbPassword: password banco de dados. - dbServer: servidor de conexão do banco de dados. - dbPort: porta servidor banco de dados. - dbScheme: database. - dbInstance: instância do banco, utilizada para SQLServer, caso não seja o caso passar em branco (\"\"). - mailServer: nome do servidor SMTP. - emailSender: e-mail do remetente padrão do produto. - emailPort: porta do servidor SMTP. - emailDefaultSender: - emailUser: usuário de email, somente se o servidor necessitar de autenticação. - emailPassword: password do email, somente se o servidor necessitar de autenticação. - emailTLS: servidor utilizará criptografia no envio de email (true/false) - paramsRMTPTPort: porta utilizada pelo Flex. - lsType: tipo de licença utilizada, LM/LS. - paramsLSHost: servidor de licenças. - paramsLSPort: porta servidor de licenças. - paramsOpenOfficeDir: diretório de instalação do OpenOffice - paramsOpenOfficePorts: porta utilizado pelo OpenOffice - portsSetName: portas utilizadas pelo sistema (ports-default, ports-01, ports-02) Retorno: String. Atenção Método depreciado e não mais utilizável no fluig. |\n| updateGlobalParam | Altera parâmetros gerais de uma empresa. Método: updateGlobalParam(String username, String password, int companyId, GlobalParamDto[] global) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - global: parâmetros gerais da empresa. Retorno: String. |\n\n**Quadro 17: Métodos da GlobalParamService.**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [GlobalParamServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/GlobalParamServiceClient.java?version=1&modificationDate=1378475581000&api=v2), esta exemplifica a utilização dos principais métodos da classe GlobalParamService.\n\n# ECMGroupService\n\nWebservice responsável por realizar operações referentes a grupos no fluig. Pode ser utilizado para criar, alterar, excluir e procurar grupos, entre outros recursos.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createGroup | Cria um grupo no fluig. Método: createGroup(String username, String password, int companyId, GroupDto[] grupos) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - grupos: grupo que será criado. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok ``` |\n| deleteGroup | Exclui um grupo do fluig. Método: deleteGroup(String username, String password, int companyId, String groupId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - GroupId: código do grupo. Retorno: String. Estrutura de retorno com sucesso ``` \t \t 1 \t \t 310 \t 0 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Documento não encontrado: 303 \t ``` |\n| getGroup | Retorna um grupo cadastrado no fluig. Método: getGroups(String username, String password, int companyId, String groupId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - groupId: código do grupo. Retorno: GroupDto[]. Atributos de Retorno: - companyId - groupDescription - groupId |\n| getGroups | Retorna todos os grupos cadastrados no fluig. Método: getGroups(String username, String password, int companyId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: GroupDto[]. Atributos de Retorno: - companyId - groupDescription - groupId |\n| getGroupsByDescription | Retorna um grupo pela descrição. Método: getGroupsByDescription(String username, String password, int companyId, String desc) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - desc: descrição do grupo. Retorno: GroupDto[]. Atributos de Retorno: - companyId - groupDescription - groupId |\n| getOcurrenceByKey | Retorna se existe configuração de segurança para atribuição e valor da atribuição. Método: getOcurrenceByKey(String username, String password, int companyId, int pIdiAtribuic, String pDesValAtribuic) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - pIdiAtribuic: código da atribuição. - pDesValAtribuic: valor da atribuição. Retorno: boolean. |\n| updateGroup | Altera um grupo no fluig. Método: updateGroup(String username, String password, int companyId, GroupDto[] grupos) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - grupos: grupo que será alterado. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok Não foi possível eliminar o grupo. ``` |\n\n**Quadro 18: Métodos da GroupService.**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [GroupServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/GroupServiceClient.java?version=1&modificationDate=1409227367000&api=v2), esta exemplifica a utilização dos principais métodos da classe GroupService.\n\n# ECMOutstandingService\n\n Webservice responsável por interagir com as transferências de pendências do fluig. Pode ser utilizado para transferir pendências de um usuário para outro usuário.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| transfer | Transfere pendências de um usuário para outro usuário. Método: transfer(String user, String password, int companyId, String colleagueIdFrom, String colleagueIdTo, String[] parameters) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueIdFrom: matrícula do usuário origem (suas pendências serão tranferidas para o usuário destino). - colleagueIdTo: matrícula do usuário destino (receberá as pendências do usuário origem). - parameters: array de pendências que serão transferidas para o usuário destino. Retorno: String. Estrutura de retorno com sucesso ``` \tVerificando Transferência de Permissão de Gravação em Pastas \t[INFO] Todas as permissões foram transferidas. \t================================================================================ \tVerificando Transferência de Documentos Ativos \t[INFO] Transferido o documento 1 - XXXXX \t[INFO] Transferido o documento 2 - YYYYY \t================================================================================ \tVerificando Transferência de Documentos Aguardando Aprovação \t[WARN] Nenhum registro encontrado. \t================================================================================ \tVerificando Transferência de Tarefas Workflow Pendentes \t[INFO] Tarefa pendente do workflow (Atividade - Solicitação: X) foi transferida para o colaborador user. \t================================================================================ \tVerificando Transferência de Aprovador de Pastas/Documentos \t[INFO] Transferido o aprovador do documento 293 \t================================================================================ \tVerificando Transferência de Aprovação de Documento \t[WARN] Nenhum registro encontrado. \t================================================================================ \tVerificando Transferência de Tasks da Central de Tarefas \t================================================================================ ``` Estrutura de retorno com erro ``` ERROR: Usuário origem e destino não podem ser iguais, TRANSFERÊNCIA NÃO REALIZADA ``` |\n\n**Quadro 19: Métodos da OutstandingService.**\n\nExemplo de utilização\n\nFaça o download da classe [OutstandingServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/OutstandingServiceClient.java?version=1&modificationDate=1378475645000&api=v2), esta exemplifica a utilização dos principais métodos da classe OutstandingService.\n\n# ECMReportService\n\n Webservice responsável por realizar operações referentes a relatórios no fluig. Pode ser utilizado para criar, alterar, excluir e procurar relatórios, entre outros recursos." }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createSimpleReport | Cria um relatório de maneira simplificada no fluig. Método: createSimpleReport(String username, String password, int companyId, int parentDocId, String reportDescription, Attachment[] attachments) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - parentDocId: código da pasta pai. - reportDescription: descrição do relatório. - attachments: anexos do relatório. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t Colleague Report \t 312 \t 1000 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Registro de Pasta Pai Inexistente no Banco de Dados! \t ``` |\n| getActiveReport | Retorna um relatório ativo no fluig. Método: getActiveReport(int companyId, String username, String password, String documentId) Parâmetros: - companyId: código da empresa. - username: login do usuário. - password: senha do usuário. - documentId: código do documento. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto). |\n| getAttachmentsList | Retorna uma lista de anexos do relatório no fluig. Método: getAttachmentsList(String username, String password, int companyId, String documentId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - documentId: código do documento. Retorno: Retorna lista de String[], com nome dos anexos. |\n| getReportContent | Retorna o arquivo físico de um relatório. Método: getReportContent(String username, String password, int companyId, int nrDocumentId, String colleagueId, int documentoVersao, String fileName) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - nrDocumentId: número do documento. - colleagueId: matrícula do usuário. - documentoVersao: versão do documento. - fileName: nome do arquivo. Retorno: byte[]. |\n| getRepots | Retorna os relatórios disponíveis. Método: getRepots(String username, String password, int companyId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[]. |\n| updateSimpleReport | Atualiza um relatório de maneira simplificada no fluig. Método: updateSimpleReport(String username, String password, int companyId, int docId, String reportDescription, Attachment[] attachments, String versionOption) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - docId: código da pasta pai. - reportDescription: descrição do relatório. - attachments: anexos do relatório. - versionOption: informa se deseja atualizar a versão do relatório. Retorno: [WebServiceMessageArray](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WebServiceMessageArray). Estrutura de retorno com sucesso ``` \t \t 1 \t Colleague Report \t 313 \t 2000 \t ok \t ``` Estrutura de retorno com erro ``` \t \t 0 \t \t 0 \t 0 \t Documento inexistente ou permissão insuficiente. \t ``` |\n\n**Quadro 20: Métodos da ReportService.**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [ReportServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/ReportService.java?version=1&modificationDate=1378476011000&api=v2), esta exemplifica a utilização dos principais métodos da classe ReportService.\n\n# ECMSearchDocumentService\n\nWebservice responsável por realizar operações referentes às buscas no fluig. Pode ser utilizado para buscar documentos utilizando a busca simples e avançada.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| advancedSearchDocuments | Utiliza busca avançada. Método: advancedSearchDocuments(String user, String password, int companyId, String colleagueId, String content, boolean  findAllDocumentTypes, boolean  findFolders, boolean  findDocuments, boolean  findCardIndex, boolean  findCards, boolean  findExternalDocument, int  documentParentId, Date  startDate, Date  finalDate) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - content: conteúdo da busca. - findAllDocumentTypes: indica se deve buscar todos os tipos de documentos. - findFolders: indica se deve buscar pastas. - findDocuments: indica se deve buscar documentos. - findCardIndex: indica se deve buscar formulários. - findCards: indica se deve buscar registros de formulários. - findExternalDocument: indica se deve buscar documentos externos. - documentParentId: número do documento pai. - startDate: data inicial. - finalDate: data final. Retorno: [SearchResultDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-SearchResultDto). |\n| advancedSearchDocumentsWithMetadata | Utiliza busca avançada através das opções de metadados e campos customizados. Método: advancedSearchDocuments(String user, String password, int companyId, String colleagueId, String content, SearchFields[] metadata, SearchFields[] customfields, boolean  findAllDocumentTypes, boolean  findFolders, boolean  findDocuments, boolean  findCardIndex, boolean  findCards, boolean  findExternalDocument, int  documentParentId, Date  startDate, Date  finalDate) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - content: conteúdo da busca. - metadata: informações para busca a partir de metadados do arquivo, como publicador (usando o fieldName publisher), autor (author), descrição (description), descrição da versão/revisão (versionDescription), comentários (additionalComments), tags (tags), data de criação (createDate) e data da última alteração (lastUpdateDate). - customfields: informações para busca a partir de metadados de campos customizados, informando o código do campo customizado como fieldName e valor a ser utilizado como filtro. - findAllDocumentTypes: indica se deve buscar todos os tipos de documentos. - findFolders: indica se deve buscar pastas. - findDocuments: indica se deve buscar documentos. - findCardIndex: indica se deve buscar formulários. - findCards: indica se deve buscar registros de formulários. - findExternalDocument: indica se deve buscar documentos externos. - documentParentId: número do documento pai. - startDate: data inicial. - finalDate: data final. Retorno: [SearchResultDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-SearchResultDto). |\n| searchDocuments | Utiliza busca simples. Método: searchDocuments(String user, String password, int companyId, String colleagueId, String content) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - content: conteúdo da busca. Retorno: [SearchResultDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-SearchResultDto). |\n| searchFavoritesDocuments | Busca documentos favoritos. Metodo: searchFavoritesDocuments(String user, String Password, int companyId, String colleagueId, String content) Parametros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - colleagueId: matrícula do usuário. - contente: conteúdo a ser buscado Retorno: [SearchResultDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-SearchResultDto). |\n\n**Quadro 21: Métodos da SearchDocumentService**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [SearchDocumentServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/SearchDocumentServiceClient.java?version=2&modificationDate=1422438607000&api=v2), esta exemplifica a utilização dos principais métodos da classe SearchDocumentService.\n\n# ECMSignalService\n\nWebservice responsável por interagir com os sinais criados no fluig. Pode ser utilizado para criar, remover, enviar sinais ou consultar os sinais existentes.\n\n#### Métodos\n\n| | |\n| --- | --- |\n| createSignal | Cria um sinal no fluig. Método: createSignal(String login, String password, int companyId, String description) Parâmetros: - login: login do usuário. - password: senha do usuário. - companyId: código da empresa. - description: descrição do sinal. Retorno: String. |\n| deleteSignal | Remove um sinal criado no fluig. Método: deleteSignal(String login, String password, int companyId, int signalId) Parâmetros: - login: login do usuário que será gerado pelo token. - password: senha do usuário. - companyId: código da empresa. - signalId: código do sinal. Retorno: String. |\n| fireSignal | Envia/ Dispara o sinal existente. Método: fireSignal (String login, String password, int companyId, int signalId) Parâmetros: - login: login do usuário que será gerado pelo token. - password: senha do usuário. - companyId: código da empresa. - signalId: código do sinal. Retorno: String. |\n| getSignals | Retorna os sinais existentes no fluig. Método: getSignals(String login, String password, int companyId) Parâmetro: - login: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: [Signal[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-Signal). |\n\n**Quadro 22: Métodos da SignalService.**\n\n#### Exemplo de utilização" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\nFaça o download da classe [ECMSignalService.java](https://git.fluig.com/projects/SAMPLES/repos/samples-webservice/browse/src/samples/ECMSignalService.java), esta exemplifica a utilização dos principais métodos da classe SignalService.\n\n# ECMTokenService\n\nWebservice responsável por interagir com os token’s do fluig. Pode ser utilizado para pesquisar e validar os token’s existentes.\n\n#### Métodos\n\n| | |\n| --- | --- |\n| getToken | Retorna um token de segurança. Método: getToken(String login, String password) Parâmetros: - login: login do usuário. - password: senha do usuário. Retorno: String. |\n| getTokenByLogin | Retorna um token de segurança para o login solicitado. Método: getTokenByLogin(int companyId, String colleagueId, String password, String login) Parâmetros: - companyId: código da empresa. - colleagueId: matrícula do usuário. - password: senha do usuário. - login: login do usuário que será gerado pelo token. Retorno: String. |\n| getTokenEmail | Retorna um token de segurança para o e-mail solicitado. Método: getTokenEmail(int companyId, String email, String password) Parâmetros: - companyId: código da empresa. - email: e-mail do usuário. - password: senha do usuário. Retorno: String. |\n| validateToken | Valida o token de segurança e retorna o login do usuário. Método: validateToken(String token) Parâmetro: - token: token do usuário. Retorno: String. |\n\n**Quadro 23: Métodos da TokenService.**\n\n#### Exemplo de utilização\n\nFaça o download da classe  [TokenServiceClient.java](https://tdn.totvs.com/download/attachments/73084007/TokenServiceClient.java?version=1&modificationDate=1378475769000&api=v2), esta exemplifica a utilização dos principais métodos da classe TokenService.\n\n# ECMWorkflowEngineService\n\nWebservice responsável por realizar operações referentes a workflow no fluig. Pode ser utilizado para movimentar solicitações, entre outros recursos.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| calculateDeadLineHours | Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no produto passando o prazo em horas. Método: calculateDeadLineHours(String username, String password, int companyId, String userId, String data, int segundos, int prazo, String periodId) Parâmetros: - username - Usuário de Integração - password - Senha de Integração - companyId - Código da empresa - userId - Matrícula do usuário - data - data (Tipo String no formato \"yyyy-MM-dd\"). - segundos - Quantidade de segundos após a meia noite - prazo - Prazo que será aplicado em horas (Variável int). - periodId - Código de Expediente Retorno: Objeto [DeadLineDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DeadLineDto) que contem variáveis com a data e hora. Estrutura de retorno com sucesso ``` \t2015-05-08 \t43201 ``` Estrutura de retorno com erro ``` NOK Não foi encontrado expediente para o código informado: Default* ``` |\n| calculateDeadLineTime | Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no produto passando o prazo em minutos. Método: calculateDeadLineHours(String username, String password, int companyId, String userId, String data, int segundos, int prazo, String periodId) Parâmetros: - username - Usuário de Integração - password - Senha de Integração - companyId - Código da empresa - userId - Matrícula do usuário - data - data (Tipo String no formato \"yyyy-MM-dd\"). - segundos - Quantidade de segundos após a meia noite - prazo - Prazo que será aplicado em minutos (Variável int). - periodId - Código de Expediente Retorno: Objeto [DeadLineDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DeadLineDto) que contem variáveis com a data e hora. Estrutura de retorno com sucesso ``` 2015-03-20 32400 ``` Estrutura de retorno com erro ``` NOK Não foi encontrado expediente para o código informado: Default* ``` |\n| cancelInstance | Cancela uma solicitação. Método: cancelInstance(String user, String password, int companyId, int processInstanceId, String userId, String cancelText) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação. - userId: mátricula do usuário. - cancelText: comentários do cancelamento. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` Processo não encontrado. ``` |\n| cancelInstanceByReplacement | Cancela uma solicitação utilizando usuário substituto. Método: cancelInstanceByReplacement(String user, String password, int companyId, int processInstanceId, String userId, String cancelText, String replacementId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação. - userId: mátricula do usuário. - cancelText: comentários do cancelamento. - replacementId: matrícula do usuário substituto. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` Processo não encontrado. ``` |\n| createWorkFlowProcessVersion | Cria nova versão do processo workflow. Método: createWorkFlowProcessVersion(String user, String password, int companyId, int processId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: número da solicitação. Retorno: String. Estrutura de retorno com sucesso ``` {swimlane=Nova Versão das SwimLanes, processLinkAssoc=Nova Versão das Associações, conditionProcessState=Nova Versão das Condições das Atividades Automáticas, ok=true, flow=Nova Versão dos Fluxos do Processo, end=Versão criada com sucesso, processComponGraf=Nova Versão dos Componentes Gráficos, activity=Nova Versão das Atividades, begin=Criando versão '2' do processo 'Solicitação de férias'} ``` Estrutura de retorno com erro ``` {error=Processo não existente} ``` |\n| exportProcess | Retorna o processo selecionado em uma String. Método: *exportProcess* (String username, String password, int companyId, String processId) Parâmetros: - username - Usuário de Integração - password - Senha de Integração - companyId - Código da empresa - processId - Código do processo Retorno: String que contém a definição do processo. |\n| exportProcessInZipFormat | Retorna o processo selecionado no formato zip. Método: exportProcessInZipFormat(String username, String password, int companyId, String processId) Parâmetros: - username - Usuário de Integração - password - Senha de Integração - companyId - Código da empresa - processId - Código do processo Retorno: byte[] que contém a definição do processo. |\n| getActualThread | Retorna a sequência da thread de uma solicitação. Método: getActualThread(String user, String password, int companyId, int processInstanceId, int stateSequence) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - userId: matrícula do usuário. - stateSequence: sequência do estado. Retorno: int. |\n| getAllActiveStates | Retorna o número da atividade em que uma solicitação esta. Método: getAllActiveStates(String user, String password, int companyId, String userId, int processInstanceId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - userId: matrícula do usuário. - processInstanceId: número da solicitação. Retorno: Integer[]. |\n| getAllProcessAvailableToExport | Retorna uma lista de processos disponíveis para serem exportados. Método: getAllProcessAvailableToExport (String username, String password, int companyId) Parâmetros: - username - Usuário de Integração - password - Senha de Integração - companyId - Código da empresa Retorno: [ProcessDefinitionDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessDefinitionDto). |\n| getAllProcessAvailableToImport | Retorna uma lista de processos disponíveis para serem importados. Método: getAllProcessAvailableToImport (String username, String password, int companyId) Parâmetros: - username - Usuário de Integração - password - Senha de Integração - companyId - Código da empresa Retorno: [ProcessDefinitionDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessDefinitionDto) |\n| getAttachments | Retorna os anexos de uma solicitação. Método: getAttachments(String user, String password, int companyId, String userId, int processInstanceId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - userId: matrícula do usuário. - processInstanceId: número da solicitação. Retorno: [ProcessAttachmentDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessAttachmentDto). |\n| getAvailableProcess | Retorna os processos que o usuário pode iniciar uma solicitação. Método: getAvailableProcess(String username, String password, int companyId, String userId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - userId: matrícula do usuário. Retorno: [ProcessDefinitionVersionDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessDefinitionVersionDto). |\n| getAvailableProcessOnDemand | Retorna os processos que o usuário pode iniciar uma solicitação, paginados. Método: getAvailableProcessOnDemand(String username, String password, int companyId, String userId, int limit, int lastRowId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - userId: matrícula do usuário. - limit: número de registros a serem retornados. - lastRowId: última linha retornada. Retorno: [ProcessDefinitionVersionDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessDefinitionVersionDto). |\n| getAvailableStates | Retorna o número da próxima atividade de uma solicitação. Método: getAvailableStates(String user, String password, int companyId, String processId, int processInstanceId, int threadSequence) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. - processInstanceId: número da solicitação. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. Retorno: Integer[]. |\n| getAvailableStatesDetail | Retorna detalhes das atividades disponíveis para seleção... Atenção Caso haja necessidade de utilizar este método na primeira instância do processo, favor consultar a [hAPI](../../Recurso de Processos (BPM).md)/Desenvolvimento de Workflow.md). Método: getAvailableStatesDetail(String user, String password, int companyId, String processId, int processInstanceId, int threadSequence) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. - processInstanceId: número da solicitação. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. Retorno: [ProcessStateDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessStateDto). |\n| getAvailableUsers | Retorna os usuários que podem executar a tarefa corrente de uma solicitação. Método: getAvailableUsers(String username, String password, int companyId, int processInstanceId, int state, int threadSequence) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação. - state: número da atividade. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. Retorno: String[]. |\n| getAvailableUsersOnDemand | Retorna os usuários que podem executar a tarefa corrente de uma solicitação, paginados e com busca. Método: getAvailableUsersOnDemand(String username, String password, int companyId, int processInstanceId, int state, int threadSequence, int limit, int initialUser, String userSearch) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação. - state: número da atividade. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. - limit: número de registros a serem retornados. - initialUser: última linha retornada. - userSearch: texto a ser buscado. Retorno: [AvailableUsersDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-AvailableUsersDto). |\n| getAvailableUsersStart | Retorna os usuários disponíveis na abertura de uma solicitação. Método: getAvailableUsersStart (String username, String password, int companyId, String processId, int state, int threadSequence) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. - state: número da atividade. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. Retorno: String[]. |\n| getAvailableUsersStartOnDemand | Retorna os usuários disponíveis na abertura de uma solicitação, paginados e com busca. Método: getAvailableUsersStart (String username, String password, int companyId, String processId, int state, int threadSequence, int limit, int initialUser, String userSearch) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. - state: número da atividade. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. - limit: número de registros a serem retornados. - initialUser: última linha retornada. - userSearch: texto a ser buscado. Retorno: [AvailableUsersDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-AvailableUsersDto). |\n| getCardValue | Retorna o valor de um campo do registro de formulário. Método: getCardValue(String user, String password, int companyId, int processInstanceId, String userId, String cardFieldName) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação. - userId: mátricula do usuário. - cardFieldName: nome do campo do registro de formulário. Retorno: String. |\n| getHistories | Retorna a lista de históricos de um processo, exceto os comentários adicionados pelos usuários nas atividades. Método: getHistories (String username, String password, int companyId) Parâmetros: - username - Usuário de Integração - password - Senha de Integração - companyId - Código da empresa - userId - Matrícula do usuário - processInstanceId - número da solicitação workflow Retorno: [ProcessHistoryDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessHistoryDto). |\n| getInstanceCardData | Retorna o valor dos campos do registro de formulário de uma solicitação. Método: getInstanceCardData(String user, String password, int companyId, String userId, int processInstanceId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - userId: matrícula do usuário. - processInstanceId: número da solicitação. Retorno: String[][]. |\n| getProcessFormId | Retorna o código do formulário vinculado ao processo. Método: getProcessFormId(String user, String password, int companyId, string processId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. Retorno: int. |\n| getWorkFlowProcessVersion | Retorna a versão de um processo. Método: getWorkFlowProcessVersion(String user, String password, int companyId, int processId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: número da solicitação. Retorno: int. |\n| importProcess | Importa processos workflow. Método: importProcess(String user, String password, int companyId, String processId, Attachment file, boolean newProcess, boolean overWrite, String colleagueId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. - file: arquivo a ser importado. - newProcess: indica se deve ser criado um processo ou atualizado o existente. - overWrite: indica se as atividades e fluxos do processo existentes devem ser sobrescritas. - colleagueId : matrícula do usuário. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` Não foi possível importar os dados do arquivo: Solicitação de férias ``` |\n| importProcessWithCard | Importa processos workflow e formulário. Método: importProcessWithCard(String user, String password, int companyId, String processId, Attachment[] processAttachs, boolean newProcess, boolean overWrite, String colleagueId, int parentDocId, String docDescription, String cardDescription, String datasetName, Attachment[] cardAttachs, CardEventDto[] customEvents, boolean update) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. - processAttachs: anexos do processo. - newProcess: indica se deve ser criado um processo ou atualizado o existente. - overWrite: indica se as atividades e fluxos do processo existentes devem ser sobrescritas. - colleagueId : matrícula do usuário. - parentDocId: número do formulário. - docDescription: descrição. - cardDescription: nome. - datasetName: nome do dataset. - cardAttachs: arquivo anexo. - customEvents: eventos. - update: caso verdadeiro ('true'), informa que será uma atualização. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` Não foi possível importar os dados do arquivo: Solicitação de férias ``` |\n| releaseProcess | Libera processos workflow. Método: releaseProcess(String user, String password, int companyId, String processId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. Retorno: String. Estrutura de retorno com sucesso ``` {activityError=[], subProcess=[Sub-processos], subProcessError=[], attachmentSecurityError=[], attachmentSecurity=[Segurança de Anexos], ok=true, flow=[Fluxos], flowError=[], activity=[Atividades], end=Versão liberada para utilização., begin=Liberação da versão 2 do processo Solicitação de férias} ``` Estrutura de retorno com erro ``` Login e senha inválidos ``` |\n| saveAndSendTask | Movimenta solicitação para próxima atividade. Caso possua os campos preenchidos na solicitação e os valores não forem repassados no cardData ou estiverem vazios, a solicitação também ficará com o valor vazio, onde os valores preenchidos serão apagados caso não seja passado o valor. Método: saveAndSendTask(String user, String password, int companyId, int processInstanceId, int choosedState, String[] colleagueIds, String comments, String userId, boolean completeTask, [ProcessAttachmentDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessAttachmentDto) attachments, String[][] [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData), [ProcessTaskAppointmentDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessTaskAppointmentDto) appointment, boolean managerMode, int threadSequence) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação. - choosedState: número da atividade. - colleagueIds: usuário que receberá a tarefa. - comments: comentários. - userId: matrícula do usuário que vai executar a tarefa. - completeTask: indica se deve completar a tarefa (true) ou somente salvar (false). - attachments: anexos da solicitação. - [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData): dados do registro de formulário. - appointment: apontamentos da tarefa. - managerMode: indica se usuário esta executando a tarefa como gestor do processo. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. Retorno: String[][]. Estrutura de retorno com sucesso ``` \t \t iTask \t 4 \t \t \t cDestino \t [adm] \t ``` Estrutura de retorno com erro ``` \t \t ERROR: \t Erro ao salvar/completar a tarefa: Usuário destino não foi informado! \t ``` Exemplo de utilização com exclusão de anexo: ``` adm adm 1 1780 4 adm movimentação removendo anexo adm true 3012334 adm adm 1 true arquivo.docx 3012334 docx arquivo.docx false 1 1780 1000 > false 0 ``` O exemplo de movimentação com exclusão de anexo está excluindo apenas um anexo, caso necessário excluir mais de um, adicione uma nova tag |\n| saveAndSendTaskByReplacement | Movimenta solicitação para próxima atividade utilizando usuário substituto. Caso possua os campos preenchidos na solicitação e os valores não forem repassados no cardData ou estiverem vazios, a solicitação também ficará com o valor vazio, onde os valores preenchidos serão apagados caso não seja passado o valor. Método: saveAndSendTaskByReplacement (String user, String password, int companyId, int processInstanceId, int choosedState, String[] colleagueIds, String comments, String userId, boolean completeTask, [ProcessAttachmentDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessAttachmentDto) attachments, String[][] [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData), [ProcessTaskAppointmentDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessTaskAppointmentDto) appointment, boolean managerMode, int threadSequence, String replacementId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação. - choosedState: número da atividade. - colleagueIds: usuário que receberá a tarefa. - comments: comentários. - userId: matrícula do usuário que vai executar a tarefa. - completeTask: indica se deve completar a tarefa (true) ou somente salvar (false). - attachments: anexos da solicitação. - [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData): dados do registro de formulário. - appointment: apontamentos da tarefa. - managerMode: indica se usuário esta executando a tarefa como gestor do processo. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. - replacementId: matrícula do usuário substituto. Retorno: String[][]. Estrutura de retorno com sucesso ``` \t \t iTask \t 4 \t \t \t cDestino \t [adm] \t ``` Estrutura de retorno com erro ``` \t \t ERROR: \t Erro ao salvar/completar a tarefa: Usuário destino não foi informado! \t ``` |\n| saveAndSendTaskClassic | Movimenta solicitação para próxima atividade e retorna um array de objeto com chave e valor. Caso possua os campos preenchidos na solicitação e os valores não forem repassados no cardData ou estiverem vazios, a solicitação também ficará com o valor vazio, onde os valores preenchidos serão apagados caso não seja passado o valor. Método: saveAndSendTaskClassic(String user, String password, int companyId, int processInstanceId, int choosedState, String[] colleagueIds, String comments, String userId, boolean completeTask, [ProcessAttachmentDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessAttachmentDto) attachments, [KeyValueDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-KeyValueDto) [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData), [ProcessTaskAppointmentDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessTaskAppointmentDto) appointment, boolean managerMode, int threadSequence) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação. - choosedState: número da atividade. - colleagueIds: usuário que receberá a tarefa. - comments: comentários. - userId: matrícula do usuário que vai executar a tarefa. - completeTask: indica se deve completar a tarefa (true) ou somente salvar (false). - attachments: anexos da solicitação. - [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData): dados do registro de formulário. - appointment: apontamentos da tarefa. - managerMode: indica se usuário esta executando a tarefa como gestor do processo. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. Estrutura mínima para movimentação com anexo **Exemplo usando SoapUI** ``` adm adm 1 48 2 al01 movimentação com anexo adm true 0 true true pdf_para_teste.pdf true adm adm 1 false pdf usado para teste pdf true 47 false 0 ``` O exemplo de movimentação com anexo foi criado considerando do uso da pasta de *upload* do volume. Sendo assim, o arquivo para transferência deverá estar contido na pasta de *upload* do usuário. Considerando o exemplo acima, o arquivo pdf\\_para\\_teste.pdf deverá estar contido na pasta do usuário, que fica localizada dentro do diretório *upload* no volume do fluig. Caso não queira utilizar este tipo de transferência para anexo e sim a transferência via *Bytes*, devem ser adicionadas à estrutura, abaixo da *tag* , as seguintes *tags*: ``` = para indicar o tamanho do arquivo ``` ``` = que deverá conter os bytes referentes ao arquivo ``` Adicionando *estas* tags será ignorada a busca no diretório de *upload* do usuário, sendo considerado o arquivo contido na *tag* . Retorno: [KeyValueDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-KeyValueDto). Estrutura de retorno com sucesso ``` \t \t iTask \t 4 \t \t \t cDestino \t [adm] \t ``` Estrutura de retorno com erro ``` \t \t ERROR: \t Erro ao salvar/completar a tarefa: Usuário destino não foi informado! \t ``` |\n| searchProcess | Busca processo disponíveis para inicialização. Método: searchProcess(String user, String Password, int companyId, String colleagueId, String content, boolean favorite) Parametros - user - Usuário de Integração - password - Senha de Integração - companyId - Código da empresa - colleagueId - Matrícula do usuário - content – nome do processo a ser pesquisado - favorite – busca da lista de processos favoritos ou da listagem padrão. Retorno: [ProcessDefinitionVersionDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessDefinitionVersionDto) |\n| setAutomaticDecisionClassic | Seleciona usuário(s) e avança atividade automática. Método: setAutomaticDecisionClassic(String user, String password, int companyId, int processInstanceId, int iTaskAutom, int iTask, int condition, String[] colleagueIds, String comments, String userId, boolean managerMode, int threadSequence) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação. - iTaskAutom: número da atividade automática. - iTask: número da atividade atual. - condition: número da condição da atividade automática. - colleagueIds: usuário que receberá a tarefa. - comments: comentários. - userId: matrícula do usuário que vai executar a tarefa. - managerMode: indica se usuário esta executando a tarefa como gestor do processo. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. Retorno: [KeyValueDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-KeyValueDto) Estrutura de retorno com sucesso ``` \t \t iTask \t 4 \t \t \t cDestino \t [adm] \t ``` Estrutura de retorno com erro ``` \t \t ERROR \t Nenhum colaborador foi informado. \t ``` |\n| setDueDate | Altera a data de prazo da tarefa. Método: setDueDate(String user, String password, int companyId, int processInstanceId, String userId, int threadSequence, String newDueDate, int timeInSeconds) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação. - userId: matrícula do usuário. Quando é Para um Grupo ou Para um Papel deve ser passado da seguinte forma: Papel: \"Pool:Role:CodigoDoPapel\"; Grupo: \"Pool:Group:CodigoDoGrupo\". - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. - newDueDate: nova data de prazo da tarefa. Exemplo: \"2014-08-20\". - timeInSeconds: quantidade de segundos após a meia noite. Exemplo: \"32000\". Retorno: String. Estrutura de retorno com sucesso ``` Data da solicitação: 26 do usuário: adm da empresa: 1 foi alterada com sucesso! ``` Estrutura de retorno com erro ``` Não foi possível encontrar histórico de processo para empresa 1 solicitação 263 thread 0 ``` |\n| setTasksComments | Altera os comentários da tarefa. Método: setTasksComments(String user, String password, int companyId, int processInstanceId, String userId, int threadSequence, String comments) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação. - userId: mátricula do usuário. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. - comments: comentários. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` Não foi possível encontrar histórico de processo para empresa 1 solicitação 263 thread 0 ``` |\n| simpleStartProcess | Inicia uma solicitação simples. Método: simpleStartProcess(String user, String password, int companyId, String processId, String comments, [ProcessAttachmentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessAttachmentDto)[] attachments, String [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData)[][]) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. - comments: comentários. - attachments: anexos da solicitação. - [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData): dados do registro de formulário. Retorno: String[]. Estrutura de retorno com sucesso ``` \tiTask=2 \tWDNrVersao=1000 \tWDNrDocto=0 \tiProcess=28 \tcDestino=[adm] ``` Estrutura de retorno com erro ``` Versão do processo não encontrada. processId: 263 ``` Para utilização do método, acesse o exemplo a seguir: [Exemplo](http://tdn.totvs.com/download/attachments/73084007/ws.zip?version=1&modificationDate=1506447690000&api=v2). |\n| startProcess | Inicia uma solicitação. Método: startProcess(String user, String password, int companyId, String processId, int choosedState, String[] colleagueIds, String comments, String userId, boolean completeTask, [ProcessAttachmentDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessAttachmentDto) attachments, String[][] [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData), [ProcessTaskAppointmentDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessTaskAppointmentDto) appointment, boolean managerMode) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. - choosedState: número da atividade. - colleagueIds: usuário que receberá a tarefa. Caso a solicitação esteja sendo atribuída \"Para um Papel\" ou \"Para um Grupo\", o parâmetro colleagueIds deve ser informado da seguinte forma: Papel: Pool:Role:Nome\\_do\\_papel Grupo: Pool:Group:Nome\\_do\\_grupo - comments: comentários. - userId: matrícula do usuário que vai iniciar a solicitação. - completeTask: indica se deve completar a tarefa (true) ou somente salvar (false). - attachments: anexos da solicitação. - [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData): dados do registro de formulário. - appointment: apontamentos da tarefa. - managerMode: indica se usuário esta iniciando a solicitação como gestor do processo. Retorno: String[][]. Estrutura de retorno com sucesso ``` \t \t iTask \t 2 \t \t \t WDNrVersao \t 1000 \t \t \t WDNrDocto \t 0 \t \t \t iProcess \t 29 \t \t \t cDestino \t [adm] \t ``` Estrutura de retorno com erro ``` \t \t ERROR \t Processo informado não foi encontrado. \t ``` Para utilização do método, acesse o exemplo a seguir: [Exemplo](https://tdn.totvs.com/download/attachments/73084007/ws.zip?version=1&modificationDate=1506447690000&api=v2). |\n| startProcessClassic | Inicia uma solicitação e retorna um array de objeto com chave e valor. Método: startProcessClassic(String user, String password, int companyId, String processId, int choosedState, String[] colleagueIds, String comments, String userId, boolean completeTask, [ProcessAttachmentDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessAttachmentDto) attachments, [KeyValueDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-KeyValueDto) [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData), [ProcessTaskAppointmentDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-ProcessTaskAppointmentDto) appointment, boolean managerMode) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processId: código do processo. - choosedState: número da atividade. - colleagueIds: usuário que receberá a tarefa. - comments: comentários. - userId: matrícula do usuário que vai iniciar a solicitação. - completeTask: indica se deve completar a tarefa (true) ou somente salvar (false). - attachments: anexos da solicitação. - [cardData](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-cardData): dados do registro de formulário. - appointment: apontamentos da tarefa. - managerMode: indica se usuário esta iniciando a solicitação como gestor do processo. Retorno: String[][]. Estrutura de retorno com sucesso ``` \t \t iTask \t 2 \t \t \t WDNrVersao \t 1000 \t \t \t WDNrDocto \t 0 \t \t \t iProcess \t 30 \t \t \t cDestino \t [adm] \t ``` Estrutura de retorno com erro ``` \t \t ERROR \t Processo informado não foi encontrado. \t ``` Para utilização do método, acesse o exemplo a seguir: [Exemplo](http://tdn.totvs.com/download/attachments/73084007/ws.zip?version=1&modificationDate=1506447690000&api=v2). |\n| takeProcessTask | Assume uma tarefa. Método: takeProcessTask(String user, String password, int companyId, String userId, int processInstanceId, int threadSequence) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - userId: matrícula do usuário. - processInstanceId: número da solicitação. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` Tarefa não encontrada ``` |\n| takeProcessTaskByReplacement | Assume uma tarefa utilizando usuário substituto. Método: takeProcessTask(String user, String password, int companyId, String userId, int processInstanceId, int threadSequence, String replacementId) Parâmetros: - user: login do usuário. - password: senha do usuário. - companyId: código da empresa. - userId: matrícula do usuário. - processInstanceId: número da solicitação. - threadSequence: Indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito dependendo da quantidade de atividade paralelas existentes no processo. - replacementId: matrícula do usuário substituto. Retorno: String. Estrutura de retorno com sucesso ``` OK ``` Estrutura de retorno com erro ``` Usuário não possui permissão para assumir a tarefa ``` |\n| updateWorkflowAttachment | Atualiza um documento do tipo 7. Retorna uma string contendo a descrição de sucesso ou falha da operação. Método: updateWorkflowAttachment(String username, String password, int companyId, int processInstanceId, String usuario, [DocumentDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-DocumentDto)[] docdtos, Attachment[] attach) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - processInstanceId: número da solicitação workflow. - usuario: usuário responsável pela edição do documento. - documents: documento ou documentos que serão publicados. - attachments: arquivo(s) anexado(s) na publicação. Observação: Caso necessite atualizar somente o título do anexo, basta enviar a tag attachments vazio, exemplo: Caso queira atualizar o arquivo do anexo será preciso informar o filename. Caso não tenha enviado o arquivo na pasta upload via FTP informe também o filecontent, exemplo:                          arquivo.pdf              cid:884394243078               Retorno: String. Estrutura de retorno com sucesso ``` Documento editado com sucesso ``` Estrutura de retorno com erro ``` DOCUMENTO NÃO É ANEXO WORKFLOW ``` |\n\n**Quadro 24: Métodos da WorkflowEngineService**" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n#### Exemplo de utilização\n\nFaça o download da classe [ECMWorkflowEngineService.java](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse/webservice/src/samples/ECMWorkflowEngineService.java), esta exemplifica a utilização dos principais métodos da classe WorkflowEngineService.\n\n# ECMWorkflowRoleService\n\nWebservice responsável por realizar operações referentes a papéis no fluig. Pode ser utilizado para criar, alterar, excluir e procurar papéis, entre outros recursos.\n\n#### Métodos" }, { "metadata": { "title": "Documentação dos Web Services", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=662867789", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Documentação dos Web Services.md" }, "content": "Documentação dos Web Services\n\n\n| | |\n| --- | --- |\n| createWorkflowRole | Cria um papel no fluig. Método: createWorkflowRole(String username, String password, int companyId, [workflowRoleDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowRoleDto) role) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - role: papel que será criado. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok ``` |\n| deleteWorkflowRole | Exclui um papel do fluig. Método: deleteWorkflowRole(String username, String password, int companyId, String roleId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - roleId: código do papel a ser excluído. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok ``` |\n| getWorkflowRole | Retorna um papel cadastrado no fluig. Método: getWorkflowRole(String username, String password, int companyId, String roleId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - roleId: código do papel. Retorno: [WorkflowRoleDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowRoleDto). Atributos de Retorno: - companyId - roleDescription - roleId |\n| getWorkflowRoles | Retorna todos os papéis cadastrados no fluig. Método: getWorkflowRoles(String username, String password, int companyId) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. Retorno: [WorkflowRoleDto[]](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowRoleDto). Atributos de Retorno: - companyId - roleDescription - roleId |\n| updateWorkflowRole | Atualiza um papel no fluig. Método: updateWorkflowRole(String username, String password, int companyId, [workflowRoleDto](http://tdn.totvs.com/display/fluig/Guia+de+Propriedades+dos+Objetos#GuiadePropriedadesdosObjetos-WorkflowRoleDto) role) Parâmetros: - username: login do usuário. - password: senha do usuário. - companyId: código da empresa. - role: papel que será criado. Retorno: String. Estrutura de retorno com sucesso ``` ok ``` Estrutura de retorno com erro ``` nok ``` |\n\n**Quadro 25: Métodos da WorkflowRoleService**" }, { "metadata": { "title": "Webservices SOAP com Identity habilitado", "source": "https://tdn.totvs.com/display/fluig/Webservices+SOAP+com+Identity+habilitado", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Webservices SOAP com Identity habilitado.md" }, "content": "Webservices SOAP com Identity habilitado" }, { "metadata": { "title": "Webservices SOAP com Identity habilitado", "source": "https://tdn.totvs.com/display/fluig/Webservices+SOAP+com+Identity+habilitado", "path": "\\Plataforma Documentação técnica\\Desenvolvimento sobre a plataforma\\Utilização de Webservices\\Webservices SOAP com Identity habilitado.md" }, "content": "Webservices SOAP com Identity habilitado\n\n\n# Índice\n\n- 1 [Objetivo](#WebservicesSOAPcomIdentityhabilitado-Objetivo)\n- 2 [Pré-requisitos](#WebservicesSOAPcomIdentityhabilitado-Pré-requisitos)\n- 3 [Visão geral](#WebservicesSOAPcomIdentityhabilitado-Visãogeral)\n- 4 [Utilizando serviços com o Identity habilitado](#WebservicesSOAPcomIdentityhabilitado-UtilizandoserviçoscomoIdentityhabilitado)\n\n# Objetivo\n\nO objetivo deste guia é apresentar formas de autenticação no webservice nos casos em que a plataforma utiliza o TOTVS Identity.\n\n# Pré-requisitos\n\nPara que se tenha uma compreensão completa destas informações, alguns conhecimentos são considerados pré-requisitos, entre eles:\n\n- Visão geral sobre o TOTVS Fluig Plataforma\n- Visão geral sobre integração de sistemas\n- WebServices\n- SOAP\n\nDica!\n\nA equipe TOTVS Fluig recomenda a utilização da API em exemplos que utilizam o método SOAP, pois seu uso é mais complexo em comparação com a API e está caindo em desuso.\n\n# Visão geral\n\nO Identity é um componente para gestão de identidades. Sendo que, para realizar a autenticação os usuários são reconhecidos por *login* (e-mail) e senha.\n\nAo integrar o Identity com a plataforma, os webservices SOAP da plataforma TOTVS Fluig irão exigir que a autenticação seja realizada com o *login* (e-mail) e senha do Identity.\n\nAtenção\n\nIntegrações que usam a senha do usuário como **MD5** deixarão de funcionar quando o Identity estiver habilitado.\n\nCom isso, para projetos que hoje utilizam algum tipo de usuário integrador, é necessário que este usuário esteja previamente cadastrado e relacionado a empresa no Identity.\n\nO diagrama abaixo demonstra o processo de autenticação em webservices SOAP quando existir integração com Identity.\n\n![](..\\..\\..\\images\\imagem.png)\n\nAtenção\n\nIntegrações com o Identity que tiverem várias requisições em um curto período de tempo devem usar o serviço de Token.\n\nComo todas as requisições vão até o Identity para validar o usuário e senha e, dependendo da configuração, este pode ter que perguntar ao *Active Directory* pela senha, uma técnica de desenvolvimento que terá que ser aplicada para maior velocidade de integrações é a de [Token](http://tdn.totvs.com/pages/viewpage.action?pageId=73084007#UtilizaçãodeWebservices-ECMTokenService).\n\nUsando o serviço de token, utilize o método getToken para ter acesso a um token, e nós próximos serviços de qualquer módulo, basta colocar no nome de usuário (*username*) o token gerado. A única limitação desse serviço é que o Token dura apenas 15 minutos, após esse período será necessário gerar um novo token.\n\n# Utilizando serviços com o Identity habilitado\n\nAlguns métodos de serviços necessitam do 'userId' para sua utilização. Para estes casos você pode obter o 'userId' pelo *e-mail* conforme o exemplo abaixo:\n\n**getUserIdByIdentityEmail**\n\n```\nfunction afterProcessFinish(processId){\n\t\t// Obtém a instância do serviço 'ColleagueService'\n\t \tvar colleagueServiceProvider = ServiceManager.getServiceInstance(\"ColleagueService\");\n\t \t// Instancia o serviço\n\t \tvar colleagueServiceLocator = colleagueServiceProvider.instantiate(\"com.totvs.technology.ecm.foundation.ws.ECMColleagueServiceService\");\n\t \tvar colleagueService = colleagueServiceLocator.getColleagueServicePort();\n \t\t// Obtém os dados do usuário pelo email do Identity\n\t \tvar colleaguesList = colleagueService.getColleaguesMail(\"usuario\",\"senha\",\"1\",\"usuario@fluig.com\").getItem();\n\t \tvar userId = null;\n\t \tif(colleaguesList != null && colleaguesList.size() > 0) {\n\t \t\t//Obtém o coleague retornado\n\t \t\tuserId = colleaguesList.get(0).getColleagueId()\n\t \t\tlog.info(\"userId: \" + userId);\n\t \t}\n\t \t// Obtém a instância do serviço 'WorkflowEngineService'\n\t \tvar workflowEngineServiceProvider = ServiceManager.getServiceInstance(\"WorkflowEngineService\");\n\t \t// Instancia o serviço\n\t\tvar workflowEngineServiceLocator = workflowEngineServiceProvider.instantiate(\"com.totvs.technology.ecm.workflow.ws.ECMWorkflowEngineServiceService\");\n\t\tvar workflowEngineService = workflowEngineServiceLocator.getWorkflowEngineServicePort();\n\t // Cria o ObjectFactory\n\t var objectFactory = workflowEngineServiceProvider.instantiate(\"net.java.dev.jaxb.array.ObjectFactory\");\n\t // Matriz de string\n \t var cardData = objectFactory.createStringArrayArray();\n\t\t// Array de anexos\n\t var processAttachmentDtoArray = workflowEngineServiceProvider.instantiate(\"com.totvs.technology.ecm.workflow.ws.ProcessAttachmentDtoArray\");\n\t \t// Array com a id dos usuários\n\t \tvar colleaguesId = objectFactory.createStringArray();\n\t \tcolleaguesId.getItem().add(\"1\");\n\t \t// Array de apontamentos\n\t var appointment = workflowEngineServiceProvider.instantiate(\"com.totvs.technology.ecm.workflow.ws.ProcessTaskAppointmentDtoArray\");;\n\t \n\t // Cria uma solicitação com os dados obtidos\n\t workflowEngineService.startProcess(\"usuario\", \"senha\", 1, \"nomeDoProcesso\", 5, colleaguesId, \"Comentário: Movimentando automaticamente\", userId, false, processAttachmentDtoArray, cardData, appointment, false);\n}\n```" }, { "metadata": { "title": "Boas práticas de segurança para o seu ambiente", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=611010249", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Boas práticas de segurança para o seu ambiente.md" }, "content": "Boas práticas de segurança para o seu ambiente\n\n\nDica!\n\n[Acesse aqui](Segurança da plataforma.md) e veja mais sobre os controles de **Segurança da plataforma** TOTVS Fluig.\n\n# Objetivo\n\n---\n\nReunimos nesse documento uma série de recomendações para trazer mais segurança ao seu ambiente do TOTVS Fluig Plataforma. Elencamos diversos artigos e dicas de segurança básicas que você pode aplicar para proteger seu ambiente.\n\nÉ importante definir uma agenda para revisão destes itens periodicamente.\n\n## Segurança nos padrões internacionais" }, { "metadata": { "title": "Boas práticas de segurança para o seu ambiente", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=611010249", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Boas práticas de segurança para o seu ambiente.md" }, "content": "Boas práticas de segurança para o seu ambiente\n\n\n---\n\nO TOTVS Fluig passa por testes de segurança seguindo as principais metodologias internacionais. Ele faz parte do programa de Bug Bounty da TOTVS, que tem como principal objetivo identificar e corrigir potenciais vulnerabilidades em seu ambiente tecnológico de produtos, aderindo e seguindo as melhores práticas recomendadas pelo OWASP (Open Web Application Security Project), uma comunidade mundial dedicada a melhorar a segurança de software. Ao alinhar nossos processos com as diretrizes do OWASP, buscamos garantir a identificação e correção eficazes de potenciais vulnerabilidades em nossa plataforma, contribuindo para um ambiente digital mais seguro e resiliente.\n\nPossuímos certificados e atestados de reconhecimento que demonstram nosso compromisso em seguir as práticas do mercado para processos de desenvolvimento seguro. Esses documentos evidenciam que nossas metodologias e procedimentos estão alinhados com os mais altos padrões de segurança, validados por auditorias internas e externas.\n\nOs certificados e atestados, como os exemplificados abaixo, podem ser solicitados a qualquer momento por meio dos nossos canais de atendimento:\n\n- [Certificado de conformidade em testes de segurança](https://tdn.totvs.com/download/attachments/611010249/TISBD%20-%20Certificado%20de%20Conformidade%20em%20testes%20de%20seguran%C3%A7a_FLUIG.pdf.pdf?version=1&modificationDate=1738241078047&api=v2);\n\n- [*Letter of attestation* - *Bounty program*](https://tdn.totvs.com/download/attachments/611010249/Letter%20of%20attestation%20-%20Bounty%20program%20Fluig.pdf%20-%20254.706%20%C3%97%20297.039mm%20-%20Canva.pdf?version=1&modificationDate=1738241076453&api=v2).\n\n# *Checklist*\n\n---\n\n**Política de senha**\n\nTroque a senha do usuário **wcmadmin** regularmente. Se possível, incentive seus usuários a trocarem a senha com regularidade e implemente a utilização de senhas fortes.\n\nPara um gerenciamento mais completo e seguro dos acessos, permissões e identidades, recomendamos implementar o [TOTVS Identity integrado com o Fluig](../Configuração/Identity/Integração da plataforma com o Identity.md). Você também pode utilizar os eventos beforeCreateUser e beforeUpdateUser para criar regras de senhas fortes. Mais informações em [Desenvolvimento de eventos](../Desenvolvimento sobre a plataforma/Desenvolvimento de Eventos.md).\n\n**Login e matrícula dos usuários**\n\nNão crie usuários com matrícula e login iguais. Não utilize dados pessoais, como o CPF, pois esses campos não podem ser anonimizados, alterados ou excluídos.\n\n**Configurações de segurança para login**\n\nRecomendamos a implementação de configurações de segurança [para ampliar a proteção contra acessos não autorizados à plataforma e evitar ataques de força bruta](../Configuração/Configuração de Ambiente/Configurações de segurança para prevenção de ataques de força bruta BFA (Brute Force Attack).md).md) (Brute Force Attack).\n\n**Verifique a segurança de APIs, Datasets e Webservices**\n\nVocê pode configurar permissões de acesso em APIs, Datasets e Webservices, conforme explica a documentação: [Recursos de permissão em APIs, datasets e webservices](https://tdn.totvs.com/x/pB2eI).\n\n**Não executar como *root***\n\nA inicialização dos serviços da plataforma em Servidor Linux não pode ser realizada com o usuário *root*, para isso deve configurar seu ambiente conforme é orientado na documentação: [Configurar ambiente Linux para não utilizar o usuário root](../Configuração/Configuração de Ambiente/Configurar ambiente Linux para não utilizar o usuário root.md).\n\n**Não exponha o servidor de aplicação diretamente na internet**\n\nO TOTVS Fluig Plataforma possui suporte a implementação de DMZ e sugerimos a implementação conforme explica a documentação: [Topologia DMZ](../Configuração/Configuração de Ambiente/Topologia DMZ.md).\n\n**Criptografar a senha do banco de dados e LDAP**\n\nA senha do banco de dados deve ser criptografada no arquivo standalone.xml (a partir da 2.0) ou no domain.xml (1.6 até 1.8.2). Consulte o procedimento em: [Encriptação de senha do banco de dados](../Configuração/Configuração de Banco de Dados/Encriptação de senha do banco de dados.md).\nO mesmo se aplica a senha do LDAP, quando configurado este tipo de autenticação. Consulte o procedimento em: [Configuração de autenticação utilizando LDAP](../Configuração/Configuração de Ambiente/Configuração de autenticação utilizando LDAP.md).\n\n**Protocolo HTTPS**\n\nConfigure a plataforma para utilizar o protocolo HTTPS e a opção *Flags \"HttpOnly\"* e *\"Secure\"* nos *cookies* será automaticamente habilitada. É importante mantê-la habilitada. Verifique também o nível de segurança habilitando as configurações da compatibilidade Moderna.\nPara mais detalhes consulte [Configuração HTTPS da plataforma](../Configuração/Configuração de Ambiente/HTTPS/Configuração HTTPS da plataforma.md), [Configurações do sistema](https://tdn.totvs.com/x/EO4KDg) e [Configuração de níveis de segurança no HTTPS](../Configuração/Configuração de Ambiente/HTTPS/Configuração de níveis de segurança no HTTPS.md).\n\n**oculto**\n\n**Configurações do servidor de aplicação**\n\nMantenha as configurações do Apache e Nginx atualizadas: [Título link](../../images/%C3%ADcone%20widget%20links%20%C3%BAteis.png).\n\n**Páginas públicas**\n\nNão deixe exposto credenciais de acesso (chaves de autenticação, usuário e senha, etc) em páginas públicas. Veja como consultar serviços autenticados em página pública de forma segura: [Como expor dados em ambientes públicos](../Configuração/Apps e Mashups/Como expor dados em ambientes públicos.md).\n\n**Utilize IPs no arquivo standalone.xml (a partir da 2.0) ou no domain.xml (1.6 até 1.8.2)**\n\nSempre utilize o IP da rede interna no arquivo de configuração, de acordo com a atualização do Fluig que você utiliza. Isso evita chegar ao servidor, caso haja algum vazamento.\n\n**Arquivo robots.txt**\n\nConfigurar o arquivo robots.txt. A partir da **atualização 1.7.1-211207** a plataforma cria automaticamente o arquivo impedindo o rastreamento de arquivos do site. Para mais detalhes, consulte a documentação: [Como configurar o arquivo robots.txt](../Configuração/Configuração de Ambiente/Como configurar o arquivo robots.txt.md).\n\n**Domínios de busca**\n\nRemova as informações dos resultados da pesquisa, para saber mais acesse: [Remover informações do Google](https://developers.google.com/search/docs/advanced/crawling/remove-information?hl=pt-br).\n \n\\* O Google é o mais comum, mas esse procedimento pode ser feito para outros buscadores.\n\n**Version**\n\nLibere o acesso para **https://version.fluig.com**. O serviço de versionamento do Fluig notifica sobre novas versões disponíveis e atualizações de segurança.\n\n**Bloqueio de *Clickjacking***\n\nMantenha habilitado o bloqueio de *Clickjacking* conforme orientado na documentação: [Configurações da plataforma](https://tdn.totvs.com/pages/releaseview.action?pageId=257623022#Configura%C3%A7%C3%B5esdaplataforma-BloqueiodeClickjacking).\n\n**Informações no cabeçalho dos balanceadores**\n\nAvalie a configuração dos balanceadores de carga para que não enviem informações desnecessárias no cabeçalho conforme instruído [nessa documentação](../Configuração/Configuração de Ambiente/Proxy reverso/Ocultar informações no cabeçalho HTTP.md).\n\n**Matriz de portabilidade**\n\nUtilize as versões de software homologadas na [Matriz de portabilidade](Matriz de Portabilidade.md).\n\n**Execução de antivírus**\n\nPara ambientes que necessitam utilizar antivírus, adicione a pasta de instalação do Fluig e o diretório de volume como exceções para que não interfiram nas funções de leitura/escrita.\n\n**SO e softwares atualizados**\n\nMantenha o Sistema Operacional atualizado, principalmente em relação aos patches de segurança. Desinstale softwares não essenciais e, na presença deles, mantenha-os atualizados.\n\n**Configuração padrão**\n\nAltere as portas e as configurações padrão da plataforma.\n\n**CORS (*Cross-origin Resource Sharing*)**\n\nRecomendamos a configuração do CORS (*Cross-origin Resource Sharing* ou Compartilhamento de Recursos de Origem Cruzada) que é um mecanismo utilizado pelos navegadores para compartilhar recursos entre diferentes origens. Obtenha informações detalhadas em [*Cross-origin Resource Sharing*](../Configuração/Configuração de Ambiente/CORS (Cross-origin Resource Sharing).md).md).\n\n**Acesso ao Servidor de indexação (Solr)**\n\nRecomendamos que nunca deixe o Solr exposto à Internet ou a qualquer máquina da sua rede interna. Utilize o parâmetro **SOLR\\_IP\\_ALLOWLIST1** e defina quais IPs podem ter acesso ao Painel administrativo do Solr. Assim, o acesso fica restrito aos IPs listados. Obtenha mais informações em [Servidor de indexação em alta disponibilidade](../Configuração/Configuração de Ambiente/Servidor de indexação dedicado/Servidor de indexação em alta disponibilidade.md). \n**1** → Disponível apenas a partir da atualização **Crystal Mist (1.8.2)**.\n\n**oculto**\n\n**Item modelo**\n\nRecomendamos .... conforme a documentação [Título link](../../images/%C3%ADcone%20widget%20links%20%C3%BAteis.png). Para que o item seja apresentado, editar o Painel e remover o título \"oculto\"" }, { "metadata": { "title": "Consumo de Banda", "source": "https://tdn.totvs.com/display/fluig/Consumo+de+Banda", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Consumo de Banda.md" }, "content": "Consumo de Banda" }, { "metadata": { "title": "Consumo de Banda", "source": "https://tdn.totvs.com/display/fluig/Consumo+de+Banda", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Consumo de Banda.md" }, "content": "Consumo de Banda\n\n\nAtenção\n\nEsta página foi revisada para considerar as novas configurações de server do Fluig para a atualização 1.6.\n\nCaso possua uma atualização anterior do Fluig acesse: [Como funciona o consumo de banda da plataforma nas atualizações 1.5.13 e inferiores?](https://tdn.totvs.com/pages/viewpage.action?pageId=73075821).\n\n# Objetivo\n\n---\n\nO objetivo desta documentação é apresentar o consumo de banda das tarefas do fluig.\n\n# Consumo de Banda\n\n---\n\nPara um usuário, o consumo de banda em tarefas comuns do Fluig são:\n\n| Recurso | Trafegado |\n| --- | --- |\n| Login | 390 KB |\n| Home WCM | 578 KB |\n| Empresas | 703 KB |\n| Home inicial vazia | 1,2 MB |\n| Navegação de documentos | 1.1 MB |\n| Edição atributos de documento | 1.1 MB |\n| Visualização de documento | 1.3 MB |\n| Central de Tarefas | 1.2 MB |\n| Página de Processos | 975 KB |\n| Visualização / Edição do processo | 1.1 MB |\n| Aprendizado / Início | 1,9 MB |\n| Execução de avaliação | 1,3 MB |\n| Turma em andamento | 1,1 MB |\n| Trilha em andamento (5 itens de trilha) | 1,9 MB |\n| Treinamento em andamento | 1,1 MB |\n| Catálogo de Disciplinas e Turmas | 8,8 KB |\n| Catálogo de Trilhas e Treinamentos | 309 KB |\n\nImportante\n\nEm casos de integração do Fluig com o ERP e/ou softwares de terceiros onde as instalações tenham comunicação remota é necessário um *link* com no mínimo 1 Mbps entre as aplicações.\n\nPara análise de *links* de internet, deve-se acionar otime de**Infra Services TOTVS**. Esta equipe oferece todo o apoio necessário através de reuniões de entendimento, visitas técnicas (quando necessário), dentre outros serviços. Entre em contato com o seu ESN para buscar orientações sobre como proceder e solicitar uma proposta.\n\n# Documentos\n\n---\n\nPara documentos com tamanho médio de 500 KB, o uso de banda por usuário é de aproximadamente 20 KB/s.\n\n# LMS\n\n---\n\nReferente à execução de conteúdos (vídeo, áudio, PDF, SCORM, etc.) no LMS do TOTVS Fluig Plataforma, deve ser considerado 1,1 MB para inicializar o *player* de conteúdo + tamanho do arquivo do conteúdo.\n\nO tamanho dos conteúdos (imagens, vídeos, etc.), que é de responsabilidade do cliente, pode afetar o desempenho de execução desse conteúdo, dependendo da velocidade da conexão à *internet* do usuário.\n\nImportante!\n\nA partir da atualização **[1.6.5-190219](http://tdn.totvs.com/pages/viewpage.action?pageId=442961412#Atualiza%C3%A7%C3%B5es(1.6.5)-190219)**, o **LMS** não faz mais parte da plataforma para **novas instalações**.\n\nMas, não se preocupe: se você adquiriu a plataforma com o **LMS incluso**, entre em contato com o [Suporte Fluig](https://suporte.fluig.com/) para que você consiga utiliza-lo normalmente – mesmo após a atualização **1.6.5-190219**. Se você não lembra se o LMS está incluso ou não no seu pacote, consulte sua proposta comercial ou entre em contato com o seu ESN." }, { "metadata": { "title": "Diferença entre Nuvem Pública e Nuvem Privada", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73077427", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Diferença entre Nuvem Pública e Nuvem Privada.md" }, "content": "Diferença entre Nuvem Pública e Nuvem Privada\n\n\n# Definição\n\n### Nuvem Pública (Cloud)\n\n---\n\nInfraestrutura e controle de ambiente da plataforma TOTVS Fluig administrados pela equipe TOTVS Fluig e/ou parceiros autorizados sobre contrato conforme proposta comercial;\n\n### Nuvem Privada (On-premise)\n\n---\n\nInfraestrutura e controle de ambiente da plataforma TOTVS Fluig administrados pelo CLIENTE, sendo de responsabilidade do mesmo atualizar para nova release;\n\n# Matriz de Diferenças\n\n| | Nuvem Pública\\* | Nuvem Privada |\n| --- | --- | --- |\n| Provisionamento com TOTVS Identity | **Sim** | ****Sim**** (Plataforma em nuvem privada + Identity em nuvem pública) |\n| Espaço em Disco | Conforme proposta | Ilimitado no Software |\n| Cópia Controlada | Conforme proposta | Necessita de Servidor Windows + Microsoft Office instalado no Servidor |\n| Usuários convidados | Conforme proposta | Ilimitado no Software |\n| Acesso a TOTVS Store | **Sim** | **Sim** |\n| Desenvolvimento no Fluig Studio | **Sim** *(instalado na máquina cliente)* | **Sim** |\n| Criação de Tenants | Ilimitado | Ilimitado no Software |\n| Fluig Viewer | Disponível | Disponível |\n| Ambiente de Homologação | Conforme proposta | Instalado na mesma máquina de produção |\n\n\\* Verifique opções com fornecedor de Data Center autorizado." }, { "metadata": { "title": "Dimensionamento", "source": "https://tdn.totvs.com/display/fluig/Dimensionamento", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento.md" }, "content": "Dimensionamento\n\n\n# Objetivo\n\nO processo de dimensionamento de infraestrutura, também conhecido como *sizing*, tem o objetivo de propor a melhor infraestrutura para o cliente a partir de suas necessidades atuais e futuras.\n\nUma infraestrutura inadequada pode causar considerável perda de performance quando houver grande número de acesso simultâneo na aplicação, pois o ambiente não irá oferecer escalabilidade limitando o uso da aplicação. Portanto, é de extrema importância escolher adequadamente a infraestrutura e dimensionamento para que se possa usufruir todos os recursos do TOTVS Fluig Plataforma de forma eficiente.\n\n# Modelos de Infraestrutura e Exemplos de Dimensionamento\n\n---\n\nAcesse os links abaixo para conhecer os modelos de infraestrutura de entrada e os exemplos de dimensionando para sua plataforma:\n\n| Nome | Descrição | Link |\n| --- | --- | --- |\n| **Modelos P, M e G da plataforma** | - Conheça os modelos de infraestrutura de entrada da plataforma TOTVS Fluig, voltados para clientes classificados como pequenas e médias empresas (SMB - *Small and Medium Business*) e modelos para grandes corporações. - São apresentadas configurações pré-definidas, que podem ser utilizadas nos ambientes dos clientes. - Ao utilizar um desses modelos não é necessário solicitar um novo *sizing* ao time TOTVS Fluig, a menos que o uso da plataforma ultrapasse algum dos itens da especificação. | [Modelo de dimensionamento](Dimensionamento/Modelo de dimensionamento.md) |\n| **Solicitação e exemplos de dimensionamento** | - O que são ambientes de ALTA, MÉDIA e BAIXA disponibilidade? - Entenda porque as respostas do formulário de *sizing* devem ser as mais próximas possível da realidade do cliente. | [Solicitação e exemplos de dimensionamento](Dimensionamento/Solicitação e exemplos de dimensionamento.md) |" }, { "metadata": { "title": "Matriz de Portabilidade", "source": "https://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Matriz de Portabilidade.md" }, "content": "Matriz de Portabilidade" }, { "metadata": { "title": "Matriz de Portabilidade", "source": "https://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Matriz de Portabilidade.md" }, "content": "Matriz de Portabilidade\n\n\nIDIOMA\n\n[![Português](..\\..\\images\\pt-BR.png)](https://tdn.totvs.com/pages/viewpage.action?pageId=73075448) [![Espanhol](..\\..\\images\\es-ES.png)](https://tdn.totvs.com/pages/viewpage.action?pageId=181962587) [![Inglês](..\\..\\images\\en-US.png)](https://tdn.totvs.com/pages/viewpage.action?pageId=185741515)\n\n---\n\n- [TOTVS Fluig](#MatrizdePortabilidade-TOTVSFluig)\n - [Servidor](#MatrizdePortabilidade-Servidor)\n - [Cliente Desktop](#MatrizdePortabilidade-ClienteDesktop)\n - [Cliente Mobile](#MatrizdePortabilidade-ClienteMobile)\n - [Tradução](#MatrizdePortabilidade-Tradução)\n- [Matriz de portabilidade Identity](#MatrizdePortabilidade-MatrizdeportabilidadeIdentity)\n- [Matriz de portabilidade para documentos via Webdav](#MatrizdePortabilidade-MatrizdeportabilidadeparadocumentosviaWebdav)\n\n![](..\\..\\images\\matriz-portabilidade.png)\n\n---\n\nNa matriz de portabilidade você encontra os requisitos necessários para a execução do TOTVS Fluig, como por exemplo, sistema operacional e navegadores.\n\nA matriz é atualizada constantemente na tabela abaixo. Os ***status*** correspondem a ![HOMOLOGADO](..\\..\\images\\HOMOLOGADO.png) **HOMOLOGADO**, ![EM ANÁLISE](..\\..\\images\\EM%20AN%C3%81LISE.png) **EM ANÁLISE** e ![NÃO HOMOLOGADO](..\\..\\images\\N%C3%83O%20HOMOLOGADO.png) **NÃO HOMOLOGADO**. [Clique aqui](https://tdn.totvs.com/pages/viewpage.action?pageId=73075448) para saber mais.\n\n| TOTVS Fluig | | | | |\n| --- | --- | --- | --- | --- |\n| Servidor | | | | |\n| Categoria | Produto | Versão | *Status* | Observações |\n| **SGBD** | SQL Server | 2008 | NÃO HOMOLOGADO | Não homologado a partir da atualização 1.5.10 da plataforma. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-sql-server-2008) para saber mais. |\n| 2012 | NÃO HOMOLOGADO | Não homologado a partir da atualização 2.0 da plataforma. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-mysql-sqlserver-oracle) para saber mais. |\n| 2014 | NÃO HOMOLOGADO | Não homologado a partir da atualização 2.0 da plataforma. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-mysql-sqlserver-oracle) para saber mais. |\n| 2016 | HOMOLOGADO | Homologado a partir da atualização 1.6.5 da plataforma. |\n| 2017 | HOMOLOGADO | Homologado a partir da atualização 1.6.5 da plataforma. |\n| 2019 | HOMOLOGADO | Homologado a partir da atualização 1.8.0-221004 da plataforma. |\n| 2022 | HOMOLOGADO | Homologado a partir da atualização 2.0 da plataforma. |\n| MySQL | 5.5 | NÃO HOMOLOGADO | Não homologado a partir da atualização 1.7 da plataforma. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-mysql-55) para saber mais. |\n| 5.6 | NÃO HOMOLOGADO | Não homologado a partir da atualização 2.0 da plataforma. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-mysql-sqlserver-oracle) para saber mais. |\n| 5.7 | NÃO HOMOLOGADO | Não homologado a partir da atualização 2.0 da plataforma. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-mysql-sqlserver-oracle) para saber mais. |\n| 8.0 (a partir da 8.0.27) | HOMOLOGADO | Homologado a partir da atualização 1.8.1 da plataforma. |\n| Oracle | 10G R2 | NÃO HOMOLOGADO | Não homologado a partir da atualização 1.8 da plataforma. |\n| 11G | NÃO HOMOLOGADO | Não homologado a partir da atualização 1.8 da plataforma. |\n| 12C | NÃO HOMOLOGADO | Não homologado a partir da atualização 1.5.10 da plataforma. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-mysql-sqlserver-oracle) para saber mais. |\n| 18C | NÃO HOMOLOGADO | Não homologado a partir da atualização 1.5.10 da plataforma. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-mysql-sqlserver-oracle) para saber mais. |\n| 19C | HOMOLOGADO | Homologado a partir da atualização 1.8 da plataforma. |\n| | | | | |\n| **MIDDLEWARE** | Sistemas operacionais**1** | Windows Server 2012 | NÃO HOMOLOGADO | Não homologado a partir da atualização 2.0 da plataforma. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-windows-server-2012) para saber mais. |\n| Windows Server 2012 R2 | NÃO HOMOLOGADO | Não homologado a partir da atualização 2.0 da plataforma. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-windows-server-2012) para saber mais. |\n| Windows Server 2016 | HOMOLOGADO | |\n| Windows Server 2019 | HOMOLOGADO | |\n| Windows Server 2022 | HOMOLOGADO | Homologado a partir da atualização 2.0 da plataforma. |\n| Windows Server 2025 | EM ANÁLISE | |\n| Red Hat Enterprise Linux 6.4 a 8.7 | HOMOLOGADO | |\n| Red Hat Enterprise Linux 9.5 | HOMOLOGADO | Homologado a partir da atualização 2.0 da plataforma. |\n| CentOS 6.4 a 7.5 | HOMOLOGADO | |\n| Oracle Linux 6.4 a 8.7 | HOMOLOGADO | |\n| Oracle Linux 9.5 | HOMOLOGADO | Homologado a partir da atualização 2.0 da plataforma. |\n| Ubuntu Server 16.04 a 22.04 | HOMOLOGADO | **Observação destinada somente para clientes que usam o MySQL no mesmo servidor do Fluig**: para usar o Ubuntu 20.04 ou 22.04, é necessário que o Fluig esteja na atualização 1.8.1 ou superior, pois ao atualizar para essas versões do Ubuntu, o MySQL é atualizado automaticamente para a versão 8, que é homologada apenas a partir da 1.8.1. Para quem usa outros bancos de dados não há impacto. |\n| Ubuntu Server 24.04 | HOMOLOGADO | Homologado a partir da atualização 2.0 da plataforma. |\n| **1** → Os sistemas operacionais descritos em **Servidor** na matriz de portabilidade também estão homologados para o servidor do ESB. | | | | |\n| | | | | |\n| **LOAD BALANCER / PROXY REVERSO** | Apache | 2.4.12 | HOMOLOGADO | Salientando que a melhor performance do Apache é em servidores Linux. Não recomendamos sua utilização em sistemas operacionais Windows, pois pode comprometer o desempenho. |\n| Big IP | Firmware versão 10 | HOMOLOGADO | |\n| Appliance LTM 1300 | HOMOLOGADO | |\n| Nginx | 1.22.0 | HOMOLOGADO | |\n| 1.24 | EM ANÁLISE | Essa versão não é compatível com o módulo *nginx-stick-module-ng* que é utilizado para o balanceamento de carga na versão *open-source*. |\n| 1.26 | EM ANÁLISE | Essa versão não é compatível com o módulo *nginx-stick-module-ng* que é utilizado para o balanceamento de carga na versão *open-source*. |\n| 1.28 | EM ANÁLISE | Essa versão não é compatível com o módulo *nginx-stick-module-ng* que é utilizado para o balanceamento de carga na versão *open-source*. |\n| Microsoft NLB | Embarcado no Windows Server 2016 | EM ANÁLISE | |\n| WAF | Web Application Firewall | EM ANÁLISE | Foram realizados testes internos que apresentaram problemas. |\n| | | | | |\n| **VIRTUALIZAÇÃO** | VMWare | VMware vSphere 5.0 a 6.5 | HOMOLOGADO | |\n| Hyper-V | Hyper-V em Microsoft Windows Server 2012 R2 | HOMOLOGADO | |\n| | | | | |\n| Cliente Desktop | | | | |\n| **Categoria** | **Produto** | **Versão** | ***Status*** | **Observações** |\n| **BROWSER/ NAVEGADOR** | Google Chrome | 97.0.X ou superior | HOMOLOGADO | |\n| Firefox | 97.0.X ou superior | NÃO HOMOLOGADO | Não homologado a partir da atualização 2.0 da plataforma. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-firefox) para saber mais. |\n| Safari | - | NÃO HOMOLOGADO | |\n| Internet Explorer | IE 11 | NÃO HOMOLOGADO | O suporte à plataforma com o navegador Internet Explorer foi encerrado em 01/03/2021. [Clique aqui](https://centraldeatendimento.totvs.com/hc/pt-br/articles/360055344913) para saber mais. |\n| Microsoft Edge | 97.0.X ou superior | HOMOLOGADO | Homologado a partir da atualização 1.8.0-221004 da plataforma. |\n| Resolução | Mínimo: 1024x768 | HOMOLOGADO | Até a atualização 1.8.2 da plataforma, a resolução mínima é 1024x768. Nas releases posteriores, a resolução mínima será 1366x768. |\n| Método de entrada | *Mouse* e Teclado | HOMOLOGADO | |\n| | | | | |\n| **RUNTIME** | Oracle Java | *Version* 7 *Update* 60 ou superior | HOMOLOGADO | Homologado até a atualização 1.5.13 da plataforma. Utilizado apenas para edição de documentos (WebDAV). |\n| *Version* 8 *Update* 121 ou superior | HOMOLOGADO | Homologado a partir da atualização 1.6.0 da plataforma. Utilizado apenas para edição de documentos (WebDAV). |\n| PDF | 1.7 ou inferior | HOMOLOGADO | |\n| MS Office | 2010 - 2013 | HOMOLOGADO | |\n| 2016 | EM ANÁLISE | |\n| 2019 | HOMOLOGADO | Homologado a partir da atualização 1.7.1 da plataforma. O visualizador interno utiliza o motor do Office 2016, por isso pode haver incompatibilidade com alguns recursos mais novos. |\n| Microsoft Office 365 Business | HOMOLOGADO | Homologado a partir da atualização 1.8.2 da plataforma. |\n| | | | | |\n| Cliente Mobile | | | | |\n| **Categoria** | **Produto** | **Versão** | ***Status*** | **Observações** |\n| **BROWSER/ NAVEGADOR** | iOS - Safari | iOS 6 ou superior | NÃO HOMOLOGADO | |\n| Android - (Chrome e webkit) | Android 5 ou superior | NÃO HOMOLOGADO | |\n| Windows Phone - IE | Windows Phone 8.0 ou 8.1 | NÃO HOMOLOGADO | |\n| Windows Mobile - EDGE | Windows 10 Mobile | NÃO HOMOLOGADO | |\n| | | | | |\n| **APP NATIVO2** | iOS | iOS 15 ou superior | HOMOLOGADO | Recomendamos manter o dispositivo na última versão disponível do iOS, dessa forma ele contará com todas as correções disponibilizadas pela fabricante. |\n| Android | Android 11 ou superior | HOMOLOGADO | Consulte a regra de versionamento para Android com suporte garantido [clicando aqui](https://tdn.totvs.com/pages/viewpage.action?pageId=871502812#NOT%C3%8DCIAS-android). Recomendamos manter o dispositivo na última versão disponível do Android dessa forma ele contará com todas as correções disponibilizadas pela fabricante. |\n| Windows Phone | Windows Phone | NÃO HOMOLOGADO | Conforme notícia publicada em 13/12/2016 e 23/03/2017 removemos o aplicativo Windows Phone da loja e finalizamos o suporte a ele. [Clique aqui](https://tdn.totvs.com/x/3BPyMw#NOT%C3%8DCIAS-windows-phone) para saber mais. |\n| **2** →  O aplicativo do Fluig para cada plataforma móvel (iOS, Android) pode ter recursos diferentes, visto que uma pode ser uma evolução diferente da outra. Na documentação de Recursos do My Fluig estão os recursos disponíveis nos aplicativos para cada plataforma. [Clique aqui](http://tdn.totvs.com/x/fIYtCw) para saber mais. | | | | |\n| | | | | |\n| Tradução | | | | |\n| **País** | | **Idioma** | | ***Status*** |\n| Estados Unidos | | Inglês | | HOMOLOGADO |\n| Brasil | | Português | | HOMOLOGADO |\n| Estándar | | Espanhol | | HOMOLOGADO |\n\nImportante!\n\nO *plug-in* Fluig Studio está homologado apenas para os sistemas operacionais Windows e Linux.\n\n| LEGENDA | | |\n| --- | --- | --- |\n| HOMOLOGADO **HOMOLOGADO** --- Passou por nossos testes e suportamos essa configuração em nosso atendimento. | EM ANÁLISE **EM ANÁLISE** --- A homologação deste item está em *roadmap* e está condicionada a análise, portanto não há uma previsão de homologação para os itens nesta situação. | NÃO HOMOLOGADO **NÃO HOMOLOGADO** --- O item foi avaliado e não é homologado para a plataforma. |\n\n# Matriz de portabilidade Identity\n\n---\n\nAcesse a matriz de portabilidade do Identity [aqui](https://tdn.totvs.com/pages/viewpage.action?pageId=271659128).\n\n# Matriz de portabilidade para documentos via Webdav\n\n---\n\nAcesse a matriz de portabilidade do Webdav para edição de documentos [aqui](http://tdn.totvs.com/x/E5MbCQ).\n\nFicou com alguma dúvida?\n\nEntre em contato com a equipe de **Atendimento TOTVS Fluig** agora mesmo: **(11) 4003-0015**, opção **2** - **2** - **8** - **6**." }, { "metadata": { "title": "Portas e endereços", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=275591571", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Portas e endereços.md" }, "content": "Portas e endereços" }, { "metadata": { "title": "Portas e endereços", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=275591571", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Portas e endereços.md" }, "content": "Portas e endereços\n\n\n- [Objetivo](#Portaseendereços-Objetivo)\n- [Portas padrão utilizadas](#Portaseendereços-Portaspadrãoutilizadas)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é informar as portas padrão e endereços utilizados pelo TOTVS Fluig.\n\n# Portas padrão utilizadas\n\n---\n\nAcompanhe a seguir detalhes sobre as portas utilizadas pela plataforma. Estão sendo listadas três portas padrão de bancos de dados homologados conforme a [Matriz de Portabilidade](Matriz de Portabilidade.md). Caso sua aplicação utilize a de MySQL, por exemplo, as demais (SQL Server e Oracle) deverão ser excluídas da sua lista de portas utilizadas.\n\nImportante mencionar também que, no momento da instalação da plataforma, por algum motivo (*firewall*, portas em uso por outros *softwares*...), as portas padrão poderão ser alteradas para o correto funcionamento. Casos as portas padrão tenham sido alteradas, consulte os parâmetros nos arquivos e páginas de configurações da plataforma.\n\n| Porta | Parâmetro | Uso | Para comunicar com | Afetado pelo *offset* | Necessário ao Cliente ou ao Servidor? | URL Destino |\n| --- | --- | --- | --- | --- | --- | --- |\n| **9021** | webdesk/FTPPort | Porta FTP para a publicação de documentos via FTP | Usuário fazer upload de arquivos na plataforma (normalmente para publicar no GED) | Não | Servidor/Cliente | ftp://:9021 |\n| **25** | mail-smtp | Porta de configuração de envio de e-mail. | Fluig com servidor de e-mail | Não | Servidor | |\n| **1433** | sqlserver | Banco de dados SQL Server | Fluig com banco de dados | Não | Servidor | |\n| **1521** | oracle | Banco de dados Oracle | Fluig com banco de dados | Não | Servidor | |\n| **3306** | mysql | Banco de dados MySQL | Fluig com banco de dados | Não | Servidor | |\n| **3528** | iiop | | Porta de uso interno no Fluig | Sim | Servidor | |\n| **3529** | iiop-ssl | | Porta de uso interno no Fluig | Sim | Servidor | |\n| **4099** | fluig.schedule.server.port | A porta do servidor de agendamentos. | Porta de uso interno no Fluig | Sim | Servidor | |\n| **4713** | txn-status-manager | | Porta de uso interno no Fluig | Sim | Servidor | |\n| **5445** | messaging-remote | Porta remota da fila jms | Porta de uso interno no Fluig | Sim | Servidor | |\n| **5555** | webdesk/LSPort | Porta de comunicação com o servidor do License Server. | Para comunicação entre o Fluig de aplicação e License Server. | Não | Servidor | |\n| **7777** | node.chat.url | RealTime - Chat | Usuário com Realtime (Node.jS) | Não | Cliente | ws://:7777 |\n| **8009** | ajp | | Servidor apache com servidor Fluig, quando habilitado Load Balancer | Sim | Servidor | |\n| **8021** | webdesk/FTPPrivateFolderPort | Porta FTP para a pasta particular | Usuário fazer upload de arquivos no Fluig (normalmente para publicar no GED) | Não | Servidor | ftp://:8021 |\n| **8080** | totvs/serverIPPort | Porta padrão (HTTP) de acesso | Porta de acesso do Fluig | Sim | Servidor/Cliente | http://:8080/ |\n| **8443** | https | Protocolo HTTPS | Usuário com servidor Fluig (quando habilitado https) | Sim | Servidor | https://:8443 |\n| **8888** | node.realtime.url | RealTime | Fluig com Realtime (Node.jS) | Não | Servidor | ws://:8888 |\n| **8983** | totvs/solrURL | Porta do Solr | Para comunicação entre Fluig e o servidor de Indexação. | Não | Servidor | http://:8983/solr |\n| **9990** | jboss.management.http.port | Aplicação – JMX – Console Web | Usuário monitorar o Fluig, normalmente deve estar bloqueada para uso externo | Sim | Servidor | http://:9990/ |\n| **9999** | jboss.management.native.port | Aplicação – JMX - Acesso | Porta de uso interno no Fluig | Sim | Servidor | |\n| **11211** | | Porta do Servidor de cache - Memcached | Fluig com servidor de cache | Não | Servidor | |\n| **15001** | webdesk/OOoPort | Portas disponíveis para o OpenOffice | Com OpenOffice | Não | Servidor | |\n| **15002** | webdesk/OOoPort | Portas disponíveis para o OpenOffice | Com OpenOffice | Não | Servidor | |\n| **443** | | Identity | Identity | Não | Servidor | https://\\*.fluigidentity.com  [Saiba mais](https://tdn.totvs.com/x/0qBSDg) |\n| **443** | | Google Drive | Google | Não | Servidor | |\n| **443** | | Notificação em dispositivos mobile | UrbanAirship, parceiro que centraliza todas as mensagens enviadas para dispositivos mobile (Android ou IOS) | Não | Servidor | https://\\*.urbanairship.com |\n| **443** | | Porta utilizada para configurações no Analytics. | Fluig com a internet | Não | Servidor | [https://analytics.fluig.com](https://analytics.fluig.com/) [https://secure.gooddata.com](https://secure.gooddata.com/) [https://na1.secure.gooddata.com](https://na1.secure.gooddata.com/) [https://na1-di.gooddata.com](https://na1-di.gooddata.com/) [https://secure-di.gooddata.com](https://secure-di.gooddata.com/) |\n| **443** | | Porta utilizada para acesso ao *version*.**\\*** **\\*** É um protocolo proprietário que utiliza a porta 443, porém, não deve ser validado como HTTPS. Adicione a URL como exceção no *proxy* para não ser validado. | Fluig com a internet | Não | Servidor | [http://version.fluig.com](http://version.fluig.com/) |\n| **443** | | Porta utilizada para acesso ao visualizador interno (Fluig viewer). | Fluig com a internet | Não | Servidor | [https://api.accusoft.com.br](https://api.accusoft.com.br/) [https://api.accusoft.com](https://api.accusoft.com/) |\n| **80** | | Porta utilizada para acesso ao visualizador interno (Fluig viewer). | Fluig com a internet | Não | Servidor | [http://api.accusoft.com.br](http://api.accusoft.com.br/) [http://api.accusoft.com](http://api.accusoft.com/) |\n| **80** | | Porta utilizada para *download* dos certificados da ICP-BRASIL | Fluig com a internet | Não | Servidor | [http://politicas.icpbrasil.gov.br](http://politicas.icpbrasil.gov.br/LPA_CAdES.der:%C2%A0connect \"Seguir link\") |\n| **443** | | Porta utilizada para acesso a Central de Ajuda. | Fluig com a internet | Não | Servidor | [tdn.fluig.io](http://tdn.fluig.io) |\n| **5228, 5229, 5230 e 443** | | Notificação em dispositivos mobile. | Firebase Cloud Messaging, serviço de envio e recebimento de notificações Push. (Android e iOS) | Não | Servidor\\Cliente | [mtalk4.google.com](http://mtalk4.google.com) [mtalk-staging.google.com](http://mtalk-staging.google.com) [mtalk-dev.google.com](http://mtalk-dev.google.com) [alt1-mtalk.google.com](http://alt1-mtalk.google.com) [alt2-mtalk.google.com](http://alt2-mtalk.google.com) [alt3-mtalk.google.com](http://alt3-mtalk.google.com) [alt4-mtalk.google.com](http://alt4-mtalk.google.com) [alt5-mtalk.google.com](http://alt5-mtalk.google.com) [alt6-mtalk.google.com](http://alt6-mtalk.google.com) [alt7-mtalk.google.com](http://alt7-mtalk.google.com) [alt8-mtalk.google.com](http://alt8-mtalk.google.com) [android.apis.google.com](http://android.apis.google.com) [device-provisioning.googleapis.com](http://device-provisioning.googleapis.com) [firebaseinstallations.googleapis.com](http://firebaseinstallations.googleapis.com) |\n| **443** | | Listagem e download dos itens da Store | Amazon Web Services (AWS) | Não | Servidor e cliente | https://\\*.[s3.sa-east-1.amazonaws.com](http://s3.sa-east-1.amazonaws.com) https://\\*.[lambda-url.sa](http://lambda-url.sa)-east-1.on.aws |\n| **443** | | Para utilização da Inteligência Artificial e NPS (Pesquisa de satisfação) | Com o Fluig intelligence, que está em Cloud | Não | Servidor | [https://api-fluig.totvs.app](https://api-fluig.totvs.app/fluig-intelligence/api/v1 \"Seguir link\") |\n| **443** | isDisabledNPS | Para utilização do NPS (Pesquisa de uso) | Com a solução de Customer Experience da TOTVS | Não | Cliente | [https://nps-service-core.azurewebsites.net](https://nps-service-core.azurewebsites.net/answer?token=) |\n\nDica!\n\nClique no link para obter mais informações sobre [Configuração de ambientes com alta disponibilidade](../Configuração/Configuração de Ambiente/Alta disponibilidade e balanceamento de carga.md)." }, { "metadata": { "title": "Segurança da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270087659", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Segurança da plataforma.md" }, "content": "Segurança da plataforma\n\n\n- 1 [Objetivo](#Segurançadaplataforma-Objetivo)\n - 1.1 [Segurança nos padrões internacionais](#Segurançadaplataforma-Segurançanospadrõesinternacionais)\n- 2 [Criptografia](#Segurançadaplataforma-Criptografia)\n- 3 [Disponibilidade e continuidade](#Segurançadaplataforma-Disponibilidadeecontinuidade)\n- 4 [Ambiente físico](#Segurançadaplataforma-Ambientefísico)\n- 5 [Ambiente de serviços complementares](#Segurançadaplataforma-Ambientedeserviçoscomplementares)\n- 6 [Integração com sistemas externos](#Segurançadaplataforma-Integraçãocomsistemasexternos)\n- 7 [Ambiente mobile](#Segurançadaplataforma-Ambientemobile)\n- 8 [Segurança da rede e aplicação](#Segurançadaplataforma-Segurançadaredeeaplicação)\n\nDica!\n\n[Acesse aqui](Boas práticas de segurança para o seu ambiente.md) e veja nossas recomendações sobre as **Boas práticas de segurança para o seu ambiente** no TOTVS Fluig Plataforma.\n\n# Objetivo\n\n---\n\nEsse guia tem o objetivo de declarar os controles de segurança realizados dentro do TOTVS Fluig Plataforma e sua execução em ambiente internos (on-premise) ou *cloud*.\n\n## Segurança nos padrões internacionais" }, { "metadata": { "title": "Segurança da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=270087659", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Segurança da plataforma.md" }, "content": "Segurança da plataforma\n\n\n---\n\nO TOTVS Fluig passa por testes de segurança seguindo as principais metodologias internacionais. Ele faz parte do programa de Bug Bounty da TOTVS, que tem como principal objetivo identificar e corrigir potenciais vulnerabilidades em seu ambiente tecnológico de produtos, aderindo e seguindo as melhores práticas recomendadas pelo OWASP (Open Web Application Security Project), uma comunidade mundial dedicada a melhorar a segurança de software. Ao alinhar nossos processos com as diretrizes do OWASP, buscamos garantir a identificação e correção eficazes de potenciais vulnerabilidades em nossa plataforma, contribuindo para um ambiente digital mais seguro e resiliente.\n\nPossuímos certificados e atestados de reconhecimento que demonstram nosso compromisso em seguir as práticas do mercado para processos de desenvolvimento seguro. Esses documentos evidenciam que nossas metodologias e procedimentos estão alinhados com os mais altos padrões de segurança, validados por auditorias internas e externas.\n\nOs certificados e atestados, como os exemplificados abaixo, podem ser solicitados a qualquer momento por meio dos nossos canais de atendimento:\n\n- [Certificado de conformidade em testes de segurança](https://tdn.totvs.com/download/attachments/270087659/TISBD%20-%20Certificado%20de%20Conformidade%20em%20testes%20de%20seguran%C3%A7a_FLUIG.pdf.pdf?version=1&modificationDate=1738240624453&api=v2);\n\n- [*Letter of attestation* - *Bounty program*](https://tdn.totvs.com/download/attachments/270087659/Letter%20of%20attestation%20-%20Bounty%20program%20Fluig.pdf%20-%20254.706%20%C3%97%20297.039mm%20-%20Canva.pdf?version=1&modificationDate=1738240622623&api=v2).\n\n# Criptografia\n\n---\n\n| | |\n| --- | --- |\n| Tráfego de dados | Toda a comunicação da plataforma TOTVS Fluig e os clientes é feito por HTTPS/TLS, o protocolo mais utilizado e confiável no mercado. [Saiba mais sobre configuração HTTPS](http://tdn.totvs.com/x/k_UTEQ) É de responsabilidade do cliente fornecer um certificado válido para utilização do servidor Fluig, exemplo: fluig.empresa.com.br. Caso o cliente não tenha um certificado, sugerimos a utilização do seguinte endereço: [Certificado HTTPS por 2 meses](../Configuração/Configuração de Ambiente/HTTPS/Certificado HTTPS (SSLTLS) Gratuito.md) Gratuito.md) Também é recomendável a configuração de uma [rede DMZ](../Configuração/Configuração de Ambiente/Topologia DMZ.md) para a plataforma. |\n| Senhas | Os dados sensíveis de usuário são gravados de forma que não podem ser descobertos o conteúdo original. É utilizado o algoritmo PBKDF2WithHmacSHA1, para gravação das senhas dos usuários no TOTVS Identity. |\n| Autenticação | O processo de Single Sign On (SSO) é feito através do protocolo SAML, com um certificado gerado internamente, onde não é feita a troca de informações de senha. |\n\n# Disponibilidade e continuidade\n\n---\n\n| | |\n| --- | --- |\n| Serviços TOTVS Identity na Nuvem | Disponibilidade mínima do ambiente do Identity é de 99,5% por mês sobre o **ambiente de produção**. Todo o acompanhamento e notificações sobre mudanças de estado do serviço são disponibilizadas em: [http://status.fluigidentity.com](http://status.fluigidentity.com/). O ambiente de homologação (customerfi) não tem SLA de disponibilidade e página de status. |\n| Serviço Analytics na Nuvem | Disponibilidade mínima do ambiente do Fluig Analytics é de 99,5% por mês sobre o **ambiente de produção**. |\n| Serviço CLOUD | As políticas de disponibilidade e continuidade dependem de proposta comercial, onde nossos planos iniciam com disponibilidade de 97,5% por mês. Confirme na proposta os valores específicos de uso e de disponibilidade. |\n| Alta disponibilidade On premises | É de responsabilidade do cliente on-premises criar um ambiente que atenda a necessidade de disponibilidade e desempenho que o negócio necessitará. Possuímos recomendações sobre como um cliente deve configurar seu ambiente para garantir uma maior disponibilidade. [Saiba mais sobre como criar ambientes de alta disponibilidade](Dimensionamento/Modelo de dimensionamento/Modelo de dimensionamento na release 1.6.5 ou anterior.md). Caso o cliente necessite de um apoio na administração de seu ambiente, possuímos pacotes de serviços para melhor atendê-lo. |\n\n# Ambiente físico\n\n---\n\nDependendo do uso e contrato, o cliente pode estar no datacenter NIMBVS da TOTVS ou no datacenter Amazon. Cada um possui características diferentes.\n\n| | |\n| --- | --- |\n| Ambiente NIMBVS | **Certificações** - ISAE 3402 Tipo II - ISO 9001:2008 - Datacenter TIER III - Gestão de vulnerabilidades executada por consultoria especializada - Monitoramento e bloqueio contra ataques DDOS 24x7 - SIEM - Firewall Next Generation - Política de backup conforme proposta comercial - Política de entrega de dados em caso de interrupção irrecuperável no datacenter TOTVS conforme proposta comercial - Garantia de integridade dos dados conforme contrato **Localidade** Data centers estão localizados em São Paulo, Brasil |\n| Ambiente Amazon | Para serviços Fluig Viewer e para clientes alocados na nuvem Amazon, as seguintes certificações estão incluídas: - ISO 27001 - SOC 1 e SOC 2/SSAE 16/ISAE 3402 (antes SAS 70 Type II) - PCI Level 1 - FISMA Moderate - Sarbanes-Oxley (SOX) [Mais detalhes sobre as certificações em ambiente Amazon](https://aws.amazon.com/pt/compliance/) **Localidade** Data centers alocados são da Zona São Paulo, Brasil |\n\n# Ambiente de serviços complementares\n\n---\n\nPara o funcionamento da plataforma, no conceito de [fog computing](https://pt.wikipedia.org/wiki/Fog_computing), alguns serviços rodam em serviços na nuvem. Para transparência para nossos clientes, segue serviços e localidades.\n\n| | |\n| --- | --- |\n| Ambiente Identity (Produção) | **Localidade** Data centers estão localizados na Zona São Paulo, Brasil, em serviços da Amazon AWS |\n| Ambiente Analytics | Para mais informações sobre a arquitetura e segurança referente aos serviços do Analytics, consulte o [guia de segurança](https://www.gooddata.com/sites/default/files/GoodData_Security_Overview.pdf). **Localidade** Data centers alocados nos Estados Unidos, em serviços da Rackspace |\n| Ambiente Fluig Viewer | **Localidade** Data centers estão localizados na Zona São Paulo, Brasil, em serviços da Amazon AWS |\n\n# Integração com sistemas externos\n\n---\n\nA plataforma pode ser integrada com diversos sistemas em diferentes cenários. Como segurança recomendamos verificar todas essas integrações.\n\n| | |\n| --- | --- |\n| Sistemas legados | Com a plataforma TOTVS Fluig uma das características que é muito utilizada nos projetos criados é a integração com sistemas que a empresa já tem, seja para consulta seja para efetivação. **Tipos de integração suportados:** - SOAP (HTTP e HTTPS) - REST (HTTP e HTTPS) - JDBC (criptografia depende do fornecedor do Banco de Dados) **Autenticações suportadas em REST:** - Basic - OAuth 1 - OAuth 2 - Custom (escrito em JavaScript) - Nenhuma |\n| Serviços para desenvolvimento | A plataforma disponibiliza diversos serviços que possibilitam o desenvolvimento de personalizações e integrações. Por isso recomendamos revisar a segurança de acesso às APIs, Datasets e Webservices. Acesse o [guia de usuário](https://tdn.totvs.com/pages/viewpage.action?pageId=547233188) para mais informações. |\n| Componentes obrigatórios | **On-Premise - License Server** Para verificar o contrato do cliente, será necessário instalar o License Server. Ele se conecta a nuvem para verificar o contrato do cliente ao qual ele tem acesso. [Leia mais sobre o license server](../Configuração/Configuração de Ambiente/Servidor de Licenças (License Server).md).md). **On-Premise - Banco de Dados** Conforme [matriz de portabilidade](Matriz de Portabilidade.md), a plataforma requer a utilização de um banco de dados. Para obter mais detalhes sobre características de segurança desse componente verifique a documentação do seu fornecedor. |\n| Componentes opcionais | **Microsoft Active Directory** Para autenticação de usuários é possível utilizar o Microsoft Active Directory. Tanto a plataforma como o Identity possuem conexões, sendo que para o [Identity](https://tdn.totvs.com/display/fluig/TOTVS+IDENTITY) possuímos o [Identity | SmartSync](https://tdn.totvs.com/pages/viewpage.action?pageId=221547348) que é utilizado para aumentar a segurança nessa comunicação. **SSO Identity - Single Sign On** Por meio do [Identity](https://tdn.totvs.com/display/fluig/TOTVS+IDENTITY) é possível criar ambientes de acesso a diversos sistemas usando protocolos abertos de SSO, como [SAML](https://tdn.totvs.com/display/fluig/Identity+%7C+Single+Sign+On+via+SAML) e [OIDC](https://tdn.totvs.com/pages/viewpage.action?pageId=842293735) (OpenID), incluindo integração com Microsoft Entra ID. **MFA - Autenticação Multifator** Permite um nível extra de segurança na autenticação, exigindo além do usuário e senha, de um número de 6 dígitos gerado usando o protocolo TOTP, gerando um segundo fator de autenticação (2FA) Serviço exclusivo por meio do [Identity](https://tdn.totvs.com/display/fluig/TOTVS+IDENTITY). **SMTP - Envio de e-mail** Para realizar o envio de e-mail de notificações, utilizamos o protocolo SMTP tanto com SSL como TLS. [Leia mais sobre a configuração de e-mail](../Configuração/Configuração de envio de e-mail.md). **Notificações PUSH** Para notificar os usuários de aplicativos móvel é utilizado tanto a infra-estrutura do Google® como da Apple®, em que pequenas mensagens sem dados críticos de negócio são repassadas usando o parceiro de tecnologia UrbanAirship que centraliza todas as mensagens enviadas para clientes TOTVS Fluig. |\n\n# Ambiente mobile\n\n---\n\nA plataforma pode ser acessada via dispositivos móveis com o Fluig Mobile, disponível para [Android](https://play.google.com/store/apps/details?id=br.com.fluig) e [iPhone/iPad](https://itunes.apple.com/br/app/fluig/id682057015).\n\n| | |\n| --- | --- |\n| Trafego de dados | A comunicação entre o Fluig Mobile e o servidor do Fluig é feita através de conexão de rede, onde todo o tráfego de informações ocorre via HTTP. Para acesso via rede de dados celular (3G/4G) é necessário que o endereço do Fluig esteja publicado na internet. Para uma maior segurança, é possível habilitar HTTPS, [respeitando os certificados válidos para dispositivos móveis](https://tdn.totvs.com/pages/viewpage.action?pageId=354472893#Configura%C3%A7%C3%A3oHTTPSdaplataforma-Certificadodigitalmobile). Caso não esteja publicado na internet, é necessário que o dispositivo móvel onde o Fluig Mobile está instalado esteja conectado à uma rede onde seja possível acessar o servidor do Fluig. Ex.: Wi-Fi interna da empresa, conexão VPN, etc. |\n| Autenticação | É realizada utilizando [oAuth](https://oauth.net/), um protocolo seguro de autorização que não armazena o usuário e senha no momento do login, apenas a chave de autenticação (*token*). |\n\n# Segurança da rede e aplicação\n\n---\n\n| | |\n| --- | --- |\n| Recomendação seguida | Para boa parte das ações de segurança, são levadas em consideração as recomendações da OWASP |\n| Teste de vulnerabilidades | Empresas terceiras realizam *Pentests* de forma regular e de forma independente. Descobertas de vulnerabilidades são avaliadas conforme impacto e probabilidade da falha, nisso são criadas tarefas de correção para o time responsável. Para garantir o processo, clientes são orientados a abrir um ticket relatando a situação mapeada no Pentest, juntamente com o impacto. Cada ticket aberto será avaliado pelo time de segurança TOTVS, caso a vulnerabilidade seja confirmada, o ticket entrará em processo de manutenção padrão. Cada situação deve ter um ticket e deve ser evitado criar um ticket com todas as situações. É importante que os testes sejam realizados em um ambiente atualizado com a versão mais recente do Fluig, disponível para download no Portal de Clientes. |\n| Incidentes de segurança | No evento de um vazamento de informações ou de uma descoberta de uma vulnerabilidade, nossos profissionais técnicos são alocados. Para garantir o processo, clientes são orientados a abrir um *ticket* relatando a situação. |" }, { "metadata": { "title": "Modelo de dimensionamento", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento.md" }, "content": "Modelo de dimensionamento" }, { "metadata": { "title": "Modelo de dimensionamento", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento.md" }, "content": "Modelo de dimensionamento\n\n\nAtenção\n\nEsta página foi revisada para considerar as configurações do TOTVS Fluig Plataforma a partir da **atualização 1.7.0 (Lake)**.\n\nSe o seu ambiente possui uma atualização anterior, acesse: [Modelo de dimensionamento na release 1.6.5 ou anterior](Modelo de dimensionamento/Modelo de dimensionamento na release 1.6.5 ou anterior.md)\n\nAtenção\n\nOs modelos abaixo não deverão sofrer nenhum tipo de alteração. Caso o cliente deseje realizar qualquer tipo de alteração, deverá solicitar a homologação do dimensionamento pelos times responsáveis, entrando em contato com os Canais ou parceiros Fluig. \n\n- Plataforma rodando em servidores próprios: deverá ser acionado o time **TOTVS Infra Services** através do [TIS.COMERCIAL@totvs.com.br](mailto:TIS.COMERCIAL@totvs.com.br)\n\n- Plataforma rodando em servidores do Cloud TOTVS: deverá ser acionado o time **Cloud Projetos Técnicos** através do [cloud.projetostecnicos@totvs.com.br](mailto:cloud.projetostecnicos@totvs.com.br)\n\n# Índice\n\n- 1 [Objetivo](#Modelodedimensionamento-Objetivo)\n- 2 [Observações](#Modelodedimensionamento-Observações)\n- 3 [Uso da plataforma](#Modelodedimensionamento-Usodaplataforma)\n- 4 [Hardware](#Modelodedimensionamento-Hardware)\n - 4.1 [Servidor de aplicação](#Modelodedimensionamento-Servidordeaplicação)\n - 4.2 [Repositório / Storage](#Modelodedimensionamento-Repositório/Storage)\n - 4.3 [Servidor de banco de dados](#Modelodedimensionamento-Servidordebancodedados)\n - 4.3.1 [Recomendações dos fabricantes](#Modelodedimensionamento-Recomendaçõesdosfabricantes)\n - 4.3.2 [Recomendação do time Fluig](#Modelodedimensionamento-RecomendaçãodotimeFluig)\n- 5 [Desenho lógico](#Modelodedimensionamento-Desenhológico)\n\n# Objetivo\n\nO objetivo deste guia é mostrar um ambiente pré homologado para clientes que desejam instalar e executar o TOTVS Fluig Plataforma em servidores próprios.\n\n# Observações\n\n- As recomendações abaixo valem para uso moderado, distribuído entre as diversas funcionalidades. Usos intensos em funcionalidades específicas (por exemplo, publicação de documentos, movimentação de processos, publicação de arquivos muito grandes, etc.) requerem configurações mais específicas que precisam ser avaliadas.\n- A configuração ideal para uma instalação da plataforma TOTVS Fluig é ter disponível 12GB de RAM, sendo que 8GB configurado diretamente via parâmetro -Xmx e mais 4GB para uso extra.\n- Consulte também a configuração [Alta disponibilidade e balanceamento de carga](../../Configuração/Configuração de Ambiente/Alta disponibilidade e balanceamento de carga.md).\n\n# Uso da plataforma\n\n| | | | | |\n| --- | --- | --- | --- | --- |\n| | | **P** | **M** | **G** |\n| **Usuários** | Máximo de usuários cadastrados | 20 a 100 | 101 a 300 | 301 a 500 |\n| Máximo de usuários conectados | 80 | 150 | 220 |\n| **Documentos** | Quantidade máxima de publicações diárias | 300 | 500 | 600 |\n| **Processos** | Quantidade máxima de processos desenhados | 5 | 10 | 15 |\n| Média de abertura por hora de solicitações | 50 | 100 | 200 |\n| Integração com ERP? | Sim | Sim | Sim |\n| ERP na mesma rede da plataforma TOTVS Fluig?\\* | Sim | Sim | Sim |\n\n# Hardware\n\nNesta seção estão listadas as definições de *hardware* para os servidores de aplicação e de banco de dados." }, { "metadata": { "title": "Modelo de dimensionamento", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento.md" }, "content": "Modelo de dimensionamento\n\n### Servidor de aplicação" }, { "metadata": { "title": "Modelo de dimensionamento", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento.md" }, "content": "Modelo de dimensionamento\n\n\n| | | | | |\n| --- | --- | --- | --- | --- |\n| | | **P** | **M (maior performance)** | **G (alta performance)** |\n| **Servidores** | Quantidade de instâncias plataforma | 1 | 2¹ | 3¹ |\n| **Memória RAM** | Quantidade de memória em GB por instância | 16 GB ² | 16 GB ² | 16 GB ² |\n| **Processador** | *Bits* | 64 | 64 | 64 |\n| *Core* (vCPU) | 8 | 8 | 8 |\n| **Disco** | Velocidade | SAS de 15.000/rpm | SAS de 15.000/rpm | SAS de 15.000/rpm |\n| Taxa de transferência Rede SAN | 1 GB/s | 1 GB/s | 1 GB/s |\n| Espaço requerido para instalação | 12 GB | 12 GB | 12 GB |\n| Espaço requerido para repositório | (Qtde documentos x Tamanho do documento x Qtde versões) x 1,10 | | |\n| Espaço requerido para diretório de cache \\*\\* | (Qtde documentos acessados no dia x Tamanho do arquivo x 6) | | |\n| Espaço requerido para banco de dados | Mínimo de 5 GB de disco para Fluig - Para o sistema operacional e instalação do SGBD verificar a documentação [Servidor de banco de dados](https://tdn.totvs.com/pages/viewpage.action?pageId=557339796) | | |\n| Sistema de Arquivos Linux | ext4 | ext4 | ext4 |\n| Sistema de Arquivos Windows | NTFS ou ReFS | NTFS ou ReFS | NTFS ou ReFS |\n\n**oculto**\n\n**Informação interna:** \nUm print da tabela acima foi repassado ao RN da 1.7. Caso tenha alguma alteração, atualizar como uma nova versão do anexo **dimensionamento.png** em [Atualização Lake (1.7.0)](https://tdn.totvs.com/pages/viewpage.action?pageId=440834439) e [Checklist atualização 1.7](https://tdn.totvs.com/pages/viewpage.action?pageId=549488105)\n\nObservações\n\n**Dimensionamento**: Entendemos **P** para clientes com poucas integrações e usuários concorrentes, **M** para clientes com mais integrações e usuários concorrentes e que necessitam de uma maior performance, e **G** para clientes com necessidade de alta performance e disponibilidade. \nQuando há muitas integrações, é recomendado rever o número de conexões com o banco de dados. Obtenha mais informações em [Como configurar o dimensionamento de *pools* dos *datasources*](https://centraldeatendimento.totvs.com/hc/pt-br/articles/29536983021335-Fluig-Plataforma-CON-Como-configurar-o-dimensionamento-de-pools-dos-datasources).\n\n¹ Utilizar a configuração de balanceamento de carga, conforme descrito em [Alta disponibilidade e balanceamento de carga](../../Configuração/Configuração de Ambiente/Alta disponibilidade e balanceamento de carga.md)\n\n² Sendo que os 16 GB de memória da instância são distribuídos da seguinte forma:\n\n- Sistema Operacional: 4 GB\n- Fluig: 12GB, sendo 8GB configurados no host.xml e mais 4GB disponíveis no SO para uso da plataforma. O host.xml fica armazenado em [diretório\\_instalação]\\appserver\\domain\\configuration. Dentro do arquivo host.xml, localize a seguinte tag:\n\n```\n\n```\n\nAbaixo desta tag, existe a tag \"heap\", que deve estar assim:\n\n```\n\n```\n\nOnde:\n\nsize=\"2g\" - Quantidade inicial de memória alocada\n\nmax-size=\"8g\" - Quantidade máxima de memória alocada\n\nO total de memória utilizado pela JVM depende de diversos fatores como Java Heap Space, Coletor de lixo, Cache de código, Compilador, Metadados, Threads, etc, Para mais detalhes, consulte a documentação [Consumo de memória pelo servidor de aplicação](Modelo de dimensionamento/Consumo de memória pelo servidor de aplicação.md).\n\n\\* Para sistemas externos que não estão na mesma VLAN que se encontra a plataforma TOTVS Fluig, deve ser levado em consideração a latência entre as redes, pois isso afeta diretamente a performance da plataforma.\n\n\\*\\* O *cache* expira e é eliminado após 24 horas de acesso.\n\n\\*\\*\\* O atributo name*=*\"fluig1\" da tag é padrão da plataforma, mas pode ter sido alterado por quem administra o ambiente." }, { "metadata": { "title": "Modelo de dimensionamento", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento.md" }, "content": "Modelo de dimensionamento\n\n### Repositório / Storage\n\nToda a empresa na plataforma terá um volume, que será onde as informações de documentos serão salvos, não só os documentos de ECM mas também dentro de processos BPM. Apesar de suportarmos sistemas de Storage, mapeados no sistema operacional, é necessário observar a latência entre o servidor de aplicação e o Storage. Qualquer variação nesse canal de comunicação causará grande lentidão na plataforma.\n\nAviso\n\nDevido a grandes latências, não deve ser configurada a plataforma TOTVS Fluig para utilizar repositórios em outros *Datacenters.*\n\n### Servidor de banco de dados\n\n#### Recomendações dos fabricantes\n\n| | | | |\n| --- | --- | --- | --- |\n| **Banco de dados** | **Descrição** | **Link das documentações oficiais** | **Data da consulta** |\n| **Oracle** | Recomendações de *hardware* | | 15/08/2016 |\n| Recomendações de *software* | | 15/08/2016 |\n| **SQL Server** | Recomendações de *hardware* e *software* | | 15/08/2016 |\n| **MySQL 5.7** | Sistemas operacionais suportados | | 15/08/2016 |\n\n#### Recomendação do time Fluig" }, { "metadata": { "title": "Modelo de dimensionamento", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento.md" }, "content": "Modelo de dimensionamento\n\n\n| | |\n| --- | --- |\n| **Banco de dados** | **Descrição** |\n| **Oracle** | [Requisitos mínimo para executar os bancos de dados homologados](Modelo de dimensionamento/Requisitos mínimos para executar os bancos de dados homologados.md) |\n| **SQL Server** |\n| **MySQL 5.7** |\n\nO servidor de aplicação deve ser separado do servidor de banco de dados, sendo 2 servidores no mínimo.\n\nPara garantir a performance da plataforma os servidores devem ser dedicados:\n\n- O servidor de aplicação deve conter somente o sistema operacional e a instalação da plataforma;\n\n- O servidor de banco de dados deve conter somente o sistema operacional e a instalação do banco de dados utilizado pelo cliente;\n\n# Desenho lógico\n\nEste desenho tem como objetivo mostrar como o ambiente virtual será estruturado.\n\nEste desenho representa fielmente o ambiente que deverá montado no cliente. Se o ambiente do cliente estiver construído num modelo inferior ao exibido neste documento, ele será considerado fora do padrão, e em desacordo com o escopo de atendimento e suporte do produto.\n\n![](..\\..\\..\\images\\Ambiente%20Produ%C3%A7%C3%A3o.jpg)\n\n![](..\\..\\..\\images\\VIEWER%20CLOUD%20-%20Ambiente%20Produ%C3%A7%C3%A3o.jpg)" }, { "metadata": { "title": "Solicitação e exemplos de dimensionamento", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244429371", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento.md" }, "content": "Solicitação e exemplos de dimensionamento" }, { "metadata": { "title": "Solicitação e exemplos de dimensionamento", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244429371", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento.md" }, "content": "Solicitação e exemplos de dimensionamento\n\n\nAtenção\n\nO dimensionamento deve ser solicitado pelo cliente aos Canais e parceiros Fluig.\n\nSe necessário, a demanda será encaminhada ao time **Cloud Projetos Técnicos** através do [cloud.projetostecnicos@totvs.com.br](mailto:cloud.projetostecnicos@totvs.com.br) e/ou ao time **TOTVS Infra Services** através do [TIS.COMERCIAL@totvs.com.br](mailto:TIS.COMERCIAL@totvs.com.br).\n\nCaso o dimensionamento (*sizing*) esteja diferente dos modelos listados na documentação [Modelos P, M e G do Fluig](Modelo de dimensionamento.md) e/ou não seja elaborado pelos times mencionados acima, não será homologado pelo Fluig, estando fora dos requisitos e do escopo de atendimento do Suporte Fluig.\n\nPreencha [a planilha de dimensionamento clicando aqui](https://tdn.totvs.com/download/attachments/244429371/2015-11-25-Dimensionamento-Fluig.xlsx?version=1&modificationDate=1489690602000&api=v2), entre em contato com o seu ESN - **Executivo de Soluções de Negócio** - para buscar orientações de como proceder com essa situação e solicite uma proposta.\n\n# Índice\n\n- 1 [Objetivo](#Solicitaçãoeexemplosdedimensionamento-Objetivo)\n- 2 [Solicitação de sizing](#Solicitaçãoeexemplosdedimensionamento-Solicitaçãodesizing)\n - 2.1 [Informações para elaborar dimensionamento](#Solicitaçãoeexemplosdedimensionamento-Informaçõesparaelaborardimensionamento)\n - 2.2 [Disponibilidade do ambiente](#Solicitaçãoeexemplosdedimensionamento-Disponibilidadedoambiente)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é ilustrar os exemplos de sizing para utilização no Fluig.\n\n# Solicitação de sizing\n\n---\n\nNo processo de solicitação de sizing, há um formulário com uma série de questões que devem ser respondidas sobre a utilização do Fluig no cliente. As respostas devem ser aproximadas a experiência que o cliente terá sobre a utilização da plataforma.\n\nObservação\n\nClientes Fluig devem contatar os parceiros e canais Fluig para solicitar o sizing para ambientes.\n\nNa sequência o canal irá tomar as seguintes ações de contato:\n\n- Para Fluig em execução na Nuvem TOTVS deve-se contatar o **time de Projetos Cloud** para que seu sizing seja homologado.\n- Para Fluig em execução em servidores próprios, deve-se contatar o **time de Infra Services TOTVS**, assim você terá todo o apoio através de reuniões de entendimento, visitas técnicas quando necessárias, modelos de sizing, dentre outros serviços." }, { "metadata": { "title": "Solicitação e exemplos de dimensionamento", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244429371", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento.md" }, "content": "Solicitação e exemplos de dimensionamento\n\n### Informações para elaborar dimensionamento\n\n---\n\n- **Quantidade de usuários conectados simultaneamente** \n Por padrão de mercado, a quantidade de usuários conectados ao mesmo tempo é um valor entre 10% e 30% do total de usuários cadastrados em base. \n Ou seja, se você tem 1000 usuários cadastrados você terá entre 100 e 300 usuários conectados simultaneamente.\n- **Quantidade de documentos publicados na implantação**\n- **Quantidade de documentos versionados mensalmente**\n- **Tamanho médio dos arquivos publicados (em Kbytes)** \n Esta métrica está diretamente relacionada ao espaço em disco que será sugerido para o cliente. Sugerimos utilizar o repositório de documentos em um Storage com discos SAS de 15k em RAID-1**.**\n- **Quantidade de processos workflow que será aberta mensalmente** \n Esta métrica está relacionada ao poder de processamento das máquinas onde estarão as instâncias de Fluig. Quanto mais processos abertos mais máquinas serão necessárias.\n\n### Disponibilidade do ambiente" }, { "metadata": { "title": "Solicitação e exemplos de dimensionamento", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244429371", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento.md" }, "content": "Solicitação e exemplos de dimensionamento\n\n\n---\n\nAcompanhe os cenários abaixo considerando a criticidade de disponibilidade do ambiente.\n\n- Quando um ambiente é de alta disponibilidade, estamos falando que este é um ambiente crítico e não pode ficar fora do ar. Para que a disponibilidade seja garantida todas as máquinas envolvidas em um ambiente de alta disponibilidade devem possuir redundância de pelo menos 1 máquina. Estas trabalharam de maneira conjunta dividindo o processamento.\n\n Caso uma máquina cair a máquina que ainda está no ar assumirá todo o processamento. Além de redundância esses ambientes devem ter plano de backup diário. Projetos que demandam este tipo de ambiente são os de maior custo para o cliente.\n\n![](..\\..\\..\\images\\alta.png)\n\n- Quando um ambiente é de média disponibilidade, estamos falando de um ambiente no qual impacta a operação do cliente. Ou seja, se o ambiente ficar fora do ar no período de expediente do cliente esta queda causará impacto em sua operação.\n\n Este ambiente é distribuído para minimizar os pontos de falha. Este é um modelo que apresenta custo médio para o cliente por não ter redundância entre as máquinas, comparado ao modelo de alta disponibilidade.\n\n![](..\\..\\..\\images\\Media%20-%20Ambiente%20Produ%C3%A7%C3%A3o.png)\n\n- Quando um ambiente é de baixa disponibilidade estamos falando de um ambiente no qual não impacta diretamente na operação do cliente, ou seja, se o ambiente ficar fora durante alguns minutos no horário de expediente do cliente esta queda não impactará em sua operação. Este modelo é o de menor custo para o cliente, entretanto é o mais vulnerável.\n\n![](..\\..\\..\\images\\Baixa%20-%20Ambiente%20Produ%C3%A7%C3%A3o.png)" }, { "metadata": { "title": "Consumo de memória pelo servidor de aplicação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244925501", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento\\Consumo de memória pelo servidor de aplicação.md" }, "content": "Consumo de memória pelo servidor de aplicação" }, { "metadata": { "title": "Consumo de memória pelo servidor de aplicação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244925501", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento\\Consumo de memória pelo servidor de aplicação.md" }, "content": "Consumo de memória pelo servidor de aplicação\n\n\n- [Objetivo](#Consumodememóriapeloservidordeaplicação-Objetivo)\n- [Memória alocada pela JVM](#Consumodememóriapeloservidordeaplicação-MemóriaalocadapelaJVM)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é mostrar a configuração correta para evitar problemas quanto ao consumo de memória pelo servidor de aplicação.\n\n# Memória alocada pela JVM\n\n---\n\nO total de memória utilizado pela JVM depende de diversos fatores, como: Java Heap Space, Coletor de lixo, Cache de código, Compilador, Metadados, *Threads*, etc. Como são muitos os fatores envolvidos, não existe uma maneira garantida de estimar o total de memória que será utilizada por um processo Java.\n\n```\nTotal memory = Heap + Code Cache + Metaspace + Symbol tables + Other JVM structures + Thread stacks + Direct buffers + Mapped files + Native Libraries + Malloc overhead + ...\n```\n\nO parâmetro XMX define o quanto de memória estará disponível para o Java Heap Space (memória dinâmica) que é uma das áreas de memória utilizada pela JVM (*Java Virtual Machine*).\n\nDevido a um uso mais alto temos um consumo mais elevado das *threads* tanto de HTTP, como de EJB.\n\nÉ possível verificar que a configuração de *threads* está desta forma:\n\nNo arquivo **standalone.xml** em produção (localizado em [diretório\\_instalação]/appserver/standalone/configuration):\n\n**standalone.xml**\n\n```\n\n\n\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\n```\n\nNo arquivo **domain.xml** em produção (localizado em [diretório\\_instalação]/appserver/domain/configuration):\n\n**domain.xml**\n\n```\n\n\n\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\n```\n\nQuanto maior o uso, mais alto será o consumo de memória. Os espaços de memória são configurados separadamente, o valor máximo é definido pela soma das variáveis (como explicado acima) e o uso real vai variar conforme a carga de processamento atual." }, { "metadata": { "title": "Modelo de dimensionamento na release 1.6.5 ou anterior", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento+na+release+1.6.5+ou+anterior", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento\\Modelo de dimensionamento na release 1.6.5 ou anterior.md" }, "content": "Modelo de dimensionamento na release 1.6.5 ou anterior" }, { "metadata": { "title": "Modelo de dimensionamento na release 1.6.5 ou anterior", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento+na+release+1.6.5+ou+anterior", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento\\Modelo de dimensionamento na release 1.6.5 ou anterior.md" }, "content": "Modelo de dimensionamento na release 1.6.5 ou anterior\n\n\nAtenção\n\nEsta página foi revisada para considerar as configurações do TOTVS Fluig Plataforma até a **atualização Liquid (1.6.5)**.\n\nSe o seu ambiente possui a atualização 1.7.0 ou superior, acesse: [Modelo de dimensionamento](../Modelo de dimensionamento.md)\n\nAtenção\n\nOs modelos abaixo não deverão sofrer nenhum tipo de alteração. Caso o cliente deseje realizar qualquer tipo de alteração, deverá solicitar a homologação do dimensionamento pelos times responsáveis, entrando em contato com os Canais ou parceiros Fluig. \n\n- Plataforma rodando em servidores próprios: deverá ser acionado o time **TOTVS Infra Services** através do [TIS.COMERCIAL@totvs.com.br](mailto:TIS.COMERCIAL@totvs.com.br)\n\n- Plataforma rodando em servidores do Cloud TOTVS: deverá ser acionado o time **Cloud Projetos Técnicos** através do [cloud.projetostecnicos@totvs.com.br](mailto:cloud.projetostecnicos@totvs.com.br)\n\n# Índice\n\n- 1 [Objetivo](#Modelodedimensionamentonarelease1.6.5ouanterior-Objetivo)\n- 2 [Uso da plataforma](#Modelodedimensionamentonarelease1.6.5ouanterior-Usodaplataforma)\n- 3 [Hardware](#Modelodedimensionamentonarelease1.6.5ouanterior-Hardware)\n - 3.1 [Servidor de aplicação](#Modelodedimensionamentonarelease1.6.5ouanterior-Servidordeaplicação)\n - 3.2 [Repositório / Storage](#Modelodedimensionamentonarelease1.6.5ouanterior-Repositório/Storage)\n - 3.3 [Servidor de banco de dados](#Modelodedimensionamentonarelease1.6.5ouanterior-Servidordebancodedados)\n - 3.3.1 [Recomendações dos fabricantes](#Modelodedimensionamentonarelease1.6.5ouanterior-Recomendaçõesdosfabricantes)\n - 3.3.2 [Recomendação do time TOTVS Fluig](#Modelodedimensionamentonarelease1.6.5ouanterior-RecomendaçãodotimeTOTVSFluig)\n- 4 [Desenho lógico](#Modelodedimensionamentonarelease1.6.5ouanterior-Desenhológico)\n\n# Objetivo\n\nO objetivo deste guia é mostrar um ambiente pré homologado para clientes que desejam instalar e executar o TOTVS Fluig Plataforma em servidores próprios.\n\n# Uso da plataforma\n\n| | | | | |\n| --- | --- | --- | --- | --- |\n| | | **P** | **M** | **G** |\n| **Usuários** | Máximo de usuários cadastrados | 20 a 100 | 101 a 300 | 301 a 500 |\n| Máximo de usuários conectados | 6 a 35 | 36 a 60 | 61 a 100 |\n| **Documentos** | Quantidade máxima de publicações diárias | 300 | 500 | 600 |\n| **Processos** | Quantidade máxima de processos desenhados | 5 | 10 | 15 |\n| Média de abertura por hora de solicitações | 50 | 100 | 200 |\n| Integração com ERP? | Sim | Sim | Sim |\n| ERP na mesma rede da plataforma TOTVS Fluig?\\* | Sim | Sim | Sim |\n\n# Hardware\n\nNesta seção estão listadas as definições de *hardware* para os servidores de aplicação e de banco de dados." }, { "metadata": { "title": "Modelo de dimensionamento na release 1.6.5 ou anterior", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento+na+release+1.6.5+ou+anterior", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento\\Modelo de dimensionamento na release 1.6.5 ou anterior.md" }, "content": "Modelo de dimensionamento na release 1.6.5 ou anterior\n\n### Servidor de aplicação" }, { "metadata": { "title": "Modelo de dimensionamento na release 1.6.5 ou anterior", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento+na+release+1.6.5+ou+anterior", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento\\Modelo de dimensionamento na release 1.6.5 ou anterior.md" }, "content": "Modelo de dimensionamento na release 1.6.5 ou anterior\n\n\n| | | | | |\n| --- | --- | --- | --- | --- |\n| | | **P** | **M** | **G** |\n| **Memória RAM** | Quantidade de memória em GB | 8 GB ¹ | 12 GB ² | 16 GB ³ |\n| **Processador** | *Bits* | 64 | 64 | 64 |\n| *Core* (vCPU) | 2 | 4 | 4 |\n| **Disco** | Velocidade | SAS de 15.000/rpm | SAS de 15.000/rpm | SAS de 15.000/rpm |\n| Taxa de transferência Rede SAN | 1 GB/s | 1 GB/s | 1 GB/s |\n| Espaço requerido para instalação | 12 GB | 12 GB | 12 GB |\n| Espaço requerido para repositório | (Qtde documentos x Tamanho do documento x Qtde versões) x 1,10 | | |\n| Espaço requerido para diretório de cache \\*\\* | (Qtde documentos acessados no dia x Tamanho do arquivo x 6) | | |\n| Espaço requerido para banco de dados | Mínimo de 5 GB de disco para a plataforma - Para o sistema operacional e instalação do SGBD verificar a documentação [Servidor de banco de dados](https://tdn.totvs.com/pages/viewpage.action?pageId=244735798) | | |\n| Sistema de Arquivos Linux | ext4 | ext4 | ext4 |\n| Sistema de Arquivos Windows | NTFS ou ReFS | NTFS ou ReFS | NTFS ou ReFS |\n\nObservações\n\n¹ Sendo que os 8 GB de memória são dedicados à plataforma TOTVS Fluig, da seguinte forma:\n\n- Java (5 GB) – Configuração realizada no host.xml, armazenado em [diretório\\_instalação]\\appserver\\domain\\configuration. Dentro do arquivo host.xml, localize a seguinte tag:\n\n```\n\n```\n\n- Abaixo desta tag, altere as seguintes propriedades:\n\nsize=\"1g\" - Quantidade inicial de memória alocada\n\nmax-size=\"4g\" - Quantidade máxima de memória alocada\n\n-XX:MaxMetaspaceSize=1g\n\n- Sistema Operacional (3 GB);\n\n² Sendo que os 12 GB de memória são dedicados à plataforma, da seguinte forma:\n\n- Java (8 GB) – Configuração realizada no host.xml, armazenado em [diretório\\_instalação]\\appserver\\domain\\configuration. Dentro do arquivo host.xml, localize a seguinte tag:\n\n```\n\n```\n\n- Abaixo desta tag, altere as seguintes propriedades:\n\nsize=\"2g\" - Quantidade inicial de memória alocada\n\nmax-size=\"7g\" - Quantidade inicial de memória alocada\n\n-XX:MaxMetaspaceSize=1g\n\n- Sistema operacional (4 GB)\n\n³ Sendo que os 16 GB de memória são dedicados à plataforma, da seguinte forma:\n\n- Java (13 GB) – Configuração realizada no host.xml, armazenado em [diretório\\_instalação]\\appserver\\domain\\configuration. Dentro do arquivo host.xml, localize a seguinte tag:\n\n```\n\n```\n\n- Abaixo desta tag, altere as seguintes propriedades:\n\nsize=\"4g\" - Quantidade inicial de memória alocada\n\nmax-size=\"12g\" - Quantidade máxima de memória alocada\n\n-XX:MaxMetaspaceSize=1g\n\n- Sistema operacional (3 GB)\n\n\\* Para sistemas externos que não estão na mesma VLAN que se encontra a plataforma TOTVS Fluig, deve ser levado em consideração a latência entre as redes, pois isso afeta diretamente a performance da plataforma.\n\n\\*\\* O *cache* expira e é eliminado após 24 horas de acesso.\n\n\\*\\*\\* O atributo name*=*\"fluig1\" da tag é padrão da plataforma, mas pode ter sido alterado pelo administrador do ambiente." }, { "metadata": { "title": "Modelo de dimensionamento na release 1.6.5 ou anterior", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento+na+release+1.6.5+ou+anterior", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento\\Modelo de dimensionamento na release 1.6.5 ou anterior.md" }, "content": "Modelo de dimensionamento na release 1.6.5 ou anterior\n\n### Repositório / Storage\n\nToda a empresa na plataforma terá um volume, que será onde as informações de documentos serão salvos, não só os documentos de ECM mas também dentro de processos BPM. Apesar de suportarmos sistemas de Storage, mapeados no sistema operacional, é necessário observar a latência entre o servidor de aplicação e o Storage. Qualquer variação nesse canal de comunicação causará grande lentidão na plataforma.\n\nAviso\n\nDevido a grandes latências, não deve ser configurada a plataforma TOTVS Fluig para utilizar repositórios em outros *Datacenters*\n\n### Servidor de banco de dados\n\n#### Recomendações dos fabricantes\n\n| | | | |\n| --- | --- | --- | --- |\n| **Banco de dados** | **Descrição** | **Link das documentações oficiais** | **Data da consulta** |\n| **Oracle** | Recomendações de *hardware* | | 15/08/2016 |\n| Recomendações de *software* | | 15/08/2016 |\n| **SQL Server** | Recomendações de *hardware* e *software* | | 15/08/2016 |\n| **MySQL 5.7** | Sistemas operacionais suportados | | 15/08/2016 |\n\n#### Recomendação do time TOTVS Fluig" }, { "metadata": { "title": "Modelo de dimensionamento na release 1.6.5 ou anterior", "source": "https://tdn.totvs.com/display/fluig/Modelo+de+dimensionamento+na+release+1.6.5+ou+anterior", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento\\Modelo de dimensionamento na release 1.6.5 ou anterior.md" }, "content": "Modelo de dimensionamento na release 1.6.5 ou anterior\n\n\n| | |\n| --- | --- |\n| **Banco de dados** | **Descrição** |\n| **Oracle** | [Requisitos mínimo para executar os bancos de dados homologados](Requisitos mínimos para executar os bancos de dados homologados.md) |\n| **SQL Server** |\n| **MySQL 5.7** |\n\nO servidor de aplicação deve ser separado do servidor de banco de dados, sendo 2 servidores no mínimo.\n\nPara garantir a performance da plataforma os servidores devem ser dedicados:\n\n- O servidor de aplicação deve conter somente o sistema operacional e a instalação da plataforma;\n\n- O servidor de banco de dados deve conter somente o sistema operacional e a instalação do banco de dados utilizado pelo cliente;\n\n# Desenho lógico\n\nEste desenho tem como objetivo mostrar como o ambiente virtual será estruturado.\n\nEste desenho representa fielmente o ambiente que deverá montado no cliente. Se o ambiente do cliente estiver construído num modelo inferior ao exibido neste documento, ele será considerado fora do padrão, e em desacordo com o escopo de atendimento e suporte do produto.\n\n![](..\\..\\..\\..\\images\\Ambiente%20Produ%C3%A7%C3%A3o.jpg)\n\n![](..\\..\\..\\..\\images\\VIEWER%20CLOUD%20-%20Ambiente%20Produ%C3%A7%C3%A3o.jpg)" }, { "metadata": { "title": "Requisitos mínimos para executar os bancos de dados homologados", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244736171", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Modelo de dimensionamento\\Requisitos mínimos para executar os bancos de dados homologados.md" }, "content": "Requisitos mínimos para executar os bancos de dados homologados\n\n\n# Índice\n\n- 1 [Objetivo](#Requisitosmínimosparaexecutarosbancosdedadoshomologados-Objetivo)\n - 1.1 [Recomendação mínima](#Requisitosmínimosparaexecutarosbancosdedadoshomologados-Recomendaçãomínima)\n\n# Objetivo\n\nO objetivo deste guia é mostrar qual o hardware mínimo para executar os bancos de dados homologados, conforme demonstrado na [Matriz de Portabilidade](../../Matriz de Portabilidade.md) do TOTVS Fluig Plataforma.\n\n## Recomendação mínima\n\n| | | |\n| --- | --- | --- |\n| **Memória RAM** | Quantidade de memória em GB | 8 GB ¹ |\n| **Processador** | Bits | 64 |\n| Core (vCPU) | 2 |\n| **Disco** | Quantidade de disco | 60 GB ¹ |\n\n¹ Quantidade de disco médio para o sistema operacional e o banco de dados. Este valor poderá ser modificado conforme necessidade do cliente." }, { "metadata": { "title": "Cliente 1 - Ambiente de alta disponibilidade - Cloud", "source": "https://tdn.totvs.com/display/fluig/Cliente+1+-+Ambiente+de+alta+disponibilidade+-+Cloud", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 1 - Ambiente de alta disponibilidade - Cloud.md" }, "content": "Cliente 1 - Ambiente de alta disponibilidade - Cloud\n\n\n# Índice\n\n- 1 [Dimensionamento em ambiente de alta disponibilidade executando na Nuvem Totvs](#Cliente1AmbientedealtadisponibilidadeCloud-DimensionamentoemambientedealtadisponibilidadeexecutandonaNuvemTotvs)\n - 1.1 [Perguntas do formulário](#Cliente1AmbientedealtadisponibilidadeCloud-Perguntasdoformulário)\n - 1.2 [Desenho lógico](#Cliente1AmbientedealtadisponibilidadeCloud-Desenhológico)\n - 1.3 [Definições de hardware](#Cliente1AmbientedealtadisponibilidadeCloud-Definiçõesdehardware)\n\n# Dimensionamento em ambiente de alta disponibilidade executando na Nuvem Totvs\n\nConfira a seguir o exemplo de dimensionamento para ambiente de alta disponibilidade executando em nuvem Totvs.\n\nEste é um dimensionamento real executado em cliente. Os dados abaixo podem ser usados como exemplos e podem ser aplicados à qualquer banco de dados homologado pelo Fluig.\n\n### Perguntas do formulário" }, { "metadata": { "title": "Cliente 1 - Ambiente de alta disponibilidade - Cloud", "source": "https://tdn.totvs.com/display/fluig/Cliente+1+-+Ambiente+de+alta+disponibilidade+-+Cloud", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 1 - Ambiente de alta disponibilidade - Cloud.md" }, "content": "Cliente 1 - Ambiente de alta disponibilidade - Cloud\n\n\n| INDIVÍDUOS CADASTRADOS | | | |\n| --- | --- | --- | --- |\n| Informar a quantidade de indivíduos cadastrados para uso do Fluig: | | | 3500 |\n| ACESSOS SIMULTÂNEOS | | | |\n| Informar a quantidade de indivíduos acessando o Fluig simultaneamente: | | | 150 |\n| VIRTUALIZAÇÃO | | | |\n| O cliente tem ambiente virtualizado para o servidor do Fluig? | | | Não |\n| O cliente tem ambiente virtualizado para o banco de dados? | | | Não |\n| BANCO DE DADOS | | | |\n| Qual é o banco de dados a ser usado em produção? | | | Microsoft SQL Server 2012 ou superior |\n| O banco de dados será migrado de uma versão Progress? | | | Não |\n| Caso haja migração de um banco Progress, qual o tamanho? | | | |\n| ECM | | | |\n| DOCUMENTOS | | | |\n| Qual é a quantidade de documentos publicados na implantação? | | | 0 |\n| Qual é a quantidade média de documentos que serão publicados/versionados por mês? | | | 0 |\n| Indique o tamanho médio dos documentos que serão publicados. (O valor deve estar em Kbytes.) | | | 0 |\n| Será usado o visualizador de documentos do Fluig? | | | Não |\n| BPM | | | |\n| PROCESSOS | | | |\n| Qual é a quantidade de definições de processos workflow a serem implantados? | | | 0 |\n| Qual é a média de atividades relacionadas a cada processo workflow? | | | 0 |\n| Qual é a quantidade média mensal de processos workflow iniciados? | | | 0 |\n| Especifique a quantidade média de publicações via formulários por mês. | | | 0 |\n| Especifique a quantidade de grupos de usuários que serão utilizados. | | | 0 |\n| Especifique a quantidade média de usuários por grupo. | | | 0 |\n| Existem processos de workflow integrados com ERP TOTVS ou de terceiros? | | | Não |\n| ANALYTICS | | | |\n| ANÁLISE DE DADOS | | | |\n| Será necessária a análise dos dados de documentos e processos? | | | Não |\n| Será necessária a análise dos dados de comunidades e usuários? | | | Não |\n| Especifique a quantidade de dashboards para visualização. | | | Não |\n| PORTAIS | | | |\n| PORTAIS | | | |\n| Existe alguma demanda de portais corporativos? | | | Não |\n| Especifique a quantidade prevista de páginas de portais. | | | 0 |\n| COLABORAÇÃO | | | |\n| COMUNIDADES | | | |\n| Serão criadas comunidades no Fluig? | | | Não |\n| As comunidades terão widgets que consumirão dados de ERPS? | | | Não |\n| Serão utilizadas galerias de vídeos nas comunidades ? | | | Não |\n| Serão utilizadas galerias de imagens nas comunidades ? | | | Não |\n| LMS | | | |\n| APRENDIZADO | | | |\n| Qual é a quantidade de treinamentos criados no Fluig? | | | 60 |\n| Qual é a quantidade de turmas criadas no Fluig? | | | 15 |\n| Qual é a quantidade de conteúdos de aprendizado que serão criados no Fluig? | | | 30 |\n| Qual é a quantidade média de matrículas ativas? | | | 3000 |\n| Qual é a quantidade de usuários que serão alunos? | | | 3500 |\n| AVALIAÇÕES | | | |\n| Qual é a quantidade de questões que serão criadas no Fluig? | | | 1000 |\n| Qual é a quantidade de avaliações que serão criadas no Fluig? | | | 100 |\n| Pretende aplicar avaliações para pessoas fora do Fluig? Se sim, qual é a frequência? | | | Não |" }, { "metadata": { "title": "Cliente 1 - Ambiente de alta disponibilidade - Cloud", "source": "https://tdn.totvs.com/display/fluig/Cliente+1+-+Ambiente+de+alta+disponibilidade+-+Cloud", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 1 - Ambiente de alta disponibilidade - Cloud.md" }, "content": "Cliente 1 - Ambiente de alta disponibilidade - Cloud\n\n### Desenho lógico\n\n![](..\\..\\..\\..\\images\\Cliente1%20-%20Ambiente%20Produ%C3%A7%C3%A3o.png)\n\n### Definições de hardware\n\n---\n\n![](../../../../images/oie_transparent%20(44).png).png)\n\n![](../../../../images/oie_transparent%20(45).png).png)\n\n![](../../../../images/oie_transparent%20(46).png).png)\n\n![](../../../../images/oie_transparent%20(47).png).png)\n\n![](../../../../images/oie_transparent%20(48).png).png)\n\n![](../../../../images/oie_transparent%20(49).png).png)" }, { "metadata": { "title": "Cliente 2 - Ambiente de média disponibilidade - Cloud", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244425315", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 2 - Ambiente de média disponibilidade - Cloud.md" }, "content": "Cliente 2 - Ambiente de média disponibilidade - Cloud" }, { "metadata": { "title": "Cliente 2 - Ambiente de média disponibilidade - Cloud", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244425315", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 2 - Ambiente de média disponibilidade - Cloud.md" }, "content": "Cliente 2 - Ambiente de média disponibilidade - Cloud\n\n\n# Índice\n\n- 1 [Dimensionamento em ambiente de média disponibilidade executando na Nuvem Totvs](#Cliente2AmbientedemédiadisponibilidadeCloud-DimensionamentoemambientedemédiadisponibilidadeexecutandonaNuvemTotvs)\n - 1.1 [Desenho lógico](#Cliente2AmbientedemédiadisponibilidadeCloud-Desenhológico)\n - 1.2 [Definições de hardware](#Cliente2AmbientedemédiadisponibilidadeCloud-Definiçõesdehardware)\n\n# Dimensionamento em ambiente de média disponibilidade executando na Nuvem Totvs\n\nConfira a seguir o exemplo de dimensionamento para ambiente de média disponibilidade executando em nuvem Totvs.\n\nEste é um dimensionamento real executado em cliente. Os dados abaixo podem ser usados como exemplos e podem ser aplicados à qualquer banco de dados homologado pelo Fluig.\n\n| INDIVÍDUOS CADASTRADOS | | | |\n| --- | --- | --- | --- |\n| Informar a quantidade de indivíduos cadastrados para uso do Fluig: | | | 1000 |\n| ACESSOS SIMULTÂNEOS | | | |\n| Informar a quantidade de indivíduos acessando o Fluig simultaneamente: | | | 100 |\n| VIRTUALIZAÇÃO | | | |\n| O cliente tem ambiente virtualizado para o servidor do Fluig? | | | SIM |\n| O cliente tem ambiente virtualizado para o banco de dados? | | | SIM |\n| BANCO DE DADOS | | | |\n| Qual é o banco de dados a ser usado em produção? | | | MySQL 5.5 ou superior |\n| O banco de dados será migrado de uma versão Progress? | | | Não |\n| Caso haja migração de um banco Progress, qual o tamanho? | | | 0 |\n| ECM | | | |\n| DOCUMENTOS | | | |\n| Qual é a quantidade de documentos publicados na implantação? | | | 167.600 |\n| Qual é a quantidade média de documentos que serão publicados/versionados por mês? | | | 10.000 |\n| Indique o tamanho médio dos documentos que serão publicados. (O valor deve estar em Kbytes.) | | | 500 Kb |\n| Será usado o visualizador de documentos do Fluig? | | | Sim |\n| BPM | | | |\n| PROCESSOS | | | |\n| Qual é a quantidade de definições de processos workflow a serem implantados? | | | A definir |\n| Qual é a média de atividades relacionadas a cada processo workflow? | | | A definir |\n| Qual é a quantidade média mensal de processos workflow iniciados? | | | A definir |\n| Especifique a quantidade média de publicações via formulários por mês. | | | A definir |\n| Especifique a quantidade de grupos de usuários que serão utilizados. | | | A definir |\n| Especifique a quantidade média de usuários por grupo. | | | A definir |\n| Existem processos de workflow integrados com ERP TOTVS ou de terceiros? | | | A definir |\n| ANALYTICS | | | |\n| ANÁLISE DE DADOS | | | |\n| Será necessária a análise dos dados de documentos e processos? | | | Não |\n| Será necessária a análise dos dados de comunidades e usuários? | | | Não |\n| Especifique a quantidade de dashboards para visualização. | | | Não |\n| PORTAIS | | | |\n| PORTAIS | | | |\n| Existe alguma demanda de portais corporativos? | | | Não |\n| Especifique a quantidade prevista de páginas de portais. | | | Não |\n| COLABORAÇÃO | | | |\n| COMUNIDADES | | | |\n| Serão criadas comunidades no Fluig? | | | Sim |\n| As comunidades terão widgets que consumirão dados de ERPS? | | | Sim |\n| Serão utilizadas galerias de vídeos nas comunidades ? | | | Sim |\n| Serão utilizadas galerias de imagens nas comunidades ? | | | Sim |\n| LMS | | | |\n| APRENDIZADO | | | |\n| Qual é a quantidade de treinamentos criados no Fluig? | | | Sim |\n| Qual é a quantidade de turmas criadas no Fluig? | | | Não |\n| Qual é a quantidade de conteúdos de aprendizado que serão criados no Fluig? | | | Não |\n| Qual é a quantidade média de matrículas ativas? | | | Não |\n| Qual é a quantidade de usuários que serão alunos? | | | Não |\n| AVALIAÇÕES | | | |\n| Qual é a quantidade de questões que serão criadas no Fluig? | | | Não |\n| Qual é a quantidade de avaliações que serão criadas no Fluig? | | | Não |\n| Pretende aplicar avaliações para pessoas fora do Fluig? Se sim, qual é a frequência? | | | Não |" }, { "metadata": { "title": "Cliente 2 - Ambiente de média disponibilidade - Cloud", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244425315", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 2 - Ambiente de média disponibilidade - Cloud.md" }, "content": "Cliente 2 - Ambiente de média disponibilidade - Cloud\n\n### Desenho lógico\n\n![](..\\..\\..\\..\\images\\CLIENTE%203%20Ambiente%20Produ%C3%A7%C3%A3o.png)\n\n### Definições de hardware\n\n---\n\n![](../../../../images/oie_transparent%20(50).png).png)\n\n![](../../../../images/oie_transparent%20(51).png).png)\n\n![](../../../../images/oie_transparent%20(52).png).png)\n\n![](../../../../images/oie_transparent%20(53).png).png)\n\n![](../../../../images/oie_transparent%20(54).png).png)\n\n![](../../../../images/oie_transparent%20(55).png).png)" }, { "metadata": { "title": "Cliente 3 - Ambiente de baixa disponibilidade - Cloud", "source": "https://tdn.totvs.com/display/fluig/Cliente+3+-+Ambiente+de+baixa+disponibilidade+-+Cloud", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 3 - Ambiente de baixa disponibilidade - Cloud.md" }, "content": "Cliente 3 - Ambiente de baixa disponibilidade - Cloud\n\n\n# Índice\n\n- 1 [Dimensionamento em ambiente de baixa disponibilidade executando na Nuvem Totvs](#Cliente3AmbientedebaixadisponibilidadeCloud-DimensionamentoemambientedebaixadisponibilidadeexecutandonaNuvemTotvs)\n - 1.1 [Perguntas do formulário](#Cliente3AmbientedebaixadisponibilidadeCloud-Perguntasdoformulário)\n - 1.2 [Desenho lógico e definições de hardware](#Cliente3AmbientedebaixadisponibilidadeCloud-Desenhológicoedefiniçõesdehardware)\n\n# Dimensionamento em ambiente de baixa disponibilidade executando na Nuvem Totvs\n\nConfira a seguir o exemplo de dimensionamento para ambiente de baixa disponibilidade executando em nuvem Totvs.\n\nEste é um dimensionamento real executado em cliente. Os dados abaixo podem ser usados como exemplos e podem ser aplicados à qualquer banco de dados homologado pelo Fluig.\n\n### Perguntas do formulário" }, { "metadata": { "title": "Cliente 3 - Ambiente de baixa disponibilidade - Cloud", "source": "https://tdn.totvs.com/display/fluig/Cliente+3+-+Ambiente+de+baixa+disponibilidade+-+Cloud", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 3 - Ambiente de baixa disponibilidade - Cloud.md" }, "content": "Cliente 3 - Ambiente de baixa disponibilidade - Cloud\n\n\n| INDIVÍDUOS CADASTRADOS | | | |\n| --- | --- | --- | --- |\n| Informar a quantidade de indivíduos cadastrados para uso do Fluig: | | | 37 |\n| ACESSOS SIMULTÂNEOS | | | |\n| Informar a quantidade de indivíduos acessando o Fluig simultaneamente: | | | 15 |\n| VIRTUALIZAÇÃO | | | |\n| O cliente tem ambiente virtualizado para o servidor do Fluig? | | | Não |\n| O cliente tem ambiente virtualizado para o banco de dados? | | | Não |\n| BANCO DE DADOS | | | |\n| Qual é o banco de dados a ser usado em produção? | | | Microsoft SQL Server 2012 ou superior |\n| O banco de dados será migrado de uma versão Progress? | | | Não |\n| Caso haja migração de um banco Progress, qual o tamanho? | | | |\n| ECM | | | |\n| DOCUMENTOS | | | |\n| Qual é a quantidade de documentos publicados na implantação? | | | 10 |\n| Qual é a quantidade média de documentos que serão publicados/versionados por mês? | | | 50 |\n| Indique o tamanho médio dos documentos que serão publicados. (O valor deve estar em Kbytes.) | | | 500 |\n| Será usado o visualizador de documentos do Fluig? | | | Sim |\n| BPM | | | |\n| PROCESSOS | | | |\n| Qual é a quantidade de definições de processos workflow a serem implantados? | | | 5 |\n| Qual é a média de atividades relacionadas a cada processo workflow? | | | 5 |\n| Qual é a quantidade média mensal de processos workflow iniciados? | | | 80 |\n| Especifique a quantidade média de publicações via formulários por mês. | | | 10 |\n| Especifique a quantidade de grupos de usuários que serão utilizados. | | | 10 |\n| Especifique a quantidade média de usuários por grupo. | | | 6 |\n| Existem processos de workflow integrados com ERP TOTVS ou de terceiros? | | | Sim |\n| ANALYTICS | | | |\n| ANÁLISE DE DADOS | | | |\n| Será necessária a análise dos dados de documentos e processos? | | | Sim |\n| Será necessária a análise dos dados de comunidades e usuários? | | | Sim |\n| Especifique a quantidade de dashboards para visualização. | | | Sim |\n| PORTAIS | | | |\n| PORTAIS | | | |\n| Existe alguma demanda de portais corporativos? | | | Não |\n| Especifique a quantidade prevista de páginas de portais. | | | 0 |\n| COLABORAÇÃO | | | |\n| COMUNIDADES | | | |\n| Serão criadas comunidades no Fluig? | | | Sim |\n| As comunidades terão widgets que consumirão dados de ERPS? | | | Sim |\n| Serão utilizadas galerias de vídeos nas comunidades ? | | | Não |\n| Serão utilizadas galerias de imagens nas comunidades ? | | | Não |\n| LMS | | | |\n| APRENDIZADO | | | |\n| Qual é a quantidade de treinamentos criados no Fluig? | | | Não |\n| Qual é a quantidade de turmas criadas no Fluig? | | | Não |\n| Qual é a quantidade de conteúdos de aprendizado que serão criados no Fluig? | | | Não |\n| Qual é a quantidade média de matrículas ativas? | | | Não |\n| Qual é a quantidade de usuários que serão alunos? | | | Não |\n| AVALIAÇÕES | | | |\n| Qual é a quantidade de questões que serão criadas no Fluig? | | | Não |\n| Qual é a quantidade de avaliações que serão criadas no Fluig? | | | Não |\n| Pretende aplicar avaliações para pessoas fora do Fluig? Se sim, qual é a frequência? | | | Não |" }, { "metadata": { "title": "Cliente 3 - Ambiente de baixa disponibilidade - Cloud", "source": "https://tdn.totvs.com/display/fluig/Cliente+3+-+Ambiente+de+baixa+disponibilidade+-+Cloud", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 3 - Ambiente de baixa disponibilidade - Cloud.md" }, "content": "Cliente 3 - Ambiente de baixa disponibilidade - Cloud\n\n### Desenho lógico e definições de hardware\n\n![](..\\..\\..\\..\\images\\cliente%205%20-%20Ambiente%20Produ%C3%A7%C3%A3o.png)" }, { "metadata": { "title": "Cliente 4 - Alta disponibilidade em servidor cliente", "source": "https://tdn.totvs.com/display/fluig/Cliente+4+-+Alta+disponibilidade+em+servidor+cliente", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 4 - Alta disponibilidade em servidor cliente.md" }, "content": "Cliente 4 - Alta disponibilidade em servidor cliente\n\n\n# Índice\n\n- 1 [Dimensionamento em ambiente de alta disponibilidade executando em servidor cliente](#Cliente4Altadisponibilidadeemservidorcliente-Dimensionamentoemambientedealtadisponibilidadeexecutandoemservidorcliente)\n - 1.1 [Perguntas do formulário](#Cliente4Altadisponibilidadeemservidorcliente-Perguntasdoformulário)\n - 1.2 [Desenho lógico](#Cliente4Altadisponibilidadeemservidorcliente-Desenhológico)\n - 1.3 [Definições de hardware](#Cliente4Altadisponibilidadeemservidorcliente-Definiçõesdehardware)\n\n# Dimensionamento em ambiente de alta disponibilidade executando em servidor cliente\n\nConfira a seguir o exemplo de dimensionamento para ambiente de alta disponibilidade executando em servidor de cliente.\n\nEste é um dimensionamento real executado em cliente. Os dados abaixo podem ser usados como exemplos e podem ser aplicados à qualquer banco de dados homologado pelo Fluig.\n\n### Perguntas do formulário" }, { "metadata": { "title": "Cliente 4 - Alta disponibilidade em servidor cliente", "source": "https://tdn.totvs.com/display/fluig/Cliente+4+-+Alta+disponibilidade+em+servidor+cliente", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 4 - Alta disponibilidade em servidor cliente.md" }, "content": "Cliente 4 - Alta disponibilidade em servidor cliente\n\n\n| INDIVÍDUOS CADASTRADOS | | | |\n| --- | --- | --- | --- |\n| Informar a quantidade de indivíduos cadastrados para uso do Fluig: | | | Inicialmente 1300 com aquisições em 3 ondas. Onda 1 chegará a 9.000 usuários no Total, Onda 2 18.000 e Onda 3 23.000 usuários no total. Essas ondas acontecerão no prazo de 1 ano |\n| ACESSOS SIMULTÂNEOS | | | |\n| Informar a quantidade de indivíduos acessando o Fluig simultaneamente: | | | 1300 inicialmente, 5.000 Onda 1, 9.000 onda 2, 15.000 onda 3 |\n| VIRTUALIZAÇÃO | | | |\n| O cliente tem ambiente virtualizado para o servidor do Fluig? | | | Não |\n| O cliente tem ambiente virtualizado para o banco de dados? | | | Não |\n| BANCO DE DADOS | | | |\n| Qual é o banco de dados a ser usado em produção? | | | MySQL 5.1 ou superior |\n| O banco de dados será migrado de uma versão Progress? | | | Não |\n| Caso haja migração de um banco Progress, qual o tamanho? | | | |\n| ECM | | | |\n| DOCUMENTOS | | | |\n| Qual é a quantidade de documentos publicados na implantação? | | | 12.000.000 na 1 onda e chegando a 120.000.000 na segunda onda |\n| Qual é a quantidade média de documentos que serão publicados/versionados por mês? | | | 500.000 |\n| Indique o tamanho médio dos documentos que serão publicados. (O valor deve estar em Kbytes.) | | | 1 MB |\n| Será usado o visualizador de documentos do Fluig? | | | Sim |\n| BPM | | | |\n| PROCESSOS | | | |\n| Qual é a quantidade de definições de processos workflow a serem implantados? | | | 5 |\n| Qual é a média de atividades relacionadas a cada processo workflow? | | | 5 |\n| Qual é a quantidade média mensal de processos workflow iniciados? | | | 5000 |\n| Especifique a quantidade média de publicações via formulários por mês. | | | 5000 |\n| Especifique a quantidade de grupos de usuários que serão utilizados. | | | 1.300 na 1 onda e 2.500 na segunda onda |\n| Especifique a quantidade média de usuários por grupo. | | | 2 na 1 onda e 5 na segunda onda |\n| Existem processos de workflow integrados com ERP TOTVS ou de terceiros? | | | Não |\n| ANALYTICS | | | |\n| ANÁLISE DE DADOS | | | |\n| Será necessária a análise dos dados de documentos e processos? | | | Sim |\n| Será necessária a análise dos dados de comunidades e usuários? | | | Sim |\n| Especifique a quantidade de dashboards para visualização. | | | Sim |\n| PORTAIS | | | |\n| PORTAIS | | | |\n| Existe alguma demanda de portais corporativos? | | | Sim |\n| Especifique a quantidade prevista de páginas de portais. | | | 10 |\n| COLABORAÇÃO | | | |\n| COMUNIDADES | | | |\n| Serão criadas comunidades no Fluig? | | | Sim |\n| As comunidades terão widgets que consumirão dados de ERPS? | | | Não |\n| Serão utilizadas galerias de videos nas comunidades ? | | | Sim |\n| Serão utilizadas galerias de imagens nas comunidades ? | | | Sim |\n| LMS | | | |\n| APRENDIZADO | | | |\n| Qual é a quantidade de treinamentos criados no Fluig? | | | 76 |\n| Qual é a quantidade de turmas criadas no Fluig? | | | 10 |\n| Qual é a quantidade de conteúdos de aprendizado que serão criados no Fluig? | | | 500 GB no total |\n| Qual é a quantidade média de matrículas ativas? | | | 250 |\n| Qual é a quantidade de usuários que serão alunos? | | | 250 |\n| AVALIAÇÕES | | | |\n| Qual é a quantidade de questões que serão criadas no Fluig? | | | 10 |\n| Qual é a quantidade de avaliações que serão criadas no Fluig? | | | 5 |\n| Pretende aplicar avaliações para pessoas fora do Fluig? Se sim, qual é a frequência? | | | Sim, bem esporadicamente. Talvez 2 vezes ao ano. |" }, { "metadata": { "title": "Cliente 4 - Alta disponibilidade em servidor cliente", "source": "https://tdn.totvs.com/display/fluig/Cliente+4+-+Alta+disponibilidade+em+servidor+cliente", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 4 - Alta disponibilidade em servidor cliente.md" }, "content": "Cliente 4 - Alta disponibilidade em servidor cliente\n\n### Desenho lógico\n\n![](..\\..\\..\\..\\images\\Cliente2%20-%20Ambiente%20Produ%C3%A7%C3%A3o.png)\n\n### Definições de hardware\n\n---\n\n![](../../../../images/oie_transparent%20(56).png).png)\n\n![](../../../../images/oie_transparent%20(57).png).png)\n\n![](../../../../images/oie_transparent%20(58).png).png)\n\n![](../../../../images/oie_transparent%20(59).png).png)\n\n![](../../../../images/oie_transparent%20(60).png).png)\n\n![](../../../../images/oie_transparent%20(61).png).png)" }, { "metadata": { "title": "Cliente 5 - Média disponibilidade em servidor cliente", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244425415", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 5 - Média disponibilidade em servidor cliente.md" }, "content": "Cliente 5 - Média disponibilidade em servidor cliente\n\n\n# Índice\n\n- 1 [Dimensionamento em ambiente de média disponibilidade executando em servidor cliente](#Cliente5Médiadisponibilidadeemservidorcliente-Dimensionamentoemambientedemédiadisponibilidadeexecutandoemservidorcliente)\n - 1.1 [Perguntas do formulário](#Cliente5Médiadisponibilidadeemservidorcliente-Perguntasdoformulário)\n - 1.2 [Desenho lógico](#Cliente5Médiadisponibilidadeemservidorcliente-Desenhológico)\n - 1.3 [Definições de hardware](#Cliente5Médiadisponibilidadeemservidorcliente-Definiçõesdehardware)\n\n# Dimensionamento em ambiente de média disponibilidade executando em servidor cliente\n\nConfira a seguir o exemplo de dimensionamento para ambiente de média disponibilidade executando em servidor de cliente.\n\nEste é um dimensionamento real executado em cliente. Os dados abaixo podem ser usados como exemplos e podem ser aplicados à qualquer banco de dados homologado pelo Fluig.\n\n### Perguntas do formulário" }, { "metadata": { "title": "Cliente 5 - Média disponibilidade em servidor cliente", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244425415", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 5 - Média disponibilidade em servidor cliente.md" }, "content": "Cliente 5 - Média disponibilidade em servidor cliente\n\n\n| INDIVÍDUOS CADASTRADOS | | | |\n| --- | --- | --- | --- |\n| Informar a quantidade de indivíduos cadastrados para uso do Fluig: | | | 1000 |\n| ACESSOS SIMULTÂNEOS | | | |\n| Informar a quantidade de indivíduos acessando o Fluig simultaneamente: | | | 50 |\n| VIRTUALIZAÇÃO | | | |\n| O cliente tem ambiente virtualizado para o servidor do Fluig? | | | Sim |\n| O cliente tem ambiente virtualizado para o banco de dados? | | | Sim |\n| BANCO DE DADOS | | | |\n| Qual é o banco de dados a ser usado em produção? | | | Oracle 10G R2 ou superior |\n| O banco de dados será migrado de uma versão Progress? | | | Não |\n| Caso haja migração de um banco Progress, qual o tamanho? | | | Não haverá migração |\n| ECM | | | |\n| DOCUMENTOS | | | |\n| Qual é a quantidade de documentos publicados na implantação? | | | 100 |\n| Qual é a quantidade média de documentos que serão publicados/versionados por mês? | | | 300 |\n| Indique o tamanho médio dos documentos que serão publicados. (O valor deve estar em Kbytes.) | | | 1000 |\n| Será usado o visualizador de documentos do Fluig? | | | Sim |\n| BPM | | | |\n| PROCESSOS | | | |\n| Qual é a quantidade de definições de processos workflow a serem implantados? | | | 10 |\n| Qual é a média de atividades relacionadas a cada processo workflow? | | | 20 |\n| Qual é a quantidade média mensal de processos workflow iniciados? | | | 600 |\n| Especifique a quantidade média de publicações via formulários por mês. | | | 100 |\n| Especifique a quantidade de grupos de usuários que serão utilizados. | | | 30 |\n| Especifique a quantidade média de usuários por grupo. | | | 33 |\n| Existem processos de workflow integrados com ERP TOTVS ou de terceiros? | | | Não |\n| ANALYTICS | | | |\n| ANÁLISE DE DADOS | | | |\n| Será necessária a análise dos dados de documentos e processos? | | | Não |\n| Será necessária a análise dos dados de comunidades e usuários? | | | Não |\n| Especifique a quantidade de dashboards para visualização. | | | Não |\n| PORTAIS | | | |\n| PORTAIS | | | |\n| Existe alguma demanda de portais corporativos? | | | Sim |\n| Especifique a quantidade prevista de páginas de portais. | | | 20 |\n| COLABORAÇÃO | | | |\n| COMUNIDADES | | | |\n| Serão criadas comunidades no Fluig? | | | Sim |\n| As comunidades terão widgets que consumirão dados de ERPS? | | | Não |\n| Serão utilizadas galerias de vídeos nas comunidades ? | | | Sim |\n| Serão utilizadas galerias de imagens nas comunidades ? | | | Sim |\n| LMS | | | |\n| APRENDIZADO | | | |\n| Qual é a quantidade de treinamentos criados no Fluig? | | | 20 |\n| Qual é a quantidade de turmas criadas no Fluig? | | | 10 |\n| Qual é a quantidade de conteúdos de aprendizado que serão criados no Fluig? | | | 10 |\n| Qual é a quantidade média de matrículas ativas? | | | 100 |\n| Qual é a quantidade de usuários que serão alunos? | | | 1000 |\n| AMS | | | |\n| Qual é a quantidade de questões que serão criadas no Fluig? | | | 40 |\n| Qual é a quantidade de avaliações que serão criadas no Fluig? | | | 40 |\n| Pretende aplicar avaliações para pessoas fora do Fluig? Se sim, qual é a frequência? | | | Não |" }, { "metadata": { "title": "Cliente 5 - Média disponibilidade em servidor cliente", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244425415", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 5 - Média disponibilidade em servidor cliente.md" }, "content": "Cliente 5 - Média disponibilidade em servidor cliente\n\n### Desenho lógico\n\n![](..\\..\\..\\..\\images\\cliente%204%20Ambiente%20Produ%C3%A7%C3%A3o.png)\n\n### Definições de hardware\n\n---\n\n![](../../../../images/oie_transparent%20(62).png).png)\n\n![](../../../../images/oie_transparent%20(63).png).png)\n\n![](../../../../images/oie_transparent%20(64).png).png)\n\n![](../../../../images/oie_transparent%20(65).png).png)\n\n![](../../../../images/oie_transparent%20(66).png).png)\n\n![](../../../../images/oie_transparent%20(67).png).png)" }, { "metadata": { "title": "Cliente 6 - Baixa disponibilidade em servidor cliente", "source": "https://tdn.totvs.com/display/fluig/Cliente+6+-+Baixa+disponibilidade+em+servidor+cliente", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 6 - Baixa disponibilidade em servidor cliente.md" }, "content": "Cliente 6 - Baixa disponibilidade em servidor cliente\n\n\n# Índice\n\n- 1 [Dimensionamento em ambiente de baixa disponibilidade executando em servidor cliente](#Cliente6Baixadisponibilidadeemservidorcliente-Dimensionamentoemambientedebaixadisponibilidadeexecutandoemservidorcliente)\n - 1.1 [Perguntas do formulário](#Cliente6Baixadisponibilidadeemservidorcliente-Perguntasdoformulário)\n - 1.2 [Desenho lógico e definições de hardware](#Cliente6Baixadisponibilidadeemservidorcliente-Desenhológicoedefiniçõesdehardware)\n\n# Dimensionamento em ambiente de baixa disponibilidade executando em servidor cliente\n\nConfira a seguir o exemplo de dimensionamento para ambiente de baixa disponibilidade executando em servidor de cliente.\n\nEste é um dimensionamento real executado em cliente. Os dados abaixo podem ser usados como exemplos e podem ser aplicados à qualquer banco de dados homologado pelo Fluig.\n\n### Perguntas do formulário" }, { "metadata": { "title": "Cliente 6 - Baixa disponibilidade em servidor cliente", "source": "https://tdn.totvs.com/display/fluig/Cliente+6+-+Baixa+disponibilidade+em+servidor+cliente", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 6 - Baixa disponibilidade em servidor cliente.md" }, "content": "Cliente 6 - Baixa disponibilidade em servidor cliente\n\n\n| INDIVÍDUOS CADASTRADOS | | | |\n| --- | --- | --- | --- |\n| Informar a quantidade de indivíduos cadastrados para uso do Fluig: | | | 700 |\n| ACESSOS SIMULTÂNEOS | | | |\n| Informar a quantidade de indivíduos acessando o Fluig simultaneamente: | | | 70 |\n| VIRTUALIZAÇÃO | | | |\n| O cliente tem ambiente virtualizado para o servidor do Fluig? | | | Cloud TOTVS |\n| O cliente tem ambiente virtualizado para o banco de dados? | | | Cloud TOTVS |\n| BANCO DE DADOS | | | |\n| Qual é o banco de dados a ser usado em produção? | | | MySQL 5.5 ou superior |\n| O banco de dados será migrado de uma versão Progress? | | | Não |\n| Caso haja migração de um banco Progress, qual o tamanho? | | | |\n| ECM | | | |\n| DOCUMENTOS | | | |\n| Qual é a quantidade de documentos publicados na implantação? | | | 2500 |\n| Qual é a quantidade média de documentos que serão publicados/versionados por mês? | | | 30 |\n| Indique o tamanho médio dos documentos que serão publicados. (O valor deve estar em Kbytes.) | | | 1mb |\n| Será usado o visualizador de documentos do Fluig? | | | Sim |\n| BPM | | | |\n| PROCESSOS | | | |\n| Qual é a quantidade de definições de processos workflow a serem implantados? | | | 5 |\n| Qual é a média de atividades relacionadas a cada processo workflow? | | | 10 |\n| Qual é a quantidade média mensal de processos workflow iniciados? | | | 2100 |\n| Especifique a quantidade média de publicações via formulários por mês. | | | 700 |\n| Especifique a quantidade de grupos de usuários que serão utilizados. | | | - |\n| Especifique a quantidade média de usuários por grupo. | | | - |\n| Existem processos de workflow integrados com ERP TOTVS ou de terceiros? | | | Sim |\n| ANALYTICS | | | |\n| ANÁLISE DE DADOS | | | |\n| Será necessária a análise dos dados de documentos e processos? | | | Sim |\n| Será necessária a análise dos dados de comunidades e usuários? | | | Sim |\n| Especifique a quantidade de dashboards para visualização. | | | Sim |\n| PORTAIS | | | |\n| PORTAIS | | | |\n| Existe alguma demanda de portais corporativos? | | | Sim |\n| Especifique a quantidade prevista de páginas de portais. | | | |\n| COLABORAÇÃO | | | |\n| COMUNIDADES | | | |\n| Serão criadas comunidades no Fluig? | | | Não |\n| As comunidades terão widgets que consumirão dados de ERPS? | | | Não |\n| Serão utilizadas galerias de vídeos nas comunidades ? | | | Não |\n| Serão utilizadas galerias de imagens nas comunidades ? | | | Não |" }, { "metadata": { "title": "Cliente 6 - Baixa disponibilidade em servidor cliente", "source": "https://tdn.totvs.com/display/fluig/Cliente+6+-+Baixa+disponibilidade+em+servidor+cliente", "path": "\\Plataforma Documentação técnica\\Especificações Técnicas\\Dimensionamento\\Solicitação e exemplos de dimensionamento\\Cliente 6 - Baixa disponibilidade em servidor cliente.md" }, "content": "Cliente 6 - Baixa disponibilidade em servidor cliente\n\n### Desenho lógico e definições de hardware\n\n---\n\n![](..\\..\\..\\..\\images\\cliente%206%20-%20Ambiente%20Produ%C3%A7%C3%A3o.png)" }, { "metadata": { "title": "Avaliação de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=268597232", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma.md" }, "content": "Avaliação de lentidão na plataforma" }, { "metadata": { "title": "Avaliação de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=268597232", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma.md" }, "content": "Avaliação de lentidão na plataforma\n\n\n# Índice\n\n- 1 [Objetivo](#Avaliaçãodelentidãonaplataforma-Objetivo)\n- 2 [Pré-requisitos](#Avaliaçãodelentidãonaplataforma-Pré-requisitos)\n- 3 [Análise inicial](#Avaliaçãodelentidãonaplataforma-Análiseinicial)\n- 4 [Cenários comuns](#Avaliaçãodelentidãonaplataforma-Cenárioscomuns)\n - 4.1 [Na página inicial](#Avaliaçãodelentidãonaplataforma-Napáginainicial)\n - 4.2 [Na publicação ou visualização de documentos](#Avaliaçãodelentidãonaplataforma-Napublicaçãoouvisualizaçãodedocumentos)\n - 4.3 [Na tela de inicialização de processos](#Avaliaçãodelentidãonaplataforma-Nateladeinicializaçãodeprocessos)\n - 4.4 [Na abertura da tela de movimentação de processo](#Avaliaçãodelentidãonaplataforma-Naaberturadatelademovimentaçãodeprocesso)\n - 4.5 [Na movimentação de processo](#Avaliaçãodelentidãonaplataforma-Namovimentaçãodeprocesso)\n- 5 [Analisando o log da plataforma](#Avaliaçãodelentidãonaplataforma-Analisandoologdaplataforma)\n- 6 [Ativação do log por usuário](#Avaliaçãodelentidãonaplataforma-Ativaçãodologporusuário)\n\n# Objetivo\n\n---\n\nProblemas de lentidão no TOTVS Fluig Plataforma podem acontecer por diversos motivos, por isso reunimos nesta página algumas formas para identificar e analisar possíveis causas de lentidão.\n\n# Pré-requisitos\n\n---\n\nO dimensionamento do ambiente do usuário deve estar de acordo com as [especificações definidas](../Especificações Técnicas/Dimensionamento/Modelo de dimensionamento.md).\n\n# Análise inicial\n\n---\n\nConforme o [Guia de Performance e Analise do Servidor](http://tdn.totvs.com/x/AHQSCw), a análise inicial deve ser realizada para identificar o ponto exato de lentidão com base na reclamação do usuário.\n\nPara realizar esta análise, deve-se utilizar as ferramentas de rede do navegador, conforme descrito no item [Análise Inicial](http://tdn.totvs.com/x/D3QSCw).\n\n# Cenários comuns\n\n---\n\nDentro da nossa experiência de atendimento à diversos clientes, identificamos alguns cenários como os mais comuns quando relacionados à lentidão da plataforma. Abaixo, temos a descrição de cada um deles, bem como as medidas normalmente utilizadas para identificar os fatores que levam à percepção de lentidão." }, { "metadata": { "title": "Avaliação de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=268597232", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma.md" }, "content": "Avaliação de lentidão na plataforma\n\n#### Na página inicial\n\nComeçamos com a avaliação dos tempos de execução dos *widgets* e, caso existam, das páginas desenvolvidas sobre a plataforma. Essa análise é realizada principalmente através das ferramentas de análise disponibilizadas pelos navegadores, como Chrome e Firefox. Nesta avaliação, buscamos identificar qual, ou quais, recursos estão levando um tempo anormal para responder ou carregar.\n\n#### Na publicação ou visualização de documentos\n\nQuando a demora é percebida na publicação de documentos, começamos verificando se há execução de eventos personalizados, através do *log* do servidor. Caso a percepção seja na visualização, também temos a hipótese de eventos personalizados demorando muito para executar. Caso a lentidão seja no visualizador interno, deve-se verificar seu [dimensionamento](../Configuração/Apps e Mashups/Sobre o Fluig Viewer.md).\n\n#### Na tela de inicialização de processos\n\nNormalmente identificamos que a percepção de lentidão nesta tela ocorre devido aos mecanismos de atribuição relacionados às atividades iniciais dos processos. Como a plataforma precisa resolver cada um dos mecanismos para então exibir a lista dos processos aos quais o usuário possui permissão para iniciar, pode haver lentidão neste ponto.\n\n#### Na abertura da tela de movimentação de processo" }, { "metadata": { "title": "Avaliação de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=268597232", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma.md" }, "content": "Avaliação de lentidão na plataforma\n\n\nNesta tela, quando o processo está sendo aberto para que usuário possa preencher o formulário, anexar arquivos, etc., normalmente iniciamos a avaliação pelo tempo de execução das requisições através do console do navegador para identificar quais recursos estão demorando para responder. Assim, podemos identificar se o motivo da percepção de lentidão são recursos externos, como bibliotecas JavaScript utilizadas no formulário, ou requisições internas da própria plataforma.\n\nCaso identificado que são requisições internas, passamos a avaliar o *log* do servidor em busca da execução de desenvolvimentos como eventos de processos do tipo *before* e de eventos de formulário (*displayFields, enableFields, etc.*), consultas à dataset e/ou consultas a serviços externos. Caso a lentidão seja causada pela execução de eventos, sugerimos a revisão dos mesmos para reduzir ao máximo o processamento necessário para execução. Caso a lentidão seja em consultas a datasets, deve-se avaliar se o dataset em questão foi desenvolvido utilizando as boas práticas e também recursos como a sincronização de datasets.\n\n#### Na movimentação de processo" }, { "metadata": { "title": "Avaliação de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=268597232", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma.md" }, "content": "Avaliação de lentidão na plataforma\n\n\nQuando temos situações onde o envio da solicitação está levando muito tempo, procedemos com uma análise bastante parecida com a analise descrita no item acima, porém agora devemos avaliar eventos de processos do tipo *after* e eventos de validação de formulários (*validateForm*, etc.).\n\nEm muitos casos, na movimentação de solicitações são utilizadas integrações com aplicativos externos que podem causar a percepção de lentidão para o usuário. Para estes casos, recomendamos a utilização da [Atividade de Serviço](http://tdn.totvs.com/x/1oSNBw). Mais informações sobre esta atividade e exemplo de utilização estão disponíveis no guia [Integração assíncrona via processos workflow](http://tdn.totvs.com/x/9mUmDg).\n\nPara saber mais\n\n- [Desenvolvimento de dataset](http://tdn.totvs.com/x/eitbB)\n- [Sincronização de datasets](http://tdn.totvs.com/x/xZSwD)\n- [Desenvolvimento de processos](http://tdn.totvs.com/x/widbB)\n- [Desenvolvimento de formulários](http://tdn.totvs.com/x/U4l8B)\n- [Integração assíncrona via processo](http://tdn.totvs.com/x/9mUmDg)\n- [Desenvolvimento de eventos](http://tdn.totvs.com/x/EIl8B)\n- [Desenvolvimento de widgets](http://tdn.totvs.com/x/jSiDC)\n\n# Analisando o *log* da plataforma\n\n---\n\nPara analisar o *log* estático, recomendamos o uso de uma ferramenta de texto inteligente, como o Notepad++ ou o SublimeText. Para acompanhar em [tempo real](http://tdn.totvs.com/x/xvIGDg), podem ser utilizadas ferramentas como o BareTail e o glogg.\n\nA página [Mensagens de *log* para processos](http://tdn.totvs.com/x/u5QKDg) tem como objetivo auxiliar o suporte e desenvolvedores da plataforma a ativar e compreender um novo conjunto de mensagens de *log* que trazem informações relevantes a solicitação Workflow durante as fases de abertura e movimentação passando por eventos de processo e Datasets que venham a ser consultados dentro desses eventos.\n\nOs tópicos a seguir irão demonstrar como ativar essas mensagens e farão uma breve descrição de todos os campos retornados. Desta forma, é muito importante que os desenvolvedores conheçam essas mensagens para que possam entender melhor como o Fluig trata e responde a erros durante a execução de processos e desenvolvimentos.\n\nOutra ferramenta bastante importante é a avaliação dos tempos de execução através da classe *JSChronos*.\n\nBasta procurar por \"*[com.totvs.technology.foundation.common.JSChronos]*\" no *log* do servidor. Todos os pontos de customização são registrados com a informação do tempo de execução, conforme exemplo abaixo:\n\n**Exemplo de execução de dataset**\n\n```\n11:02:22,499 INFO [com.totvs.technology.foundation.common.JSChronos] (http-pool-threads - 77) DatasetFactory.getDataset.dsCargosSalariosAtv executou por 1 segundo\n```\n\n**Exemplo de execução de customizações**\n\n```\n11:13:01,280 INFO [com.totvs.technology.foundation.common.JSChronos] (http-pool-threads - 95) CustomizationManagerImpl.invokeFunction.validateForm executou por 1 segundo\n```\n\n# Ativação do *log* por usuário\n\n---\n\nEsta é uma ferramenta disponibilizada na plataforma a partir da versão 1.5.8, pois conforme o [Release Notes](http://tdn.totvs.com/x/L9H7DQ) do recurso, quanto maior o uso da plataforma, mais informações são registradas em seu *log*, o que torna difícil saber qual usuário efetuou a ação que acarretou em um erro.\n\nPor isso, agora quando um usuário relatar que está com problemas e você está com dúvidas do que está acontecendo, ative essa nova opção e acompanhe todas as informações que vão te auxiliar a fazer o diagnóstico de situações que estejam prejudicando o uso da plataforma para esse usuário. Para conferir, acesse **Painel de Controle** > **Gerais** > **Controle de*****log**.*\n\nO guia completo de ativação e utilização da funcionalidade está disponível na página [Controle de *log* por usuário](http://tdn.totvs.com/x/wLMKDg)." }, { "metadata": { "title": "Backup da aplicação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271666031", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Backup da aplicação.md" }, "content": "Backup da aplicação\n\n\nAtenção\n\nEsta página foi revisada para considerar as configurações de server para a atualização 1.6 ou superiores.\n\n# Índice\n\n- 1 [Objetivo](#Backupdaaplicação-Objetivo)\n- 2 [Backup da aplicação](#Backupdaaplicação-Backupdaaplicação)\n - 2.1 [Windows](#Backupdaaplicação-Windows)\n - 2.2 [Linux](#Backupdaaplicação-Linux)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é orientar o administrador do ambiente sobre a criação de cópias de segurança do banco de dados, pasta de instalação e diretório de arquivos do TOTVS Fluig Plataforma.\n\n# Backup da aplicação\n\n---\n\nPara fazer o backup da aplicação da plataforma, o ideal é fazer um backup completo incluindo a pasta de instalação, volume completo e a base de dados. Esse backup pode ser manual ou automatizado, dependendo do que acharem melhor. \n \nQuanto ao backup do volume, basta salvar a pasta completa. O backup da instalação também pode ser da pasta completa, assim se necessário é possível restaurá-lo.\n\nConfira a seguir o procedimento de acordo com o sistema operacional.\n\n## Windows" }, { "metadata": { "title": "Backup da aplicação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271666031", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Backup da aplicação.md" }, "content": "Backup da aplicação\n\n\n---\n\n**1.** Parar todos os serviços do Fluig (fluig\\_RealTime, fluig\\_Indexer, FLUIG).\n\n**2.** Acessar o gerenciador do banco de dados e realizar cópia da base de dados do Fluig.\n\nO gerenciamento do banco de dados é de responsabilidade do cliente. Acione sua equipe de TI para receber orientação de como fazer o *backup*.\n\n**3.** Copiar os arquivos da aplicação (diretório de instalação e volume).\n\n**3.1** Apagar as pastas temporárias data, log, servers e temp localizadas em [diretório\\_instalação]\\appserver\\domain.\n\n![](..\\..\\images\\003_02_16.png)\n\n**3.2** Fazer a cópia de segurança dos diretórios de instalação (onde são armazenados os arquivos de sistema, responsáveis pelo funcionamento da plataforma) e de volume (onde ficam armazenados os documentos, formulários, templates e demais arquivos publicados pelos usuários na plataforma).\n\n![](..\\..\\images\\004_02_16.png)\n\n**A localização do volume é definida pelo administrador durante a criação da empresa no Fluig.**\n\n## Linux" }, { "metadata": { "title": "Backup da aplicação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271666031", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Backup da aplicação.md" }, "content": "Backup da aplicação\n\n\n---\n\n**1.**Parar todos os serviços do Fluig\n\n| | |\n| --- | --- |\n| Utilizando o init | **fluig** ```service fluig stop ``` |\n| **Indexer** ``` service fluig_Indexer stop ``` |\n| **RealTime** ``` service fluig_Realtime stop ``` |\n| Utilizando o systemd | **fluig** ``` systemctl stop fluig ``` |\n| **Indexer** ``` systemctl stop fluig_Indexer ``` |\n| **RealTime** ``` systemctl stop fluig_Realtime ``` |\n| Sem serviços | **fluig** ``` #Para identificar o numero do servico fluig ps -wef | grep standalone.sh #Para encerrar o servico kill [nº serviço fluig] ``` |\n| **Indexer** ``` service fluig_Indexer stop ``` |\n| **RealTime** ``` #Para identificar o numero do servico node ps -wef | grep node #Para encerrar o servico kill [nº serviço node] ``` |\n\n**2.** Acessar o gerenciador do banco de dados e realizar cópia da base de dados do Fluig.\n\nO gerenciamento do banco de dados é de responsabilidade do cliente. Acione sua equipe de TI para receber orientação de como fazer o *backup*.\n\n**3.** Copiar os arquivos da aplicação (diretório de instalação e volume).\n\n**3.1** Apagar as pastas temporárias data, log, servers e temp localizadas em [diretório\\_instalação]/appserver/domain.\n\n**Pastas temporárias**\n\n```\n#Navegar ate a pasta /appserver/domain do diretorio de instalacao e remover as pastas temporarias\n\n#data\nrm data -R\n\n#log\nrm log -R\n\n#temp\nrm temp -R\n```\n\n**3.2** Fazer a cópia de segurança dos diretórios de instalação (onde são armazenados os arquivos de sistema, responsáveis pelo funcionamento da plataforma) e de volume (onde ficam armazenados os documentos, formulários, templates e demais arquivos publicados pelos usuários na plataforma).\n\n**Pasta de Instalação**\n\n```\n#Copiar a pasta de instalacao do fluig\n\ncp -R [pasta de instalacao] [diretorio de backup]\n```\n\n**Volume**\n\n```\n#Copiar o volume do fluig\n\ncp -R [volume] [diretorio de backup]\n```\n\nDica\n\nSaiba mais sobre a configuração e utilização de volumes em [Plataforma ❙ Volumes (wcmadmin)](https://tdn.totvs.com/x/jP-uDQ)." }, { "metadata": { "title": "Checklist de instalação da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622851", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Checklist de instalação da plataforma.md" }, "content": "Checklist de instalação da plataforma\n\n\n- O [Checklist de instalação da plataforma](https://tdn.totvs.com/download/attachments/257622851/MIF979%2B-%2BCheck-list%2Bde%2Bentrega%2Bde%2Bambiente.docx?version=4&modificationDate=1489581797000&api=v2) é um questionário a ser preenchido pelo prestador de serviço após a instalação do produto." }, { "metadata": { "title": "Conversão", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=144409658", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão.md" }, "content": "Conversão\n\n\n**oculto**\n\n## **Obs**: Liberar o item \"Migração e Conversão do Oracle ECM para plataforma TOTVS Fluig\" quando o oracle 19 for liberado e a issue FFDN 6298 for liberada. Liberar tb a pagina filha \n\n- [Migração e Conversão de Collation (SQL Server)](Conversão/Migração e Conversão de Collation (SQL Server).md).md)\n- [Conversão TOTVS ECM para plataforma TOTVS Fluig](Conversão/Conversão TOTVS ECM para plataforma TOTVS Fluig.md)\n- [Migração e Conversão do Oracle ECM para plataforma TOTVS Fluig](Conversão/Migração e Conversão do Oracle ECM para plataforma TOTVS Fluig.md)" }, { "metadata": { "title": "Criando um ambiente de homologação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=269439292", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Criando um ambiente de homologação.md" }, "content": "Criando um ambiente de homologação" }, { "metadata": { "title": "Criando um ambiente de homologação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=269439292", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Criando um ambiente de homologação.md" }, "content": "Criando um ambiente de homologação\n\n\n- [Objetivo](#Criandoumambientedehomologação-Objetivo)\n- [Pré-requisitos](#Criandoumambientedehomologação-Pré-requisitos)\n- [Fazer uma nova instalação](#Criandoumambientedehomologação-Fazerumanovainstalação)\n- [Configurar a plataforma](#Criandoumambientedehomologação-Configuraraplataforma)\n - [Acessar o Painel de controle](#Criandoumambientedehomologação-AcessaroPaineldecontrole)\n - [Ajustar endereço de acesso](#Criandoumambientedehomologação-Ajustarendereçodeacesso)\n - [Ajustar caminho do volume](#Criandoumambientedehomologação-Ajustarcaminhodovolume)\n - [Configurar Fluig Analytics](#Criandoumambientedehomologação-ConfigurarFluigAnalytics)\n - [Verificar parâmetros](#Criandoumambientedehomologação-Verificarparâmetros)\n - [Configurar TOTVS Identity](#Criandoumambientedehomologação-ConfigurarTOTVSIdentity)\n - [Configurar autenticação integrada](#Criandoumambientedehomologação-Configurarautenticaçãointegrada)\n - [Copiar os widgets personalizados](#Criandoumambientedehomologação-Copiaroswidgetspersonalizados)\n- [OAuth Providers](#Criandoumambientedehomologação-OAuthProviders)\n- [Serviços](#Criandoumambientedehomologação-Serviços)\n- [Reiniciar o Fluig](#Criandoumambientedehomologação-ReiniciaroFluig)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é orientar administradores e desenvolvedores na preparação de um ambiente de homologação que seja fiel ao ambiente de produção utilizado pelos usuários da plataforma. Dessa forma, ao testar novas atualizações ou desenvolvimentos, é possível simular o comportamento da plataforma, diminuindo a chance de imprevistos, perda de dados e instabilidades no ambiente de produção.\n\n**oculto**\n\n**Observação interna: Esse procedimento foi repassado para o artigo ** \n**Caso tenha alguma atualização aqui, lembrar de repassar pra lá.**\n\n# Pré-requisitos\n\n---\n\n- Um servidor separado do ambiente de produção e que preencha os requisitos da [Matriz de Portabilidade](../Especificações Técnicas/Matriz de Portabilidade.md) e [Dimensionamento](../Especificações Técnicas/Dimensionamento.md).\n\n- Cópia da base de dados do Fluig em produção.\n\nImportante!\n\nO gerenciamento do banco de dados é de responsabilidade do cliente. Acione sua equipe interna de TI para obter a cópia da base de dados.\n\n- Cópia do(s) [volume(s)](http://tdn.totvs.com/pages/viewpage.action?pageId=233766796) do Fluig em produção.\n\n- Cópia da [pasta de instalação](http://tdn.totvs.com/x/b0sxE) do Fluig em produção (incluindo os *kits* e *widgets* personalizados na pasta appserver/apps).\n\n# Fazer uma nova instalação\n\n---\n\n- Faça o *download* do pacote de instalação do Fluig no [Central do cliente](https://suporte.totvs.com/portal/p/10098/download#000035). Esse pacote deve estar na mesma atualização da base de dados copiada, ou seja, se o ambiente de produção estiver na **Update  1.6.5-190326**, a instalação no ambiente de homologação deve ser feita com essa mesma *release*. \n\n Atenção!\n\n Caso você não tenha o pacote de instalação de mídias anteriores necessário para instalação, ficará de responsabilidade de cliente o processo de atualização da plataforma. Disponibilizaremos somente os pacotes de releases atuais no Portal de cliente para download.\n- Execute o *wizard* de instalação, conforme a documentação ([Windows](Guia de instalação da plataforma/Instalação da plataforma em Windows - Instalador.md) / [Linux](Guia de instalação da plataforma/Instalação da plataforma no Linux - Instalador.md)), mas fique atento no momento de configurar o banco de dados para informar corretamente os dados de acesso **da cópia** da base de produção e não da base original. O mesmo é valido para o serviço de cache, que não deve ser compartilhado.\n\n![](..\\..\\images\\banco_de_dados.png)\n\n- Verifique também o número de licenças disponíveis no servidor de licenças, pois cada usuário ativo no ambiente de homologação consumirá uma licença.\n\n- Após concluir a instalação, inicie os serviços do Fluig.\n\n# Configurar a plataforma\n\n---\n\nUma vez instalado o Fluig no ambiente de homologação, é necessário ajustar os dados da base copiada da produção com os dados do novo ambiente." }, { "metadata": { "title": "Criando um ambiente de homologação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=269439292", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Criando um ambiente de homologação.md" }, "content": "Criando um ambiente de homologação\n\n## Acessar o Painel de controle\n\n---\n\n- Acesse o Fluig no endereço que foi configurado durante a nova instalação e autentique-se com o administrador da plataforma (wcmadmin). É provável que ocorram redirecionamentos para o endereço de produção, visto que a base de dados ainda está configurada com estas informações. Se isso ocorrer, cole a URL de homologação novamente na barra de endereços do navegador.\n\nNota:\n\nCaso esteja integrado ao TOTVS Identity, verifique [nessa documentação](https://tdn.totvs.com/pages/viewpage.action?pageId=203767554) como acessar a plataforma com o usuário wcmadmin.\n\n- Para acessar o Painel de Controle do wcmadmin, informe http://[fluig\\_homologacao]/portal/p/wcm/cpaneladmin na barra de endereços do navegador.\n\n## Ajustar endereço de acesso\n\n---\n\nPara ajustar o endereço de acesso, siga os passos da documentação [ARQ - Como alterar a URL de acesso do Fluig?](https://centraldeatendimento.totvs.com/hc/pt-br/articles/27663603084567-Fluig-Plataforma-CON-Como-alterar-a-URL-de-acesso-a-plataforma)\n\n## Ajustar caminho do volume" }, { "metadata": { "title": "Criando um ambiente de homologação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=269439292", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Criando um ambiente de homologação.md" }, "content": "Criando um ambiente de homologação\n\n\n---\n\nOs volumes são utilizados pelo Fluig para armazenar os documentos, artigos, formulários, *templates* e demais arquivos publicados na plataforma. O(s) volume(s) copiados do servidor de produção para o de homologação precisam ser configurados no Painel de Controle para que a nova instalação do Fluig possa localizá-los.\n\n- Crie uma nova pasta vazia no sistema operacional do servidor de homologação.\n\n- Acesse o Painel de Controle do wcmadmin e selecione a opção **Volumes**.\n\n- Selecione o volume que deseja ajustar e clique em **Editar**.\n\n- No campo **Diretório Físico**, informe o caminho completo da pasta criada, inclusive com o nome do diretório e salve a alteração.\n\n- Copie os arquivos salvos dentro do volume copiado do ambiente de produção para a nova pasta informada como volume no Fluig.\n\n![](../../images/Image%207%20(1).png).png)\n\nFique por dentro!\n\nPara visualizar mais detalhes e informações, acesse nossa documentação sobre [Plataforma ❙ Volumes (wcmadmin)](https://tdn.totvs.com/pages/viewpage.action?pageId=233766796).\n\n## Configurar Fluig Analytics\n\n---\n\nLevando em consideração que o banco de dados replicado veio com as informações de integração do ambiente de produção é muito importante que seja alterada para o projeto de homologação ou desabilitada neste momento, pois o envio de dados configurado com o projeto de produção no ambiente de homologação irá sobrescrever as informações do ambiente de produção causando conflito.\n\nLembrando que o Fluig permite integrar apenas uma empresa (*tenant*) por projeto no Fluig Analytics, portanto caso você ainda não possua um projeto de homologação, é preciso solicitar via ticket para o atendimento Fluig a criação deste projeto. Siga os passos descritos na página [Guia de Implantação fluig Analytics](../Recurso de Analytics/Guia de Implantação do Analytics.md) para solicitar o projeto e habilitar a integração.\n\n## Verificar parâmetros" }, { "metadata": { "title": "Criando um ambiente de homologação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=269439292", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Criando um ambiente de homologação.md" }, "content": "Criando um ambiente de homologação\n\n\n---\n\nAcesse o menu **Painel de Controle** e o recurso **Configuração do sistema**. Na aba **Parâmetros** da plataforma verifique as informações em todos campos. Altere o que for necessário, de acordo com o novo servidor do Fluig.\n\nFique por dentro!\n\nPara visualizar mais detalhes e informações, acesse nossa documentação sobre [Configurações do sistema](https://tdn.totvs.com/pages/viewpage.action?pageId=235597328).\n\n## Configurar TOTVS Identity\n\n---\n\nLevando em consideração que o banco de dados replicado veio com a integração habilitada ou mesmo, que se queira habilitar a integração com o TOTVS Identity homologação, será necessário atualizar ou incluir as informações de integração neste momento.\n\nPara isso, é imprescindível ter as informações do [contexto de homologação](https://tdn.totvs.com/pages/viewpage.action?pageId=181144752) do TOTVS Identity para posteriormente seguir os passos descritos na página [Integração do Fluig com o Identity](../Configuração/Identity/Integração da plataforma com o Identity.md).\n\n## Configurar autenticação integrada\n\n---\n\nCriando o ambiente de homologação usando a replicação do banco de dados da aplicação de produção, as informações da tela de Autenticação Integrada da plataforma estarão preenchidas, portanto será necessário ajustá-las realizando uma nova configuração da autenticação integrada para o ambiente de homologação.\n\nSiga os procedimentos informados na página [Configurando Autenticação Integrada](../Configuração/Configuração de Ambiente/Configurando Autenticação Integrada.md). Recomendamos que seja gerado um novo Token de autenticação. Além disso, é preciso criar um novo arquivo 'remote\\_auth.asp' e salvá-lo em um novo diretório do IIS, porém, não é necessário reconfigurar o(s) navegador(es).\n\n## Copiar os *widgets* personalizados" }, { "metadata": { "title": "Criando um ambiente de homologação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=269439292", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Criando um ambiente de homologação.md" }, "content": "Criando um ambiente de homologação\n\n\n---\n\nCaso faça uso de *kits* ou *widgets* personalizados no ambiente de produção, é necessário copiá-los manualmente para a pasta [instalação\\_fluig]/appserver/apps no ambiente de homologação.\n\nImportante!\n\nCopie apenas os *widgets* personalizados ou adquiridos via Fluig Store. Os demais *widgets* são padrão do Fluig e estarão na nova instalação automaticamente.\n\n# OAuth Providers\n\n---\n\nCaso possua integrações REST configuradas em seu ambiente de produção através do cadastro OAuth Provider e OAuth App, é necessário editar e revisar os apontamentos de URL de todos os OAuth Provider cadastrados em seu novo ambiente de homologação.\n\nPara realizar esta análise é preciso estar logado com um usuário **administrador**. Acesse o menu **Painel de Controle**, localize o agrupador **Parâmetros técnicos** e acione o recurso **OAuth Provider**.\n\n![](..\\..\\images\\OAuth%20165.png)\n\nFique por dentro!\n\nPara visualizar mais detalhes e informações, acesse nossa documentação sobre [Plataforma ❙ OAuth provider](https://tdn.totvs.com/pages/viewpage.action?pageId=234455787).\n\n# Serviços\n\n---\n\nAs integrações JDBC e REST cadastradas em seu ambiente através do ícone Serviços devem ter suas URL de apontamentos revisadas.\n\nAs integrações SOAP cadastradas como serviços em seu ambiente são mais sensíveis a mudanças como esta, pois além do cadastro no banco também têm alguns arquivos que são gerados no servidor. Portanto, caso a URL dos serviços SOAP de homologação sejam diferentes das de produção, as mesmas devem ser **excluídas e recadastradas**.\n\nPara realizar estas verificações é preciso estar logado com um usuário administrador. Acesse o menu **Painel de Controle**, localize o agrupador **Desenvolvimento** e acione o recurso **Serviços**.\n\n![](..\\..\\images\\Painel%20de%20Controle%20165.png)\n\nFique por dentro!\n\nPara visualizar mais detalhes e informações, acesse nossa documentação sobre [Serviços](https://tdn.totvs.com/pages/viewpage.action?pageId=243660796).\n\n# Reiniciar o Fluig\n\n---\n\nUma vez concluídos todos os passos acima, para que as alterações sejam aplicadas, reinicie os serviços do Fluig na seguinte ordem : 1º fluig\\_Indexer, 2º fluig\\_RealTime, 3º fluig.\n\nQuando a plataforma estiver no ar, pode-se usar os mesmos logins e senhas do ambiente de produção para autenticar-se no ambiente de homologação." }, { "metadata": { "title": "Erros comuns ao instalar/atualizar a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=819058035", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Erros comuns ao instalaratualizar a plataforma.md" }, "content": "Erros comuns ao instalar/atualizar a plataforma" }, { "metadata": { "title": "Erros comuns ao instalar/atualizar a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=819058035", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Erros comuns ao instalaratualizar a plataforma.md" }, "content": "Erros comuns ao instalar/atualizar a plataforma\n\n\n- [Objetivo](#Erroscomunsaoinstalar/atualizaraplataforma-Objetivo)\n- [Pré-requisitos](#Erroscomunsaoinstalar/atualizaraplataforma-Pré-requisitos)\n- [Sistema operacional Windows](#Erroscomunsaoinstalar/atualizaraplataforma-SistemaoperacionalWindows)\n - [Alterar o tipo de inicialização dos serviços para manual](#Erroscomunsaoinstalar/atualizaraplataforma-Alterarotipodeinicializaçãodosserviçosparamanual)\n - [Serviço \"fluig\" permanece com o status \"stopping\" (ou \"parando\")](#Erroscomunsaoinstalar/atualizaraplataforma-Serviço\"fluig\"permanececomostatus\"stopping\"(ou\"parando\"))\n - [Mensagens durante a instalação/atualização](#Erroscomunsaoinstalar/atualizaraplataforma-Mensagensduranteainstalação/atualização)\n - [Renomear o diretório de instalação (teste)](#Erroscomunsaoinstalar/atualizaraplataforma-Renomearodiretóriodeinstalação(teste))\n - [Verificar as permissões do usuário executor da mídia](#Erroscomunsaoinstalar/atualizaraplataforma-Verificaraspermissõesdousuárioexecutordamídia)\n - [Consultar o log de eventos do Windows](#Erroscomunsaoinstalar/atualizaraplataforma-ConsultarologdeeventosdoWindows)\n - [Monitor de recursos do Windows](#Erroscomunsaoinstalar/atualizaraplataforma-MonitorderecursosdoWindows)\n - [Limpeza de arquivos temporários e pastas keys](#Erroscomunsaoinstalar/atualizaraplataforma-Limpezadearquivostemporáriosepastaskeys)\n - [Nova tentativa de atualização](#Erroscomunsaoinstalar/atualizaraplataforma-Novatentativadeatualização)\n- [Sistema operacional Linux](#Erroscomunsaoinstalar/atualizaraplataforma-SistemaoperacionalLinux)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar quais os problemas mais comuns ao efetuar a atualização do TOTVS Fluig Plataforma e como resolvê-los.\n\n# Pré-requisitos\n\n---\n\n- Interesse em instalar/atualizar o ambiente de acordo com o [Guia de instalação da plataforma](Guia de instalação da plataforma.md) ou o [Guia de atualização da plataforma](Guia de atualização da plataforma.md), respectivamente.\n- Servidores respeitando o [Modelo de dimensionamento](../Especificações Técnicas/Dimensionamento/Modelo de dimensionamento.md).\n- Plataforma de acordo com os padrões da [Matriz de portabilidade](https://tdn.totvs.com/display/fluig/Matriz+de+portabilidade).\n- Conferir outras [Especificações Técnicas](../Especificações Técnicas.md) necessárias.\n\n# Sistema operacional Windows\n\n---\n\nDescrevemos abaixo algumas situações que podem impactar diretamente na instalação/atualização das mídias do TOTVS Fluig Plataforma no Sistema Operacional Windows." }, { "metadata": { "title": "Erros comuns ao instalar/atualizar a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=819058035", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Erros comuns ao instalaratualizar a plataforma.md" }, "content": "Erros comuns ao instalar/atualizar a plataforma\n\n## Alterar o tipo de inicialização dos serviços para manual\n\n---\n\n**01.** Alterar o tipo de inicialização dos serviços do Fluig para **\"manual\"** é importante para evitar que o serviço inicialize e impeça a atualização da plataforma.\n\nImportante!\n\nEssa configuração será utilizada apenas para reiniciar o servidor e fazer a atualização. Depois o serviço poderá ser configurado novamente para **inicialização automática**.\n\n- Acessar a tela de **Serviços** do **Windows** e procure pelos serviços: (1) fluig, (2) fluig\\_Indexer e (3) fluig\\_RealTime.\n\n![](..\\..\\images\\YrTzhKtrImgyBecmxYeWnep2owGaJu4ZHc1haIqbMFrOeuuaOs0mhbLL25ZkasY09lA3oFRMKUSjVjP5N6cajR4RFz6_Rx1VyFed-l-tc54UXmYDOzhu2uLct7dWIAAE2j41EdQM)\n\n- Acessar as **propriedades** dos serviços.\n\n![](..\\..\\images\\zt6a1P3LDWDYD_6K_7zH5LwOcdYFzLxBzLjqD0lNkixUgidHLswo2k2reXDiM_b4Sih7h3MIV74s1M0yKNGXf8_IRf9-kcrASxEjL1z4ojkF2Dy_PM6y_ctl3HUOTy867-Z9u_LT)\n\n- Alterar o **Tipo de Inicialização** de Automático para **Manual**.\n- Fazer isso para (1) fluig, (2) fluig\\_Indexer e (3) fluig\\_RealTime.\n\n![](..\\..\\images\\tUWdw3SJzEriQbmfsJcBZRW1-TtIvPmr_n4oK86ttjc4QATn0ecGJWdX5E1WiKu1Y5Ywdi7YtJvy6QQgpyxSobNw2-RMsQ42ijNj53eZkaI7-wS9-zdK5Elabx3M3niankO7Fjo1)\n\n## Serviço \"fluig\" permanece com o status \"stopping\" (ou \"parando\")" }, { "metadata": { "title": "Erros comuns ao instalar/atualizar a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=819058035", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Erros comuns ao instalaratualizar a plataforma.md" }, "content": "Erros comuns ao instalar/atualizar a plataforma\n\n\n---\n\nNão é incomum que, ao encerrar o **serviço \"fluig\"**, o status permaneça em **\"stopping\"** e não finalize a ação. Esse comportamento não é específico da plataforma e, geralmente, está associado a interferências externas, seja de outra aplicação, servidor, etc. A maior parte dos relatos estão relacionados ao **serviço \"fluig\"**, os demais serviços **(fluig\\_Indexer e fluig\\_RealTime)** nunca apresentaram tal eventualidade.\n\nOs motivos mais comuns para a situação ocorrer são:\n\n- Aplicação de **backup** sendo executada nas pastas e no mesmo servidor da plataforma, de forma que, o serviço não consiga fazer os procedimentos necessários para parar.\n- **Antivírus** ativado, ou funcionando no mesmo servidor, sem ter o Fluig configurado como exceção. Isso pode impedir a plataforma de apagar pastas temporárias, que é um procedimento padrão no desligamento.\n\nRecomendação\n\nO ideal é que o servidor seja **dedicado** à plataforma, sem que haja outros sistemas operando em conjunto.\n\nPreparamos alguns procedimentos a serem feitos para que a instalação/atualização possa prosseguir:\n\n**01.** Desativar outras aplicações **Java** e avaliar se ainda ocorre interferências ao finalizar o **serviço \"fluig\"**.\n\n**02.** Conferir a documentação de [Portas e endereços](../Especificações Técnicas/Portas e endereços.md) utilizados pelo Fluig e descartar a possibilidade de conflitos nas portas pela utilização de outras aplicações.\n\n**03.** Recortar os arquivos da **pasta apps** para outro local, fora do diretório de instalação do Fluig: **\\appserver\\apps**\n\n**04.** Limpar os **arquivos temporários** do **Windows**, seguindo os passos abaixo:\n\n- Fechar **todas** as aplicações abertas.\n- Acionar **Executar**.\n\n![](..\\..\\images\\image-2024-1-10_15-59-36.png)\n\n- Digitar o termo **%tmp%** ou **%temp%** (ambos são válidos).\n\n- Clicar em **Ok**.\n\n![](..\\..\\images\\image-2024-1-10_16-1-1.png)\n\n- Abrirá a pasta de **arquivos temporários** do **Windows**.\n- Selecionar todos os arquivos **(Ctrl + A)**.\n\n![](..\\..\\images\\image-2024-1-18_17-3-15.png)\n\n- Clicar com o botão direito do mouse em cima dos arquivos selecionados e acionar **Excluir**.\n- Confirme a exclusão dos arquivos.\n- Também é possível realizar a exclusão com o botão **Delete**, no teclado.\n\n![](..\\..\\images\\image-2024-1-18_17-5-1.png)\n\n**05.** Encerrar todas as tarefas do **OpenJDK Platform binary** e do **Node.js JavaScript Runtime** no **Gerenciador de Tarefas** do **Windows**:\n\nNota:\n\nO **Node.js JavaScript Runtime** é um ambiente de execução do código JavaScript do lado servidor (*server-side*). Na prática, o **Node.js** gera a possibilidade de criar aplicações autossuficientes (*standalone*) em uma máquina servidora, sem a necessidade do navegador.\n\nJá o**OpenJDK Platform binary** é um serviço que executa o Servidor de Aplicação Java, que serve como base para a aplicação Fluig.\n\nA plataforma funciona tanto de forma **reativa**, quando os usuários a acessam; quanto **proativa**, quando se tratam de fluxos automáticos, agendamentos de processamentos e demais tarefas automatizadas que possam estar configuradas.\n\nAssim, mesmo sem usuários utilizando o ambiente, existem integrações ou agendamentos de tarefas que são executados em **segundo plano** pelo Fluig.\n\n- Acionar o atalho **Ctrl + Alt + Del** no teclado e clicar em **Gerenciador de Tarefas**.\n- Também é possível pesquisar por **Gerenciador de Tarefas** no campo de busca do **Windows**.\n\n![](..\\..\\images\\image-2024-1-10_17-42-40.png)\n\n- Se certifique que está na aba **Processos**.\n- Buscar em **Processos em segundo plano** pelos termos **\"OpenJDK Platform binary\"** e **\"Node.js JavaScript Runtime\"**.\n\n![](..\\..\\images\\image-2024-1-10_17-54-21.png)\n\n- Acionar o recurso **Finalizar tarefa** para cada processo em segundo plano relacionado ao **\"OpenJDK Platform binary\"** e ao **\"Node.js JavaScript Runtime\"**.\n\n![](..\\..\\images\\image-2024-1-10_17-57-7.png)\n\n- Após finalizar as tarefas, abra novamente a tela de **Serviços** do **Windows**. Todos os serviços deverão aparecer sem nenhuma informação na coluna **Status**.\n\n![](..\\..\\images\\image-2024-1-10_18-2-2.png)" }, { "metadata": { "title": "Erros comuns ao instalar/atualizar a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=819058035", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Erros comuns ao instalaratualizar a plataforma.md" }, "content": "Erros comuns ao instalar/atualizar a plataforma\n\n## Mensagens durante a instalação/atualização" }, { "metadata": { "title": "Erros comuns ao instalar/atualizar a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=819058035", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Erros comuns ao instalaratualizar a plataforma.md" }, "content": "Erros comuns ao instalar/atualizar a plataforma\n\n\n---\n\n**01.** Durante a instalação ou atualização da plataforma, podem surgir as seguintes mensagens de erro:\n\n- *O serviço Fluig está em execução. Finalize o serviço para continuar a atualização.*\n- *Existe algum arquivo aberto ou em uso. Feche todas as aplicações que possam estar usando arquivos.*\n- *O serviço do Solr está em execução. Finalize o serviço para continuar a atualização.*\n- *The system cannot find the path specified.*\n- *Mensagens em branco.*\n- *Unable to evaluate expression using this context.*\n- *[...]\\dataset.author.csv (O dispositivo não está pronto).*\n\nNota:\n\nO instalador da plataforma verifica se todos os serviços e arquivos da plataforma estão abertos ou em uso durante a instalação/atualização. Isso garante que o procedimento seja realizado com segurança.\n\nAtenção!\n\nAo ignorar os erros e prosseguir com a instalação, é possível finalizá-la. No entanto, ao tentar inicializar a plataforma, os serviços são encerrados logo em seguida.\n\n**02.** Abaixo seguem alguns exemplos das mensagens que podem aparecer em tela:\n\n![](..\\..\\images\\FoV7B6XDaReUoIxKfBaNI7LdQg2Qrvby-HhOBuwQmDNXWL947618KGFn4kbZYTuNzLIZc71xzGcdcRBPLeBxd3z9dEUj4rcfOoG0rhc5cX1571TBaWNy4n6tACw8EHZ77GxyoIIm)\n\n![](..\\..\\images\\zb3_DT80ETi6DrV1lgmeYobxER-DoWCOvH-c_K4pcctQId7jJdJBQRLKGVE52cP2EL0oQ0CBtNpdzT_DkjfQvTiFanB_2KB0pqtcELnKurOqbC9-4PKYr438xNVtFzn_GumFYVR7)\n\n![](..\\..\\images\\tBAnHHPDhU-UDBe8iwrx4R4eTDN6M4TDFbWFId9R3TtEVPmjLSO8eruMHVXJmxGqgqFZauW_M4WI1dSb4M-4VnlMr2Yu_J96qoTRk8CKwSJrCe4vH1ZjgtLFWMkCgtFy6aEwIJLM)\n\n![](..\\..\\images\\trLExRqfOgRKY6cZ8IF0IPgfnpfeTfNOyCVmWXJE1NovsvAsrrAUhwckbDQw_tY5KLy6Pf2DpO8PDllkjUQlMHVzWeL7-iEFvzWO430FglkKZMesiNMo7pBtzUs_vfmQZv8IWr3a)\n\n![](..\\..\\images\\Rg82H8ODqW6FUKANSYlzOVsPAuidgj4NKP8TUM1HPSoXSwi7PxLtZd__sfZ9jNUlvOiDyfxo8zE91QraXHPdBBKCar08ZnsjtOYcfnaPD3aH-90D4yiRy920J4_lzWwJBzg7vwGi)\n\n![](..\\..\\images\\3LtMt7cTkEUXnwdNXdLVWtV9tjY0Q-kEbs-vXPqgJ3MC44ufWkakwf_txv6tWa18qckN-XdUSZy0PGALXahFCW4UJKLVME31mtPvYgkNLEkiOOAbRSOuA-djubeEJ-o4i_nbGy5q)\n\n![](..\\..\\images\\tbWA_fvLx3uTRtHnLU8FgTas6lZuOaNeTJ33-lrhONjC5IigkN_E0-RXFyIYatJsOFVakmCpXcbZt74kUCMDpq7lzZpJ-HLHCd9lIP-fOZHAG7372sBBAxuVHHV6y2wVbl3Raswb)" }, { "metadata": { "title": "Erros comuns ao instalar/atualizar a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=819058035", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Erros comuns ao instalaratualizar a plataforma.md" }, "content": "Erros comuns ao instalar/atualizar a plataforma\n\n## Renomear o diretório de instalação (teste)\n\n---\n\n**01.** Certifique-se de ter fechado todos os arquivos e finalizado os serviços do Fluig: (1) fluig, (2) fluig\\_Indexer e (3) fluig\\_RealTime.\n\n**02.** Tente renomear a pasta de instalação da plataforma.\n\n**03.** Se o Sistema Operacional não permitir que a pasta seja renomeada, significa que algum arquivo está aberto ou em execução.\n\n## Verificar as permissões do usuário executor da mídia" }, { "metadata": { "title": "Erros comuns ao instalar/atualizar a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=819058035", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Erros comuns ao instalaratualizar a plataforma.md" }, "content": "Erros comuns ao instalar/atualizar a plataforma\n\n\n---\n\n**01.** O usuário que está executando o instalador deve possuir permissão de **administrador**.\n\n**02.** Iniciar a sessão no Sistema Operacional com um usuário que possua propriedades administrativas no servidor.\n\n**03.** Verificar se o usuário autenticado é realmente um usuário administrador:\n\n- Buscar pelo o **Painel de Controle** do **Windows**.\n\n![](..\\..\\images\\image-2024-1-10_15-12-27.png)\n\n- Acionar **Contas de Usuário**.\n\n**![](..\\..\\images\\image-2024-1-10_15-13-50.png)**\n\n- Acionar **Contas de Usuário** novamente.\n\n![](..\\..\\images\\image-2024-1-10_15-14-50.png)\n\n- Clicar em **Gerenciar Contas de Usuários**.\n\n![](..\\..\\images\\image-2024-1-18_17-8-13.png)\n\n- Selecionar o usuário que está autenticado e clicar em **Propriedades**.\n\n![](..\\..\\images\\image-2024-1-18_17-10-41.png)\n\n- A opção **Administrador** precisa estar marcada.\n\n**![](..\\..\\images\\image-2024-1-18_17-12-18.png)**\n\n**04.** Em caráter de teste, tente iniciar o instalador por linha de comando:\n\n- Abrir o **Prompt de Comando** através do botão direito do mouse e escolha a opção **Executar como administrador**, conforme a imagem abaixo:\n\n**![](..\\..\\images\\image-2024-1-10_15-39-55.png)**\n\n- Se sua sessão **não for** de administrador, será necessário informar um **login** e **senha** antes de prosseguir;\n- Com o **Prompt de Comando** aberto, navegue até a pasta descompactada onde contém a **mídia** do Fluig.\n\n![](..\\..\\images\\passso-2.png)\n\n- Ao acessar a pasta do instalador, execute o arquivo **Fluig-Installer-64.exe**.\n- A tela do instalador/atualizador será exibida e o processo de atualização prosseguirá normalmente.\n\n![](..\\..\\images\\passo-3.png)\n\n## Consultar o log de eventos do Windows" }, { "metadata": { "title": "Erros comuns ao instalar/atualizar a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=819058035", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Erros comuns ao instalaratualizar a plataforma.md" }, "content": "Erros comuns ao instalar/atualizar a plataforma\n\n\n---\n\nO **Windows** possui o **Visualizador de Eventos** como recurso nativo para consulta de logs de eventos. Essa ferramenta registra detalhes sobre erros no sistema, inclusive os que são causados por falha de hardware, como HD ou memória RAM. **Para consultar:**\n\n- Pesquisar pelo **Painel de Controle** no campo de busca do **Windows**.\n\n![](..\\..\\images\\image-2024-1-10_18-32-3.png)\n\n- Acionar a opção **Sistema e Segurança**.\n\n![](..\\..\\images\\image-2024-1-10_18-34-29.png)\n\n- Clicar em **Ferramentas do Windows**.\n\n![](..\\..\\images\\image-2024-1-10_18-35-30.png)\n\n- Clicar em **Visualizador de Eventos****.**\n\n![](..\\..\\images\\image-2024-1-10_18-39-31.png)\n\n- O **Visualizador de Eventos** mostra diversas informações a respeito do tipo de evento e qual aplicação fez o disparo.\n\n![](..\\..\\images\\image-2024-1-10_18-45-57.png)\n\n## Monitor de recursos do Windows\n\n---\n\n**01.** O **Monitor de Recursos** é um recurso do **Windows** que pode auxiliar no mapeamento das aplicações que estão conectadas ou utilizando o **Java.exe**. **Para acessá-la:**\n\n- Pesquisar pelo **Painel de Controle** no campo de busca do **Windows**.\n\n![](..\\..\\images\\image-2024-1-10_18-32-3.png)\n\n- Acionar a opção **Sistema e Segurança**.\n\n![](..\\..\\images\\image-2024-1-10_18-34-29.png)\n\n- Clicar em **Ferramentas do Windows**.\n\n![](..\\..\\images\\image-2024-1-10_18-35-30.png)\n\n- Clicar em **Monitor de Recursos****.**\n\n![](..\\..\\images\\image-2024-1-11_12-6-35.png)\n\n- Ao abrir o **Monitor de Recursos**, aparecerá a aba **“Visão Geral\"** com os recursos de **hardware**.\n- Selecionar a aba **CPU** e buscar pelo **java.exe**.\n\n![Exibindo image.png](..\\..\\images\\get_attachment_url)\n\n- Com o **java.exe** selecionado, é possível consultar, nas abas **Identificadores Associados** e **Módulo Associados**, todas as aplicações que estão utilizando o recurso.\n\n![](..\\..\\images\\image-2024-1-11_13-45-5.png)\n\n## Limpeza de arquivos temporários e pastas keys" }, { "metadata": { "title": "Erros comuns ao instalar/atualizar a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=819058035", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Erros comuns ao instalaratualizar a plataforma.md" }, "content": "Erros comuns ao instalar/atualizar a plataforma\n\n\n---\n\n**01.** Realizar a limpeza dos arquivos temporários e pastas keys, conforme o passo a passo abaixo:\n\n**a)** Parar a execução dos serviços do Fluig: (1) fluig, (2) fluig\\_Indexer e (3) fluig\\_RealTime.\n\n**b)** Acessar o diretório **\\appserver\\standalone\\log** (a partir da **2.0**) ou **\\appserver\\domain\\servers\\fluig1\\log** (**1.6 até 1.8.2**).\n\n**c)** Eliminar as pastas: **data, log, servers** e **tmp**.\n\nAtenção!\n\nNesse diretório existe a pasta **configuration**, que**não deve ser excluída**, pois se trata de uma pasta fundamental para o funcionamento da plataforma. As demais pastas são todas temporárias. Caso a plataforma não as encontre, ela automaticamente recria as pastas.\n\nNota:\n\nEsse procedimento reiniciará a plataforma e limpará os arquivos de log do ambiente.\n\n**d)** Apagar as pastas keys disponíveis nos caminhos:\n\n- **\\repository\\wcmdir**\n- **\\keys***.*\n\n**e)** Verificar se existem arquivos que **NÃO**estejam nos formatos **.war**, **.ear** ou **.jar** dentro das pastas **apps**, **core**e **system**. Caso existam, é necessário remover esses arquivos **fora do formato** das pastas:\n\n- **\\appserver\\apps**\n- **\\appserver\\core**\n- **\\appserver\\system**\n\nImportante!\n\nOs arquivos temporários gerados nestas pastas são excluídos no momento da finalização dos serviços, porém, em casos de desligamentos forçados do ambiente estes arquivos podem não ser excluídos automaticamente. Assim, é necessário fazer a exclusão manualmente, geralmente, **os arquivos temporários estão no formato .tmp ou são diretórios como o mesmo nome**.\n\n## Nova tentativa de atualização" }, { "metadata": { "title": "Erros comuns ao instalar/atualizar a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=819058035", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Erros comuns ao instalaratualizar a plataforma.md" }, "content": "Erros comuns ao instalar/atualizar a plataforma\n\n\n---\n\n**01.** Reiniciar o servidor.\n\n**02.** Tentar efetuar a atualização da plataforma novamente.\n\n**03.** Iniciar novamente os serviços do Fluig: (1) fluig\\_Indexer, (2) fluig\\_RealTime e (3) fluig.\n\n# Sistema operacional Linux\n\n---\n\nEm servidores Linux essas situações não costumam ocorrer, no entanto, caso ocorra alguma eventualidade, realize a abertura de um ticket na [Central do cliente](https://suporte.totvs.com/), através da opção: **Abrir ticket** e anexe esses arquivos ao chamado. Essa ação agilizará todo o processo de atendimento:\n\n- **\\appserver\\standalone\\configuration\\standalone.xml**\n- **\\appserver\\bin\\standalone.conf**\n- **\\appserver\\standalone\\log\\server.log**\n- **\\node\\fluig.rt\\package.json**\n- **\\node\\fluig.rt\\logs**\n- **\\install.log**\n- ** (Arquivo que fica dentro do servidor do Proxy Reverso)**\n\n- **\\appserver\\domain\\configuration\\domain.xml**\n- **\\appserver\\domain\\configuration\\host.xml**\n- **\\appserver\\domain\\servers\\fluig1\\log\\server.log**\n- **\\appserver\\domain\\log\\host-controller.log**\n- **\\appserver\\domain\\log\\process-controller.log**\n- **\\node\\fluig.rt\\package.json**\n- **\\node\\fluig.rt\\logs**\n- **\\install.log**\n- ** (Arquivo que fica dentro do servidor do Proxy Reverso)**" }, { "metadata": { "title": "Guia de atualização da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271666186", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de atualização da plataforma.md" }, "content": "Guia de atualização da plataforma\n\n\nFique atento!\n\nEsta página é válida a partir da **atualização 1.6** e **superiores**.\n\nCaso possua a atualização **1.5.13 ou inferior** acesse [Quais os procedimentos para atualização na release 1.5.13 ou inferior?](https://tdn.totvs.com/pages/viewpage.action?pageId=155583041)\n\n- [Objetivo](#Guiadeatualizaçãodaplataforma-Objetivo)\n- [Pré-requisitos](#Guiadeatualizaçãodaplataforma-Pré-requisitos)\n - [Gerais](#Guiadeatualizaçãodaplataforma-Gerais)\n - [Atualização 2.0](#Guiadeatualizaçãodaplataforma-Atualização2.0)\n- [Procedimentos para efetuar a atualização](#Guiadeatualizaçãodaplataforma-Procedimentosparaefetuaraatualizaçãoatualização)\n- [Atualização em ambiente Windows - Modo caractere](#Guiadeatualizaçãodaplataforma-AtualizaçãoemambienteWindows-Modocaractere)\n- [Atualização em ambiente Linux - Modo caractere](#Guiadeatualizaçãodaplataforma-AtualizaçãoemambienteLinux-Modocaractere)\n- [Atualização com balanceamento de carga, alta disponibilidade e tolerância à falha - Cluster](#Guiadeatualizaçãodaplataforma-Atualizaçãocombalanceamentodecarga,altadisponibilidadeetolerânciaàfalha-Cluster)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar os procedimentos necessários para efetuar a atualização do TOTVS Fluig.\n\nPara acompanhar informações sobre Atualização programada e sobre o Ciclo de atualização obrigatório, acesse [Atualização da plataforma](../Sobre a plataforma/Atualização da plataforma.md).\n\nPlataforma em Cloud\n\nA instalação, atualização ou configuração da plataforma para quem contratou o serviço de *Cloud* é realizada por uma equipe de atendimento específica. Para solicitar o atendimento, abra um *ticket* para a equipe de *Cloud* pela página de [suporte](http://suporte.totvs.com).\n\n# Pré-requisitos\n\n---\n\nVeja a seguir os pré-requisitos necessários para a correta atualização da sua plataforma.\n\n## Gerais" }, { "metadata": { "title": "Guia de atualização da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271666186", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de atualização da plataforma.md" }, "content": "Guia de atualização da plataforma\n\n\n---\n\n- É imprescindível **parar** todos os serviços antes de atualizar a plataforma: fluig, fluig\\_Indexer, fluig\\_Realtime, fluig\\_memCached ou redis (para ambientes de alta disponibilidade ou com servidores de cache configurados) e Prizm (esse serviço só existe se você utiliza o Fluig Viewer localmente).\n\n Importante!\n\n Lembramos que, para ambientes de alta disponibilidade, todos os serviços devem estar parados e nenhum arquivo ou pasta deve estar aberto (isso inclui mapeamento de pastas ou arquivos).\n- Realizar o backup da instalação, conforme descrito no guia [Backup da aplicação](Backup da aplicação.md).\n\n- Antes de atualizar a plataforma no ambiente de produção, [crie um ambiente de homologação](Criando um ambiente de homologação.md) e realize os testes necessários.\n\n- Recomendamos que seja realizado o *download* sempre da **última versão do instalador**na [Central do cliente](https://suporte.totvs.com/portal/p/10098/download#000035).\n\n Importante!\n\n Ressaltamos que não disponibilizamos o instalador para **pacotes específicos**que não estejam disponíveis na Central do cliente. Sempre disponibilizamos o instalador para a última atualização disponível, que já contempla todas as correções e melhorias liberadas.\n- Caso venha a ocorrer algum problema durante a instalação, antes de fazer o*rollback*, recomendamos salvar os arquivos **server.log** – localizado em [diretório\\_instalação]\\appserver\\standalone\\log (a partir da **2.0**) ou [diretório\\_instalação]\\appserver\\domain\\servers\\fluig1\\log (**1.6 até 1.8.2**) – e **install.log** (localizado em [diretório\\_instalação]) e abrir *ticket* com essas evidências, para que o time de atendimento TOTVS Fluig possa analisar.\n\n**oculto**\n\n**Observação interna:**\n\nO procedimento de atualização foi repassado ao artigo: \n\nCaso tenham alterações, é necessário repassar a esse artigo!!!\n\n## Atualização 2.0" }, { "metadata": { "title": "Guia de atualização da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271666186", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de atualização da plataforma.md" }, "content": "Guia de atualização da plataforma\n\n\n---\n\nA instalação da **atualização Voyager (2.0)** exige que a plataforma esteja no mínimo na **atualização Crystal Mist (1.8.2).**\n\n- Caso seu ambiente esteja em uma atualização anterior, é necessário primeiramente atualizar para o pacote **mais** **recente da 1.8.2 (no mínimo 1.8.2-260127)**, disponível para *download* na Central do cliente. Após a atualização, basta subir os serviços, iniciar a plataforma e, só então, atualizar para a **Voyager (2.0)****.**\n\n- Caso seu ambiente esteja na **atualização 1.8.2**, é necessário primeiramente atualizar para o pacote **mais** **recente da 1.8.2 (no mínimo 1.8.2-260127)**, disponível para *download* na Central do Clientes, subir os serviços,  iniciar a plataforma e, só então, atualizar para a **Voyager (2.0)****.**\n\nImportante!\n\nPara realizar o *download* das atualizações, acesse a [Central do cliente](https://suporte.totvs.com/portal/p/10098/download#000035), descompacte o arquivo conforme orientado e siga os [Procedimentos para efetuar a atualização.](https://tdn.totvs.com/pages/releaseview.action?pageId=271666186#Guiadeatualiza%C3%A7%C3%A3odaplataforma-Procedimentosparaefetuaraatualiza%C3%A7%C3%A3oatualiza%C3%A7%C3%A3o)\n\n### Atualização 1.8\n\n---\n\n- A atualização para a 1.8.x deve ser efetuada apenas se a instalação atual estiver na atualização Crystal Lake (1.7.1). Para baixar o pacote da 1.7.1, acesse a [Central do cliente](https://suporte.totvs.com/portal/p/10098/download#000035/FLUIG%201.7/FLUIG/search/searchAll).\n\n- Após a atualização para a Crystal Mist (1.8.2), acesse o recurso de [Indexação](http://tdn.totvs.com/pages/viewpage.action?pageId=234455757) e faça uma reindexação completa dos conteúdos do repositório da plataforma, marcando inclusive a opção para **Recriar o índice**.\n\n Nota:\n\n Na atualização Crystal Mist (1.8.2), o Servidor de indexação (Solr) foi atualizado para a versão 9.4.1.\n\n### Atualização 1.7" }, { "metadata": { "title": "Guia de atualização da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271666186", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de atualização da plataforma.md" }, "content": "Guia de atualização da plataforma\n\n\n---\n\n- A atualização para a 1.7.x deve ser efetuada apenas se a instalação atual estiver na atualização Liquid (1.6.5). Para baixar o pacote da 1.6.5, acesse o [Central do cliente](https://suporte.totvs.com/portal/p/10098/download#000035/FLUIG%201.6/FLUIG/).\n\n- Após a atualização para a Crystal Lake (1.7.1), acesse o recurso de [Indexação](http://tdn.totvs.com/pages/viewpage.action?pageId=234455757) e faça uma reindexação completa dos conteúdos do repositório da plataforma, marcando inclusive a opção para **Recriar o índice**.\n\n#### Ajuste de processos e arquivos abertos para Fluig Indexer (Solr) em sistemas operacionais Linux" }, { "metadata": { "title": "Guia de atualização da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271666186", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de atualização da plataforma.md" }, "content": "Guia de atualização da plataforma\n\n\n---\n\nAtenção!\n\nA partir da atualização 1.7.0, o TOTVS Fluig Plataforma passa a ser compilado sob a versão 11 do Java®. Por este motivo as mensagens de alerta, abaixo citadas, referentes ao serviço Fluig Indexer (Solr) durante a inicialização da plataforma, podem ser exibidas.\n\n**Solr warnings**\n\n```\nStarting Node server ... done\n*** [WARN] *** Your open file limit is currently 1024. \nIt should be set to 65000 to avoid operational disruption. \nIf you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh\n*** [WARN] *** Your Max Processes Limit is currently 62191. \nIt should be set to 65000 to avoid operational disruption. \nIf you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh\nWaiting up to 180 seconds to see Solr running on port 8983 [\\] \nStarted Solr server on port 8983 (pid=54541). Happy searching!\n```\n\nTrata-se de variáveis de ambiente Linux utilizadas para definir um limite de arquivos abertos e um número máximo de processos rodando.\n\nOs valores default no Linux para estas variáveis não são os ideais para alta performance do Fluig Indexer (Solr), por isso são sugeridos os valores desejáveis nestas mensagens.\n\nPara realizar essa configuração, é necessário editar o arquivo /etc/security/limits.conf, e ao final dele inserir os seguintes valores:\n\n**/etc/security/limits.conf**\n\n```\nsolr soft nofile 65000\n\nsolr hard nofile 65000\n\nsolr soft nproc 65000\n\nsolr hard nproc 65000\n```\n\nApós a configuração e o reinício do servidor a mensagem não será mais exibida no log da plataforma.\n\n### Atualização 1.6" }, { "metadata": { "title": "Guia de atualização da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271666186", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de atualização da plataforma.md" }, "content": "Guia de atualização da plataforma\n\n\n---\n\nAtenção!\n\nCaso você tenha a plataforma com envio de e-mail configurado anterior à atualização 1.6.1, será necessário limpar os dados antigos de conexão do Servidor de e-mail pois a partir da atualização 1.6.1 essas configurações são feitas em tela.\n\n- A atualização para a release 1.6.x deve ser efetuada apenas se a instalação atual estiver na release 1.5.13. Para baixar o pacote da 1.5.13, acesse o [Central do cliente](https://suporte.totvs.com/portal/p/10098/download#000035/FLUIG%201.5/FLUIG/).\n\n- As bibliotecas JavaScript da plataforma foram atualizadas, portanto é preciso realizar novos testes com os formulários já cadastrados para garantir que não ocorram conflitos com versões mais antigas destas mesmas bibliotecas.\n\n- Os desenvolvimentos sob a plataforma com dependências diretas do Java deverão ser recompilados com a versão Java 1.8.\n\n- Os componentes da TOTVS Store devem ser atualizados para nova versão compatível com a release 1.6.\n\n- Após a atualização, acesse o recurso de [Indexação](http://tdn.totvs.com/pages/viewpage.action?pageId=234455757) e faça uma reindexação completa dos conteúdos do repositório da plataforma, marcando inclusive a opção para **Recriar o índice**.\n\n- A estrutura de pastas e arquivos no diretório de instalação da plataforma foram alteradas. As principais diferenças podem ser consultadas em [Localização dos arquivos na pasta de instalação da release 1.6](https://tdn.totvs.com/pages/viewpage.action?pageId=271844650).\n\n- Caso utilize autenticação LDAP, siga os procedimentos descritos [aqui](https://suporte.totvs.com/portal/p/10098/suporte-fluig-noticias?id=532).\n\n### Atualização 1.5\n\n---\n\n- Para atualização da plataforma para a release 1.5, consulte o guia [Fluig 1.5 - Inicialização com LMS](https://tdn.totvs.com/pages/viewpage.action?pageId=189305418).\n\n### Atualização 1.2.8" }, { "metadata": { "title": "Guia de atualização da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271666186", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de atualização da plataforma.md" }, "content": "Guia de atualização da plataforma\n\n\n---\n\n- Clientes que estiverem utilizando a plataforma abaixo da atualização 1.2.8 devem entrar em contato com o [Suporte TOTVS Fluig](http://suporte.totvs.com/) antes de executar a atualização.\n\n# Procedimentos para efetuar a atualização\n\n---\n\nPara efetuar a atualização do TOTVS Fluig, é necessário seguir os passos descritos a seguir:\n\n- Efetue o *download* através do [Central do Cliente](https://suporte.totvs.com/portal/p/10098/download#000035) e descompacte o arquivo.\n\n![](..\\..\\images\\Central%20cliente.png)\n\n- Pare os serviços Fluig, fluig\\_Indexer, fluig\\_RealTime e fluig\\_MemCached ou redis (se tiver configurado).\n\n![](..\\..\\images\\Parar%20servi%C3%A7os.gif)\n\nNota:\n\nCaso tenha atualização 1.5.13 ou anterior instalado, os serviços serão: fluig, fluig\\_MemCached e fluig\\_RealTime.\n\nNa instalação da atualização 1.6.0, por padrão, o serviço fluig\\_MemCached não será criado. Nesta versão o servidor de aplicação mudou e trabalha com sistema de cache local, exceto em servidores de alta disponibilidade.\n\n- Execute o instalador e escolha a opção **Atualizar minha instalação** e clique em **Próximo**.\n\n![](..\\..\\images\\atualizar.jpg)\n\n- Na tela de Diretório para Atualização, selecione o diretório onde a plataforma está instalada.\n\n- Clique em **Próximo** até o sistema apresentar a mensagem de que a atualização foi concluída com sucesso.\n\n![](..\\..\\images\\Diret%C3%B3rio.png)\n\n- Caso a plataforma esteja operando em ***load balance***, é necessário realizar a configuração abaixo:\n\n**01**. Localize a pasta WCMDIR, que está compartilhada entre todos os nós:\n\n- abra em um editor de texto o arquivo **standalone.xml** localizado em [diretório\\_instalação]/appserver/standalone/configuration;\n\n- localize a propriedade de *binding* \"**java:global/wcm/globalDataDir**\", que informa o caminho da pasta compartilhada entre as instâncias.\n\n```\n\n```\n\n**02**. Em seguida, copie o conteúdo do diretório [diretório\\_instalação]/repository/wcmdir/ para o caminho encontrado no parâmetro acima **GLOBAL\\_DATA\\_DIR/wcmdir**.\n\n**01**. Localize a pasta WCMDIR, que está compartilhada entre todos os nós:\n\n- abra em um editor de texto o arquivo **domain.xml** localizado em [diretório\\_instalação]/appserver/domain/configuration;\n\n- localize a propriedade de *binding* \"**java:global/wcm/globalDataDir**\", que informa o caminho da pasta compartilhada entre as instâncias.\n\n```\n\n```\n\n**02**. Em seguida, copie o conteúdo do diretório [diretório\\_instalação]/repository/wcmdir/ para o caminho encontrado no parâmetro acima **GLOBAL\\_DATA\\_DIR/wcmdir**.\n\n- Inicie os serviços respeitando a seguinte ordem:\n\n1. fluig\\_MemCached ou redis (se tiver configurado)\n2. fluig\\_Indexer;\n3. fluig\\_RealTime;\n4. fluig.\n\nImportante!\n\nHabilite o acesso ao serviço de versionamento da plataforma, liberando acesso ao endereço [https://version.fluig.com](https://version.fluig.com/) (porta 443), na rede local onde a plataforma está instalada.\n\nPara verificar a disponibilidade do serviço de licenciamento, acesse o site [status.fluig.com](http://status.fluig.com).\n\n# Atualização em ambiente Windows - Modo caractere\n\n---\n\nAs instruções para realizar o atualização do TOTVS Fluig Plataforma e dos módulos separadamente estão informados abaixo:\n\n- Abra o **Prompt de Comandos** no diretório onde o pacote de instalação foi descompactado e execute o comando abaixo. Se a plataforma foi instalada de forma completa ou seja, com todos os módulos, não será necessário atualizar os módulos Servidor de indexação e RealTime separadamente, sendo preciso apenas executar este comando:\n\n```\njava -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate \n```\n\n- **Pronto**! Após o término da atualização será apresentada a mensagem \"Atualização concluída\" no console. Portanto sua plataforma foi atualizada.\n\n- Abra o **Prompt de Comandos** no diretório onde o pacote de instalação foi descompactado e execute o comando abaixo caso deseje atualizar apenas o Servidor de indexação:\n\n```\njava -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate solr \n```\n\n- **Pronto**! Após o término da atualização será apresentada a mensagem \"Atualização concluída\" no console. Portanto o Servidor de indexação foi atualizado corretamente.\n\nDica!\n\nSe desejar implementar mais servidores na configuração Master/Slave, continue a instalação conforme os procedimentos descritos na documentação [Servidor de indexação em alta disponibilidade](../Configuração/Configuração de Ambiente/Servidor de indexação dedicado/Servidor de indexação em alta disponibilidade.md).\n\n- Abra o **Prompt de Comandos** no diretório onde o pacote de instalação foi descompactado e execute o comando abaixo caso deseje atualizar apenas o serviços de RealTime:\n\n```\njava -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate nodejs \n```\n\n- **Pronto**! Após o término da atualização será apresentada a mensagem \"Atualização concluída\" no console. Portanto o Servidor de indexação foi atualizado corretamente.\n\n# Atualização em ambiente Linux - Modo caractere\n\n---\n\nAs instruções para realizar o atualização do TOTVS Fluig Plataforma e dos módulos separadamente estão informados abaixo:\n\n- Abra o **Console** no diretório onde o pacote de instalação foi descompactado e execute o comando abaixo. Se a plataforma foi instalada de forma completa ou seja, com todos os módulos, não será necessário atualizar os módulos Servidor de indexação e RealTime separadamente, sendo preciso apenas executar este comando:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate \n```\n\n- **Pronto**! Após o término da atualização será apresentada a mensagem \"Atualização concluída\" no console. Portanto sua plataforma foi atualizada.\n\n- Abra o **Console** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate solr \n```\n\n- **Pronto**! Após o término da atualização será apresentada a mensagem \"Atualização concluída\" no console. Portanto o Servidor de indexação foi atualizado corretamente.\n\nDica!\n\nSe desejar implementar mais servidores na configuração Master/Slave, continue a instalação conforme os procedimentos descritos na documentação [Servidor de indexação em alta disponibilidade](../Configuração/Configuração de Ambiente/Servidor de indexação dedicado/Servidor de indexação em alta disponibilidade.md).\n\n- Abra o **Console** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate nodejs \n```\n\n- **Pronto**! Após o término da atualização será apresentada a mensagem \"Atualização concluída\" no console. Portanto o serviço de RealTime foi atualizado corretamente.\n\n# Atualização com balanceamento de carga, alta disponibilidade e tolerância à falha - *Cluster*\n\n---\n\nO procedimento de atualização da plataforma em *cluster*, onde é possível ter balanceamento de carga, alta disponibilidade e tolerância a falha, é igual ao de ambientes com [apenas uma instância](https://tdn.totvs.com/pages/viewpage.action?pageId=271666186), porém o pacote de atualização deverá ser executado**em cada um dos nós** do ambiente. Os serviços FLUIG, fluig\\_Indexer, fluig\\_Realtime, Cache (Memcached ou Redis) e Prizm devem estar parados antes que o processo de atualização seja iniciado.\n\nAtenção!\n\nSe a atualização for realizada da versão 1.5.x para a versão 1.6, as configurações de balanceamento de carga, alta disponibilidade e tolerância a falhadeverão ser refeitas devido ao servidor de aplicação ter mudado. Para isso, siga a documentação [Alta disponibilidade e balanceamento de carga](../Configuração/Configuração de Ambiente/Alta disponibilidade e balanceamento de carga.md)." }, { "metadata": { "title": "Guia de atualização Fluig Studio", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=240298991", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de atualização Fluig Studio.md" }, "content": "Guia de atualização Fluig Studio" }, { "metadata": { "title": "Guia de atualização Fluig Studio", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=240298991", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de atualização Fluig Studio.md" }, "content": "Guia de atualização Fluig Studio\n\n\n# Índice\n\n- 1 [Objetivo](#GuiadeatualizaçãoFluigStudio-Objetivo)\n- 2 [Pré requisitos](#GuiadeatualizaçãoFluigStudio-Prérequisitos)\n- 3 [Identificando a versão do Fluig Studio instalada](#GuiadeatualizaçãoFluigStudio-IdentificandoaversãodoFluigStudioinstalada)\n- 4 [Atualizando a versão do Fluig Studio](#GuiadeatualizaçãoFluigStudio-AtualizandoaversãodoFluigStudio)\n- 5 [Removendo a versão do Fluig Studio da IDE](#GuiadeatualizaçãoFluigStudio-RemovendoaversãodoFluigStudiodaIDE)\n\n# Objetivo\n\n---\n\nEste guia tem como objetivo auxiliar os usuários na instalação do Fluig Studio e apresentar as ações possíveis na instalação ou atualização do mesmo. A atualização do plug-in Fluig Studio é feita ao sobrescrever a instalação atual na IDE com a versão mais recente.\n\n# Pré requisitos\n\n---\n\n- Ter a mesma versão de plugin e servidor para melhor experiência. **Exemplo:** se o Fluig utilizado estiver na atualização 1.5.9, o plugin também deve estar nesta mesma versão.\n\n# Identificando a versão do Fluig Studio instalada\n\n---\n\nPara identificar qual a versão do plugin Fluig Studio que está instalada em seu Eclipse© ou TOTVS Developer Studio siga os passos abaixo:\n\n- Selecione no menu **Help** a opção **Installation Details** (ou **Ajuda** **→ Detalhes da Instalação**, se sua IDE estiver traduzida).\n\n![](..\\..\\images\\Screenshot%2028_06%20001.png)\n\n- Verifique na coluna **Version** a versão correspondente ao item \"Fluig Workflow and WCM Designer\":\n\n![](..\\..\\images\\Installation%20Details.png)\n\n# Atualizando a versão do Fluig Studio\n\n---\n\nPara atualizar o plugin Fluig Studio para a última versão ou para uma versão específica basta seguir os passos e as dicas em [Guia de instalação Fluig Studio - Instalação/Atualização funções Fluig Studio.](http://tdn.totvs.com/pages/viewpage.action?pageId=73078179#GuiadeinstalaçãofluigStudio-InstalaçãodasfunçõesdofluigStudio)\n\nPara instalar uma versão do Fluig Studio anterior à versão atualmente instalada em sua IDE, primeiramente será necessário remover essa versão para prosseguir com a instalação.\n\n# Removendo a versão do Fluig Studio da IDE\n\n---\n\n\n\n- Selecione no menu **Help** a opção **Installation Details** (ou **Ajuda** → **Detalhes da Instalação**, se sua IDE estiver traduzida).\n\n![](..\\..\\images\\Screenshot%2028_06%20001.png)\n\n- Selecione o item \"Fluig Workflow and WCM Designer\" e utilize o botão **Uninstall...** :\n\n![](..\\..\\images\\Uninstall.png)\n\n- Confirme a remoção do Fluig Studio clicando em **Finish**.\n\n![](..\\..\\images\\Uninstall%20Details.png)" }, { "metadata": { "title": "Guia de Instalação da plataforma em VMs", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73075567", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de Instalação da plataforma em VMs.md" }, "content": "Guia de Instalação da plataforma em VMs\n\n\n# Índice\n\n- 1 [Instalação do ambiente virtualizado para a plataforma](#GuiadeInstalaçãodaplataformaemVMs-Instalaçãodoambientevirtualizadoparaaplataforma)\n - 1.1 [Diretrizes para VMWare vSphere](#GuiadeInstalaçãodaplataformaemVMs-DiretrizesparaVMWarevSphere)\n - 1.2 [Diretrizes para Microsoft Hyper-V](#GuiadeInstalaçãodaplataformaemVMs-DiretrizesparaMicrosoftHyper-V)\n - 1.3 [Procedimento para instalação da plataforma](#GuiadeInstalaçãodaplataformaemVMs-Procedimentoparainstalaçãodaplataforma)\n - 1.4 [Topologia da Arquitetura](#GuiadeInstalaçãodaplataformaemVMs-TopologiadaArquitetura)\n - 1.5 [Dimensionamentos para ambiente de produção](#GuiadeInstalaçãodaplataformaemVMs-Dimensionamentosparaambientedeprodução)\n - 1.6 [Suporte Técnico](#GuiadeInstalaçãodaplataformaemVMs-SuporteTécnico)\n\n# Instalação do ambiente virtualizado para a plataforma\n\n---\n\nA instalação ou criação do ambiente virtualizado deve obedecer as diretrizes descritas neste capítulo para responder aos requisitos de execução da plataforma.\n\nOrientação de segurança\n\nPor motivos de segurança recomendamos que após a instalação da plataforma em ambientes Linux, seja retirado o usuário como root seguindo o processo na documentação [Configurar ambiente Linux para não utilizar o usuário root](http://tdn.totvs.com/x/v2cWGw).\n\n### Diretrizes para VMWare vSphere" }, { "metadata": { "title": "Guia de Instalação da plataforma em VMs", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73075567", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de Instalação da plataforma em VMs.md" }, "content": "Guia de Instalação da plataforma em VMs\n\n\n---\n\n| VMWare vSphere |\n| --- |\n| A versão homologada do VMWare vSphere para a plataforma está disponível na [Matriz de Portabilidade](http://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade). |\n| Sempre utilizar discos do tipo **Thick Provisioning Eager Zeroed** para a máquina virtual. |\n\n![Resultado de imagem para VMWARE Thick Provisioning Eager Zeroed](..\\..\\images\\vstg-image044.png)\n\nAtenção\n\nA configuração acima é muito importante, pois caso o disco seja configurado como **Thick Provisioning** **Lazy** **Zeroed** ou **Thin Provision** a plataforma apresentará lentidão e vários recursos não irão responder conforme desejado.\n\n**Observação: Muitas vezes é necessário recriar a VM por completo.**\n\n### Diretrizes para Microsoft Hyper-V" }, { "metadata": { "title": "Guia de Instalação da plataforma em VMs", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73075567", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de Instalação da plataforma em VMs.md" }, "content": "Guia de Instalação da plataforma em VMs\n\n\n---\n\n| Microsoft Hyper-V |\n| --- |\n| A versão homologada do Microsoft Hyper-V para a plataforma está disponível na [Matriz de Portabilidade](http://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade). |\n| Configurar o antivírus para ignorar os processos e diretórios do Hyper-V (configurações e diretórios de armazenamento das máquinas virtuais). |\n| Evitar armazenar arquivos do sistema operacional nas mesmas unidades utilizadas para armazenamento de configurações e máquinas virtuais do Hyper-V. |\n| Evitar a utilização em conjunta de máquinas virtuais que podem e que não podem utilizar os componentes do Integration Service. |\n| Preferir utilizar unidades de armazenamento separadas para cada máquina virtual. |\n| Sempre utilizar sistemas operacionais homologados para o Hyper-V ([Linux homologados](https://technet.microsoft.com/pt-br/library/dn531030.aspx) e [Windows Server homologados](https://technet.microsoft.com/en-us/library/dn792027.aspx)) e homologados na [Matriz de Portabilidade](http://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade) da plataforma. |\n| Sempre utilizar [máquinas virtuais de 2ª geração](https://technet.microsoft.com/library/dn282285.aspx). |\n| Sempre mudar a localização padrão de armazenamento de configurações e VHD das máquinas virtuais. |\n| Sempre instalar o Integration Components nos sistemas operacionais homologados para o Hyper-V. |\n| Sempre utilizar **VHDs de tamanho fixos** para a máquina virtual. |\n\n### Procedimento para instalação da plataforma" }, { "metadata": { "title": "Guia de Instalação da plataforma em VMs", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73075567", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de Instalação da plataforma em VMs.md" }, "content": "Guia de Instalação da plataforma em VMs\n\n\n---\n\nExistem dois tipos de pacotes de instalação, cada um está relacionado a um tipo de sistema operacional, como podemos verificar na tabela abaixo:\n\n| | |\n| --- | --- |\n| **Pacote de Instalação** | |\n| Fluig-Win64.zip | Deve ser utilizado em Sistemas Operacionais Windows® 64 bits. |\n| Fluig-Linux64.zip | Deve ser utilizado em Sistemas Operacionais Linux® 64 bits. |\n\nApós verificar o pacote de instalação adequado para o servidor, é possível iniciar a instalação. Para isto é necessário descompactar o zip e executar o arquivo:\n\n- Fluig-Installer-64.exe, no caso de sistema operacional Windows®.\n- Fluig-Installer-64.sh no caso de sistema operacional Linux®.\n\nAtenção\n\nPara instalar em sistemas operacionais Linux®, usando usuário diferente do root, é necessário dar permissão de execução no arquivo FLUIG-Installer-64.sh, para iniciar a instalação.\n\n- A relação dos sistemas operacionais suportados pelo produto pode ser encontrada na [Matriz de portabilidade](http://tdn.totvs.com/x/_ApbB).\n- O processo de instalação do produto está descrito no [Guia de Instalação da plataforma](http://tdn.totvs.com/x/zAJbDw).\n\n \n\n### Topologia da Arquitetura\n\n---\n\nA  topologia para a instalação padrão da plataforma em ambiente virtualizado é apresentada na figura abaixo.\n\n![](..\\..\\images\\topologia-padrao-dev.png)\n\nOnde:\n\n- Servidor Fluig: é o servidor onde são instalados os componentes de negócio.\n- STORAGE/ Repositório de Arquivos: é o local onde será armazenado o conteúdo.\n- Servidor de Dados: é o dicionário de dados do produto.\n- Servidor de E-mail: responsável por enviar os e-mails referentes as notificações da plataforma.\n- Servidor de Indexação: responsável por indexar o conteúdo da plataforma.\n- Servidor Identity: responsável pela gestão na plataforma.\n\n### Dimensionamentos para ambiente de produção" }, { "metadata": { "title": "Guia de Instalação da plataforma em VMs", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73075567", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de Instalação da plataforma em VMs.md" }, "content": "Guia de Instalação da plataforma em VMs\n\n\n---\n\nOs itens abaixo descrevem o dimensionamento mínimo para a instalação do servidor de aplicação da plataforma considerando o ambiente virtualizado em modo de produção:\n\n- - Recursos para a VM  \n    - 4 vCPU \n    - 16 GB Memória RAM \n    - 2 HD SAS 15k - 80 GB - RAID 1\n - Configuração da VM \n    - Usar “Memory Reservation” \n    - Usar “[Large Memory Pages](http://www.vmware.com/files/pdf/large_pg_performance.pdf)” no sistema operacional **\\*** \n    - Usar área exclusiva de disco físico ou storage \n    - Configurar o adaptador de rede indicado para o sistema operacional a ser usado na VM \\*\\*\n - Parametrização Java Virtual Machine \n   - Xms=2g \n   - Xmx=6g \n   - XX:PermSize=1g \n   - XX:MaxPermSize=1g \n   - XX:+UseLargePages\n - Link sugerido 3,5 Mb\n\n| Atenção |\n| --- |\n| \\* A configuração de “Large Memory Pages” é realizada no sistema operacional e pode ser encontrada em:  |\n| \\*\\* A configuração do adaptador de rede indicado para o sistema operacional da VM pode ser encontrada em: [http://kb.vmware.com/selfservice/microsites/](http://kb.vmware.com/selfservice/microsites/search.do?cmd=displayKC&docType=kc&docTypeID=DT_KB_1_1&externalId=1001805) |\n| **Importante:** O dimensionamento é um processo contínuo e está diretamente relacionado ao número de usuários e as exigências de disponibilidade do ambiente. |\n\n### Suporte Técnico" }, { "metadata": { "title": "Guia de Instalação da plataforma em VMs", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73075567", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de Instalação da plataforma em VMs.md" }, "content": "Guia de Instalação da plataforma em VMs\n\n\n---\n\nAo acionar o suporte técnico ou criar chamado para situações envolvendo a instalação do produto em ambiente virtualizado, tenha as seguintes informações:\n\n1. A configuração do host para a VM;\n2. A porcentagem de utilização da CPU;\n3. O nome e versão do sistema operacional;\n4. Os parâmetros de inicialização da JVM do servidor de aplicação. Esta informação está disponível no arquivo host.xml em [diretório\\_instalação]/appserver/domain/configuration.\n5. O tipo de armazenamento configurado para VM, o número de iops/disk e hits/rg." }, { "metadata": { "title": "Guia de instalação da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622732", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma.md" }, "content": "Guia de instalação da plataforma" }, { "metadata": { "title": "Guia de instalação da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622732", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma.md" }, "content": "Guia de instalação da plataforma\n\n\n- [Introdução](#Guiadeinstalaçãodaplataforma-Introdução)\n- [Componentes do instalador](#Guiadeinstalaçãodaplataforma-Componentesdoinstalador)\n- [Pacotes de instalação](#Guiadeinstalaçãodaplataforma-Pacotesdeinstalação)\n- [Instalação ou atualização da plataforma](#Guiadeinstalaçãodaplataforma-Instalaçãoouatualizaçãodaplataforma)\n - [Informações importantes](#Guiadeinstalaçãodaplataforma-Informaçõesimportantes)\n - [Como iniciar](#Guiadeinstalaçãodaplataforma-Comoiniciar)\n- [Fluig Studio](#Guiadeinstalaçãodaplataforma-FluigStudio)\n- [Ambiente de homologação X ambiente de produção](#Guiadeinstalaçãodaplataforma-AmbientedehomologaçãoXambientedeprodução)\n\n# Introdução\n\n---\n\nA mídia desenvolvida para instalar o TOTVS Fluig é muito fácil e rápida. No instalador se encontra o servidor de aplicações utilizado para executar o sistema, o Java Development Kit 11 e o servidor de indexação.\n\n# Componentes do instalador\n\n---\n\nVeja a lista de componentes contidos na instalação da plataforma:\n\n- Servidor de indexação;\n- Servidor de gerenciamento de mensagens;\n- Componente para visualização de documentos;\n- Java;\n- Servidor de aplicação.\n\n# Pacotes de instalação\n\n---\n\nExistem dois pacotes de instalação disponíveis na [Central do cliente](https://suporte.totvs.com/portal/p/10098/download#000035), cada um referente a um sistema operacional específico. Para ter acesso ao portal de clientes, é necessário ser um cliente TOTVS Fluig.\n\n| Pacote de instalação | |\n| --- | --- |\n| **Arquivo** | **Descrição** |\n| Fluig-[release]-Win64.zip | Utilize em sistemas operacionais Windows 64 bits. |\n| Fluig-[release]-Linux64.zip | Utilize em sistemas operacionais Linux 64 bits. |\n\nImportante!\n\nRessaltamos que não disponibilizamos o instalador para **pacotes específicos**que não estejam disponíveis na [Central do cliente](https://suporte.totvs.com/portal/p/10098/download#000035). Sempre disponibilizamos o instalador para a última atualização disponível, que já contempla todas as correções e melhorias liberadas.\n\nÉ possível acompanhar nosso calendário de atualizações em [Atualização da plataforma](../Sobre a plataforma/Atualização da plataforma.md).\n\n# Instalação ou atualização da plataforma\n\n---\n\nVeja a seguir as opções de instalação ou atualização da plataforma." }, { "metadata": { "title": "Guia de instalação da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622732", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma.md" }, "content": "Guia de instalação da plataforma\n\n## Informações importantes\n\n---\n\n- Por questões de segurança, orientamos não expor sua plataforma diretamente à internet. Para isso, será necessário [criar uma rede DMZ](http://tdn.totvs.com/x/MZIbCQ) juntamente com o [protocolo HTTPS](http://tdn.totvs.com/x/vdMgFQ).\n\n- Habilite o acesso ao serviço de **licenciamento** da plataforma liberando a conexão com o endereço [https://version.fluig.com](https://version.fluig.com/) (porta 443) na rede local onde a plataforma está instalada. Para verificar a disponibilidade do serviço de licenciamento, acesse o site [status.fluig.com](http://status.fluig.com).\n\n- Em ambientes de produção não é recomendado utilizar o recurso de **varredura do antivírus** na pasta de instalação da plataforma, pois pode interferir na sua performance.\n\n- É obrigatório executar a instalação como **administrador do sistema**.\n\n- Em servidores Linux, é necessário conceder permissão de execução no arquivo java, no diretório jdk-64/bin e no arquivo Fluig-Installer-64.sh para iniciar a instalação.\n\n- Caso ocorra alguma inconsistência durante a instalação, antes de fazer o *rollback*, recomendamos salvar os arquivos **server.log** – localizado em  [diretório\\_instalação]\\appserver\\standalone\\log (a partir da **2.0**) ou [diretório\\_instalação]\\appserver\\domain\\servers\\fluig1\\log (até a **1.8.2**) – e **install.log** – localizado em [diretório\\_instalação] – e abrir um *ticket* com essas evidências, para que o time de atendimento TOTVS Fluig possa analisar.\n\n \n\n## Como iniciar" }, { "metadata": { "title": "Guia de instalação da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622732", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma.md" }, "content": "Guia de instalação da plataforma\n\n\n---\n\nApós verificar o pacote de instalação adequado para o servidor e descompactá-lo, é possível iniciar a instalação pelos seguintes arquivos:\n\n- Fluig-Installer-64.exe - Para sistema operacional Windows.\n\n- Fluig-Installer-64.sh - Para sistema operacional Linux.\n\nApós executar o instalador, é possível optar entre instalar ou atualizar a plataforma.\n\n![](..\\..\\images\\instalador.png)\n\nA opção **Instalar** irá executar a instalação a partir do zero, criando todos os arquivos necessários. Mais detalhes sobre esse procedimento podem ser obtidos em:\n\n- [Instalação da plataforma em Windows - Instalador](Guia de instalação da plataforma/Instalação da plataforma em Windows - Instalador.md);\n\n- [Instalação da plataforma no Linux - Instalador](Guia de instalação da plataforma/Instalação da plataforma no Linux - Instalador.md);\n\nImportante!\n\nEm modo caractere, a **instalação** da plataforma pode ser realizada de forma **modularizada**. Este procedimento só pode ser executado a partir da atualização 1.6.1.\n\n**Acesse as documentações abaixo e verifique!**\n\n- [Instalação Windows - Modo Caractere](Guia de instalação da plataforma/Instalação da plataforma em Windows - Instalador/Instalação Windows - Modo Caractere.md);\n\n- [Instalação Linux - Modo Caractere](Guia de instalação da plataforma/Instalação da plataforma no Linux - Instalador/Instalação Linux - Modo Caractere.md).\n\nA opção **Atualizar** é utilizada para atualização da plataforma por meio dos pacotes liberados no [Central do cliente](https://suporte.totvs.com/portal/p/10098/download#000035). Mais detalhes sobre esse procedimento podem ser obtidos no [Guia de atualização](Guia de atualização da plataforma.md).\n\n# Fluig Studio\n\n---\n\nPara instalar o *plugin* Fluig Studio, siga os passos descritos na página [Guia de instalação Fluig Studio](Guia de instalação Fluig Studio.md).\n\n# Ambiente de homologação X ambiente de produção\n\n---\n\nO ambiente de homologação é indicado para que desenvolvimentos sobre a plataforma (criação de processos, formulários, páginas, widgets, etc.) e pacotes de atualização sejam aplicados e testados com segurança.\n\nIsso permite que o impacto e eventuais inconsistências causadas pelos desenvolvimentos e alterações possam ser identificados e analisados pelos desenvolvedores e administradores da empresa antes da liberação no ambiente de produção.\n\nVerifique a documentação [Criando um ambiente de homologação](Criando um ambiente de homologação.md) para informar-se sobre os procedimentos de configuração de um ambiente de homologação.\n\nNota:\n\nAcompanhe, na página [Dimensionamento](../Especificações Técnicas/Dimensionamento.md), as especificações mínimas obrigatórias para um servidor dedicado. Outros produtos, como o [Fluig ESB](https://tdn.totvs.com/pages/viewpage.action?pageId=6066522), também devem ser instalados em um servidor próprio.\n\nImportante!\n\nA instalação de múltiplas instâncias em um único servidor **não é homologado** **para atualizações 1.6 e superiores** do TOTVS Fluig, pois gera concorrência pelos recursos e portas do servidor entre as instâncias, provocando comportamentos inesperados. A partir desta atualização não será fornecido suporte quando identificado este cenário.\n\nNo caso específico do ambiente de homologação, o banco de dados pode estar instalado no mesmo servidor, além de possuir no mínimo 8 GB de RAM. As demais configurações de [dimensionamento](../Especificações Técnicas/Dimensionamento.md) permanecem as mesmas." }, { "metadata": { "title": "Guia de instalação Fluig Studio", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73078179", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação Fluig Studio.md" }, "content": "Guia de instalação Fluig Studio\n\n\n# Índice\n\n- 1 [Instalação da IDE](#GuiadeinstalaçãoFluigStudio-InstalaçãodaIDE)\n- 2 [Instalação do Fluig Studio](#GuiadeinstalaçãoFluigStudio-InstalaçãodoFluigStudio)\n - 2.1 [Pré requisitos](#GuiadeinstalaçãoFluigStudio-Prérequisitos)\n\n# Instalação da IDE\n\n---\n\nPara utilização do plugin de desenvolvimento do Fluig é necessário possuir uma IDE baseada em Eclipse. As IDEs homologadas para trabalhar com o Fluig Studio estão listadas abaixo:\n\n| IDEs Homologadas | Página de download | Requisitos |\n| --- | --- | --- |\n| Eclipse Luna (seleção) | O Eclipse Luna não é compatível com a atualização Voyager 2.0 do Fluig. | Ter instalado o JDK 8 da Oracle: |\n| Eclipse 2019-R9 (seleção) | | Ter instalado o JDK 8 da Oracle: O recurso de Autocompletar, na edição de eventos não funcionará por um problema no JSDT (*JavaScript Development Tools*) da IDE. |\n\n- O plugin de desenvolvimento do Fluig não é compatível com o sistema operacional macOS.\n- Desenvolvedores que utilizam o plugin do Eclipse precisam atualizar para uma versão que execute com **Java 11**.\n\n# Instalação do Fluig Studio\n\n---\n\n## Pré requisitos" }, { "metadata": { "title": "Guia de instalação Fluig Studio", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=73078179", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação Fluig Studio.md" }, "content": "Guia de instalação Fluig Studio\n\n\n- Para a instalar e atualizar o Fluig Studio será necessário acesso à internet na estação em que a IDE está instalada.\n\nCom sua IDE instalada e devidamente configurada restam apenas quatro passos simples que são os mesmos em ambas as IDEs.\n\n- Selecione no menu “Help” a opção “Install New Software”  ou “Ajuda” e a opção “Instalar novo Software” se sua IDE estiver traduzida.\n\n![](..\\..\\images\\1.PNG)\n\n- Adicione um novo “update site” selecionando o botão \"Add\":\n\n![](..\\..\\images\\2.PNG)\n\n- Cadastre o endereço **http://update.fluig.com**, referente a última versão do plugin do Fluig disponível, confirmando os dados conforme figura abaixo:\n\n![](..\\..\\images\\image2014-1-10%20115212.png)\n\nAtenção\n\nPara o TDS 11.2 e o Eclipse em versões anteriores à Mars, é recomendável adicionar também o repositório  [**https://archive.eclipse.org/graphiti/updates/0.11.2/**](https://archive.eclipse.org/graphiti/updates/0.11.2/), referente a versão compatível do Graphiti© com o Fluig Studio.\n\nNota\n\nSe deseja informar a atualização do plugin de uma versão específica, basta informar \"*/*\" após a URL padrão, onde corresponde ao número da versão desejada.\n\n**Exemplo:** Possuo o Fluig 1.2.8 e desejo atualizar o plugin Fluig para a mesma versão do servidor, como já existe uma versão mais atual disponível na URL padrão, basta informar: **http://update.fluig.com/128** .\n\n- Selecione a opção que você acabou de cadastrar no **Passo 3** e confirme a operação.\n\n![](..\\..\\images\\image2014-1-10%20115333.png)\n\nAtenção\n\nPara o correto funcionamento da instalação do Fluig Studio é necessário selecionar o *checkbox* “Contact all update sites during install to find required software”.\n\nNa ocorrência de erros referentes à autenticação no proxy, durante essa etapa, você pode tentar desabilitar o proxy, o firewall e até mesmo o antivírus na máquina onde estiver instalando o plugin, e em seguida prosseguir com a instalação. Sugere-se também fazer um teste de instalação em uma máquina fora da rede para comparar.\n\n- Após o download e reinício da IDE a mesma estará pronta para trabalhar com o Fluig Studio.\n\n**Dica:** Para atualização basta selecionar o update cadastrado com o Fluig Studio conforme ilustrado no passo número 4.\n\nAtenção\n\nNão é recomendado o uso do plugin \"Team Foundation Server plug-in for Eclipse\" (TFS) no mesmo TDS do plugin Fluig.\n\nO plugin Fluig utiliza algumas bibliotecas de terceiros para comunicação com os *webservices* do servidor Fluig. Entre elas, o plugin Apache Xerces (), que é instalado automaticamente e pode ser visualizado em *Sobre > Detalhes da Instalação > Plugins*. A versão atual disponível nos repositórios do Eclipse Luna é a versão 2.9.0.\n\nIdentificamos que o TFS também faz uso do Xerces, porém, na versão 2.8.0. Normalmente isso geraria um erro ou um alerta, na hora da instalação, mas o TFS não o instala diretamente, apenas carrega-o internamente a partir da pasta *plugins/com.microsoft.tfs.core\\_14.0.2.201512281637/libs/xerces-2.8.0*.\n\nPor se tratarem de duas versões diferentes, quando carregado primeiramente o Xerces do TFS, ao tentar utilizar algumas funções do plugin Fluig, o TDS identifica versões diferentes do mesmo arquivo e dispara um erro.\n\nA pasta pode ser removida manualmente para que os dois possam trabalhar juntos, mas o TFS pode não funcionar corretamente.\n\n**Vídeo How to**\n\nSe preferir veja a seguir o vídeo a seguir que ilustra o processo de instalação do Fluig Studio" }, { "metadata": { "title": "Guia de migração da plataforma do Windows para Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1027816803", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de migração da plataforma do Windows para Linux.md" }, "content": "Guia de migração da plataforma do Windows para Linux" }, { "metadata": { "title": "Guia de migração da plataforma do Windows para Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1027816803", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de migração da plataforma do Windows para Linux.md" }, "content": "Guia de migração da plataforma do Windows para Linux\n\n\nFique atento!\n\nEsta página é válida a partir da **atualização 2.0** e **superiores**.\n\n- [Objetivo](#GuiademigraçãodaplataformadoWindowsparaLinux-Objetivo)\n- [Preparação](#GuiademigraçãodaplataformadoWindowsparaLinux-Preparação)\n- [Instalação](#GuiademigraçãodaplataformadoWindowsparaLinux-Instalação)\n - [Ajustes de ambiente](#GuiademigraçãodaplataformadoWindowsparaLinux-Ajustesdeambiente)\n - [Importação das configurações](#GuiademigraçãodaplataformadoWindowsparaLinux-Importaçãodasconfigurações)\n- [Ajustes no standalone.xml](#GuiademigraçãodaplataformadoWindowsparaLinux-Ajustesnostandalone.xml)\n- [Volume com os arquivos](#GuiademigraçãodaplataformadoWindowsparaLinux-Volumecomosarquivos)\n - [Aplicativos customizados](#GuiademigraçãodaplataformadoWindowsparaLinux-Aplicativoscustomizados)\n - [Caminho customizado do volume](#GuiademigraçãodaplataformadoWindowsparaLinux-Caminhocustomizadodovolume)\n- [Banco de dados](#GuiademigraçãodaplataformadoWindowsparaLinux-Bancodedados)\n - [Tabela FDN\\_TENANTDATA](#GuiademigraçãodaplataformadoWindowsparaLinux-TabelaFDN_TENANTDATA)\n - [Tabela FDN\\_PARAMGERAL](#GuiademigraçãodaplataformadoWindowsparaLinux-TabelaFDN_PARAMGERAL)\n - [Tabela FDN\\_VOLUMESITE](#GuiademigraçãodaplataformadoWindowsparaLinux-TabelaFDN_VOLUMESITE)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar os procedimentos recomentados para efetuar uma migração do TOTVS Fluig de um servidor Microsoft Windows para Linux.\n\n# Preparação\n\n---\n\n- Defina previamente as configurações do ambiente para que sejam informados corretamente durante a fase de instalação e posteriores. \n EXEMPLO \n URL pública, servidor SMTP.\n\n- RECOMENDADO: derrube todos os serviços do Fluig antes de começar a migração.\n\n# Instalação\n\n---\n\nAtenção!\n\n- Utilize, para o Linux, uma versão do Fluig igual a versão instalada no Microsoft Windows.\n\n- Durante a execução do instalador, informe nas configurações do banco de dados o mesmo nome do banco sendo utilizado atualmente.\n\n- Apenas execute a instalação, não inicie o Fluig.\n\nRealize uma instalação em Linux seguindo os procedimentos de uma nova instalação conforme documentado em [Instalação da plataforma no Linux - Instalador](Guia de instalação da plataforma/Instalação da plataforma no Linux - Instalador.md).\n\nEm seguida, faça os ajustes necessários na instalação." }, { "metadata": { "title": "Guia de migração da plataforma do Windows para Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1027816803", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de migração da plataforma do Windows para Linux.md" }, "content": "Guia de migração da plataforma do Windows para Linux\n\n## Ajustes de ambiente\n\n---\n\nRealize os ajustes de ambientes necessários – configurações de memória do servidor, por exemplo – no arquivo **appserver/bin/standalone.conf**.\n\n## Importação das configurações" }, { "metadata": { "title": "Guia de migração da plataforma do Windows para Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1027816803", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de migração da plataforma do Windows para Linux.md" }, "content": "Guia de migração da plataforma do Windows para Linux\n\n\n---\n\nSubstitua o arquivo **appserver/standalone/configuration/standalone.xml** por uma cópia do mesmo arquivo encontrado na instalação do servidor Microsoft Windows.\n\n# Ajustes no standalone.xml\n\n---\n\nUma vez que o arquivo **appserver/standalone/configuration/standalone.xml** foi copiado a partir do servidor Windows, estará configurado com informações – nome do servidor, endereço IP do servidor, caminhos da instalação – apontando para o servidor Windows. Será necessário alterar para as configurações do novo servidor. Para isso, abra o arquivo **appserver/standalone/configuration/standalone.xml** em seu editor de texto simples favorito (vi, nano, etc) e faça as seguintes alterações:\n\nAtenção!\n\n- O Microsoft Windows comumente utiliza como separador de pastas o caracter **\"\\\"**, enquanto que o Linux utiliza o caracter **\"/\"**. Portanto, é importante lembrar de, sempre que alterar partes de um caminho, substituir o **\"\\\"** por **\"/\"** em todo o restante do caminho.\n\n- Os exemplos utilizados a seguir usam como base as seguintes informações:\n - Servidor antigo (Windows) → Endereço IP: **192.168.1.100**; hostname: **fluig-windows**; pasta de instalação: **C:\\fluig**.\n - Servidor novo (Linux) → Endereço IP: **192.168.2.50**; hostname: **fluig-linux**; pasta de instalação: **/opt/fluig**.\n\n- Troque o endereço IP do servidor antigo (por exemplo: **192.168.1.100**) para o IP do servidor novo (por exemplo: **192.168.2.50**).\n\nExemplos de configurações comumente encontradas com o endereço IP (mas não limitado a apenas esses e nem sempre todos esses existem):\n\n```\n\n\n\n\n\n\n\n\n\n```\n\n- Troque o hostmane do servidor antigo (por exemplo: **fluig-windows**) para o hostname do servidor novo (por exemplo: **fluig-linux**).\n\nExemplos de configurações comumente encontradas com o hostname (mas não limitado a apenas esses e nem sempre todos esses existem):\n\n```\n\n\n\n\n\n\n\n\n```\n\n- Troque os caminhos do servidor antigo (por exemplo: **c:\\fluig**)  para o caminho do servidor novo (por exemplo: **/opt/fluig**).\n\n Atenção!\n\n - Em servidores Microsoft Windows, o caminho pode aparecer na forma **C:\\fluig**, **C:\\\\fluig** ou ainda **C:/fluig**. É importante procurar pelas três formas.\n - Não esqueça de trocar o \"**\\**\" por \"**/**\".\n\nExemplos de configurações comumente encontradas com o caminho (mas não limitado a apenas esses e nem sempre todos esses existem):\n\n```\n\n\n\n\n\n\n\n\n\n\n```\n\n# Volume com os arquivos\n\n---\n\nUm dos principais motivadores de uma migração de um servidor Microsoft Windows para um servidor Linux, é a falta de confiabilidade do Microsoft Windows como servidor de arquivos. Portanto, é muito importante migrar o volume (arquivos) para um servidor Linux também.\n\nEm ambientes onde haverá apenas um servidor do Fluig, o volume pode ser movido para o mesmo servidor Linux onde o Fluig será instalado, mantendo uma estrutura muito semelhante à instalação no servidor Windows.\n\nMas se o ambiente possuir (ou haver a intenção de possuir) mais de um servidor Fluig, é imprescindível que o volume esteja em algum servidor de arquivos que seja compartilhado (comumente via NFS).\n\nPortanto:\n\n- faça a cópia dos arquivos do volume atual (Windows) para o volume novo (Linux);\n\n- monte um caminho (por exemplo: **/opt/volume**) apontando para o compartilhamento, em caso de uso de um servidor de arquivos dedicado." }, { "metadata": { "title": "Guia de migração da plataforma do Windows para Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1027816803", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de migração da plataforma do Windows para Linux.md" }, "content": "Guia de migração da plataforma do Windows para Linux\n\n## Aplicativos customizados\n\n---\n\nSe possuir aplicativos não padrão, sejam desenvolvidos por equipes internas, por terceiros ou mesmo baixado na *Store* oficial do Fluig, esses estarão na pasta própria.\n\nEm uma instalação padrão, encontram-se na pasta \"**appserver/apps**\".\n\nEsses aplicativos precisam ser disponibilizados manualmente para a nova instalação.\n\nEm uma instalação padrão, com um único servidor Fluig, basta copiar o conteúdo da pasta *apps* do servidor atual (por exemplo: **C:\\fluig\\appserver\\apps**) para a pasta *apps* do novo servidor (por exemplo: **/opt/fluig/appserver/apps**).\n\nJá em uma instalação em que a pasta *apps* não esteja no local padrão, é necessário:\n\n- copiar os aplicativos para uma localização acessível ao Fluig no novo servidor. Por exemplo, em um ambiente com um servidor de arquivos dedicado, poderia estar na pasta \"**/opt/volume/apps**\";\n\n- ajustar a configuração que indica o caminho. Para isso, edite o arquivo **appserver/standalone/configuration.xml**, procure por algo como:\n\n ```\n \n ```\n\n e substitua por algo como:\n\n ```\n \n ```\n\n## Caminho customizado do volume" }, { "metadata": { "title": "Guia de migração da plataforma do Windows para Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1027816803", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de migração da plataforma do Windows para Linux.md" }, "content": "Guia de migração da plataforma do Windows para Linux\n\n\n---\n\nSe o volume está em um local diferente do local padrão da instalação (**FLUIG\\_DIR/repository**), é preciso configurar esse caminho.\n\nPara isso, edite o arquivo **appserver/standalone/configuration.xml**, procure pela propriedade **java:global/wcm/globalDataDir**.\n\nSerá encontrado algo como:\n\n```\n\n```\n\nAjuste para algo como:\n\n```\n\n```\n\nNota:\n\nÉ importante manter sufixo \"**/wcmdir**\".\n\n# Banco de dados\n\n---\n\nO caminho da instalação também é salvo em alguns registros de algumas tabelas e, portanto, precisam ser ajustados também.\n\nPara isso, conecte no banco de dados com algum cliente dele e execute alguns *updates*.\n\n## Tabela FDN\\_TENANTDATA" }, { "metadata": { "title": "Guia de migração da plataforma do Windows para Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1027816803", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de migração da plataforma do Windows para Linux.md" }, "content": "Guia de migração da plataforma do Windows para Linux\n\n\n---\n\nEncontre os registros que precisam ser alterados na empresa \"**0**\" (dados globais), com um comando como este (a sintaxe está para o banco MySQL, é necessário ajustar de acordo com o banco):\n\n```\nselect * from fdn_tenantdata where data_key in ('dirUpload', 'dirDefault', 'dirCustom') and tenant_id = 0 order by tenantdata_id;\n```\n\nRetornará algo semelhante a isso:\n\n![](..\\..\\images\\image-2025-12-29_14-51-18.png)\n\nAtualize os registros usando comandos semelhantes a esses:\n\n```\nupdate fdn_tenantdata set data_value = '/opt/volume/wcmdir/wcm/tenants/wcm' where tenant_id = 0 and data_key = 'dirDefault';\nupdate fdn_tenantdata set data_value = '/opt/volume/wcmlocaldir/wcm/upload' where tenant_id = 0 and data_key = 'dirUpload';\nupdate fdn_tenantdata set data_value = '/opt/volume/wcmlocaldir/wcm/custom' where tenant_id = 0 and data_key = 'dirCustom';\n```\n\nConsulte os registros alterados para conferência:\n\n```\nselect * from fdn_tenantdata where data_key in ('dirUpload', 'dirDefault', 'dirCustom') and tenant_id = 0 order by tenantdata_id;\n```\n\nRetornará algo semelhante a isso:\n\n![](..\\..\\images\\image-2025-12-29_14-58-57.png)\n\nA seguir, encontre os registros que precisam ser alterados na(s) empresa(s) criada(s), com um comando como esse:\n\n```\nselect * from fdn_tenantdata where data_key in ('dirUpload', 'dirDefault', 'dirCustom', 'dirUploadConnect') and tenant_id > 0 order by tenantdata_id;\n```\n\nRetornará algo semelhante a isso:\n\n![](..\\..\\images\\image-2025-12-29_15-10-28.png)\n\nAtualize os registros usando comandos semelhantes a esses:\n\n```\nupdate fdn_tenantdata set data_value = '/opt/volume/1' where data_key = 'dirDefault' and tenant_id = 1234;\nupdate fdn_tenantdata set data_value = '/opt/volume/1/upload' where data_key = 'dirUpload' and tenant_id = 1234;\nupdate fdn_tenantdata set data_value = '/opt/volume/1/uploadConnect' where data_key = 'dirUploadConnect' and tenant_id = 1234;\nupdate fdn_tenantdata set data_value = '/opt/volume/1/custom' where data_key = 'dirCustom' and tenant_id = 1234;\n```\n\nConsulte os registros alterados para conferência:\n\n```\nselect * from fdn_tenantdata where data_key in ('dirUpload', 'dirDefault', 'dirCustom') and tenant_id = 0 order by tenantdata_id;\n```\n\nRetornará algo semelhante a isso:\n\n![](..\\..\\images\\image-2025-12-29_15-19-19.png)\n\nNota:\n\nO exemplo acima pressupõe que há apenas uma empresa criada, com o TENANT\\_ID=1234. Se houver mais empresas, é preciso repetir os procedimentos para cada uma delas, tomando o cuidado de informar o caminho correto para o volume de cada uma.\n\nPor segurança, é interessante verificar se existe (e consequentemente corrigir) mais algum registro apontando para o caminho antigo. Por exemplo, com um comando como esse:\n\n```\nselect * from fdn_tenantdata where data_key like 'C:%';\n```" }, { "metadata": { "title": "Guia de migração da plataforma do Windows para Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1027816803", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de migração da plataforma do Windows para Linux.md" }, "content": "Guia de migração da plataforma do Windows para Linux\n\n## Tabela FDN\\_PARAMGERAL\n\n---\n\nEncontre os registros que precisam ser alterados com um comando como este (a sintaxe está para o banco MySQL, é necessário ajustar de acordo com o banco).\n\n### Analytics\n\n---\n\nEncontre e corrija o caminho onde são salvos os dados do Analytics:\n\n```\nselect * from fdn_paramgeral where data_key = 'analytics.resources.folder';\n```\n\n![](..\\..\\images\\image-2025-12-29_15-35-51.png)\n\n```\nupdate fdn_paramgeral set data_value = '/opt/volume/analytics/resources' where data_key = 'analytics.resources.folder';\n\nselect * from fdn_paramgeral where data_key = 'analytics.resources.folder';\n```\n\n![](..\\..\\images\\image-2025-12-29_15-37-58.png)\n\n### Solr\n\n---\n\nEncontre e corrija o caminho da instalação do Solr:\n\n```\nselect * from fdn_paramgeral where data_key = 'totvs/solrHome';\n```\n\n![](..\\..\\images\\image-2025-12-29_15-42-9.png)\n\n```\nupdate fdn_paramgeral set data_value = '/opt/fluig/solr' where data_key = 'totvs/solrHome';\n\nselect * from fdn_paramgeral where data_key = 'totvs/solrHome';\n```\n\n![](..\\..\\images\\image-2025-12-29_15-43-53.png)\n\n### Outras propriedades" }, { "metadata": { "title": "Guia de migração da plataforma do Windows para Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1027816803", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de migração da plataforma do Windows para Linux.md" }, "content": "Guia de migração da plataforma do Windows para Linux\n\n\n---\n\nEncontre e corrija o caminho em outras propriedades:\n\n```\nselect * from fdn_paramgeral where data_key in ('fluig/themeFormDir', 'webdesk/OOoDir', 'wcm/icons', 'fluig/thumbnailDir');\n```\n\n![](..\\..\\images\\image-2025-12-29_15-46-47.png)\n\n```\nupdate fdn_paramgeral set data_value = '/opt/fluig/temaFormulario' where data_key = 'fluig/themeFormDir';\nupdate fdn_paramgeral set data_value = '/opt/fluig/OpenOffice' where data_key = 'webdesk/OOoDir';\nupdate fdn_paramgeral set data_value = '/opt/fluig/icon' where data_key = 'wcm/icons';\nupdate fdn_paramgeral set data_value = '/opt/fluig/thumbnail' where data_key = 'fluig/thumbnailDir';\n\nselect * from fdn_paramgeral where data_key in ('fluig/themeFormDir', 'webdesk/OOoDir', 'wcm/icons', 'fluig/thumbnailDir');\n```\n\n![](..\\..\\images\\image-2025-12-29_15-50-18.png)\n\nPor segurança, é interessante verificar se existe (e consequentemente corrigir) mais algum registro apontando para o caminho antigo. Por exemplo, com um comando como esse:\n\n```\nselect * from fdn_paramgeral where data_key like 'C:%';\n```\n\n## Tabela FDN\\_VOLUMESITE" }, { "metadata": { "title": "Guia de migração da plataforma do Windows para Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=1027816803", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de migração da plataforma do Windows para Linux.md" }, "content": "Guia de migração da plataforma do Windows para Linux\n\n\n---\n\nEncontre os registros que precisam ser alterados com um comando como este (a sintaxe está para o banco MySQL, é necessário ajustar de acordo com o banco):\n\n```\nselect * from fdn_volumesite;\n```\n\nRetornará algo semelhante a isso:\n\n![](..\\..\\images\\image-2025-12-29_9-43-25.png)\n\nImportante observar a coluna **VOLUMESITE\\_ID**, pois ela contém a chave dos registros que precisam ser alterados.\n\nAtualize os registros usando comandos semelhantes a esses:\n\n```\nupdate fdn_volumesite set storage = '/opt/volume/1' where volumesite_id = 1;\n```\n\nConsulte os registros alterados para conferência:\n\n```\nselect * from fdn_volumesite;\n```\n\nRetornará algo semelhante a isso:\n\n![](..\\..\\images\\image-2025-12-29_15-57-52.png)\n\nImportante!\n\nAs tabelas tratadas aqui são as tabelas padrão e registros padrão. Se possuir tabelas e/ou registros customizados que apontam para o volume, será necessário ajustar manualmente." }, { "metadata": { "title": "Migração de palavras chave do ECM para a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=192089748", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Migração de palavras chave do ECM para a plataforma.md" }, "content": "Migração de palavras chave do ECM para a plataforma" }, { "metadata": { "title": "Migração de palavras chave do ECM para a plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=192089748", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Migração de palavras chave do ECM para a plataforma.md" }, "content": "Migração de palavras chave do ECM para a plataforma\n\n\n# Índice\n\n- [Índice](#MigraçãodepalavraschavedoECMparaaplataforma-Índice)\n- [Objetivo](#MigraçãodepalavraschavedoECMparaaplataforma-Objetivo)\n- [Procedimento de Migração e Conversão de Dados](#MigraçãodepalavraschavedoECMparaaplataforma-ProcedimentodeMigraçãoeConversãodeDados)\n- [Utilização do Aplicativo de conversão](#MigraçãodepalavraschavedoECMparaaplataforma-UtilizaçãodoAplicativodeconversão)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é indicar um método de migração das palavras chave dos documentos de uma base do **TOTVS | ECM** para uma base convertida para o **TOTVS Fluig Plataforma**. Estas palavras chave serão inseridas no Fluig como 'Comentário adicional' no documento.\n\n# Procedimento de Migração e Conversão de Dados\n\n---\n\nAtenção\n\nEsta operação deve ocorrer depois da conversão de uma base **TOTVS | ECM** para a plataforma. Uma cópia da base do **TOTVS |** **ECM** antes da conversão deve ser mantida como *backup.*\n\nAcompanhe a seguir o check-list para a migração das palavras chave do **TOTVS | ECM**.\n\n1. Possuir uma cópia da base do **TOTVS | ECM**antes da conversão para o **Fluig**.\n2. Ter realizado a conversão de acordo com esta documentação: [Conversão TOTVS ECM para a plataforma TOTVS Fluig](http://tdn.totvs.com/x/qANbDw).\n3. Realizar uma cópia da base convertida para realizar testes na base antes de realizar a migração das palavras chave*.*\n\n# Utilização do Aplicativo de conversão\n\n---\n\n\n\n**Passo 1: Download do aplicativo que realizará a conversão**\n\nSe você ainda não possui o aplicativo que realiza a conversão faça o download aqui: [ConvertKeywordsFromEcmToFluig.zip](https://tdn.totvs.com/download/attachments/192089748/ConvertKeywordsEcmToFluig.zip?version=1&modificationDate=1490615734000&api=v2)\n\n**Passo 2: Execução do aplicativo**\n\nApós o download do aplicativo, extraia seu conteúdo para uma pasta e execute o arquivo: **ConvertKeywordsEcmToFluig.jar.**\n\n![](..\\..\\images\\screen-convert-keywords.JPG)\n\n**Passo 3: Dados das bases de dados**\n\nNo aplicativo é necessário inserir os dados da base do **TOTVS | ECM** e da base convertida do**Fluig,** de preferência realizar a conversão com as bases de cópia para evitar acidentes, conforme o exemplo na imagem a seguir:\n\n![](..\\..\\images\\screen-convert-keywords-2.JPG)\n\n**Passo 4: Execução da Conversão**\n\nApós a inserção dos dados das bases de dados, o programa avisará que este processo pode levar alguns minutos, dependendo do tamanho de sua base, só feche o programa após a notificação no log de que a conversão foi executada com sucesso. Caso ocorra algum erro ao conectar em alguma das bases de dados o aplicativo irá notificar.\n\nApós a conversão realizada com sucesso o *log* ficará como a imagem a seguir:\n\n![](..\\..\\images\\screen-convert-keywords-3.JPG)" }, { "metadata": { "title": "Modo demonstração", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=224106571", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Modo demonstração.md" }, "content": "Modo demonstração\n\n\n# Índice\n\n- 1 [Objetivo](#Mododemonstração-Objetivo)\n- 2 [Modo demonstração](#Mododemonstração-Mododemonstração)\n - 2.1 [Recursos do modo demonstração](#Mododemonstração-Recursosdomododemonstração)\n- 3 [Solicitação de licença](#Mododemonstração-Solicitaçãodelicença)\n- 4 [Configuração do servidor de licenças na plataforma](#Mododemonstração-Configuraçãodoservidordelicençasnaplataforma)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar o modo de demonstração do TOTVS Fluig Plataforma e os passos para a ativação da licença.\n\n# Modo demonstração\n\n---\n\nO modo de demonstração é ativado a partir do momento que a instalação foi efetivada e não foi configurado uma licença válida para a plataforma.\n\n ![](..\\..\\images\\image-2024-6-28_15-53-47.png) \n\n### Recursos do modo demonstração" }, { "metadata": { "title": "Modo demonstração", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=224106571", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Modo demonstração.md" }, "content": "Modo demonstração\n\n\n---\n\nAo utilizar o modo de demonstração todos os recursos da plataforma poderão ser acessados, porém só estará disponível para **um usuário ativo**. Não sendo permitida a utilização simultânea por mais usuários.\n\n# Solicitação de licença\n\n---\n\nPara a solicitação de licença, veja os detalhes na página [Servidor de licença (License server)](http://tdn.totvs.com/x/WgmDC).\n\n# Configuração do servidor de licenças na plataforma\n\n---\n\nApós solicitar as licenças e configurar o servidor de licenças é necessário configurar a plataforma para consumi-las.\n\nAutentique-se na plataforma com o usuário **wcmadmin** e acesse:**Painel de Controle** → agrupador **WCM** → **Configurações do Sistema** → aba **Parâmetros da Plataforma**:\n\nLocalize as opções da seção **Servidor de Licença.**Verifique se o indicativo ***ON*** está sendo apresentado em **Habilitar License Server**. Caso o indicativo apresentado for OFF, este recurso está desabilitado.\n\nPara mais detalhes, confira o help [Plataforma ❙ Configurações do sistema](https://tdn.totvs.com/pages/viewpage.action?pageId=235597328).\n\nImportante!\n\nPara clientes que ainda não possuem a plataforma e querem uma prévia de integrações com o [TIdentity](#), basta [abrir um ticket](http://suporte.fluig.com) no suporte informando a necessidade de criação de uma empresa de demonstração no ambiente de homologação (customerfi.com) do Identity. O nome da empresa e domínio terão, obrigatoriamente, em sua inicial a palavra Demo, conforme o exemplo a seguir:\n\n- Nome da empresa : Demo + Nome da empresa. Ex: Demo Company Fluig.\n- Domínio: demo + nome da empresa. Ex: democompanyfluig.customerfi.com." }, { "metadata": { "title": "Recriar Serviços do Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=285662306", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Recriar Serviços do Fluig.md" }, "content": "Recriar Serviços do Fluig" }, { "metadata": { "title": "Recriar Serviços do Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=285662306", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Recriar Serviços do Fluig.md" }, "content": "Recriar Serviços do Fluig\n\n\nAtenção!\n\nEsta página foi revisada para considerar as novas configurações do Fluig para a atualização 1.6.x.\n\nCaso possua uma atualização anterior, acesse: [Como recriar os serviços do Fluig na versão 1.5.13 e anteriores?](https://tdn.totvs.com/pages/viewpage.action?pageId=198954857)\n\n# Índice\n\n- 1 [Objetivo](#RecriarServiçosdoFluig-Objetivo)\n- 2 [Localização dos arquivos](#RecriarServiçosdoFluig-Localizaçãodosarquivos)\n- 3 [Criar serviços](#RecriarServiçosdoFluig-Criarserviços)\n- 4 [Recriar](#RecriarServiçosdoFluig-Recriar)\n- 5 [Renomear](#RecriarServiçosdoFluig-Renomear)\n- 6 [Serviço de Cache (memCached)](#RecriarServiçosdoFluig-ServiçodeCache(memCached))\n\n# Objetivo\n\n---\n\nO objetivo deste guia é informar os passos para criar, desinstalar, recriar e renomear os serviços do Fluig, sendo eles: memCached, fluig\\_Indexer, fluig\\_RealTime e fluig.\n\n# Localização dos arquivos\n\n---\n\nPara cada tipo de serviço existe um arquivo correspondente que deve ser executado.\n\nAtenção!\n\nEm uma instalação padrão do Fluig 1.6.1, os serviços de RealTime e Servidor de Indexação são instalados juntamente com o servidor de aplicação no mesmo diretório. Caso a instalação seja em módulos, será necessário informar seus respectivos diretórios.\n\n| Serviço | Executável | Localização |\n| --- | --- | --- |\n| fluig | service.bat | [Instalação fluig]/appserver/bin/service |\n| fluig\\_RealTime | nodeSetup.bat | Raíz da pasta de instalação do Fluig |\n| fluig\\_Indexer | solrSetup.bat | Raíz da pasta de instalação do Fluig |\n\n# Criar serviços\n\n---\n\nNavegue nos passos abaixo para conhecer os procedimentos de criação dos serviços do Fluig:\n\n**1)** Abra o prompt de comando e acesse a [pasta correspondente](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) ao serviço que deseja criar:\n\n```\ncd [Instalação fluig]\\appserver\\bin\\service\n```\n\n**2)** Para criar o serviço, digite:\n\n```\nservice.bat install\n```\n\n**1)** Acesse o prompt de comando e acesse a [pasta correspondente](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) ao serviço que deseja criar:\n\n```\ncd [Instalação fluig]\n```\n\n**2)** Para criar o serviço, digite:\n\n```\nnodeSetup.bat install\n```\n\n**1)** Acesse o prompt de comando e acesse a [pasta correspondente](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) ao serviço que deseja criar:\n\n```\ncd [Instalação fluig]\n```\n\n**2)** Para criar o serviço, digite:\n\n```\nsolrSetup.bat install\n```\n\nAtenção\n\nPara recriar os serviços em **servidor Linux**, o caminho das pastas são os mesmos, basta apenas substituir o **.bat** por **.sh** nos comandos.\n\nDesinstalar\n\n---\n\nSiga os passos abaixo para desinstalar os serviços do Fluig:\n\n**1)** Abra o prompt de comando e acesse a [pasta correspondente](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) ao serviço que deseja desinstalar:\n\n```\ncd [Instalacao fluig]\\appserver\\bin\\service\n```\n\n**2)** Para desinstalar o serviço, digite:\n\n```\nservice.bat uninstall\n```\n\n**1)** Acesse o prompt de comando e acesse a [pasta correspondente](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) ao serviço que deseja desinstalar:\n\n```\ncd [Instalação fluig]\n```\n\n**2)** Para desinstalar o serviço, digite:\n\n```\nnodeSetup.bat uninstall\n```\n\n**1)** Acesse o prompt de comando e acesse a [pasta correspondente](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) ao serviço que deseja desinstalar:\n\n```\ncd [Instalação fluig]\n```\n\n**2)** Para desinstalar o serviço, digite:\n\n```\nsolrSetup.bat uninstall\n```\n\n# Recriar\n\n---\n\nNavegue nos passos abaixo para conhecer os procedimentos de recriar os serviços do Fluig:\n\n1. Abra o Prompt de Comandos ou Console e [localize a pasta](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) correspondente do serviço Fluig;\n2. Execute o comando para [Desinstalar o Serviço Fluig](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306);\n3. Execute o comando para [Criar o serviço Fluig](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306);\n\n1. Abra o Prompt de Comandos ou Console e [localize a pasta](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) correspondente do serviço RealTime;\n2. Execute o comando para [Desinstalar o Serviço do fluig\\_RealTime](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) (nodejs);\n3. Execute o comando para [Criar o serviço fluig\\_RealTime](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306);\n\n1. Abra o Prompt de Comandos ou Console e [localize a pasta](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) correspondente do serviço do Servidor de Indexação;\n2. Execute o comando para [Desinstalar o Serviço do fluig\\_Indexer](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) (solr);\n3. Execute o comando para [Criar o serviço fluig\\_Indexer](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306);\n\n**oculto**\n\nO conteúdo desse passo foi repassado ao artigo:  (Como recriar os serviços)\n\nLembrar de atualizar esse artigo caso tenha alguma alteração!\n\n# Renomear\n\n---\n\nSiga os passos abaixo para renomear os serviços do Fluig:\n\n1. Abra o Prompt de Comandos ou Console e [localize a pasta](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) correspondente do serviço Fluig;\n\n2. Execute o comando para [Desinstalar o Serviço Fluig](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306);\n\n3. Edite o arquivo **service.bat** localizado em [Instalação fluig]/appserver/bin/service;\n\n4. Procure pelo trecho de configuração abaixo e altere o nome dos serviços nas variáveis SHORTNAME, DISPLAYNAME e DESCRIPTION:\n\n```\nset SHORTNAME=fluig2\nset DISPLAYNAME=\"fluig2\"\nset DESCRIPTION=\"fluig Application Server\"\n```\n\n5. Em seguida, salve o arquivo.\n\n6. Execute o comando para [Criar o serviço Fluig](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306);\n\n1. Abra o Prompt de Comandos ou Console e [localize a pasta](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) correspondente do serviço RealTime;\n\n2. Execute o comando para [Desinstalar o Serviço do fluig\\_RealTime](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) (nodejs);\n\n3. Acesse o diretório da nova instalação **[Instalação fluig]** e localize o arquivo “**nodeSetup.bat**” para editá-lo.\n\n4. Procure pelo trecho de configuração abaixo e altere o nome dos serviços nas variáveis SVCNAME, SVCDISP e SVCDESC:\n\n```\nset SVCNAME=fluig_RealTime2\nset SVCDISP=fluig_RealTime2\nset SVCDESC=fluig Realtime2\n```\n\n5. Em seguida, salve o arquivo.\n\n6. Execute o comando para [Criar o serviço fluig\\_RealTime](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306);\n\n1. Abra o Prompt de Comandos ou Console e [localize a pasta](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) correspondente do serviço do Servidor de Indexação;\n\n2. Execute o comando para [Desinstalar o Serviço do fluig\\_Indexer](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306) (solr);\n\n3. Acesse o diretório da nova instalação **[Instalação fluig]** e localize o arquivo “**solrSetup.bat**” para editá-lo.\n\n4. Procure pelo trecho de configuração abaixo e altere o nome dos serviços nas variáveis SVCNAME, SVCDISP e SVCDESC:\n\n```\nset SVCNAME=fluig_Indexer2\nset SVCDISP=fluig_Indexer2\nset SVCDESC=fluig_Indexer2\n```\n\n5. Em seguida, salve o arquivo.\n\n6. Execute o comando para [Criar o serviço fluig\\_Indexer](https://tdn.totvs.com/pages/viewpage.action?pageId=285662306);\n\n# Serviço de Cache (memCached)\n\n---\n\nA partir da atualização 1.6.2, não é necessário configurar o serviço de memCached.\n\nAtenção!\n\nCaso possua a atualização 1.6.0 ou 1.6.1, acesse: [Como recriar o serviço MemCached nas atualizações 1.6.0 ou 1.6.1?](https://tdn.totvs.com/pages/viewpage.action?pageId=377324514)\n\nCaso possua uma atualização anterior a 1.6.0, acesse: [Como recriar os serviços do Fluig na versão 1.5.13 e anteriores?](https://tdn.totvs.com/pages/viewpage.action?pageId=198954857)" }, { "metadata": { "title": "Visão geral qualidade da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244738194", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Visão geral qualidade da plataforma.md" }, "content": "Visão geral qualidade da plataforma\n\n\n# Índice\n\n- 1 [Introdução](#Visãogeralqualidadedaplataforma-Introdução)\n- 2 [Processo de Inovação](#Visãogeralqualidadedaplataforma-ProcessodeInovação)\n - 2.1 [Teste de unidade](#Visãogeralqualidadedaplataforma-Testedeunidade)\n - 2.2 [Teste integrado](#Visãogeralqualidadedaplataforma-Testeintegrado)\n - 2.3 [Quality Inovação](#Visãogeralqualidadedaplataforma-QualityInovação)\n- 3 [Processo de Manutenção](#Visãogeralqualidadedaplataforma-ProcessodeManutenção)\n - 3.1 [Teste integrado:](#Visãogeralqualidadedaplataforma-Testeintegrado:)\n - 3.2 [Quality Manutenção:](#Visãogeralqualidadedaplataforma-QualityManutenção:)\n- 4 [Resumo Tipos de Testes e Responsabilidades](#Visãogeralqualidadedaplataforma-ResumoTiposdeTesteseResponsabilidades)\n- 5 [Testes Automatizados e Integração Contínua](#Visãogeralqualidadedaplataforma-TestesAutomatizadoseIntegraçãoContínua)\n\n# Introdução\n\n---\n\nEsta página tem o objetivo de descrever de forma geral o processo de qualidade do TOTVS Fluig Plataforma, mostrando os níveis de testes que são executados nos processos de Inovação e Manutenção do produto.\n\nAbaixo está ilustrado o fluxograma de desenvolvimento e níveis de teste que são executados em cada atualização da plataforma.\n\n![](..\\..\\images\\image2016-8-16%2010921.png)\n\n**Legenda de cores:**\n\n![](..\\..\\images\\image2016-8-16%2010951.png)![](..\\..\\images\\image2016-8-16%2010957.png)\n\n# Processo de Inovação\n\n---\n\nNa inovação são implementadas as novidades no produto, ou seja, são desenvolvidos novos recursos funcionais. Após o desenvolvimento de uma novidade ser finalizado, esta é submetida aos seguintes níveis de testes:\n\n## Teste de unidade" }, { "metadata": { "title": "Visão geral qualidade da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244738194", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Visão geral qualidade da plataforma.md" }, "content": "Visão geral qualidade da plataforma\n\n\n- Primeiro nível de auditoria funcional realizada em cada novidade.\n- É realizado por um desenvolvedor par dentro da equipe.\n- Verifica se os critérios de aceitação (casos de teste) especificados nas novidades foram atendidos.\n- Se o teste for aprovado, a novidade é enviada para o teste integrado. Caso contrário é gerado um retrabalho.\n\n## Teste integrado\n\n- Segundo nível de auditoria funcional realizada em cada novidade.\n- Executado pelo time SQA (*Software Quality Assurance*) em ambiente específico e adequado para este nível de teste, sendo que neste ambiente estão integradas todas as demais novidades que foram implementadas.\n- Novamente são verificados se todos os critérios de aceitação foram atendidos, mas com a visão sistêmica do SQA.\n- Se o teste for aprovado, a novidade fica aguardando o término das demais novidades planejadas para a atualização da plataforma, sendo represada para o próximo nível de teste, “*Quality* de Inovação”.\n- Se for reprovado, é gerado retrabalho e passará novamente pelo teste de unidade e teste integrado.\n\n## *Quality* Inovação" }, { "metadata": { "title": "Visão geral qualidade da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244738194", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Visão geral qualidade da plataforma.md" }, "content": "Visão geral qualidade da plataforma\n\n\n- Terceiro nível de testes que é realizado após o término de todas as novidades de uma atualização.\n- SQAs executam todos os casos de teste que geraram impacto no produto, de acordo com as novidades que foram implementadas.\n- Caso sejam identificadas não-conformidades são abertos chamados internos de *bugs*, os quais devem ser corrigidos para liberação da atualização.\n\nObservação\n\nCaso determinada novidade não esteja pronta e devidamente testada e aprovada, a mesma não é liberada para a atualização corrente, sendo transferida para a próxima atualização.\n\n# Processo de Manutenção\n\n---\n\nParalelamente ao processo de Inovação, na Manutenção ocorrem as correções dos chamados de *bugs* que foram devidamente priorizados para correção e que serão liberados na atualização corrente da plataforma.\n\nApós finalizar o ajuste (correção) de um *bug*, este é submetido aos seguintes níveis de testes:\n\n## Teste integrado:\n\n- Após a correção de cada *bug* é realizado o teste integrado, ou seja, a auditoria funcional.\n- É executado por SQA em ambiente específico e adequado para este nível de teste, sendo que este ambiente contém todas as demais correções de *bugs* já efetuadas.\n- Se o teste for aprovado, a correção fica aguardando o término das demais correções planejadas para a atualização, sendo represada para o próximo nível de testes: *Quality* de Manutenção.\n- Se for reprovado, é gerado retrabalho e passará novamente pelo teste integrado.\n\n## *Quality* Manutenção:" }, { "metadata": { "title": "Visão geral qualidade da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244738194", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Visão geral qualidade da plataforma.md" }, "content": "Visão geral qualidade da plataforma\n\n\n- Última e mais importante bateria de testes realizada para liberação da atualização.\n- Antes desta bateria de testes ser iniciada, ocorre a unificação de todas as novidades já testadas pela fase \"*Quality* de Inovação\" com os todos os *bugs* que foram corrigidos e testados, formando a atualização \"candidata\" que será liberada.\n- Nesta versão unificada é executada uma bateria de testes contendo todos os casos de teste essenciais(\\*) do produto em outro ambiente específico para este processo.\n- Caso sejam identificadas não-conformidades nesta bateria de testes são abertos chamados internos para correção dos *bugs*. Estes *bugs* devem ser corrigidos para a liberação da atualização.\n\nObservação\n\n\\* Cenários “essenciais” são casos de testes definidos como extremamente críticos para utilização do produto. Temos mais de 900 cenários de testes.\n\nCada novidade realizada no produto gera novos cenários de testes, sendo que alguns deles obrigatoriamente são definidos como “essenciais”, incrementando a bateria de testes do *Quality* Manutenção.\n\n# Resumo Tipos de Testes e Responsabilidades\n\n---\n\n![](..\\..\\images\\niveis-teste.png)\n\n# Testes Automatizados e Integração Contínua\n\n---\n\nComplementando os níveis de testes citados anteriormente, utilizamos o Bamboo como *software* de integração contínua.\n\nO Bamboo possui vários planos de compilação dos ambientes de Manutenção e Inovação, alertando as equipes responsáveis caso ocorra algum erro de compilação do produto.\n\nAlém de compilar o produto várias vezes por dia, o Bamboo também executa a bateria de testes automatizados. Seguem abaixo alguns detalhes destes testes:\n\n- A bateria de testes automatizados possui mais de 1000 testes. Esta bateria é executada 1 vez por dia para cada um dos três bancos homologados: MySQL, SQL Server e Oracle.\n\n- Em caso de falha (ou \"quebra\") de algum cenário de teste automatizado, a causa deve ser investigada e corrigida com urgência.\n\n- A atualização não é liberada para clientes caso ocorra alguma quebra de teste automatizado. \n \n ![](..\\..\\images\\image2016-8-16%20101529.png)\n\n**Trecho do *dashboard* de acompanhamento de execução de testes automatizados**" }, { "metadata": { "title": "Métodos de contorno de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=817650828", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Métodos de contorno de lentidão na plataforma.md" }, "content": "Métodos de contorno de lentidão na plataforma" }, { "metadata": { "title": "Métodos de contorno de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=817650828", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Métodos de contorno de lentidão na plataforma.md" }, "content": "Métodos de contorno de lentidão na plataforma\n\n\nFique atento!\n\nEsta página é válida a partir da atualização **Voyager (2.0)** do TOTVS Fluig.\n\nSe você utiliza uma atualização anterior, acesse [Métodos de contorno de lentidão da plataforma da atualização **1.6 até 1.8.2**](https://tdn.totvs.com/pages/viewpage.action?pageId=941662164).\n\n- [Objetivo](#Métodosdecontornodelentidãonaplataforma-Objetivo)\n- [Pré-requisitos](#Métodosdecontornodelentidãonaplataforma-Pré-requisitos)\n- [Limpeza de arquivos temporários e pastas keys](#Métodosdecontornodelentidãonaplataforma-Limpezadearquivostemporáriosepastaskeys)\n- [Utilização do Agendador de tarefas](#Métodosdecontornodelentidãonaplataforma-UtilizaçãodoAgendadordetarefas)\n- [Datasets utilizando datasources nativos do Fluig](#Métodosdecontornodelentidãonaplataforma-DatasetsutilizandodatasourcesnativosdoFluig)\n - [O que o resultado das consultas dizem?](#Métodosdecontornodelentidãonaplataforma-Oqueoresultadodasconsultasdizem?)\n- [Arquivos de instalação relacionados à lentidão](#Métodosdecontornodelentidãonaplataforma-Arquivosdeinstalaçãorelacionadosàlentidão)\n - [server.log](#Métodosdecontornodelentidãonaplataforma-server.log)\n - [standalone.xml](#Métodosdecontornodelentidãonaplataforma-standalone.xml)\n - [standalone.conf (Linux)](#Métodosdecontornodelentidãonaplataforma-standalone.conf(Linux))\n - [standalone.conf.bat (Windows)](#Métodosdecontornodelentidãonaplataforma-standalone.conf.bat(Windows))\n- [Outros interferentes no desempenho da plataforma](#Métodosdecontornodelentidãonaplataforma-Outrosinterferentesnodesempenhodaplataforma)\n\n# Objetivo\n\n---\n\nProblemas de lentidão no TOTVS Fluig podem acontecer por diversos motivos, por isso, reunimos alguns métodos e ações que podem auxiliar o administrador do ambiente a reduzir ou sanar a lentidão.\n\nPlataforma TOTVS Fluig em Cloud\n\nClientes Cloud precisam entrar em contato com o time de Cloud para que os procedimentos sejam realizados.\n\n# Pré-requisitos\n\n---\n\n- Servidores respeitando o [Modelo de dimensionamento](../../Especificações Técnicas/Dimensionamento/Modelo de dimensionamento.md).\n- Plataforma de acordo com os padrões da [Matriz de portabilidade](../../Especificações Técnicas/Matriz de Portabilidade.md).\n- Ambiente em conformidade com os ciclos de [Atualização da plataforma](../../Sobre a plataforma/Atualização da plataforma.md).\n- Conferir outras [Especificações técnicas](../../Especificações Técnicas.md) necessárias.\n- Conhecimento prévio referente às documentações [Avaliação de lentidão na plataforma](../Avaliação de lentidão na plataforma.md) e [Performance e análise do servidor](Performance e análise do servidor.md).\n\n# Limpeza de arquivos temporários e pastas *keys*\n\n---\n\nRealizar a limpeza dos arquivos temporários e pastas *keys*, conforme o passo a passo abaixo:\n\n**01.** Parar a execução dos serviços do Fluig: (1) fluig, (2) fluig\\_Indexer e (3) fluig\\_RealTime.\n\n**02.** Acessar o diretório: <**diretório de instalação do Fluig>\\appserver\\standalone**.\n\n**03.** Eliminar as pastas: **data, log, servers** e **tmp**.\n\nAtenção!\n\nNesse diretório existe a pasta **configuration**, que**não deve ser excluída**, pois se trata de uma pasta fundamental para o funcionamento da plataforma. As demais pastas são todas temporárias. Caso a plataforma não as encontre, ela automaticamente recria as pastas.\n\nNota:\n\nEsse procedimento reiniciará a plataforma e limpará os arquivos de *log* do ambiente.\n\n**04.** Apagar as pastas *keys* disponíveis nos caminhos:\n\n- **\\repository\\wcmdir**\n- **\\keys**\n\n**05.** Verificar se existem arquivos que **NÃO** estejam nos formatos **.war**, **.ear** ou **.jar** dentro das pastas **apps**, **core** e **system**. Caso existam, é necessário remover esses arquivos **fora do formato** das pastas:\n\n- **\\appserver\\apps**\n- **\\appserver\\core**\n- **\\appserver\\system**\n\nImportante!\n\nOs arquivos temporários gerados nestas pastas são excluídos no momento da finalização dos serviços, porém, em casos de desligamentos forçados do ambiente estes arquivos podem não ser excluídos automaticamente. Assim, é necessário fazer a exclusão manualmente. Geralmente, **os arquivos temporários estão no formato .tmp ou são diretórios como o mesmo nome**.\n\n**06.** Iniciar novamente os serviços do Fluig: (1) fluig\\_Indexer, (2) fluig\\_RealTime e (3) fluig.\n\n# Utilização do Agendador de tarefas\n\n---\n\n**01.** Recomendamos a configuração da**limpeza de notificações** e da **limpeza de arquivos temporários de documentos**por meio do Agendador de tarefas do Fluig. Saiba mais em [Agendador de tarefas](https://tdn.totvs.com/pages/viewpage.action?pageId=234455387).\n\n**02.** Em casos **extremos** de lentidão, é possível reduzir o tamanho das tabelas de alerta no banco de dados através da instrução **DELETE** ou **TRUNCATE**. No entanto, **NÃO** recomendamos a manipulação recorrente do banco, o correto é a ativação do Agendador de tarefas.\n\n**a)** **Instrução DELETE:** é usada para excluir as linhas de uma tabela, porém, não libera o espaço ocupado por essas linhas.\n\n```\nDELETE FROM FDN_ALERTSENDER;\nDELETE FROM FDN_ALERTACTION;\nDELETE FROM FDN_ALERTMETADATA;\nDELETE FROM FDN_ALERT;\nDELETE FROM FDN_ALERTOBJECT;\n```\n\n**b) Instrução TRUNCATE:** é usada para excluir as linhas de uma tabela e liberar o espaço ocupado por essas linhas.\n\n```\nTRUNCATE TABLE FDN_ALERTSENDER;  \nTRUNCATE TABLE FDN_ALERTACTION;  \nTRUNCATE TABLE FDN_ALERTMETADATA;  \nTRUNCATE TABLE FDN_ALERT;  \nTRUNCATE TABLE FDN_ALERTOBJECT;\n```\n\n# *Datasets* utilizando *datasources* nativos do Fluig\n\n---\n\n**01.** Executar as consultas abaixo no banco de dados e enviar os resultados em *prints* ou formato **.csv** para a equipe de Suporte Fluig. Para isso, é necessária abrir um *ticket* na [Central do cliente](https://suporte.totvs.com), a partir da opção **Abrir *ticket***.\n\n```sql\nselect COD_DATASET from serv_dataset where DSL_DATASET like '%FluigDS%'; \n\nselect nr_documento, COD_EVENT from event_ficha where DSL_EVENT like '%FluigDS%'; \n\nselect COD_EVENT from event_geral where DSL_EVENT like '%FluigDS%'; \n\nselect event_proces.COD_DEF_PROCES, COD_EVENT from event_proces where DSL_EVENT like '%FluigDS%';\n```" }, { "metadata": { "title": "Métodos de contorno de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=817650828", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Métodos de contorno de lentidão na plataforma.md" }, "content": "Métodos de contorno de lentidão na plataforma\n\n## O que o resultado das consultas dizem?" }, { "metadata": { "title": "Métodos de contorno de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=817650828", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Métodos de contorno de lentidão na plataforma.md" }, "content": "Métodos de contorno de lentidão na plataforma\n\n\n---\n\n→ Se as *queries* retornarem vazias, sem nenhum resultado, significa que as práticas de desenvolvimento do seu ambiente estão corretas e não necessitam de ajustes.\n\n→ Caso alguma *query* retorne resultados, é sinal que existem *datasets* personalizados utilizando os*datasources* nativos da plataforma **FluigDS** e **FluigDSRO**. No exemplo abaixo, uma das queries retornou 36 resultados:\n\n![](..\\..\\..\\images\\img_6637729851229989942.png)\n\n→ Essa prática de desenvolvimento **não é recomendada**, pois o Fluig disputa o *pool* de conexões no banco de dados com os *datasets* que utilizam os *datasources* nativos. O resultado disso é lentidão, queda e/ou indisponibilidade do ambiente, até que este, seja reinicializado ou ocorra a liberação da conexão com o banco novamente.\n\n→ A partir da atualização 1.6.5-190514, sempre que realizar um desenvolvimento usando o *datasource* da plataforma, é **indispensável** utilizar o **AppDS**.\n\n→ Verificar cada *dataset* retornado pelas *queries* e realizar o **ajuste no desenvolvimento** para que utilize o **AppDS**, conforme documentação: [*Datasets* acessando banco de dados externo](../../Desenvolvimento sobre a plataforma/Desenvolvimento de Datasets/Datasets acessando banco de dados externo.md).\n\n# Arquivos de instalação relacionados à lentidão\n\n---\n\nOs arquivos de instalação abaixo são os mais solicitados pela equipe de Suporte Fluig. Caso necessário, abra um *ticket* na [Central do cliente](https://suporte.totvs.com), a partir da opção **Abrir *ticket****,*e anexe esses arquivos ao chamado. Essa ação agilizará todo o processo de atendimento:\n\n- **\\appserver\\standalone\\configuration\\standalone.xml**\n- **\\appserver\\bin\\standalone.conf (Linux)**\n- **\\appserver\\bin\\standalone.conf.bat (Windows)**\n- **\\appserver\\standalone\\log\\server.log**\n- **\\node\\fluig.rt\\package.json**\n- **\\node\\fluig.rt\\logs**\n- ** (Arquivo que fica dentro do servidor do *Proxy* reverso)**\n\nNo entanto, recomendamos que nossos usuários tenham autonomia para detectar as causas de lentidão do seu ambiente. Assim, disponibilizamos uma série de achados nos arquivos de instalação e que podem ocasionar lentidão." }, { "metadata": { "title": "Métodos de contorno de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=817650828", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Métodos de contorno de lentidão na plataforma.md" }, "content": "Métodos de contorno de lentidão na plataforma\n\n## server.log" }, { "metadata": { "title": "Métodos de contorno de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=817650828", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Métodos de contorno de lentidão na plataforma.md" }, "content": "Métodos de contorno de lentidão na plataforma\n\n\n---\n\n**01.** O server.log pode ser consultado em: **\\appserver\\standalone\\log\\server.log**.\n\n**02.** Geralmente, o server.log é um arquivo extenso e sugerimos que consulte [Ferramentas de Análise de Log | Ferramentas indicadas | glogg](https://tdn.totvs.com/pages/viewpage.action?pageId=235336390#FerramentasdeAn%C3%A1lisedeLog-glogg).\n\n**03.** Termos de buscas mais comuns no **glogg:**\n\n- *ERROR;*\n- *ja esta sendo executado por;*\n- *executou por;*\n- *invokeFunction.servicetask64;*\n- *invokeFunction.createDataset;*\n- Thread em execução (ex.: *default task-39*).\n\n**04.** Principais achados no **server.log:**\n\n**a)** Sincronização de *d**atasets* levando mais tempo que o tolerável para finalizar as sincronizações. No exemplo, os *datasets* estão sincronizando por mais de **2500 segundos**:\n\n**server.log**\n\n```\n2023-05-29 10:42:00,740 WARN com.fluig.monitoring.jschronos.JSChronos DatasetMetaListServiceBean.datasetSync executou por 2520 segundos\n\n2023-05-29 10:42:00,740 INFO com.fluig.bpm.service.DatasetMetaListServiceBean Fim da sincronização do Dataset : dsFuncionario\n\n2023-05-29 11:08:39,167 WARN com.fluig.monitoring.jschronos.JSChronos DatasetMetaListServiceBean.datasetSync executou por 2318 segundos\n\n2023-05-29 11:08:39,168 INFO com.fluig.bpm.service.DatasetMetaListServiceBean Fim da sincronização do Dataset : dsEmpresas\n```\n\n**b)** Execução de *datasets* personalizados com tempo maior que **5 segundos**. Normalmente, essa situação está relacionada com a utilização dos *datasources* nativos do Fluig nesses desenvolvimentos. Exemplos:\n\n**server.log**\n\n```javascript\n2022-11-23 15:59:03,511 WARN [com.fluig.monitoring.jschronos.JSChronos] (JSChronos.CustomizationManagerImpl.invokeFunction.createDataset) CustomizationManagerImpl.invokeFunction.createDataset ja esta sendo executado por 2211 segundos params: [[[Ljava.lang.String;@268d1e17, null, null], Thread = default task-6727, datasetId = dsDatabase]\n2.211 segundos\n\n2022-11-24 08:51:22,088 WARN [com.fluig.monitoring.jschronos.JSChronos] (JSChronos.CustomizationManagerImpl.invokeFunction.createDataset) CustomizationManagerImpl.invokeFunction.createDataset ja esta sendo executado por 60 segundos params: [[[Ljava.lang.String;@7cec0760, [Lcom.totvs.technology.foundation.dataset.SearchConstraint;@64de871c, null], Thread = default task-35, datasetId = dsChecklistCRUD]\n\n2023-02-14 09:17:47,722 WARN [com.fluig.monitoring.jschronos.JSChronos] (JSChronos.CustomizationManagerImpl.invokeFunction.createDataset) CustomizationManagerImpl.invokeFunction.createDataset ja esta sendo executado por 300 segundos params: [[null, [Lcom.totvs.technology.foundation.dataset.SearchConstraint;@67eb8082, null], Thread = default task-389, datasetId = ds_sql_update]\n\n2023-02-14 09:17:56,587 WARN [com.fluig.monitoring.jschronos.JSChronos] (JSChronos.CustomizationManagerImpl.invokeFunction.servicetask64) CustomizationManagerImpl.invokeFunction.servicetask64 ja esta sendo executado por 120 segundos params: [[Process id = alteracao_de_preco, Process Version = 23, Process Current UserId = usuario.user], Thread = default task-413, datasetId = workflowColleagueRole]\n```\n\n**c)** Os termos ***\"*invokeFunction.servicetask64\"**e **\"****invokeFunction.createDataset\"**,geralmente, possuem relação com *datasets* de ***Workflow* (Processos)**:\n\n**server.log**\n\n```\n2023-02-14 08:39:38,114 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-323) CustomizationManagerImpl.invokeFunction.servicetask64 executou por 565 segundos\n\n2023-02-14 08:39:38,114 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-323) params: [[Process id = alteracao_de_preco, Process Version = 23, Process Current UserId = usuario.user], Thread = default task-323, datasetId = workflowColleagueRole]\n```\n\n**d****)** Busca pela *thread* em execução **(****default task-39)***:*\n\n**server.log**\n\n```javascript\n2023-05-29 09:30:53,414 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-39) CustomizationManagerImpl.invokeFunction.createDataset executou por 32 segundos\n2023-05-29 09:30:53,414 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-39) params: [[[Ljava.lang.String;@6c45e716, [Lcom.totvs.technology.foundation.dataset.SearchConstraint;@a1b6a73, null], Thread = default task-39, datasetId = ds_RMConsulta]\n2023-05-29 09:30:53,437 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-39) DatasetFactory.getDataset.ds_RMConsulta executou por 32 segundos\n2023-05-29 09:30:53,437 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-39) params: [[TBC012.05, 1, T], [FIELD_NAME=COLIGADA; INITIAL_VALUE=1; FINAL_VALUE=1; CONSTRAINT_TYPE=MUST; IS_LIKE_SEARCH=false; ], null]\n2023-05-29 09:31:24,672 INFO [com.datasul.technology.webdesk.dataset.business.DatasetBO] (default task-39) Executando Dataset com ID ds_RMConsulta do tipo Avançado.\n2023-05-29 09:31:24,672 INFO [com.datasul.technology.webdesk.dataset.business.DatasetBO] (default task-39) Builder rodando sem o mobile \n2023-05-29 09:31:24,719 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | Chamada do DataSet ds_RMConsulta\n2023-05-29 09:31:24,734 INFO [com.datasul.technology.webdesk.dataset.business.DatasetBO] (default task-39) Executando Dataset com ID ds_RMConecta do tipo Avançado.\n2023-05-29 09:31:24,735 INFO [com.datasul.technology.webdesk.dataset.business.DatasetBO] (default task-39) Builder rodando sem o mobile \n2023-05-29 09:31:24,786 INFO [org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean] (default task-39) Creating Service {http://www.totvs.com/}wsConsultaSQL from WSDL: http://peg54p-prd-ws.totvscloud.com.br:8083/wsConsultaSQL/MEX?wsdl\n2023-05-29 09:31:24,800 WARNING [org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean] (default task-39) No method was found for the WSDL operation {http://www.totvs.com/}RealizarConsultaSQLContexto.\n2023-05-29 09:31:24,805 INFO [org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean] (default task-39) Creating Service {http://www.totvs.com/}IwsConsultaSQLService from class com.totvs.IwsConsultaSQL\n2023-05-29 09:31:24,812 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | Dados da chamada ao serviço wsConsultaSQL:\n2023-05-29 09:31:24,812 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | CODSENTECA: TBC012.03\n2023-05-29 09:31:24,812 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | CODCOLIGADA: 1\n2023-05-29 09:31:24,812 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | APLICACAO: T\n2023-05-29 09:31:24,812 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | PARAMETRO: \n2023-05-29 09:31:24,922 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | Chamada realizada com sucesso.\n2023-05-29 09:31:24,923 INFO [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-39) uf-log | Quantidade de registros retornados: 57\n```" }, { "metadata": { "title": "Métodos de contorno de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=817650828", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Métodos de contorno de lentidão na plataforma.md" }, "content": "Métodos de contorno de lentidão na plataforma\n\n## standalone.xml" }, { "metadata": { "title": "Métodos de contorno de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=817650828", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Métodos de contorno de lentidão na plataforma.md" }, "content": "Métodos de contorno de lentidão na plataforma\n\n\n---\n\n**01.** O standalone.xml pode ser consultado em: **\\appserver\\standalone\\configuration\\standalone.xml.**\n\n**02.** O **** pode ser ajustado entre **50-200** nos *datasources*. É possível utilizar um **** menor, quando houver mais de um banco de dados no mesmo servidor.\n\n**standalone.xml**\n\n```\n\n\t\n\t\tjdbc:mysql://localhost:3306/fluig_mysql?useSSL=false&nullDatabaseMeansCurrent=true\n\t\tmysqlDriver\n\t\tTRANSACTION_READ_COMMITTED\n\t\t\n\t\t\t10\n\t\t\t100\n\t\t\n\t\t\n\t\t\tadmin\n\t\t\tadmin\n\t\t\n\t\t\n\t\t\t\n\t\t\ttrue\n\t\t\tfalse\n\t\t\n\t\t\n\t\t\tfalse\n\t\t\n\t\n\t\n\t\tjdbc:mysql://localhost:3306/fluig_mysql?useSSL=false&nullDatabaseMeansCurrent=true\n\t\tmysqlDriver\n\t\tTRANSACTION_READ_COMMITTED\n\t\t\n\t\t\t5\n\t\t\t50\n\t\t\n\t\t\n\t\t\tadmin\n\t\t\tadmin\n\t\t\n\t\t\n\t\t\t\n\t\t\ttrue\n\t\t\tfalse\n\t\t\n\t\t\n\t\t\t30000\n\t\t\n\t\t\n\t\t\tfalse\n\t\t\n\t\n\t\n\t\tjdbc:mysql://localhost:3306/fluig_mysql?useSSL=false&nullDatabaseMeansCurrent=true\n\t\tmysqlDriver\n\t\tTRANSACTION_READ_COMMITTED\n\t\t\n\t\t\t5\n\t\t\t150\n\t\t\n\t\t\n\t\t\tadmin\n\t\t\tadmin\n\t\t\n\t\t\n\t\t\t\n\t\t\ttrue\n\t\t\tfalse\n\t\t\n\t\t\n\t\t\t30000\n\t\t\n\t\t\n\t\t\tfalse\n\t\t\n\t\n\t\n\t\t\n\t\t\tcom.mysql.jdbc.Driver\n\t\t\n\t\n\n```" }, { "metadata": { "title": "Métodos de contorno de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=817650828", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Métodos de contorno de lentidão na plataforma.md" }, "content": "Métodos de contorno de lentidão na plataforma\n\n## standalone.conf (Linux)\n\n---\n\n**01.** O standalone.conf pode ser consultado em: **\\appserver\\bin\\standalone.conf.**\n\n**02.** Por padrão. o tamanho de memória que o servidor consome vem ajustado em: **-Xmx4g**e **-Xms2g**, porém, é possível alterar esses valores:\n\n**standalone.conf**\n\n```\n#\n# Specify options to pass to the Java VM.\n#\nJAVA_OPTS=\"-Xms3g -Xmx8g -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=1024m -Djava.net.preferIPv4Stack=true\"\n\nJAVA_OPTS=\"$JAVA_OPTS -Dfile.encoding=utf8 -Djavamelody.disabled=true -Djdk.tls.ephemeralDHKeySize=2048\"\n```\n\n**03.** O Fluig suporta **até 16 GB de memória**, sendo essa, uma limitação do JBoss. Caso o seu servidor de aplicação tenha mais de 16 GB de memória, recomendamos o uso de um **cluster** para distribuir os recursos. Saiba mais em [Alta disponibilidade e balanceamento de carga](../../Configuração/Configuração de Ambiente/Alta disponibilidade e balanceamento de carga.md)\n\n**04.** Não é preciso alterar a quantidade inicial (mínima) de memória alocada **(-Xms2g)**, pois a plataforma alocará memória de acordo com a necessidade. Saiba mais em [Modelo de dimensionamento](../../Especificações Técnicas/Dimensionamento/Modelo de dimensionamento.md).\n\n## standalone.conf.bat (Windows)" }, { "metadata": { "title": "Métodos de contorno de lentidão na plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=817650828", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Métodos de contorno de lentidão na plataforma.md" }, "content": "Métodos de contorno de lentidão na plataforma\n\n\n---\n\n**01.** O standalone.conf.bat pode ser consultado em: **\\appserver\\bin\\standalone.conf.bat.**\n\n**02.** Por padrão. o tamanho de memória que o servidor consome vem ajustado em: **-Xmx4g**e **-Xms2g**, porém, é possível alterar esses valores:\n\n**standalone.conf.bat**\n\n```\nrem # JVM memory allocation pool parameters - modify as appropriate.\nset \"JAVA_OPTS=%JAVA_OPTS% -Xms3g -Xmx8g -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=1024m\"\n\nset \"JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=utf8 -Djavamelody.disabled=true -Djdk.tls.ephemeralDHKeySize=2048\"\n```\n\n**03.** O Fluig suporta **até 16 GB de memória**, sendo essa, uma limitação do JBoss. Caso o seu servidor de aplicação tenha mais de 16 GB de memória, recomendamos o uso de um **cluster** para distribuir os recursos. Saiba mais em [Alta disponibilidade e balanceamento de carga](../../Configuração/Configuração de Ambiente/Alta disponibilidade e balanceamento de carga.md)\n\n**04.** Não é preciso alterar a quantidade inicial (mínima) de memória alocada **(-Xms2g)**, pois a plataforma alocará memória de acordo com a necessidade. Saiba mais em [Modelo de dimensionamento](../../Especificações Técnicas/Dimensionamento/Modelo de dimensionamento.md).\n\n# Outros interferentes no desempenho da plataforma\n\n---\n\n**01.** Execução de *backups* da aplicação e/ou banco de dados em horários de maior utilização da plataforma.\n\n**02.** Personalizações onerosas no diretório: **\\appserver\\apps**.\n\n**03.** Plataforma desatualizada.\n\n**04.** Problemas na [Configuração HTTPS da plataforma](../../Configuração/Configuração de Ambiente/HTTPS/Configuração HTTPS da plataforma.md).\n\n**05.** Problemas no [*Proxy* reverso](../../Configuração/Configuração de Ambiente/Proxy reverso.md).\n\n**06.** Excesso de consultas em *datasets*, pois podem gerar estresse desnecessário ao banco de dados." }, { "metadata": { "title": "Performance e análise do servidor", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185758720", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Performance e análise do servidor.md" }, "content": "Performance e análise do servidor\n\n\n**Tabela Geral para tempo de resposta**\n\n| Tempo | Percepção | Reação |\n| --- | --- | --- |\n| menor que 1 segundo | Instantâneo | Feliz |\n| até 3 segundos | Rápido | Indiferente |\n| de 3 a 5 segundos | Aceitável | Desconforto |\n| de 5 a 10 segundos | Lento | Irritação |\n| maior que 10 segundos | Travado | Reenvio da solicitação |\n\n**Tempo esperado para determinadas operações do Fluig**\n\n| Operação | 1 usuário | 30 usuários | 100 usuários |\n| --- | --- | --- | --- |\n| Carregar pagina | < 3 segundos | < 5 segundos | 12 segundos |\n| Movimentação de processos | < 5 segundos | < 8 segundos | 20 segundos |\n| Publicar documento | < 3 segundos | < 5 segundos | 10 segundos |" }, { "metadata": { "title": "Análise inicial", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185758735", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Performance e análise do servidor\\Análise inicial.md" }, "content": "Análise inicial\n\n\n# Índice\n\n- 1 [Monitoramento](#Análiseinicial-Monitoramento)\n- 2 [Análise](#Análiseinicial-Análise)\n - 2.1 [Páginas](#Análiseinicial-Páginas)\n - 2.2 [Banco de Dados](#Análiseinicial-BancodeDados)\n - 2.3 [Configurações](#Análiseinicial-Configurações)\n\n## Monitoramento\n\n---\n\nA primeira meta é identificar o ponto de lentidão no sistema e levantar os tempos aproximados.\n\nCom base no cenário de lentidão reportado, pode-se monitorar os tempos de resposta do servidor usando as ferramentas de desenvolvimento do navegador (tecla F12). O monitoramento dos tempos de resposta é feito pela ferramenta de rede (*Network*).\n\n![](..\\..\\..\\..\\images\\f121.png)\n\n**Tabela Geral para tempo de resposta**\n\n| Tempo | Percepção | Reação |\n| --- | --- | --- |\n| menor que 1 segundo | Instantâneo | Feliz |\n| até 3 segundos | Rápido | Indiferente |\n| de 3 a 5 segundos | Aceitável | Desconforto |\n| de 5 a 10 segundos | Lento | Irritação |\n| maior que 10 segundos | Travado | Reenvio da solicitação |\n\n**Tempos esperados para algumas operações do fluig**\n\n| Operação | 1 usuário | 30 usuários | 100 usuários |\n| --- | --- | --- | --- |\n| Carregar pagina | < 3 segundos | < 5 segundos | 12 segundos |\n| Movimentação de processos | < 5 segundos | < 8 segundos | 20 segundos |\n| Publicar documento | < 3 segundos | < 5 segundos | 10 segundos |\n\n## Análise\n\n---\n\nApós levantar o recurso e os tempos é possível fazer uma rápida análise para identificar alguns pontos que costumam interferir na resposta do servidor:\n\n#### Páginas\n\n###### Tamanho das páginas\n\nAinda na aba de *Network* da ferramenta de desenvolvimento, verificar a quantidade de *bytes* transferidos para montar a página.\n\n![](..\\..\\..\\..\\images\\f123.png)\n\nAs páginas padrão da plataforma Fluig não ultrapassam o tamanho de 1100 *bytes*. Tamanhos acima de 2 MB podem prejudicar a performance, dependendo da infraestrutura de rede.\n\n###### Widgets síncronas" }, { "metadata": { "title": "Análise inicial", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185758735", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Performance e análise do servidor\\Análise inicial.md" }, "content": "Análise inicial\n\n\nEm alguns casos*, widgets*demorados \"travam\" o carregamento de toda página. Retire o *widget* em questão da página e efetue um novo teste. Caso o tempo de resposta seja aceitável, verificar a possibilidade do *widget* ser convertido para assíncrono.\n\n#### Banco de Dados\n\nSolicite um relatório de *queries* lentas ao DBA da empresa (ou à equipe que monitora o banco de dados do Fluig) e peça para verificarem se não existem *locks* muito demorados ou *deadlocks*.\n\n#### Configurações" }, { "metadata": { "title": "Análise inicial", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185758735", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Avaliação de lentidão na plataforma\\Performance e análise do servidor\\Análise inicial.md" }, "content": "Análise inicial\n\n\nO Fluig na instalação padrão sai com apenas 20 conexões com o banco. Recomenda-se ajustar a quantidade de conexões para um valor próximo à quantidade de usuários concorrentes esperada.\n\nAtenção\n\nUm número muito alto de conexões ao banco de dados gera gasto no gerenciamento do *pool*.\n\nPara identificar se o sistema está sofrendo com falta de conexões, é necessário habilitar o console de gerenciamento do WildFly.\n\n1. No prompt de comando do Windows ou no *shell* do Linux, navegue até o diretório bin do WildFly ([Instalação do fluig]/appserver/bin);\n2. Executar o *script* add-user.bat ou add-user.sh;\n3. Na primeira pergunta exibida, apenas digite ENTER;\n4. Informe o nome do usuário na segunda pergunta;\n5. Escolha uma senha e digite-a na terceira e quarta perguntas;\n6. Após a confirmação da senha, digite ENTER na quinta pergunta;\n7. Na sexta e sétima perguntas é necessário digitar \"Sim\" (ou *\"Yes\",* se o console estiver em inglês) e confirmar com a tecla *Enter*.\n\nApós o cadastro do usuário acesse o console de monitoramento http://[IP ou hostname]:9990.\n\n- A métrica *Available* indica quantas conexões estão livres para serem usadas.\n\n- O *Active Count* informa a quantidade de conexões com o banco sendo usadas no momento.\n\n- O *Max Used* é o registro do numero máximo de conexões usadas desde que o servidor foi iniciado. Se o percentual do *Max Used* estiver em 100% em algum momento o cliente sofreu com falta de conexões com o banco. Para verificar o percentual Max Used, acesse **Runtime > Hosts > master > fluig1 > Subsystems > Datasources** e acione **View**.\n\n![](..\\..\\..\\..\\images\\maxused.png)\n\nAinda no console de monitoramento é possível acompanhar o uso de memória do WildFly. Para verificar o uso de memória, acesse **Runtime > Hosts > master > fluig1 > JVM** e acione **View**.\n\n![](..\\..\\..\\..\\images\\memoria.png)\n\nCaso o percentual do uso de memória fique variando na casa dos 90% por um longo período é possível que o servidor precise mais memória.\n\nA última avaliação a ser feita no console é o acumulo de mensagens nas filas e tópicos. Para isso, acesse **Hosts > master > fluig1 > Subsystems > Messaging - ActiveMQ** e acione **View**.\n\n![](..\\..\\..\\..\\images\\inline959840234.png)\n\nAvaliar todas as filas e tópicos. Caso algum tenha a informação *In Delivery* maior que 30 provavelmente algum componente do Fluig precise ser revisto." }, { "metadata": { "title": "Conversão TOTVS ECM para plataforma TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622952", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Conversão TOTVS ECM para plataforma TOTVS Fluig.md" }, "content": "Conversão TOTVS ECM para plataforma TOTVS Fluig" }, { "metadata": { "title": "Conversão TOTVS ECM para plataforma TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622952", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Conversão TOTVS ECM para plataforma TOTVS Fluig.md" }, "content": "Conversão TOTVS ECM para plataforma TOTVS Fluig\n\n\nAtenção\n\nEsta página foi revisada para considerar as configurações de servidor do TOTVS Fluig Plataforma para a **atualização 1.6 ou superiores**.\n\n- [Objetivo](https://tdn.totvs.com/pages/viewpage.action?pageId=257622952#Convers%C3%A3oTOTVSECMparaFluig-Objetivo)\n- [Pré-requisitos](https://tdn.totvs.com/pages/viewpage.action?pageId=257622952#Convers%C3%A3oTOTVSECMparaFluig-Pr%C3%A9-requisitosantes)\n- [Conversão para o Fluig](https://tdn.totvs.com/pages/viewpage.action?pageId=257622952#Convers%C3%A3oTOTVSECMparaFluig-Convers%C3%A3oparaoFluig)\n - [Iniciando o Fluig](https://tdn.totvs.com/pages/viewpage.action?pageId=257622952#Convers%C3%A3oTOTVSECMparaFluig-IniciandooFluig)\n - [Sobre a reinicialização do serviço](https://tdn.totvs.com/pages/viewpage.action?pageId=257622952#Convers%C3%A3oTOTVSECMparaFluig-Sobreareinicializa%C3%A7%C3%A3odoservi%C3%A7o)\n - [Conversão](https://tdn.totvs.com/pages/viewpage.action?pageId=257622952#Convers%C3%A3oTOTVSECMparaFluig-Convers%C3%A3o)\n - [Pós-conversão ou migração](https://tdn.totvs.com/pages/viewpage.action?pageId=257622952#Convers%C3%A3oTOTVSECMparaFluig-P%C3%B3s-convers%C3%A3ooumigra%C3%A7%C3%A3o)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é instruir os administradores de sistemas que desejam realizar a conversão do TOTVS ECM para a plataforma TOTVS Fluig.\n\n# Pré-requisitos\n\n---\n\nImportante\n\nPara que o processo de conversão seja realizado com sucesso, é necessário que o TOTVS ECM esteja na versão mais atual dos pacotes de atualização, disponível no [Portal de Clientes](http://suporte.totvs.com). Caso o ambiente esteja desatualizado é recomendado realizar a atualização e posteriormente prosseguir com as etapas para conversão.\n\nAntes de realizar a conversão é necessário realizar alguns procedimentos:\n\n**1)** Realize as cópias de segurança, conforme orientações abaixo:\n\nA fim de preservar os recursos e dados do TOTVS ECM caso ocorra algum erro durante o processo de conversão é importante realizar uma cópia de segurança dos seguintes itens:\n\n- **Recursos utilizados no TOTVS ECM:** como Fichários, Datasets customizados, Processos workflow, Eventos de fichários, Eventos de Processos, Eventos Globais, Serviços, Aplicativos, Parâmetros Gerais, Templates de e-mail, Mecanismos de Atribuição, e demais customizações utilizadas no TOTVS ECM. É importante exportar o máximo destes recursos, para melhor manipulação durante o processo de homologação após a conversão do TOTVS ECM para o Fluig além de possibilitar a importação no Fluig caso necessário posteriormente.\n\n- **Banco de dados:** Importante possuir uma cópia de segurança do banco de dados para caso seja necessário a restauração do último estado válido da instalação do TOTVS ECM. Se desejar manter a instalação antiga é válido realizar a duplicação da base de dados de forma que o mesmo conteúdo assuma um novo nome. Por exemplo, a base de dados do TOTVS ECM, por padrão chama-se **totvsecm**, enquanto para o Fluig são nomeadas como **fluig**.\n\n- **Volume:** Caso deseje-se manter a instalação antiga do TOTVS ECM, após a conversão os volumes cadastrados no TOTVS ECM ainda serão utilizados. Com isto, os dados nos mesmos poderão sofrer mudanças na utilização do Fluig, e este compartilhamento entre os dois sistemas pode causar conflitos e erros na utilização. Para evitar esta situação é necessária a cópia dos volumes para um novo local. A cópia de segurança dos volumes também é necessário para caso seja necessário a restauração do último estado válido da instalação do TOTVS ECM.\n\nRealize as cópias de segurança acima e, caso uma nova base de dados for utilizada, restaure a cópia de segurança da base de dados sobre esta nova base.\n\n**2)** Certifique-se de que o Fluig será disponibilizado no mesmo endereço IP e porta HTTP/HTTPS que a versão atual do TOTVS ECM. Caso não for utilizar estes mesmos critérios de acesso inicie o serviço TOTVS ECM, para esta nova base de dados, se for o caso.Ao iniciar o serviço do TOTVS ECM, acesse o cadastro das empresas do TOTVS ECM e altere as configurações de acesso, sendo os campos **Servidor Web** e **Porta Web**, como ilustrado abaixo.\n\n**![](..\\..\\..\\images\\empresa.png)**\n\n**Parâmetros da Empresa no ECM.**\n\n**3)** Caso deseje alterar a localização dos volumes, é importante que a mudança seja feita antes da conversão. Para isso, acesse a aba Volumes e realize as alterações necessárias no caminho do diretório do volume.\n\nA migração fará a conversão completa do ECM para o Fluig, ou seja, todos os documentos que estiverem no ECM serão migrados para o Fluig. Se desejar, faça também uma verificação no ECM para remover o que não precisa, antes de migrar para o Fluig.\n\n![](..\\..\\..\\images\\volume.png)\n\n**Volume(s) de dados do TOTVS ECM.**\n\n**4)** Confira a quantidade de**colaborações ativos** no TOTVS ECM.\n\nImportante!\n\nO **número de colaboradores ativos** no TOTVS ECM não pode ser superior ao **número de usuários disponíveis na licença** do Fluig cadastrada no License Server. Se o número de usuários no ECM for maior do que as licenças adquiridas para a plataforma Fluig, será necessário desativar os usuários no ECM primeiro, via tela. Se necessário, pode ser utilizado o recurso de Transferir pendências, para os usuários que são responsáveis por algum processo/documento.\n\nPara entender melhor como funciona o licenciamento da plataforma, consulte [essa documentação](../../Sobre a plataforma/Licenciamento da plataforma.md).\n\n**5)** Certifique-se que todos os colaboradores cadastrados no TOTVS ECM atendam os seguintes requisitos:\n\n**a)** O colaborador não pode possuir login, e-mail ou matrícula duplicada;\n\n**b)** A matrícula do colaborador deve possuir somente caracteres alfanuméricos, ponto (.), hífen ( - ) e traço inferior (\\_);\n\n**c)** O login do colaborador deve possuir somente caracteres alfanuméricos, ponto (.), hífen ( - ) e traço inferior (\\_);\n\n**d)** O nome do colaborador não pode ultrapassar o limite máximo de 255 caracteres;\n\n**e)** O e-mail do colaborador deve ser um e-mail válido;\n\n**f)** A senha do colaborador não pode ser em branco;\n\nCaso algum dos colaboradores não atenda aos requisitos informados é necessário adequá-lo a estes requisitos.\n\n**6)** Remova qualquer evento global ou outra customização que manipule a publicação de documentos ou outras funcionalidades do TOTVS ECM. Por exemplo: um evento global *beforeDocumentPublisher* que não permita publicar na pasta raiz.\n\n**7)** Remova todos os agendamentos de tarefas cadastrados no TOTVS ECM.\n\n**8)** Desconecte e pare o serviço do TOTVS ECM.\n\n**9)** Providencie o instalador para a**atualização 1.5.13 (última EP)** do Fluig.\n\nImportante\n\n**A conversão somente pode ser realizada até a atualização 1.5.13 (última EP) do Fluig**, para posteriormente aplicar a atualização mais recente da plataforma.\n\nÉ possível fazer o download do instalador através do nosso portal [Suporte fluig](http://suporte.totvs.com/), dentro da Central de Downloads, clicando [aqui](https://suporte.totvs.com/portal/p/10098/suporte-fluig-download#000035/).\n\nCaso o banco de dados do TOTVS ECM seja Microsoft SQL Server com agrupamento de caracteres (*collation*) diferente do padrão do Fluig \"**Latin1\\_General\\_CI\\_AS**\", será necessário seguir os procedimentos descritos em [Migração e Conversão de Collation (SQL Server)](Migração e Conversão de Collation (SQL Server).md).md).\n\n# Conversão para o Fluig\n\n---\n\nApós executados os procedimentos acima, pode ser realizada a instalação do Fluig (**atualização 1.5.13-última EP**) conforme instruções disponíveis no guia [Instalação Fluig (Instalador) - Windows](http://tdn.totvs.com/pages/viewpage.action?pageId=257622840) ou  [Instalação Fluig (Instalador) - Linux](http://tdn.totvs.com/pages/viewpage.action?pageId=257622802)." }, { "metadata": { "title": "Conversão TOTVS ECM para plataforma TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622952", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Conversão TOTVS ECM para plataforma TOTVS Fluig.md" }, "content": "Conversão TOTVS ECM para plataforma TOTVS Fluig\n\n## Iniciando o Fluig" }, { "metadata": { "title": "Conversão TOTVS ECM para plataforma TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622952", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Conversão TOTVS ECM para plataforma TOTVS Fluig.md" }, "content": "Conversão TOTVS ECM para plataforma TOTVS Fluig\n\n\n---\n\nPara o processo de migração, quando o Fluig é inicializado sobre uma base de dados utilizada pelo TOTVS ECM, as estruturas das tabelas deste último permanecem da mesma forma. Entretanto, o Fluig irá criar suas próprias tabelas, separadamente.\n\nImportante\n\nÉ obrigatório que o usuário utilizado para inicializar o Fluig, tanto pelo modo console quanto como serviço do sistema operacional, possua permissão de modificação nas pastas da instalação e volume(s) utilizado(s) pelos Fluig.\n\nVerifique os modos de inicialização abaixo e escolha aquele que deseja utilizar para iniciar o Fluig:\n\n- Execute o arquivo [Instalação\\_fluig]\\jboss\\bin\\standalone.bat.\n\n- Uma janela do Prompt de Comando será aberta exibindo as informações da inicialização e mensagens do servidor de aplicação. Quando houver necessidade de parar a execução do sistema pressione as teclas CTRL+C.\n\n- Acesse os Serviços do Windows através do Painel de Controle → Sistema → Ferramentas Administrativas ou execute o comando **services.msc** no **Prompt de Comando**.\n\n- Localize o serviço **fluig** e clique sobre ele com o botão direito do *mouse*. Selecione a opção **Iniciar**.\n\n![](..\\..\\..\\images\\servico.png)\n\n**Janela de Serviços do Windows. Serviço do fluig selecionado e inicializado.**\n\n- A inicialização pode ser acompanhada através do *log* armazenado em [Instalação\\_fluig]\\jboss\\standalone\\log\\server.log. Quando esse arquivo possuir cerca de 1,0 MB e contiver a inscrição abaixo, o Fluig está pronto para ser utilizado. O tempo para inicialização do serviço pode variar de acordo com os recursos do servidor em que o Fluig será executado.\n\n**server.log**\n\n```\nHH:MM:SS,mmm INFO [com.fluig.startup.service.fluigStartupBean] (EJB default - x) ===============================================\nHH:MM:SS,mmm INFO [com.fluig.startup.service.fluigStartupBean] (EJB default - x) == fluig is up and running right now. ==\nHH:MM:SS,mmm INFO [com.fluig.startup.service.fluigStartupBean] (EJB default - x) ===============================================\n```\n\n- Execute o arquivo [Instalação\\_fluig]\\jboss\\bin\\standalone.sh.\n\n- O *log* de inicialização, que contém as informações e mensagens do servidor de aplicação, será exibido no terminal. Quando houver necessidade de parar a execução do sistema, pressione as teclas CTRL+C." }, { "metadata": { "title": "Conversão TOTVS ECM para plataforma TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622952", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Conversão TOTVS ECM para plataforma TOTVS Fluig.md" }, "content": "Conversão TOTVS ECM para plataforma TOTVS Fluig\n\n### Sobre a reinicialização do serviço\n\n---\n\nNo caso de uma nova inicialização do serviço ou falhas na reinicialização, pode ser necessário encerrar os processos do [OpenOffice.org](http://OpenOffice.org).\n\n1. Clique com o botão direito sobre a barra de tarefas do Windows e selecione a opção **Iniciar o Gerenciador de tarefas** (ou use o atalho do teclado CTRL + SHIFT + ESC).\n2. Localize na coluna \"Nome da Imagem\" os processos **soffice.bin**. Confirme que tratam-se dos processos referentes ao Fluig através da coluna \"Nome do Caminho da Imagem\", que exibe o diretório de origem do processo.\n3. Caso afirmativo, selecione os processos e clique sobre o botão **Finalizar Processo** no canto inferior da janela para encerrá-los.\n\n![](..\\..\\..\\images\\Image%205.jpg)\n\n**Processo soffice.bin\\*32 em execução no Gerenciador de Tarefas**\n\n## Conversão" }, { "metadata": { "title": "Conversão TOTVS ECM para plataforma TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622952", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Conversão TOTVS ECM para plataforma TOTVS Fluig.md" }, "content": "Conversão TOTVS ECM para plataforma TOTVS Fluig\n\n\n---\n\nImportante\n\n- Este é um processo irreversível, pois o Fluig irá realizar a leitura das tabelas do TOTVS ECM e transportar seus dados para as respectivas tabelas do Fluig. Algumas tabelas do TOTVS ECM serão excluídas neste processo de conversão.\n\n- Durante o processo podem ocorrer falhas que comprometam a base de dados. Caso isto aconteça, utilize a cópia de segurança criada anteriormente para restaurar a base de dados.\n\n- No caso de utilização do banco de dados SQL Server, atente-se para a documentação de [configuração do banco de dados SQL Server](http://tdn.totvs.com/pages/viewpage.action?pageId=257623499).\n\n- Os documentos do tipo **Portal** e **PortalPage** não serão convertidos. Sua conversão deverá ser realizada manualmente, ou seja, será necessário criar as páginas manualmente no Fluig, através do item **Minhas páginas** presente na guia **Painel de** **Controle**, aba **WCM**.\n\nAcompanhe os passos a seguir para iniciar a conversão:\n\n**1)** Após inicializar o Fluig, é necessário realizar login utilizando o usuário **wcmadmin** e senha **adm**;\n\n**2)** Depois de feito o login, acessar o item de menu **Painel de controle** e acionar a aba **ECM**. Nesta aba, acessar a opção **Conversor de Base;**\n\n**3)** Com isto, será realizada uma validação da base para verificar se a conversão pode ser iniciada;\n\n![](..\\..\\..\\images\\image2016-10-19%207234.png)**Processo de conversão da base TOTVS ECM para Fluig.**\n\n**4)** Caso não sejam encontradas inconformidades, deve-se clicar em **Converter;**\n\n**5)** Ao clicar em **Converter** é exibida uma mensagem indicando o inicio da conversão;\n\n![](..\\..\\..\\images\\image2016-10-19%2072653.png)**Processo de conversão Iniciado.**\n\n**6)** Para acompanhar o processo de conversão, deve ser acessado o arquivo [Instalação\\_fluig]\\jboss\\standalone\\log\\conversion.log;\n\n**7)** A frase \"Conversão finalizada com sucesso!!!\" apresentada no final do arquivo de *log* indica o término do processo de conversão;\n\n**8)** Neste momento é necessário reiniciar o serviço **Fluig**, para que os updates de banco de dados sejam efetuados. Isto acontece pois o processo de conversão adiciona novas estruturas de banco de dados, bem como alterando e eliminando algumas pré-existentes.\n\n**9)** A partir deste momento é possível acessar o Fluig com os usuários e senhas que existiam no TOTVS ECM. Para gerenciar empresas é utilizado o usuário wcmadmin, e não mais o usuário wdkAdmin.\n\n![](..\\..\\..\\images\\image2016-10-19%207248.png)**Tela de login do Fluig.**" }, { "metadata": { "title": "Conversão TOTVS ECM para plataforma TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622952", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Conversão TOTVS ECM para plataforma TOTVS Fluig.md" }, "content": "Conversão TOTVS ECM para plataforma TOTVS Fluig\n\n## Pós-conversão ou migração" }, { "metadata": { "title": "Conversão TOTVS ECM para plataforma TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622952", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Conversão TOTVS ECM para plataforma TOTVS Fluig.md" }, "content": "Conversão TOTVS ECM para plataforma TOTVS Fluig\n\n\n---\n\nQuando um processo de conversão é realizado, alguns procedimentos são necessários para que os serviços do Fluig possam executar suas atividades corretamente. São recomendados os seguintes passos:\n\n- Indexação do(s) Volume(s).\n\n- Atualização dos serviços de dados do TOTVS ECM. Isto é, a modificação destes serviços para que sejam recriados os *stubs*, no caso de alteração das URLs dos *Web Services* utilizados.\n\n- Para migrações em que o TOTVS ECM era integrado ao TOTVS EMS/HCM, deve ser verificado se na pasta [Instalação\\_fluig]\\jboss\\modules\\com, encontram-se os diretórios progress\\main com as bibliotecas (JAR) do respectivo Progress.\n\nAtenção\n\nAs bibliotecas citadas acima não correspondem ao JAR gerado pelo ProxyGen (Proxy Generator), mas sim às bibliotecas do antigo ambiente cadastrado no TOTVS ECM. Este procedimento é necessário, pois nesta versão do produto não existe mais tal cadastro de ambientes e indicação das bibliotecas. O servidor de aplicação requer que estas classes Java comuns do Progress sejam inicializadas como um módulo do servidor de aplicação.\n\nDentro desta pasta, junto às bibliotecas, deve existir um arquivo chamado \"module.xml\". Todas estas bibliotecas devem ser relacionadas em seu conteúdo. Lembrando que o arquivo deve ser salvo com a codificação UTF-8 (sem BOM).\n\n**Modelo do arquivo module.xml**\n\n```\n\n\n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n\n```\n\nAlerta\n\nDepois de realizada esta configuração é obrigatória a reinicialização do Fluig para que estas bibliotecas sejam carregadas no *classpath* do servidor de aplicação. Até que isto seja realizado, as operações irão retornar um erro como \"JavaException: java.lang.ClassNotFoundException: com.progress.open4gl.ProDataGraphHolder\" ou outra classe, na tentativa de criar um objeto dentro do *package**com.progress.\\**.\n\nTratamento alternativo\n\nUma forma de permitir a utilização destas *classes* pelo *proxy* gerado é incluir o conteúdo destas bibliotecas dentro do pacote deste *proxy*, isto é, os arquivos do tipo e extensão JAR são arquivos compactados como os do tipo ZIP. Cada uma destas bibliotecas pode ser aberta por seu aplicativo de compactação de arquivos preferido (WinZIP, WinRAR, 7-ZIP, dentre outros) e seu conteúdo copiado para dentro do arquivo JAR do *proxy*. Somente as pastas e seu conteúdo “META-INF” devem ser ignoradas, não copiadas.\n\n \n\n- Adicione novamente os eventos globais ou outras customizações que foram removidas antes de iniciar a conversão;\n\n- Cadastre novamente os agendamentos de tarefas removidos antes de iniciar a conversão, caso os mesmos ainda sejam necessários;\n\n- Gere as imagens dos diagramas de processo, acessando o **Painel de Controle** da cada empresa, aba **Processos →** **Gerador de imagem de processo**;\n\n- Se ao acessar o Fluig, ocorrer o direcionamento para o [endereço]:[porta] que eram do TOTVS ECM, isso significa que não foi alterado o endereço de acesso antes da conversão (conforme mencionado na sessão **[Pré-requisitos](https://tdn.totvs.com/pages/viewpage.action?pageId=257622952)**)e portanto será necessário alterá-lo no Fluig. Para isso, acesse com o usuário **wcmadmin** e navegue para o **Painel de** **Controle**, aba **WCM**, item **Configurações do Sistema.**\n\n- Em alguns desenvolvimentos no ECM utilizava-se **jdbc/webdeskDS** para conexão com o banco de dados. Para o correto funcionamento no Fluig, é necessário utilizar **jdbc/FluigDSRO**, ou seja, desenvolvimentos que estão no formato antigo devem ser atualizados. Abaixo é exibido um exemplo de utilização em *dataset* desenvolvido sobre a plataforma.\n\n```javascript\nfunction createDataset(fields, constraints, sortFields) {\n\tvar query = \"SELECT login,email FROM fdn_usertenant LIMIT 100\";\n\tvar dataSource = \"jdbc/FluigDSRO\"; \n\tvar newDataset = DatasetBuilder.newDataset();\n\tvar ic = new javax.naming.InitialContext();\n\tvar ds = ic.lookup(dataSource);\n\t\n\ttry {\n\t\tvar conn = ds.getConnection();\n\t\tvar stmt = conn.createStatement();\n\t\tvar rs = stmt.executeQuery(query);\n\t\t\n\t\tnewDataset.addColumn(\"Login\");\n\t\tnewDataset.addColumn(\"Email\");\n\t\t\n\t\twhile (rs.next()) {\n\t\t\tnewDataset.addRow([ rs.getString(\"login\"), rs.getString(\"email\") ]);\n\t\t}\n\t\t\n\t} catch(e) {\n\t\tnewDataset.addColumn(\"erro\");\n\t\tnewDataset.addRow([e.message]);\n\t} finally {\n\t\tif(rs != null) rs.close();\n\t\tif(stmt != null) stmt.close();\n\t\tif(conn != null) conn.close();\t\t\n\t}\n\t\n\treturn newDataset;\n}\n```\n\nImportante\n\n\"É necessário **atualizar o sistema para última liberação da versão 1.6.5** para que não ocorra inconsistências de dados e arquivos e depois atualizar para a plataforma para a release mais recente. Seus processos e formulários também precisam revistos e de preferência, adaptados para os padrões do [fluig Style Guide](../../Desenvolvimento sobre a plataforma/Guia de Estilos.md).\n\nFique atento!\n\nConfira as atualizações já liberadas e as datas futuras de liberações do Fluig acessando a página de [Atualização Fluig](http://tdn.totvs.com/pages/viewpage.action?pageId=73078235). Veja as novidades de cada atualização acessando a página de [Release Notes](http://tdn.totvs.com.br/x/4gGzBQ)." }, { "metadata": { "title": "Migração e Conversão de Collation (SQL Server)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=118882384", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Migração e Conversão de Collation (SQL Server).md" }, "content": "Migração e Conversão de Collation (SQL Server)" }, { "metadata": { "title": "Migração e Conversão de Collation (SQL Server)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=118882384", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Migração e Conversão de Collation (SQL Server).md" }, "content": "Migração e Conversão de Collation (SQL Server)\n\n\n- 1 [Objetivo](#MigraçãoeConversãodeCollation(SQLServer)-Objetivo)\n- 2 [Procedimento de migração e conversão de dados](#MigraçãoeConversãodeCollation(SQLServer)-Procedimentodemigraçãoeconversãodedados)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é indicar um método de migração dos dados de uma base com agrupamento de caracteres (*collation*) diferente do padrão \"Latin1\\_General\\_CI\\_AS\" necessário para a correta utilização da base Fluig.\n\n# Procedimento de migração e conversão de dados\n\n---\n\nAtenção!\n\nEsta operação deve ocorrer antes da conversão de uma base TOTVS ECM para TOTVS Fluig Plataforma. Mesmo com a alteração do agrupamento padrão, os campos existentes permanecem incorretos, podendo assim, causar comportamentos inesperados na utilização da plataforma.\n\nAcompanhe a seguir o checklist para a conversão.\n\n- Gere um **DUMP** desta base de dados do **TOTVS ECM 3.00**, com toda estrutura de tabelas e campos.\n\n- Para o SGBD **Microsoft SQL Server** utilize o procedimento a seguir: \n 1. Clique com o botão direito do mouse sobre a base de dados.\n 2. No menu suspenso escolha a opção **Tarefas > Gerar Scripts...**\n 3. Clique no botão **Próximo >** para passar a apresentação da Introdução do assistente para **Gerar e Publicar Scripts**.\n 4. Deixe selecionada a opção para **Gerar script de todo o banco de****dados** e **todos os objetos de banco de dados** e clique no botão **Próximo >**.\n 5. Na tela seguinte, no grupo **Tipo de Saída** e no grupo abaixo selecione a opção **Salvar** na nova janela de consulta.\n 6. Clique no botão **Avançado**.\n 7. Na tela de **Opções de Script Avançadas** altere a opção **Agrupamento de Scripts** para **True** e clique no botão **OK**.\n 8. Ao retornar a tela **Gerar e Publicar Scripts**clique no botão **Próximo >**.\n 9. Na etapa a seguir revise as configurações para geração do script da base. Clique no botão **Próximo >**.\n 10. Torne à janela do **Microsoft SQL Server Management Studio**.\n 11. Na nova janela aberta com o script, altere as seguintes linhas e proceda com as alterações abaixo citadas:\n\n 1. Substituir todas as ocorrências do nome antigo do banco de dados para **fluig**. (Aproximadamente 39 ocorrências).\n\n ```\n -- antes\n \tCREATE DATABASE [byyouecm_ofi]\n\n -- depois\n \tCREATE DATABASE [fluig]\n\n -- comando\n -- replaceAll apenas na palavra byyouecm_ofi\n ```\n 2. Substituir no nome do arquivo .**mdf** e do arquivo .**log** para **fluig**, bem como a label dos arquivos.\n\n ```\n -- antes\n ON PRIMARY \n ( NAME = N'Webdesk300_Data', FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQL\\DATA\\byyouecm_ofi.MDF' , SIZE = 5098688KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%)\n LOG ON \n ( NAME = N'Webdesk300_Log', FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQL\\DATA\\byyouecm_ofi_1.LDF' , SIZE = 52352KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%)\n\n -- depois\n ON PRIMARY \n ( NAME = N'Fluig_Data', FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQL\\DATA\\fluig.MDF' , SIZE = 5098688KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%)\n LOG ON \n ( NAME = N'Fluig_Log', FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQL\\DATA\\fluig.LDF' , SIZE = 52352KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%)\n\n -- comando\n -- replaceAll apenas na palavra Webdesk300\n ```\n 3. Substituir a ocorrência da versão do banco de dados para o valor **110**.\n\n ```\n -- antes\n ALTER DATABASE [fluig] SET COMPATIBILITY_LEVEL = 100\n\n -- depois\n ALTER DATABASE [fluig] SET COMPATIBILITY_LEVEL = 110\n ```\n 4. Substituir a ocorrência do instantâneo de leitura de commit para **ON**.\n\n ```\n -- antes\n ALTER DATABASE [fluig] SET READ_COMMITTED_SNAPSHOT OFF \n\n -- depois\n ALTER DATABASE [fluig] SET READ_COMMITTED_SNAPSHOT ON\n ```\n 5. Substituir todas as ocorrências do **collation** antigo pelo novo **Latin1\\_General\\_CI\\_AS**. (Aproximadamente 444 ocorrências).\n\n Importante!\n\n Independentemente da **collation** que a base ECM tenha, é necessário converter para '**Latin1\\_General\\_CI\\_AS**', pois é o que o TOTVS Fluig espera como padrão, conforme descrito na documentação [Configuração do banco de dados SQL Server](../../Configuração/Configuração de Banco de Dados/Configuração do banco de dados SQL Server.md).\n\n 1. **CI** significa **Case Insensitive**, não diferenciando letras maiúsculas de minúsculas em suas queries.\n 2. **AS** significa **Accept Signal**, diferenciado acentuação nos campos de texto em suas queries.\n\n ```\n -- antes\n COLLATE SQL_Latin1_General_CP1_CI_AI\n\n -- depois\n COLLATE Latin1_General_CI_AS\n\n -- comando\n -- replaceAll apenas na palavra SQL_Latin1_General_CP1_CI_AI\n ```\n 12. Execute o script por inteiro.\n 13. Atualize o explorador de objetos do SQL Management Studio.\n 14. Deverá aparecer o novo banco **fluig**.\n\n- Proceda com a desativação das chaves (*constraints*) nas tabelas da base de dados **fluig**. Para o SGBD Microsoft SQL Server utilize a instrução a seguir:\n 1. Abra uma janela de Nova Consulta (menu **Arquivo > Novo > Consulta do Mecanismo de Banco de Dados**);.\n 2. Insira a consulta abaixo e a execute na nova base de dados.\n\n```\nDECLARE @TABLENAME VARCHAR(8000) \nDECLARE @TABLENAME_HEADER VARCHAR(8000) \nDECLARE TNAMES_CURSOR CURSOR FOR \n \nSELECT [name] from [sys].[tables] \n \nOPEN TNAMES_CURSOR \n \tFETCH NEXT FROM TNAMES_CURSOR INTO @TABLENAME \n \t\tWHILE (@@FETCH_STATUS <> -1) \n \t\tBEGIN \n \t\t\tIF (@@FETCH_STATUS <> -2) \n \t\t\tBEGIN \n \t\t\tSELECT @TABLENAME_HEADER = 'ALTER TABLE ' + RTRIM(UPPER(@TABLENAME)) + ' NOCHECK CONSTRAINT ALL;' \n\t\t\t--Alterar o NOCHECK para CHECK para depois habilitar as constraints \n\t\t\tPRINT @TABLENAME_HEADER \n\t\tEND \n\tFETCH NEXT FROM TNAMES_CURSOR INTO @TABLENAME \nEND\n \nSELECT @TABLENAME_HEADER = '--************* Fim das Tabelas *************--' \nPRINT @TABLENAME_HEADER PRINT ' ' \nDEALLOCATE TNAMES_CURSOR\n```\n\n3. Copie o resultado e cole em uma janela de Nova Consulta e execute (na nova base de dados) usando o bando de dados **TOTVS Fluig Plataforma**.\n\n- Exclua o índice **CENTRAL\\_TC** que fica na tabela **TAR\\_CTRAL**. Para excluir o índice pelo SQL Studio:\n 1. Abra o **SQL Server Management Studio (SSMS)**.\n 2. Conecte-se ao servidor de banco de dados.\n 3. No painel do **Object Explorer**, localize a base de dados onde a tabela está armazenada.\n 4. Expanda a base de dados e navegue até a tabela chamada **TAL\\_CTRAL**.\n 5. Clique com o botão direito na tabela **TAL\\_CTRAL** e selecione a opção **Indexes**.\n 6. A lista de índices associados à tabela será exibida.\n 7. Identifique o índice **CENTRAL\\_TC**.\n 8. Clique com o botão direito sobre o índice selecionado e escolha a opção **Delete**.\n 9. Confirme a exclusão para apagar o índice atrelado à tabela.\n\n- Realize a importação dos dados a partir da base de dados antiga, com um assistente de importação e exportação de dados, por exemplo. Para o SGBD Microsoft SQL Server utilize o procedimento:\n 1. Clique com o botão direito do mouse sobre a nova base de dados.\n 2. No menu suspenso selecione a opção **Tarefas > Importar Dados...**\n 3. Na tela de apresentação do Assistente de Importação e Exportação do SQL Server clique no botão **Avançar >**.\n 4. No campo **Fonte** de dados selecione a opção **SQL Server Native Client** (ao final é exibido o número da versão, utilize a mesma equivalente à versão do serviço de banco de dados).\n 5. No campo **Nome** do servidor indique (digite ou selecione na caixa suspensa) o servidor e instância que possui a base de dados anterior (que deverá ser compatibilizada / normalizada).\n 6. No grupo **Autenticação** utilize o método que permite acesso a todos os dados desta base de dados anterior. É recomendado o uso de um usuário com permissão de **db\\_owner**.\n 7. Selecione ou digite, no campo **Banco de dados**, a base antiga e clique no botão **Avançar >**.\n 8. Na tela com título (para) **Escolher um Destino** devem vir preenchidos os campos com informações de acesso a esta nova base de dados. Se as informações estiverem incorretas ou incompletas, corrija-as, e clique no botão **Avançar >**.\n 9. A seguir na tela com título **Especificar Cópia** ou **Consulta de Tabela** selecione a opção **Copiar** dados de uma ou mais tabelas ou exibições e clique no botão **Avançar >**.\n 10. Na tela de título **Selecionar Tabelas** e **Exibições de Origem**, clique na primeira caixa de seleção que está nos títulos da listagem de **Tabelas e exibições**.\n 11. Com todos selecionados clique no botão **Editar Mapeamentos...**\n 12. Na caixa **Configurações de Transferência**marque a caixa de seleção **Habilitar inserção de identidade** e, então, no botão OK.\n\n Atenção!\n\n Não deixe de marcar esta opção para que não ocorram falhas na cópia dos dados.\n 13. Retornando à janela anterior, **Selecionar Tabelas** e **Exibições de Origem**, clique no botão **Avançar >**.\n 14. Na tela com título **Revisar Mapeamento** de **Tipo de Dados** clique no botão **Avançar**.\n 15. Na tela com título **Executar Pacote**marque a caixa de seleção **Executar imediatamente** e clique no botão **Avançar >**.\n 16. Na tela com título **Concluir Assistente**, após revisar as ações clique no botão **Avançar**.\n 17. Na tela a seguir de execução das ações ao final deve ser exibida a informação de que a importação foi realizada com sucesso.\n 18. Execute o *script* para habilitar as *constraints* que foram desativadas no **Passo 02**alterando de **NOCHECK** para **CHECK**.\n\n- Conferir procedimentos para o serviço/instância do SGBD Microsoft SQL Server, descritos na página [Configuração do banco de dados SQL Server](https://tdn.totvs.com/pages/viewpage.action?pageId=73078837), a partir da sessão **Configuração do banco**.\n\n- As configurações de agrupamento de caracteres (*Collate/Collation*) das bases de dados podem ser consultadas utilizando a instrução:\n\n```\nSELECT [name] , [is_read_committed_snapshot_on] , [collation_name] , suser_sname([owner_sid]) as 'owner'\nFROM [sys].[databases] \nWHERE [name] LIKE 'fluig%';\n```\n\nIMPORTANTE\n\n- Verificar o nome do proprietário (owner) do novo banco criado. Deverá ser o mesmo usuário a ser informado na instalação do **Fluig.**\n\n- Verificar o repasse das permissões de acesso aos devidos usuários na nova base de dados. Estas podem ter sido perdidas.\n\n- Instalar a **versão 1.5.13 (Última EP)** do **Fluig** e configurar para apontar para esta base de dados (**fluig**).\n\n- Inicializar o serviço **Fluig**, e acompanhar o LOG, para se certificar de que toda a inicialização foi bem sucedida, sem erros graves, como falha na conexão com o SGBD.\n\n- Retornar ao processo de conversão **TOTVS ECM 3.00 para TOTVS Fluig Plataforma** se for este o caso, ou então, realizar as validações desejadas e uso da nova instalação." }, { "metadata": { "title": "Migração e Conversão do Oracle ECM para plataforma TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=661871105", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Migração e Conversão do Oracle ECM para plataforma TOTVS Fluig.md" }, "content": "Migração e Conversão do Oracle ECM para plataforma TOTVS Fluig" }, { "metadata": { "title": "Migração e Conversão do Oracle ECM para plataforma TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=661871105", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Migração e Conversão do Oracle ECM para plataforma TOTVS Fluig.md" }, "content": "Migração e Conversão do Oracle ECM para plataforma TOTVS Fluig\n\n\n# Índice\n\n- 1 [Objetivo](#MigraçãoeConversãodoOracleECMparaplataformaTOTVSFluig-Objetivo)\n- 2 [Pré-requisitos](#MigraçãoeConversãodoOracleECMparaplataformaTOTVSFluig-Pré-requisitos)\n- 3 [Ferramentas Utilizadas](#MigraçãoeConversãodoOracleECMparaplataformaTOTVSFluig-FerramentasUtilizadas)\n- 4 [Procedimento de Migração e Conversão de Dados](#MigraçãoeConversãodoOracleECMparaplataformaTOTVSFluig-ProcedimentodeMigraçãoeConversãodeDados)\n\n**oculto**\n\n**Obs**: Liberar essa documentação após a liberação do oracle 19 e da issue FFDN-6298\n\n# Objetivo\n\n---\n\nO objetivo deste guia é indicar um método de migração dos dados de uma base do TOTVS ECM 3.00 para o Fluig Plataforma. Utilizando conjunto de caracteres padrão para base através do NLS\\_CHARACTERSET =  AL32UTF8, eliminando assim a necessidade de converter tabela por tabela.\n\n# Pré-requisitos\n\n---\n\n- Conhecimento em administração de banco de dados Oracle;\n- Conhecimento em ferramentas de UI/CLI Oracle.\n\n# Ferramentas Utilizadas\n\n---\n\n- Oracle Database 19C XE\n- SQL Plus\n- SQL Developer\n\n# Procedimento de Migração e Conversão de Dados\n\n---\n\nAtenção!\n\nEsta operação deve ocorrer antes da conversão de uma base TOTVS ECM para TOTVS Fluig Plataforma. Mesmo com a alteração do agrupamento padrão, os campos existentes permanecem incorretos, podendo assim, causar comportamentos inesperados na utilização da plataforma.\n\nAcompanhe a seguir o checklist para a conversão.\n\n- Gere um **DUMP** desta base de dados do **TOTVS ECM 3.00**, com toda estrutura de tabelas, campos e dados.\n- É necessário realizar alguns processos para que a exportação ocorra com sucesso, portanto, utilize o procedimento a seguir:\n\n**1)** Criar um diretório no sistema operacional para armazenar os arquivos exportados (Dumps), conforme exemplo abaixo: \n\n```\n$ mkdir -p /home/oracle/dumps/exp_dump\n```\n\n**2)** Logo em seguida, acesse a ferramenta **sqlplus**, com o seguinte comando: \n\n```\n$ sqlplus / as sysdba\n```\n\n**3)** Execute a instrução SQL abaixo, passando o caminho da pasta que você criou anteriormente:\n\n```\nSQL > CREATE OR REPLACE DIRECTORY exp_dumps AS ‘/home/oracle/dumps/exp_dump’;\n```\n\n**4)** Agora é necessário setar permissão para o usuário que vai realizar a exportação dos dados, para isso, utilize o comando abaixo:\n\n```\nSQL > GRANT READ, WRITE on directory exp_dumps TO seu_usuario;\n```\n\n**5)** Após setar as permissões, saia do SQL Plus com o comando “**exit**” e abra o SQL Developer, para realizarmos a exportação da base;\n\n**6)** Com o banco na ferramenta instalado e uma conexão já configurada, clique no menu **Exibir > DBA** e **selecione** sua conexão. Caso a conexão não apareça, clique no ícone “**+**” para selecionar uma nova:\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Exibir%20DBA.png)\n\n**7)** Em seguida, vá até a opção **Data Pump** > **Jobs de Exportação** > clique no botão**Ações** > **Assistente de Exportação do Data:**\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Assistente%20de%20Exporta%C3%A7%C3%A3o%20do%20Data.png)\n\n**8)** Após realizar os procedimentos mencionados até aqui e com a tela do **Assistente de Exportação do Data** aberta**,**basta seguir os passos abaixo em cada tópico:\n\n- **Origem**\n\n*-Dados ou DDL:* Dados e DDL  \n*-Tipos a serem exportados no Data Pump:* Tabelas\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Origem.png)\n\n- **Tabelas**\n\n-Selecione o esquema \n-Selecione todas as tabelas\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Tabelas.png)\n\n- **Dados da tabela**\n\n-Selecione todas as tabelas e campos\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Dados%20da%20Tabela.png)\n\n- **Opções**\n\n-**Ative o log** e selecione a pasta de **exportação de dumps** criada anteriormente\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Op%C3%A7%C3%B5es.png)\n\n- **Arquivos de Saída**\n\n-Selecione o diretório de exportação criado anteriormente; \n-Defina o nome do arquivo, recomendado usar o nome do schema; \n-Deixe marcado as opções: *Anexar Timestamp a nomes de Dump, Log e Job; Compactação; Ir para resumo.*\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Arquivo%20de%20sa%C3%ADda.png)\n\n- Confira o resumo e clique em **finalizar** para gerar o Dump\n\n Veja a imagem\n\n ![](..\\..\\..\\images\\Resumo.png)\n\n- Agora vamos configurar o banco de dados que irá receber os dados e a instalação do Fluig Plataforma.\n\n         Primeiramente, acesse a documentação de [configuração do banco de dados Oracle](../../Configuração/Configuração de Banco de Dados/Configuração do banco de dados Oracle.md) disponível no TDN , crie o usuário/schema + tablespace e realize as configurações necessárias para funcionamento da plataforma.\n\n- Após realizar as configurações indicadas no passo 2, crie uma conexão no SQL Developer para essa nova base, e acesse o Assistente de Importação do Data Pump na palheta **DBA** > **Data Pump** > **Jobs de Importação** > clique no botão **Ações** > **Assistente de Importação:**\n\n- **Tipo**\n\n-Dados e DDL \n-Tipo de importação: Tabelas \n-Escolha o diretório IMP\\_DUMPS criado anteriormente e insira o nome do arquivo de dump gerado.\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Imp%20-%201%20-%20Tipo.png)\n\n- **Filtrar**\n\n-Selecione todas as tabelas do schema desejado\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Imp%20-%202%20-%20Filtrar.png)\n\n- **Remapeamento**\n\n-**Remapear Esquemas***Origem:* Schema da base original \n*Destino:* Novo Schema\n\n-**Remapear Tablespaces**Mesma lógica dos esquemas\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Imp%20-%203%20-%20Remapeamento.png)\n\n- **Opções**\n\n-Clicar na opção **Ativar Log**-Selecione o diretório de importação e defina o nome do arquivo de log \n-Clicar em **Anexar Timestamp a nomes de Log e Job** e ****Ir para resumo.****\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Imp%20-%204%20-%20Op%C3%A7%C3%B5es.png)\n\n- **Resumo**\n\n-Confira os dados e clique em **finalizar** para executar o Job\n\nVeja a imagem\n\n![](..\\..\\..\\images\\Imp%20-%205%20-%20Resumo.png)\n\n- Instalar a versão **1.5.13** (Última EP) do Fluig e apontar a configuração para esta base de dados (fluig).\n\n- Inicializar o serviço Fluig, e acompanhar o LOG, para se certificar de que toda a inicialização foi bem sucedida. Caso apresente alguma inconsistência, como por exemplo, falha na conexão com a base de dados, basta seguir o passo 6.\n\n- Retornar ao processo de [c](Conversão TOTVS ECM para plataforma TOTVS Fluig.md)[onversão TOTVS ECM para plataforma TOTVS Fluig](Conversão TOTVS ECM para plataforma TOTVS Fluig.md) se for este o caso, ou então, realizar as validações desejadas e uso da nova instalação." }, { "metadata": { "title": "Conversão de Templates anteriores a versão 1.3.0", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=146969092", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Conversão TOTVS ECM para plataforma TOTVS Fluig\\Conversão de Templates anteriores a versão 1.3.0.md" }, "content": "Conversão de Templates anteriores a versão 1.3.0" }, { "metadata": { "title": "Conversão de Templates anteriores a versão 1.3.0", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=146969092", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Conversão\\Conversão TOTVS ECM para plataforma TOTVS Fluig\\Conversão de Templates anteriores a versão 1.3.0.md" }, "content": "Conversão de Templates anteriores a versão 1.3.0\n\n\n# Índice\n\n- 1 [Objetivo](#ConversãodeTemplatesanterioresaversão1.3.0-Objetivo)\n- 2 [Introdução](#ConversãodeTemplatesanterioresaversão1.3.0-Introdução)\n- 3 [Impactos gerais](#ConversãodeTemplatesanterioresaversão1.3.0-Impactosgerais)\n- 4 [Impactos nos códigos Java](#ConversãodeTemplatesanterioresaversão1.3.0-ImpactosnoscódigosJava)\n- 5 [Impactos nos arquivos físicos de template](#ConversãodeTemplatesanterioresaversão1.3.0-Impactosnosarquivosfísicosdetemplate)\n- 6 [Impactos na atualização 1.3.0](#ConversãodeTemplatesanterioresaversão1.3.0-Impactosnaatualização1.3.0)\n\n# Objetivo\n\nO objetivo deste guia é informar impactos, soluções e mudanças realizadas nos *templates* padrões de e-mail na versão 1.3.0. \n\n# Introdução\n\nOs códigos de templates de emails tiveram seus nomes alterados para facilitar a manutenção e para a padronização de nomenclatura.\n\n**Exemplo:** Um evento que se chamava APPROVE\\_TASK e tinha seu código de template TPL105, agora tem o código TPLAPPROVE\\_TASK. Repare que o padrão de nomenclatura é o prefixo TPL + (Código do evento).\n\nUm arquivo que se chamava TPL105-pt.html foi renomeado para TPLAPPROVE\\_TASK-pt.html Esse novo padrão facilitou a manutenção do template. Antes era necessário acessar o arquivo HTML para mapear qual o template que estava sendo alterado.\n\n# Impactos gerais\n\nForam alterados os códigos e os nomes dos arquivos físicos dos *templates* para o padrão do TOTVS Fluig Plataforma. Os códigos HTML dos *templates* foram alterados para seguir um padrão. Estas mudanças podem afetar clientes e aplicativos de terceiros que utilizam *templates* personalizados.\n\nNota\n\nEsta mudança afeta apenas os eventos padrão do Fluig Plataforma, ou seja, aqueles disponibilizados nativamente na plataforma. Eventos criados ou personalizados pelo cliente não são considerados padrão.\n\n# Impactos nos códigos Java\n\nAs funções que especificavam algum código de evento precisam ser alterados para o novo padrão.\n\n**Exemplo:** Um evento que se chamava APPROVE\\_TASK e tinha seu código de *template*TPL105, agora tem o código TPLAPPROVE\\_TASK. Repare que o padrão de nomenclatura é o prefixo TPL + (Código do evento).\n\nNota\n\nQuando não especificado o código ou ele não for encontrado a plataforma Fluig utiliza o *template* *default* de e-mail.\n\nExemplo de chamada Java para o evento APPROVE\\_TASK:\n\n```\nnotifier.notify(\"APPROVE_TASK\", \"TPL105\", parametros, destinatarios, \"text/html\");\n```\n\nImportante\n\nO envio de dados de formulario na primeira atividade, somente irá funcionar se utilizado os scripts beforeStateEntry e afterStateEntry.\n\nExemplo do novo padrão:\n\n```\nnotifier.notify(\"APPROVE_TASK\", \"TPLAPPROVE_TASK\", parametros, destinatarios, \"text/html\");\n```\n\nImportante\n\nO envio de dados de formulario na primeira atividade, somente irá funcionar se utilizado os scripts beforeStateEntry e afterStateEntry.\n\nEm caso de dúvidas sobre qual o novo código do *template*, [clique aqui para obter um arquivo Excel](https://tdn.totvs.com/download/attachments/146969092/Alteracao_templates.xlsx?version=1&modificationDate=1405102169000&api=v2) que mapeia os novos códigos com os antigos.\n\nObservação\n\nOs *templates* criados e personalizados pelo cliente, e que portanto não são eventos padrão do Fluig Plataforma, não foram afetados.\n\n# Impactos nos arquivos físicos de template\n\nOs arquivos de *template* padrão também tiveram seus nomes alterados. Os que usavam o *default* agora tem seu próprio *template* e com o seguinte padrão:\n\nUm arquivo que se chamava TPL105-pt.html do evento APPROVE\\_TASK foi renomeado para TPLAPPROVE\\_TASK-pt.html\n\nO evento APPROVE\\_TASK\\_RESPONSABLE, que não possuía nenhum *template* agora possui o TPLAPPROVE\\_TASK\\_RESPONSABLE-pt.html.\n\nObservação\n\nOs *templates* criados e personalizados pelo cliente, e que portanto não são eventos padrão do Fluig Plataforma, não foram afetados.\n\n# Impactos na atualização 1.3.0\n\nAo atualizar a instalação do Fluig Plataforma para a versão 1.3.0, os *templates* padrão são movidos da pasta tempaltes\\tpl (pasta padrão de *templates*) para a pasta templates\\tplmail\\_backup e os novos *templates* padrão da versão com novo padrão de nomenclatura são adicionados novamente. Portanto, se o cliente alterou algum arquivo físico de algum evento padrão, esse arquivo estará na pasta de *backup* e será necessário o cliente refazer a atualização do *template* do evento.\n\n**Exemplo:**\n\nSe o cliente, na versão anterior, alterou o para o evento CREATE\\_DOCUMENT o arquivo *default* de *template* para template\\_create\\_document-pt.html. O processo de atualização removerá este arquivo e no lugar colocará o novo arquivo padrão TPLCREATE\\_DOCUMENT-pt.html e moverá o arquivo template\\_create\\_document-pt.html para a pasta de *backup*.\n\nPara o usuário voltar a sua versão, é necessário apenas fazer atualizar o arquivo template\\_create\\_document-pt.html novamente.\n\nObservação\n\nOs *templates* criados e personalizados pelo cliente, e que portanto não são eventos padrão do Fluig Plataforma, não foram afetados." }, { "metadata": { "title": "Instalação da plataforma em Windows - Instalador", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622840", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma em Windows - Instalador.md" }, "content": "Instalação da plataforma em Windows - Instalador" }, { "metadata": { "title": "Instalação da plataforma em Windows - Instalador", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622840", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma em Windows - Instalador.md" }, "content": "Instalação da plataforma em Windows - Instalador\n\n\n- [Pré-requisitos](#InstalaçãodaplataformaemWindowsInstalador-Pré-requisitosrequisitos)\n- [Passo a passo para a instalação da plataforma](#InstalaçãodaplataformaemWindowsInstalador-Passoapassoparaainstalaçãodaplataforma)\n- [Inicialização da plataforma](#InstalaçãodaplataformaemWindowsInstalador-Inicializaçãodaplataforma)\n- [Primeiro acesso](#InstalaçãodaplataformaemWindowsInstalador-Primeiroacesso)\n\n# Pré-requisitos\n\n---\n\nAntes de iniciar uma instalação, certifique-se de que os procedimentos e requisitos abaixo foram preenchidos:\n\n- Leia atentamente o [Guia de instalação da plataforma](../Guia de instalação da plataforma.md).\n\n- Verifique se as configurações e especificações do servidor estão de acordo com os requisitos estipulados no [Dimensionamento](http://tdn.totvs.com/display/fluig/Dimensionamento) e na [Matriz de Portabilidade](http://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade).\n\n- Confirme se a base de dados da plataforma foi criada em um banco de dados homologado, conforme as orientações descritas em [Configuração de banco de dados MySQL](http://tdn.totvs.com/pages/viewpage.action?pageId=257623464), [SQL Server](http://tdn.totvs.com/pages/viewpage.action?pageId=257623499) ou [Oracle](http://tdn.totvs.com/pages/viewpage.action?pageId=257623480).\n\n# Passo a passo para a instalação da plataforma\n\n---\n\nA seguir, acompanhe o passo a passo para instalação da plataforma em Windows:\n\nAtenção!\n\nPor questões de segurança, orientamos não expor sua plataforma diretamente à internet. Para isso, será necessário [criar uma rede DMZ](http://tdn.totvs.com/x/MZIbCQ) juntamente com o [protocolo HTTPS](http://tdn.totvs.com/x/vdMgFQ).\n\n- Na primeira tela, o idioma da mídia de instalação deve ser selecionado.\n\n![](..\\..\\..\\images\\1.png)\n\n- Em **Termo de uso**, é exibido o contrato de licença do produto que contém os termos de uso, *copyright* e recomendações para a execução da instalação que deverão ser lidos atentamente.\n\n- Para prosseguir, assinale a opção **Eu concordo com este contrato de licença** e em seguida, clique em **Próximo**.\n\n![](..\\..\\..\\images\\Image%20002.png)\n\n- Em **Instalação do TOTVS Fluig**, informe se deverá ser realizada a instalação ou a atualização da plataforma.\n\n- Mantenha assinalada a opção **Instalar o TOTVS Fluig**.\n\n![](..\\..\\..\\images\\Image%20003.png)\n\nDica!\n\nSe ao invés de instalar um novo ambiente você deseja atualizar uma instalação existente, acesse o [Guia de atualização da plataforma](../Guia de atualização da plataforma.md).\n\n- Em **Diretório de instalação** informe o diretório destino da aplicação. Por padrão a pasta de instalação será chamada \"fluig\" e ficará armazenada na unidade em que o sistema operacional está instalado. Por exemplo: \"C:\\fluig\".\n\nImportante!\n\nNão é permitida a instalação da plataforma em pastas cujo nome contenha acentuações e/ou espaços.\n\n![](..\\..\\..\\images\\Image%20005.png)\n\n- Em **Dados do servidor** devem ser preenchidas as informações de acesso ao servidor Fluig.\n\n- O campo **Endereço IP** é preenchido automaticamente pelo instalador, porém confirme se este é o IP correto de acesso ao servidor, pois em um servidor com múltiplas interfaces de rede, a sugestão de endereço IP pode não ser a interface de rede principal.\n\n- **Porta:** porta do servidor que será utilizada para a execução da plataforma.\n\n- **URL pública**: endereço público pelo qual a plataforma pode ser acessada.\n\n![](..\\..\\..\\images\\Image%20006.png)\n\nNota:\n\nA plataforma não permite o uso do \"*localhost*\" no campo Endereço IP. Para ambientes focados exclusivamente em desenvolvimento sobre a plataforma ou treinamento, recomendamos o uso do endereço \"127.0.0.1\" ou o *hostname* do servidor.\n\n- Em **Banco de dados** selecione o banco mais adequado às suas necessidades.\n\nImportante!\n\nO sistema gerenciador do banco de dados deve estar instalado e o banco ou instância deve ter sido previamente criado, conforme os pré-requisitos listados no [início deste guia](https://tdn.totvs.com/pages/viewpage.action?pageId=257622840).\n\n![](..\\..\\..\\images\\Image%20007.png)\n\n- Nesta etapa informe os dados para conexão com o banco de dados.\n\n- Cada banco de dados possui uma configuração de conexão distinta, portanto confira abaixo as informações necessárias para cada um dos banco de dados e utilize o guia referente ao banco de dados selecionado anteriormente:\n\nImportante!\n\nPara o **banco de dados MySQL**, é necessário que a base seja criada conforme descrito em [Configuração de banco de dados MySQL](http://tdn.totvs.com/pages/viewpage.action?pageId=257623464).\n\nPara configurar a conexão com um banco de dados MySQL, é necessário informar os seguintes dados:\n\n- **Arquivo do Driver:** informe o caminho do driver MySQL. Para obter o driver do MySQL, consulte a página [Configuração de banco de dados MySQL](http://tdn.totvs.com/pages/viewpage.action?pageId=257623464#Configura%C3%A7%C3%A3odebancodedadosMySQL-1.6-DownloaddoDriver);\n\n- **Usuário:** usuário utilizado para conexão com o banco de dados;\n\n- **Senha:** senha do usuário utilizado para conexão com o banco de dados;\n\n- **Servidor:** endereço do servidor;\n\n- **Porta:** porta lógica do servidor;\n\n- **Banco:** nome do banco de dados.\n\n![](..\\..\\..\\images\\Image%20010.png)\n\nImportante!\n\nPara o **banco de dados SQL Server**, é necessário que a base seja criada conforme descrito em [Configuração do banco de dados SQL Server](http://tdn.totvs.com/pages/viewpage.action?pageId=257623499).\n\nPara configurar a conexão com um banco de dados Microsoft SQL Server, é necessário informar os seguintes dados:\n\n- **Usuário:** usuário utilizado para conexão com o banco de dados;\n\n- **Senha:** senha do usuário utilizado para conexão com o banco de dados;\n\n- **Servidor:** endereço do servidor;\n\n- **Porta:** porta lógica do servidor;\n\n- **Banco:** nome do banco de dados;\n\n- **Instância:** nome da instância do SQL Server.\n\n![](..\\..\\..\\images\\Image%20011.png)\n\nImportante!\n\nPara o **banco de dados Oracle**, é necessário realizar algumas configurações para inicialização da plataforma, conforme detalhes em [Configuração do banco de dados Oracle](http://tdn.totvs.com/pages/viewpage.action?pageId=257623480).\n\nPara um banco de dados Oracle é necessário informar os seguintes dados:\n\n- **Usuário:** usuário utilizado para conexão com o banco de dados;\n\n- **Senha:** senha do usuário utilizado para conexão com o banco de dados;\n\n- **Servidor:** endereço do servidor;\n\n- **Porta:** porta lógica do servidor;\n\n- **Banco:** SID (Oracle *System Identifier*) da instância do banco de dados.\n\n![](..\\..\\..\\images\\Image%2030.png)\n\n- Em **Configuração de e-mail** os campos não são obrigatórios. Poderão ser informados o endereço do **Servidor SMTP**, a **Porta SMTP** e o **E-mail do remetente** padrão para envio de notificações a respeito das ações tomadas na plataforma.\n\n- Caso o servidor SMTP exija autenticação é necessário assinalar a opção **Servidor exige autenticação** e informar um usuário e senha válido.\n\n![](..\\..\\..\\images\\Image%20012.png)\n\n- Em **Tipo de licenciamento** escolha a opção mais adequada para seu ambiente.\n\n![](..\\..\\..\\images\\Image%20013.png)\n\n- Nesta etapa são oferecidas duas opções de licenciamento. Cada uma é configurada de forma diferente na plataforma.\n\n- Clique nas opções abaixo e verifique.\n\nEm **Servidor de licenças**, informe o endereço do **Servidor de licenças** e **Porta do servidor de licenças** para que a plataforma seja habilitada para uso. Esta configuração é válida para todas as empresas cadastradas. Os valores preenchidos podem ser editados após a instalação pelo painel administrativo da plataforma.\n\nImportante!\n\nOs valores preenchidos automaticamente pelo instalador são apenas uma sugestão e não apontam necessariamente para um servidor de licenças válido.\n\nClientes *cloud* devem abrir um *ticket* para a Equipe de atendimento Cloud TOTVS solicitando alteração do *License Server*.\n\n![](..\\..\\..\\images\\Image%20015.png)\n\nO**Fluig Identity Partner** é um novo modelo de licenciamento que utiliza o TOTVS Identity na nuvem para controlar o acesso à plataforma. Para que clientes atuais e novos utilizem o modo License Server.\n\nSua configuração é realizada após acessar a plataforma, utilizando um usuário com perfil de administrador.\n\n- Em **Servidor *Realtime***, assinale a opção **Habilitar *Realtime***, se desejado.\n\n- Se a opção acima for assinalada, informe o **IP/Nome do servidor**, a **Porta pública** e a **Porta interna**.\n\n- O mesmo servidor utilizado para a instalação da plataforma pode ser utilizado para a configuração do *Realtime*, basta informar o endereço IP preenchido no passo 5.\n\nNota:\n\nO Servidor *Realtime* é responsável por atualizar a [Central de notificações](http://tdn.totvs.com/pages/viewpage.action?pageId=233763951) do usuário, sem que seja necessário atualizar toda a página da plataforma.\n\n![](..\\..\\..\\images\\Image%20016.png)\n\n- Em **Servidor de indexação** é possível configurar o servidor que será utilizado no processo de indexação dos documentos do repositório. Informar a **URL** do servidor.\n\n![](..\\..\\..\\images\\Image%20017.png)\n\n- Neste passo o instalador informa os pacotes do sistema que serão instalados.\n\n- Em seguida, o instalador irá verificar a compatibilidade dos componentes de software existente no servidor e prepara a instalação com os dados informados anteriormente.\n\n![](..\\..\\..\\images\\Image%20020.png)\n\n- Os arquivos serão copiados para a pasta destino da instalação.\n\n![](..\\..\\..\\images\\Image%20021.png)\n\n- Nesse passo o instalador exibe a execução dos processos externos e um relatório sobre a instalação do produto. O sistema será registrado como um serviço do Microsoft Windows.\n\n![](..\\..\\..\\images\\Image%20024.png)\n\n- A instalação da plataforma é concluída com sucesso. Clique em **Ok** e, depois, em **Sair** para encerrar.\n\nImportante!\n\nPor questões de segurança, é altamente recomendável efetuar a encriptação da senha conforme o procedimento informado [nesta documentação](../../Configuração/Configuração de Banco de Dados/Encriptação de senha do banco de dados.md).\n\n![](..\\..\\..\\images\\Image%20025.png)\n\n# Inicialização da plataforma\n\n---\n\nO Fluig será instalado como um serviço no Microsoft Windows. Para iniciar ou interromper a aplicação, acesse a partir do Menu Iniciar: **Painel de Controle** → **Ferramentas Administrativas** → **Serviços**.\n\n![](..\\..\\..\\images\\23.png)\n\nAntes de iniciar os serviços do Fluig, é necessário alterar o usuário de inicialização. Os serviços fluig\\_Indexer, fluig\\_RealTime e fluig devem ser inicializados, nesta ordem, por um usuário que tenha privilégios de administrador no servidor onde fluig foi instalado. Para isso, siga os seguintes passos:\n\n**01.** Clique com o botão direito do mouse sobre um dos serviços do Fluig;\n\n**02.** Selecione a opção **Propriedades**;\n\n**03.** Selecione a aba **Logon** no topo da janela;\n\n**04.** Selecione a opção **Esta conta** e informe um usuário com privilégios administrativos no servidor.\n\nEsse procedimento deve ser realizado nos três serviços do Fluig. Uma vez concluída a configuração, inicie o fluig\\_Indexer, o fluig\\_RealTime e o fluig, nesta ordem.\n\n![](..\\..\\..\\images\\Propriedades%20do%20servi%C3%A7o.gif)\n\nPara acompanhar o processo de inicialização, acesse a pasta de instalação da plataforma, navegue até o diretório [diretório\\_instalação]\\appserver\\standalone\\log (a partir da **2.0**) ou [diretório\\_instalação]\\appserver\\domain\\servers\\fluig1\\log (até a **1.8.2**) e consulte o arquivo **server.log**. Quando a inicialização estiver concluída, a seguinte mensagem será exibida neste arquivo:\n\n```\nINFO [com.fluig.startup.service.FluigStartupBean] (EJB TIMER - 10) == Fluig is up and running right now. ==\n```\n\n# Primeiro acesso\n\n---\n\nPara informações sobre os próximos passos, que envolvem o primeiro acesso à plataforma, acesse a documentação [Primeiro acesso após a instalação da plataforma](Primeiro acesso após a instalação da plataforma.md)." }, { "metadata": { "title": "Instalação da plataforma no Linux - Instalador", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622802", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma no Linux - Instalador.md" }, "content": "Instalação da plataforma no Linux - Instalador" }, { "metadata": { "title": "Instalação da plataforma no Linux - Instalador", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=257622802", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma no Linux - Instalador.md" }, "content": "Instalação da plataforma no Linux - Instalador\n\n\n- [Pré-requisitos](#InstalaçãodaplataformanoLinuxInstalador-Pré-requisitosrequisitos)\n- [Distribuições homologadas](#InstalaçãodaplataformanoLinuxInstalador-Distribuiçõeshomologadas)\n- [Passo a passo para a instalação da plataforma](#InstalaçãodaplataformanoLinuxInstalador-Passoapassoparaainstalaçãodaplataforma)\n- [Exceção Firewall](#InstalaçãodaplataformanoLinuxInstalador-ExceçãoFirewall)\n- [Inicialização](#InstalaçãodaplataformanoLinuxInstalador-Inicializaçãoinicializacao)\n- [Primeiro acesso](#InstalaçãodaplataformanoLinuxInstalador-Primeiroacesso)\n\n# Pré-requisitos\n\n---\n\nAntes de iniciar uma instalação, certifique-se de que os procedimentos e requisitos abaixo foram preenchidos:\n\n- Leia atentamente o [Guia de instalação da plataforma](../Guia de instalação da plataforma.md).\n\n- Verifique se as configurações e especificações do servidor estão de acordo com os requisitos estipulados no [Dimensionamento](http://tdn.totvs.com/display/fluig/Dimensionamento) e na [Matriz de Portabilidade](http://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade).\n\n- Confirme se a base de dados foi criada em um banco de dados homologado, conforme as orientações descritas em [Configuração de banco de dados MySQL](http://tdn.totvs.com/pages/viewpage.action?pageId=257623464), [SQL Server](http://tdn.totvs.com/pages/viewpage.action?pageId=257623499) ou [Oracle](http://tdn.totvs.com/pages/viewpage.action?pageId=257623480).\n\n- Conheça as orientações listadas no documento [Configurações sugeridas em ambientes Linux.](http://tdn.totvs.com/pages/viewpage.action?pageId=242389225)\n\n- É obrigatório que a instalação da plataforma seja realizada utilizando o usuário **root** ou um usuário que tenha os privilégios de instalação de pacotes e alteração de serviços.\n\nImportante!\n\nÉ necessário que o usuário utilizado para iniciar o serviço do Fluig seja o mesmo usuário proprietário (owner) da pasta de instalação.\n\n- Para realizar a instalação, será necessário possuir um gerenciador de interface gráfica ativo no Linux. Para instalações em modo caractere, acesse [Instalação Linux - Modo Caractere](Instalação da plataforma no Linux - Instalador/Instalação Linux - Modo Caractere.md).\n\n- Ter instalado o pacote *unzip* para descompactação de arquivos.\n\n# Distribuições homologadas\n\n---\n\nAs distribuições Linux homologadas para a plataforma TOTVS Fluig podem ser consultadas na [Matriz de Portabilidade](../../Especificações Técnicas/Matriz de Portabilidade.md).\n\nOrientação de segurança\n\nPor motivos de segurança recomendamos que, após a instalação da plataforma em ambientes Linux, seja retirado o usuário como root seguindo o processo na documentação [Configurar ambiente Linux para não utilizar o usuário root](http://tdn.totvs.com/x/v2cWGw).\n\n# Passo a passo para a instalação da plataforma\n\n---\n\nAtenção!\n\nPor questões de segurança orientamos não expor sua plataforma diretamente à internet. Para isso, será necessário [criar uma rede DMZ](http://tdn.totvs.com/x/MZIbCQ) juntamente com o [protocolo HTTPS](http://tdn.totvs.com/x/vdMgFQ).\n\nAbra o terminal do sistema operacional e execute o seguinte comando:\n\n```\n$ sudo bash fluig-installer-64.sh\n```\n\nEm seguida, acompanhe o passo a passo para instalação gráfica do Fluig em Linux:\n\n- Na primeira tela, o idioma da mídia de instalação deve ser selecionado.\n\n![](..\\..\\..\\images\\passo1.png)\n\n- Em **Termo de uso** é exibido o contrato de licença do produto que contém os termos de uso, *copyright* e recomendações para a execução da instalação que deverão ser lidos atentamente.\n\n- Para prosseguir, assinale a opção **Eu concordo com este contrato de licença** e em seguida, clique em **Próximo**.\n\n![](..\\..\\..\\images\\passo2.png)\n\n- Em **Instalação do TOTVS Fluig** informe se deverá ser realizada a instalação ou atualização da plataforma.\n\n- Mantenha assinalada a opção **Instalar o TOTVS Fluig**.\n\n![](..\\..\\..\\images\\passo3.png)\n\n- Em **Diretório de instalação** informe o diretório destino da aplicação. Por padrão a pasta de instalação será chamada \"fluig\" e ficará armazenada na unidade em que o sistema operacional está instalado. Por exemplo: \"/opt/fluig\".\n\nImportante!\n\nNão é permitida a instalação da plataforma em pastas cujo nome contenha acentuações e/ou espaços.\n\n![](..\\..\\..\\images\\passo4.png)\n\n- Em **Dados do servidor** devem ser preenchidas as informações de acesso ao servidor Fluig.\n\n- O campo **Endereço IP** é preenchido automaticamente pelo instalador, porém confirme se este é o IP correto de acesso ao servidor, pois em um servidor com múltiplas interfaces de rede, a sugestão de endereço IP pode não ser a interface de rede principal.\n\n- **Porta:** porta do servidor que será utilizada para a execução da plataforma.\n\n- **URL pública**: endereço público pelo qual a plataforma pode ser acessada.\n\n![](..\\..\\..\\images\\passo5.png)\n\nA plataforma não permite o uso do \"*localhost*\" no campo Endereço IP. Para ambientes focados exclusivamente em desenvolvimento sobre a plataforma ou treinamento, recomendamos o uso do endereço \"127.0.0.1\" ou o *hostname* do servidor.\n\n- Em **Banco de dados** selecione o banco mais adequado às suas necessidades.\n\nImportante!\n\nO sistema gerenciador do banco de dados deve estar instalado e o banco ou instância deve ter sido previamente criado, conforme os pré-requisitos listados no [início deste guia](https://tdn.totvs.com/pages/viewpage.action?pageId=257622802).\n\n![](..\\..\\..\\images\\passo6.png)\n\n- Nesta etapa informe os dados para conexão com o banco de dados.\n\n- Cada banco de dados possui uma configuração de conexão distinta, portanto confira abaixo as informações necessárias para cada um dos banco de dados e utilize o guia referente ao banco de dados selecionado anteriormente:\n\nImportante!\n\nPara o **banco de dados MySQL**, é necessário que a base seja criada conforme descrito em [Configuração de banco de dados MySQL](http://tdn.totvs.com/pages/viewpage.action?pageId=257623464);\n\n Para configurar a conexão com um banco de dados MySQL, é necessário informar os seguintes dados:\n\n- **Arquivo do Driver:** informe o caminho do driver MySQL. Para obter o driver do MySQL, consulte a página [Configuração de banco de dados MySQL](http://tdn.totvs.com/pages/viewpage.action?pageId=257623464#ConfiguraçãodebancodedadosMySQL-DownloaddoDriver);\n\n- **Usuário:** usuário utilizado para conexão com o banco de dados;\n\n- **Senha:** senha do usuário utilizado para conexão com o banco de dados;\n\n- **Servidor:** endereço do servidor;\n\n- **Porta:** porta lógica do servidor;\n\n- **Banco:** nome do banco de dados.\n\n![](..\\..\\..\\images\\passo7-mysql.png)\n\nImportante!\n\nPara o **banco de dados SQL Server**, é necessário que a base seja criada conforme descrito em [Configuração do banco de dados SQL Server](http://tdn.totvs.com/pages/viewpage.action?pageId=257623499).\n\nPara configurar a conexão com um banco de dados Microsoft SQL Server, é necessário informar os seguintes dados:\n\n- **Usuário:** usuário utilizado para conexão com o banco de dados;\n\n- **Senha:** senha do usuário utilizado para conexão com o banco de dados;\n\n- **Servidor:** endereço do servidor;\n\n- **Porta:** porta lógica do servidor;\n\n- **Banco:** nome do banco de dados;\n\n- **Instância:** nome da instância do SQL Server.\n\n![](..\\..\\..\\images\\passo7-sqlserver.png)\n\nImportante!\n\nPara o **banco de dados Oracle**, é necessário realizar algumas configurações para inicialização da plataforma, conforme detalhes em [Configuração do banco de dados Oracle](http://tdn.totvs.com/pages/viewpage.action?pageId=257623480).\n\nPara um banco de dados Oracle é necessário informar os seguintes dados:\n\n- **Usuário:** usuário utilizado para conexão com o banco de dados;\n\n- **Senha:** senha do usuário utilizado para conexão com o banco de dados;\n\n- **Servidor:** endereço do servidor;\n\n- **Porta:** porta lógica do servidor;\n\n- **Banco:** SID (Oracle *System Identifier*) da instância do banco de dados.\n\n![](..\\..\\..\\images\\passo7-oracle.png)\n\n- Em **Configuração de *e-mail*** os campos não são obrigatórios. Poderão ser informados o endereço do **Servidor SMTP**, a **Porta SMTP** e o ***E-mail* do remetente** padrão para envio de notificações a respeito das ações tomadas no Fluig.\n\n- Caso o servidor SMTP exija autenticação é necessário assinalar a opção **Servidor exige autenticação** e informar um usuário e senha válidos.\n\n![](..\\..\\..\\images\\passo8.png)\n\n- Em **Tipo de licenciamento** escolha a opção mais adequada para seu ambiente.\n\n![](..\\..\\..\\images\\passo9.png)\n\n- Nesta etapa são oferecidas duas opções de licenciamento. Cada uma é configurada de forma diferente na plataforma.\n\n- Clique nas opções abaixo e verifique.\n\nEm **Servidor de licenças** informe o endereço do **Servidor de licenças** e **Porta do servidor de licenças**, para que a plataforma seja habilitada para uso. Esta configuração é válida para todas as empresas cadastradas. Os valores preenchidos podem ser editamos após a instalação através do painel administrativo da plataforma.\n\nImportante!\n\nOs valores preenchidos automaticamente pelo instalador são apenas uma sugestão e não apontam necessariamente para um servidor de licenças válido.\n\nClientes Cloud devem abrir um ticket para a Equipe de Atendimento Cloud TOTVS solicitando alteração do License Server.\n\n![](..\\..\\..\\images\\passo9-servidor-licen%C3%A7a.png)\n\nO**Fluig Identity Partner** é um modelo de licenciamento que utiliza o TOTVS Identity na nuvem para controlar o acesso à plataforma. Para que clientes atuais e novos utilizem o modo License Server.\n\nSua configuração é realizada após acessar a plataforma, utilizando um usuário com perfil de administrador.\n\n- Em **Servidor *Realtime***, assinale a opção **Habilitar *Realtime***, se desejado.\n\n- Se a opção acima for assinalada, informe o **IP/Nome do servidor**, a **Porta pública** e a **Porta interna**.\n\n- O mesmo servidor utilizado para a instalação da plataforma pode ser utilizado para a configuração do *chat*, basta informar o endereço IP preenchido no passo 5.\n\nNota:\n\nO Servidor de Chat é responsável por atualizar a [Central de notificações](http://tdn.totvs.com/pages/viewpage.action?pageId=233763951) do usuário, sem que seja necessário atualizar toda a página da plataforma.\n\n![](..\\..\\..\\images\\passo10.png)\n\n- Na tela configuração **Servidor de indexação** é possível configurar o servidor que será utilizado no processo de indexação dos documentos do repositório. Informar a **URL** do servidor.\n\n![](..\\..\\..\\images\\passo11.png)\n\n- Neste passo o instalador informa os pacotes do sistema que serão instalados.\n\n- Em seguida, o instalador irá verificar a compatibilidade dos componentes de software existente no servidor e preparar a instalação com os dados informados anteriormente.\n\n![](..\\..\\..\\images\\passo13.png)\n\n- Os arquivos serão copiados para a pasta destino da instalação.\n\n![](..\\..\\..\\images\\passo14.png)\n\n- Nesse passo o instalador exibe a execução dos processos externos e um relatório sobre a instalação do produto. O sistema será registrado como um serviço do Microsoft Windows.\n\n![](..\\..\\..\\images\\passo15.png)\n\nImportante!\n\nAlgumas distribuições Linux não possuem o comando **chkconfig**, o que gera um alerta informando que o comando não foi encontrado durante a execução dos processos externos da instalação. Caso isto ocorra, clique em **Sim** na caixa de diálogo aberta para continuar com o processo de instalação.\n\n- A instalação da plataforma é concluída com sucesso. Clique em **Ok** e, depois, em **Sair** para encerrar.\n\nImportante!\n\nPor questões de segurança é altamente recomendável efetuar a encriptação da senha conforme o procedimento informado [nesta documentação](../../Configuração/Configuração de Banco de Dados/Encriptação de senha do banco de dados.md).\n\n![](..\\..\\..\\images\\passo16.png)\n\nImportante!\n\nNão se esqueça de revisar as orientações apresentadas na página de [Configurações sugeridas em ambientes Linux.](http://tdn.totvs.com/pages/viewpage.action?pageId=242389225)\n\n# Exceção Firewall\n\n---\n\nCaso o servidor onde a plataforma foi instalada possua *firewall* ativo é necessário adicionar exceções para as seguintes portas utilizadas pela plataforma:\n\n- Porta do Servidor de Aplicação do Fluig;\n- Porta do Servidor para RealTime;\n- Porta do Servidor de Chat.\n\n# Inicialização\n\n---\n\nOs procedimentos de inicialização estão disponíveis na página [Inicializar Fluig - Linux](Instalação da plataforma no Linux - Instalador/Inicializar Fluig - Linux.md).\n\n# Primeiro acesso\n\n---\n\nPara informações sobre os próximos passos, que envolvem o primeiro acesso à plataforma, acesse a documentação [Primeiro acesso após a instalação da plataforma](Primeiro acesso após a instalação da plataforma.md).\n\nDica\n\nPara informações sobre utilização da plataforma, acesse o [Guia rápido da plataforma](../../Sobre a plataforma/Guia rápido da plataforma.md), acompanhe os primeiros passos e se familiarize com o produto!" }, { "metadata": { "title": "Primeiro acesso após a instalação da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=431678598", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Primeiro acesso após a instalação da plataforma.md" }, "content": "Primeiro acesso após a instalação da plataforma\n\n\n# Índice\n\n- 1 [Pré-requisitos](#Primeiroacessoapósainstalaçãodaplataforma-Pré-requisitos)\n- 2 [Primeiro acesso](#Primeiroacessoapósainstalaçãodaplataforma-Primeiroacesso)\n - 2.1 [Login](#Primeiroacessoapósainstalaçãodaplataforma-Login)\n - 2.2 [Criação da empresa](#Primeiroacessoapósainstalaçãodaplataforma-Criaçãodaempresa)\n - 2.3 [Criação do volume](#Primeiroacessoapósainstalaçãodaplataforma-Criaçãodovolume)\n - 2.4 [Acessar como administrador](#Primeiroacessoapósainstalaçãodaplataforma-Acessarcomoadministrador)\n\n# Pré-requisitos\n\n---\n\nO administrador da plataforma precisa ter concluído os passos do Guia de Instalação ([Windows](Instalação da plataforma em Windows - Instalador.md) ou [Linux](Instalação da plataforma no Linux - Instalador.md)).\n\n# Primeiro acesso\n\n---\n\nPara efetuar o primeiro acesso e iniciar as primeiras configurações da plataforma, siga as etapas abaixo:\n\n## Login\n\n---\n\nPara acessar a plataforma através de um navegador, é preciso informar o endereço: **:/portal**.\n\nNo campo Login informe **wcmadmin**e no campo Senha informe a senha padrão **adm****.**Por questões de segurança, é recomendável alterar esta senha após o primeiro acesso.\n\nAtenção!\n\nPara alterar a senha, siga o passo a passo descrito no help [Editar perfil](https://tdn.totvs.com/pages/viewpage.action?pageId=233762774).\n\n![](..\\..\\..\\images\\Primeiro%20acesso%20165.png)\n\n## Criação da empresa\n\n---\n\nNessa etapa, com o usuário wcmadmin deve ser realizada a criação e a configuração da empresa, a partir da qual serão definidas as características principais na plataforma, tais como seu administrador, volume, etc.\n\nPara fazer essa configuração, no Painel de Controle localize o agrupador **WCM** e acione a opção **Empresas**. As instruções para criação da empresa podem ser conferidas no help [Adicionar empresa](https://tdn.totvs.com/pages/viewpage.action?pageId=235597350).\n\n## Criação do volume" }, { "metadata": { "title": "Primeiro acesso após a instalação da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=431678598", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Primeiro acesso após a instalação da plataforma.md" }, "content": "Primeiro acesso após a instalação da plataforma\n\n\n---\n\nNessa etapa, ainda com o usuário wcmadmin, deve ser realizada a criação do(s) volume(s). A plataforma permite que os documentos publicados sejam armazenados em volumes diferentes, objetivando a melhor distribuição dos documentos físicos.\n\nPara fazer essa configuração, no Painel de Controle localize o agrupador **Gerais**e acione a opção **Volumes**. As instruções para configuração dos volumes podem ser conferidas no help [Adicionar volume](https://tdn.totvs.com/pages/viewpage.action?pageId=233766796).\n\nAtenção!\n\nÉ importante aguardar a criação dos itens. Aguarde pelo menos 5 minutos antes de prosseguir.\n\n## Acessar como administrador\n\n---\n\nApós seguir as etapas anteriores, acesse a plataforma com o usuário administrador definido na etapa de criação da empresa.\n\nDica!\n\nPara mais informações sobre a plataforma e seus recursos, acesse o [Guia rápido da plataforma](../../Sobre a plataforma/Guia rápido da plataforma.md) e assista aos treinamentos do [Fluig Academy](https://academy.fluig.com/course/index.php?categoryid=3&browse=courses).\n\nPrecisa de ajuda?\n\nAcesse a **Central de ajuda** da plataforma clicando no ícone **Assistente**![](..\\..\\..\\images\\assistente-ia.png) – localizado no lado superior direito do cabeçalho – e, em seguida, clicando na aba **Central de ajuda** para obter informações específicas sobre os recursos, além de *links* com documentações relacionadas. [Saiba mais](http://tdn.totvs.com/x/ZMhSDg)." }, { "metadata": { "title": "Instalação Windows - Modo Caractere", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=274325941", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma em Windows - Instalador\\Instalação Windows - Modo Caractere.md" }, "content": "Instalação Windows - Modo Caractere" }, { "metadata": { "title": "Instalação Windows - Modo Caractere", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=274325941", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma em Windows - Instalador\\Instalação Windows - Modo Caractere.md" }, "content": "Instalação Windows - Modo Caractere\n\n\n- [Objetivo](#InstalaçãoWindowsModoCaractere-Objetivo)\n- [Pré-requisitos](#InstalaçãoWindowsModoCaractere-Pré-requisitos)\n- [Pacote de instalação](#InstalaçãoWindowsModoCaractere-Pacotedeinstalação)\n- [Passo a passo para a instalação da plataforma](#InstalaçãoWindowsModoCaractere-Passoapassoparaainstalaçãodaplataforma)\n- [Passo a passo para instalar somente o Servidor de indexação](#InstalaçãoWindowsModoCaractere-PassoapassoparainstalarsomenteoServidordeindexação)\n- [Passo a passo para instalar somente o RealTime](#InstalaçãoWindowsModoCaractere-PassoapassoparainstalarsomenteoRealTime)\n- [Atualização dos módulos](#InstalaçãoWindowsModoCaractere-Atualizaçãodosmódulos)\n- [Exceção Firewall](#InstalaçãoWindowsModoCaractere-ExceçãoFirewall)\n- [Primeiro acesso](#InstalaçãoWindowsModoCaractere-Primeiroacesso)\n\n# Objetivo\n\n---\n\nInformar como é realizada a instalação de módulos específicos da plataforma no Windows como o do Fluig, Servidor de indexação (Solr) e RealTime (nodejs), em modo caractere.\n\n# Pré-requisitos\n\n---\n\nAntes de iniciar uma instalação, certifique-se de que os procedimentos e requisitos abaixo foram preenchidos:\n\n- Leia atentamente o [Guia de instalação da plataforma](../../Guia de instalação da plataforma.md).\n\n- Verifique se as configurações e especificações do servidor estão de acordo com os requisitos estipulados no [Dimensionamento](http://tdn.totvs.com/display/fluig/Dimensionamento) e na [Matriz de Portabilidade](http://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade).\n\n- Confirme se a base de dados foi criada em um banco de dados homologado, conforme as orientações descritas em [Configuração de banco de dados MySQL](http://tdn.totvs.com/pages/viewpage.action?pageId=257623464), [SQL Server](http://tdn.totvs.com/pages/viewpage.action?pageId=257623499) ou [Oracle](http://tdn.totvs.com/pages/viewpage.action?pageId=257623480).\n\n- É obrigatório que a instalação do(s) módulo(s) seja realizada utilizando o usuário **administrador** ou um usuário que tenha permissões de instalação e alteração de serviços.\n\n# Pacote de instalação\n\n---\n\n**01.** Para fazer *download* do pacote de instalação, acesse a [Central do cliente](http://suporte.totvs.com), conforme descrito na documentação [Como fazer para obter a plataforma](../../../Sobre a plataforma/Como fazer para obter a plataforma.md).\n\n**02.** Descompacte o instalador da plataforma no diretório desejado.\n\n**03. Pronto!** Agora você já pode executar os comandos para instalação da plataforma.\n\n# Passo a passo para a instalação da plataforma\n\n---\n\nMovimente-se nas abas abaixo e acompanhe o passo a passo de instalação:\n\nAtenção!\n\nPor questões de segurança, orientamos não expor sua plataforma diretamente à internet. Para isso, será necessário [criar uma rede DMZ](http://tdn.totvs.com/x/MZIbCQ) juntamente com o [protocolo HTTPS](http://tdn.totvs.com/x/vdMgFQ).\n\nNota:\n\nSe você já possui um arquivo de configuração (install.conf) previamente configurado, pode seguir diretamente para o passo 2.\n\nSe a instalação for realizada de forma completa, ou seja, com todos os módulos no mesmo servidor de aplicação, não será necessário executar os procedimentos [Passo a passo para instalar somente o Servidor de indexação](https://tdn.totvs.com/pages/viewpage.action?pageId=274325941) e [Passo a passo para instalar somente o RealTime](https://tdn.totvs.com/pages/viewpage.action?pageId=274325941).\n\n- Abra o **Prompt de comandos** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\njava -cp fluig-installer.jar com.fluig.install.ExecuteInstall\n```\n\n- A execução do comando irá gerar o arquivo de configurações **install.conf** conforme imagem abaixo:\n\n![](..\\..\\..\\..\\images\\Image%2024.jpg)\n\n**Figura 1 - Arquivo install.conf gerado**\n\n- Edite o arquivo **install.conf** alterando as variáveis para atender as configurações desejadas para a instalação do produto.\n\nImportante!\n\nQuando informar o diretório onde a plataforma será instalada, no parâmetro INSTALL\\_PATH, deve-se usar duas contrabarras (\\\\) como separador de pastas.\n\nSe o **Servidor de indexação** não for instalado neste momento juntamente com o Fluig, o parâmetro **install.solr** deve ser igual a **false**. Ao optar por instalar, além de alterar o valor do parâmetro **install.solr** para **true,** deve-se informar também o **diretório** de instalação do **JDK** como valor no parâmetro ****solr.jdk****, na condição de estar instalado. Caso o valor do parâmetro permanecer em branco, o **JDK** será instalado automaticamente.\n\nSe o **nodejs** não for instalado neste momento juntamente com o Fuig, o parâmetro **install.node** deve ser igual **false**.\n\n- Se o arquivo de configuração (install.conf) já existe e está em um diretório diferente, passe como parâmetro o caminho absoluto do arquivo de configuração:\n\n```\njava -cp fluig-installer.jar com.fluig.install.ExecuteInstall \\install.conf\n```\n\n- **Pronto!** Ao finalizar a instalação no Console, os **serviços do Fluig** estarão pronto para serem iniciados.\n\n# Passo a passo para instalar somente o Servidor de indexação\n\n---\n\nSiga os passos abaixo para a instalação:\n\nNota:\n\nSe você já possui um arquivo de configuração (install.conf) previamente configurado, pode seguir diretamente para o passo 2.\n\n- Abra o **Prompt de comandos** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\njava -cp fluig-installer.jar com.fluig.install.ExecuteInstall solr\n```\n\n- A execução do comando irá gerar o arquivo de configurações **install.conf**.\n\n- Edite o arquivo **install.conf** alterando as variáveis para atender as configurações desejadas para a instalação do produto.\n\nImportante!\n\nQuando informar o diretório onde o **Solr** será instalado, no parâmetro INSTALL\\_PATH, deve-se usar duas contrabarras (\\\\) como separador de pastas.\n\nPara que o **Servidor de indexação** seja instalado neste momento, o parâmetro **install.solr** deve ter o valor **true**. Também é necessário alterar o valor do parâmetro **solr.remote** se a instalação será feita para/em ambiente remoto e **solr.cloud** se a instalação será feita para/em ambiente *cloud*.\n\nSe já houver uma instalação do **JDK**, o seu caminho/diretório deve ser informado como valor no parâmetro **solr.jdk**. Se o valor do parâmetro permanecer em branco o JDK será instalado automaticamente.\n\n- Se o arquivo de configuração (install.conf) já existe e está em um diretório diferente, passe como parâmetro o **caminho absoluto** do arquivo de configuração executando o comando abaixo:\n\n```\njava -cp fluig-installer.jar com.fluig.install.ExecuteInstall solr \\install.conf\n```\n\n- **Pronto!** Ao finalizar a instalação no Prompt de Comandos, o serviço do **Servidor de indexação** estará pronto para ser iniciado.\n\nDica!\n\nSe desejar configurar **alta disponibilidade (*Cluster*)**, continue a instalação conforme os procedimentos descritos na documentação [Servidor de indexação em alta disponibilidade](../../../Configuração/Configuração de Ambiente/Servidor de indexação dedicado/Servidor de indexação em alta disponibilidade.md).\n\n# Passo a passo para instalar somente o RealTime\n\n---\n\nPara realizar a instalação, siga os passos abaixo:\n\nNota:\n\nSe você já possui um arquivo de configuração (install.conf) previamente configurado, pode seguir diretamente para o passo 2.\n\n- Abra o **Prompt de comandos** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\njava -cp fluig-installer.jar com.fluig.install.ExecuteInstall nodejs\n```\n\n- A execução do comando irá gerar o arquivo de configurações **install.conf**.\n\n- Edite o arquivo **install.conf** alterando as variáveis para atender as configurações desejadas para a instalação do produto.\n\nImportante!\n\nQuando informar o diretório onde o **nodejs** será instalado, no parâmetro INSTALL\\_PATH, deve-se usar duas contrabarras (\\\\) como separador de pastas.\n\nPara o **nodejs** ser instalado neste momento, o parâmetro **install.node** deve ter o valor **true**.\n\n- Se o arquivo de configuração (install.conf) já existe e está em um diretório diferente, passe como parâmetro o caminho absoluto do arquivo de configuração executando o comando abaixo:\n\n```\njava -cp fluig-installer.jar com.fluig.install.ExecuteInstall nodejs \\install.conf\n```\n\n- **Pronto!** Ao finalizar a instalação no Prompt de Comandos, o serviço do **RealTime** estará pronto para ser iniciado.\n\n# Atualização dos módulos\n\n---\n\nAs instruções para realizar o atualização dos serviços do Fluig estão informados abaixo:\n\n- Abra o **Prompt de comandos** no diretório onde o pacote de instalação foi descompactado e execute o comando abaixo. Se o Fluig foi instalado de forma completa ou seja, com todos os módulos, não será necessário atualizar os módulos Servidor de indexação e RealTime separadamente, sendo preciso apenas executar este comando:\n\n```\njava -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate \n```\n\n- Abra o **Prompt de comandos** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\njava -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate solr \n```\n\n- Abra o **Prompt de comandos** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\njava -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate nodejs \n```\n\n# Exceção Firewall\n\n---\n\nCaso o servidor onde a plataforma foi instalada possua *firewall* ativo é necessário adicionar exceções para as seguintes portas utilizadas pela plataforma:\n\n- Porta do Servidor de Aplicação;\n- Porta do Servidor para RealTime;\n- Porta do Servidor de Chat.\n\n# Primeiro acesso\n\n---\n\nPara informações sobre os próximos passos, que envolvem o primeiro acesso à plataforma, acesse a documentação [Primeiro acesso após a instalação da plataforma](../Primeiro acesso após a instalação da plataforma.md)." }, { "metadata": { "title": "Configurações sugeridas em ambientes Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=242389225", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma no Linux - Instalador\\Configurações sugeridas em ambientes Linux.md" }, "content": "Configurações sugeridas em ambientes Linux" }, { "metadata": { "title": "Configurações sugeridas em ambientes Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=242389225", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma no Linux - Instalador\\Configurações sugeridas em ambientes Linux.md" }, "content": "Configurações sugeridas em ambientes Linux\n\n\n# Índice\n\n- 1 [Introdução](#ConfiguraçõessugeridasemambientesLinux-Introdução)\n- 2 [Pré requisitos](#ConfiguraçõessugeridasemambientesLinux-Prérequisitos)\n- 3 [Configuração do host local](#ConfiguraçõessugeridasemambientesLinux-Configuraçãodohostlocal)\n- 4 [Limite de arquivos abertos](#ConfiguraçõessugeridasemambientesLinux-Limitedearquivosabertos)\n - 4.1 [Sistemas de Arquivos](#ConfiguraçõessugeridasemambientesLinux-SistemasdeArquivos)\n- 5 [Ajuste de processos e arquivos abertos para Fluig Indexer (Solr)](#ConfiguraçõessugeridasemambientesLinux-AjustedeprocessosearquivosabertosparaFluigIndexer(Solr))\n- 6 [Codificação de caracteres do sistema](#ConfiguraçõessugeridasemambientesLinux-Codificaçãodecaracteresdosistema)\n- 7 [Desabilitar SELinux](#ConfiguraçõessugeridasemambientesLinux-DesabilitarSELinux)\n- 8 [Configurações MySQL](#ConfiguraçõessugeridasemambientesLinux-ConfiguraçõesMySQL)\n- 9 [Usuário para inicialização do serviço do Fluig](#ConfiguraçõessugeridasemambientesLinux-UsuárioparainicializaçãodoserviçodoFluig)\n\n# Introdução\n\n---\n\nNesta página são listadas configurações do sistema operacional que podem afetar a experiência de uso da plataforma. Os comandos abaixo são compatíveis com distribuições baseadas no Red Hat Enterprise Linux.\n\nImportante!\n\nPor questões de segurança orientamos não expor sua plataforma diretamente à internet. Para isso, será necessário [criar uma rede DMZ](http://tdn.totvs.com/x/MZIbCQ) juntamente com o [protocolo HTTPS](http://tdn.totvs.com/x/vdMgFQ).\n\n# Pré requisitos\n\n---\n\n- Conhecimento em Linux.\n\n# Configuração do host local\n\n---\n\nEm alguns casos, de acordo com a configuração padrão da distribuição ou a instalação realizada, o servidor pode não resolver o nome do próprio *host* corretamente. Para evitar problemas, inclua o *hostname* do servidor no arquivo **/etc/hosts** apontando para o endereço IP local do servidor.\n\n**/etc/hosts**\n\n```\n10.11.12.130\tproducao.fluig.com\n```\n\n# Limite de arquivos abertos\n\n---\n\nO limite padrão de algumas distribuições Linux é de 1024 arquivos abertos. Porém, a plataforma pode ultrapassar com certa facilidade esse limite devido ao processamento paralelo realizado durante o uso do servidor de aplicação.\n\nOs arquivos abertos são a quantidade de descritores para um recurso alocado para um processo. Os recursos alocados podem ser arquivos no sistema operacional ou outros recursos como, por exemplo, conexões de rede.\n\nNo caso da plataforma, temos os arquivos temporários, conexões aos clientes que fizeram a requisição (navegador), conexões de rede para os serviços dos quais depende (banco de dados, LDAP, consultas a serviços externos), arquivos do volume e outros recurso sob controle da JVM, como arquivos JAR carregados no *classpath* e utilizado nos *classloaders*.\n\nEsse número não é limitado e pode variar, por isso você deve ajustar o limite máximo se estiver passando do valor configurado atualmente.\n\nPara aumentar o limite de arquivos execute o comando abaixo:\n\n```\n echo \"fs.file-max=65536\" >> /etc/sysctl.conf\n sysctl -p\n```\n\nMais informações: [RedHat](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Tuning_and_Optimizing_Red_Hat_Enterprise_Linux_for_Oracle_9i_and_10g_Databases/chap-Oracle_9i_and_10g_Tuning_Guide-Setting_File_Handles.html)." }, { "metadata": { "title": "Configurações sugeridas em ambientes Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=242389225", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma no Linux - Instalador\\Configurações sugeridas em ambientes Linux.md" }, "content": "Configurações sugeridas em ambientes Linux\n\n## Sistemas de Arquivos" }, { "metadata": { "title": "Configurações sugeridas em ambientes Linux", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=242389225", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma no Linux - Instalador\\Configurações sugeridas em ambientes Linux.md" }, "content": "Configurações sugeridas em ambientes Linux\n\n\n---\n\nRecomendamos o uso do **sistema de arquivos Ext4**, pois ele não tem um limite de subdiretórios imediatos dentro de um único diretório.\n\n# Ajuste de processos e arquivos abertos para Fluig Indexer (Solr)\n\n---\n\nA partir da atualização 1.7.0, a plataforma passa a funcionar sobre a versão embarcada [**openJDK 11**](https://adoptopenjdk.net/). Por este motivo as mensagens de alerta, abaixo citadas, referentes ao serviço Fluig Indexer (SOLR) durante a inicialização do Fluig, podem ser exibidas.\n\n**Solr warnings**\n\n```\nStarting Node server ... done\n*** [WARN] *** Your open file limit is currently 1024. \nIt should be set to 65000 to avoid operational disruption. \nIf you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh\n*** [WARN] *** Your Max Processes Limit is currently 62191. \nIt should be set to 65000 to avoid operational disruption. \nIf you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh\nWaiting up to 180 seconds to see Solr running on port 8983 [\\] \nStarted Solr server on port 8983 (pid=54541). Happy searching!\n```\n\nTrata-se de variáveis de ambiente Linux utilizadas para definir um limite de arquivos aberto e um número máximo de processos rodando.\n\nO valores default no Linux para estas variáveis não são os ideais para alta performance do Fluig Indexer (Solr), por isso são sugeridos os valores desejáveis nestas mensagens.\n\nPara realizar essa configuração, é necessário editar o arquivo /etc/security/limits.conf, e ao final dele inserir os seguintes valores:\n\n**/etc/security/limits.conf**\n\n```\nsolr soft nofile 65000\n\nsolr hard nofile 65000\n\nsolr soft nproc 65000\n\nsolr hard nproc 65000\n```\n\nApós a configuração e o reinício do servidor a mensagem não será mais exibida no log da plataforma.\n\n# Codificação de caracteres do sistema\n\n---\n\nPara evitar problemas no armazenamento de formulários por conta da codificação de caracteres do sistema, certifique-se de que a variável LC\\_ALL está configurada. Isso pode ser feito inserindo a variável LC\\_ALL na variáveis do usuário.\n\nInclua no *script* de inicialização mais adequado (.bashrc, .bash\\_profile, /etc/environment, etc...) a linha abaixo:\n\n```\n export LC_ALL=en_US.utf8\n```\n\n# Desabilitar SELinux\n\n---\n\nO SELinux é uma ferramenta de segurança desenvolvida pela NSA para proteger informações do governo americano e é ativada por padrão em algumas distribuições. Em contrapartida à segurança oferecida, o nível de detalhe para configuração do SELinux é muito grande.\n\nPor conta disso, em ambientes onde não há um administrador com experiência na ferramenta, é sugerida a configuração no modo *Permissive*, através do procedimento abaixo:\n\n- Edite o arquivo /etc/selinux/config;\n\n- Na linha que declara o valor SELINUX, altere para SELINUX=permissive;\n\n- Reinicie o sistema operacional.\n\nMais informações: [RedHat](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-Working_with_SELinux-Changing_SELinux_Modes.html#sect-Security-Enhanced_Linux-Enabling_and_Disabling_SELinux-Permissive_Mode)\n\n# Configurações MySQL\n\n---\n\nPara maiores informações sobre como configurar o banco de dados MySQL em um ambiente Linux, acesse [Configuração do banco de dados MySQL.](http://tdn.totvs.com/x/qAVbDw)\n\n# Usuário para inicialização do serviço do Fluig\n\n---\n\nA instalação do Fluig deve ser realizado com o usuário root. Porém, deve ser utilizado um usuário comum para inicialização do serviço do Fluig. Acesse [Configurar ambiente Linux para não utilizar o usuário root](../../../Configuração/Configuração de Ambiente/Configurar ambiente Linux para não utilizar o usuário root.md) para mais detalhes." }, { "metadata": { "title": "Inicializar Fluig - Linux", "source": "https://tdn.totvs.com/display/fluig/Inicializar+Fluig+-+Linux", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma no Linux - Instalador\\Inicializar Fluig - Linux.md" }, "content": "Inicializar Fluig - Linux\n\n\n# Índice\n\n- 1 [Inicialização](#InicializarFluigLinux-Inicialização)\n- 2 [Pré requisitos](#InicializarFluigLinux-Prérequisitos)\n - 2.1 [Servidor de Indexação](#InicializarFluigLinux-ServidordeIndexação)\n - 2.2 [RealTime](#InicializarFluigLinux-RealTime)\n - 2.3 [Fluig](#InicializarFluigLinux-Fluig)\n\n# Inicialização\n\n---\n\nA inicialização da plataforma depende do correto funcionamento de alguns serviços antes da inicialização do servidor de aplicação. Para iniciar o Fluig execute os comandos na ordem: fluig\\_Indexer, fluig\\_RealTime e fluig.\n\n# Pré requisitos\n\n---\n\n- Para realizar os comandos abaixo é necessário acessar o Console do servidor onde fica instalado o Fluig e seus módulos.\n\nAtenção!\n\nSe desejar saber o status do serviço, no caso de ter dúvidas sobre sua inicialização, pode-se executar o seguinte comando:\n\n```\nservice [nome do serviço] status\n```\n\n## Servidor de Indexação\n\n---\n\nPara **iniciar** o Indexer, utilize:\n\n```\nservice fluig_Indexer start\n```\n\nou\n\n```\nsystemctl start fluig_Indexer\n```\n\nSe o serviço não estiver disponível, utilize:\n\n```\n/etc/init.d/fluig_Indexer start\n```\n\nPara **parar** o serviço do Indexer execute:\n\n```\nservice fluig_Indexer stop\n```\n\n## RealTime\n\n---\n\nPara **iniciar** o RealTime, utilize:\n\n```\nservice fluig_RealTime start\n```\n\nou\n\n```\nsystemctl start fluig_Realtime\n```\n\nSe o serviço não estiver disponível, utilize:\n\n```\ncd /node/bin/\n./node ws_server.js > /dev/null 2>&1 &\n```\n\nPara **parar** o serviço do RealTime execute:\n\n```\nservice fluig_RealTime stop\n```\n\n## Fluig" }, { "metadata": { "title": "Inicializar Fluig - Linux", "source": "https://tdn.totvs.com/display/fluig/Inicializar+Fluig+-+Linux", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma no Linux - Instalador\\Inicializar Fluig - Linux.md" }, "content": "Inicializar Fluig - Linux\n\n\n---\n\nÉ necessário que o usuário utilizado para iniciar o serviço do Fluig seja o mesmo usuário proprietário *(owner)* da pasta de instalação.\n\nPara **iniciar** o Fluig, utilize:\n\n```\nservice fluig start\n```\n\nou\n\n```\nsystemctl start fluig\n```\n\nSe o serviço não estiver disponível, utilize:\n\n```\nsh /appserver/bin/standalone.sh &\n```\n\n```\nsh /appserver/bin/domain.sh &\n```\n\nPara **parar** o serviço do Fluig execute:\n\n```\nservice fluig stop\n```\n\nPara **acompanhar o processo de inicialização**, acesse a pasta de instalação do Fluig, navegue até o diretório [diretório\\_instalação]\\appserver\\standalone\\log (a partir da **2.0**) ou [diretório\\_instalação]\\appserver\\domain\\servers\\fluig1\\log (**1.6 até 1.8.2**) e consulte o arquivo **server.log**. Quando a inicialização estiver concluída, a seguinte mensagem será exibida neste arquivo:\n\n```\nINFO [com.fluig.startup.service.FluigStartupBean] (EJB TIMER - 10) == Fluig is up and running right now. ==\n```\n\nDica\n\nPara informações sobre acesso e utilização da plataforma, acesse o [Guia rápido da plataforma](../../../Sobre a plataforma/Guia rápido da plataforma.md), acompanhe os primeiro passos e se familiarize com a plataforma." }, { "metadata": { "title": "Instalação Linux - Modo Caractere", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=152797808", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma no Linux - Instalador\\Instalação Linux - Modo Caractere.md" }, "content": "Instalação Linux - Modo Caractere" }, { "metadata": { "title": "Instalação Linux - Modo Caractere", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=152797808", "path": "\\Plataforma Documentação técnica\\Instalação e Atualização\\Guia de instalação da plataforma\\Instalação da plataforma no Linux - Instalador\\Instalação Linux - Modo Caractere.md" }, "content": "Instalação Linux - Modo Caractere\n\n\n# Índice\n\n- 1 [Objetivo](#InstalaçãoLinuxModoCaractere-Objetivo)\n- 2 [Pré-requisitos](#InstalaçãoLinuxModoCaractere-Pré-requisitos)\n- 3 [Distribuições homologadas](#InstalaçãoLinuxModoCaractere-Distribuiçõeshomologadas)\n- 4 [Pacote de Instalação](#InstalaçãoLinuxModoCaractere-PacotedeInstalação)\n- 5 [Passo a passo para a instalação da plataforma](#InstalaçãoLinuxModoCaractere-Passoapassoparaainstalaçãodaplataforma)\n- 6 [Passo a passo para instalar somente o Servidor de indexação](#InstalaçãoLinuxModoCaractere-PassoapassoparainstalarsomenteoServidordeindexação)\n- 7 [Passo a passo para instalar somente o RealTime](#InstalaçãoLinuxModoCaractere-PassoapassoparainstalarsomenteoRealTime)\n- 8 [Atualização dos Módulos](#InstalaçãoLinuxModoCaractere-AtualizaçãodosMódulos)\n- 9 [Exceção Firewall](#InstalaçãoLinuxModoCaractere-ExceçãoFirewall)\n- 10 [Inicialização](#InstalaçãoLinuxModoCaractere-Inicialização)\n\n# Objetivo\n\n---\n\nInformar como é realizada a instalação de módulos específicos da plataforma no Linux como o do Fluig, Servidor de indexação (Solr) e RealTime (nodejs), em modo caractere.\n\nOrientação de segurança\n\nPor motivos de segurança recomendamos que após a instalação do TOTVS Fluig Plataforma em ambientes Linux, seja retirado o usuário como root seguindo o processo na documentação [Configurar ambiente Linux para não utilizar o usuário root](http://tdn.totvs.com/x/v2cWGw).\n\n# Pré-requisitos\n\n---\n\nAntes de iniciar uma instalação, certifique-se de que os procedimentos e requisitos abaixo foram preenchidos:\n\n- Leia atentamente o [Guia de instalação da plataforma](../../Guia de instalação da plataforma.md)\n- Verifique se as configurações e especificações do servidor estão de acordo com os requisitos estipulados no [Dimensionamento](http://tdn.totvs.com/display/fluig/Dimensionamento) e na [Matriz de Portabilidade](http://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade).\n- Confirme se a base de dados foi criada em um banco de dados homologado, conforme as orientações descritas em [Configuração de banco de dados MySQL](http://tdn.totvs.com/pages/viewpage.action?pageId=257623464), [SQL Server](http://tdn.totvs.com/pages/viewpage.action?pageId=257623499) ou [Oracle](http://tdn.totvs.com/pages/viewpage.action?pageId=257623480).\n- Conheça as orientações listadas no documento [Configurações sugeridas em ambientes Linux.](http://tdn.totvs.com/pages/viewpage.action?pageId=242389225)\n- É obrigatório que a instalação do(s) módulo(s) seja realizada utilizando o usuário **root** ou um usuário que tenha os privilégios de instalação de pacotes e alteração de serviços.\n- Ter instalado o pacote unzip para descompactação de arquivos.\n- Ao utilizar o Fluig em ambiente Linux, é necessário que a biblioteca **fontconfig** (ou **libfontconfig1**, dependendo da distribuição) esteja instalada.\n\n# Distribuições homologadas\n\n---\n\nAs distribuições Linux homologadas para a plataforma TOTVS Fluig podem ser consultadas na [Matriz de Portabilidade](http://tdn.totvs.com/display/fluig/Matriz+de+Portabilidade)\n\n# Pacote de Instalação\n\n---\n\n1. Para fazer download do pacote de instalação acesse o [Portal do Cliente](http://suporte.fluig.com/), conforme descrito na documentação [Como fazer para obter a plataforma](../../../Sobre a plataforma/Como fazer para obter a plataforma.md);\n2. Descompacte o instalador da plataforma no diretório desejado;\n3. **Pronto!** Agora você já pode executar os comandos para instalação da plataforma.\n\n# Passo a passo para a instalação da plataforma\n\n---\n\nMovimente-se nas abas abaixo e acompanhe o passo a passo de instalação.\n\nImportante!\n\nPor questões de segurança orientamos não expor sua plataforma diretamente à internet. Para isso, será necessário [criar uma rede DMZ](http://tdn.totvs.com/x/MZIbCQ) juntamente com o [protocolo HTTPS](http://tdn.totvs.com/x/vdMgFQ).\n\nObservação\n\nSe você já possui um arquivo de configuração (install.conf) previamente configurado, pode seguir diretamente para o passo 2.\n\nSe a instalação for realizada de forma completa, ou seja, com todos os módulos no mesmo servidor de aplicação, não será necessário executar os procedimentos [Passo a passo para instalar somente o Servidor de indexação](https://tdn.totvs.com/pages/viewpage.action?pageId=152797808) e [Passo a passo para instalar somente o RealTime](https://tdn.totvs.com/pages/viewpage.action?pageId=152797808).\n\n- Abra o **Console** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.install.ExecuteInstall\n```\n\n- A execução do comando irá gerar o arquivo de configurações **install.conf.**\n\n- Edite o arquivo **install.conf** alterando as variáveis para atender as configurações desejadas para a instalação do produto.\n\nAtenção!\n\nQuando informar o diretório onde a plataforma será instalada, no parâmetro INSTALL\\_PATH, deve-se usar uma barra (/) como separador de pastas.\n\nSe o **Servidor de indexação** não for instalado neste momento juntamente com o Fluig, o parâmetro **install.solr** deve ser igual a **false**. Ao optar por instalar, além de alterar o valor do parâmetro **install.solr** para **true,** deve-se informar também o **diretório** de instalação do **JDK** como valor no parâmetro ****solr.jdk****, na condição de estar instalado. Caso o valor do parâmetro permanecer em branco o **JDK** será instalado automaticamente.\n\nSe o **nodejs** não for instalado neste momento juntamente com o fuig, o parâmetro **install.node** deve ser igual **false**.\n\n- Se o arquivo de configuração (install.conf) já existe e está em um diretório diferente, passe como parâmetro no o **caminho absoluto** do arquivo de configuração (install.conf). Isso significa que, em deve ser incluído o caminho onde o arquivo de configuração está salvo:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.install.ExecuteInstall \\install.conf\n```\n\n- **Pronto!** Ao finalizar a instalação no Console, os **serviços do Fluig** estarão pronto para serem iniciados.\n\n# Passo a passo para instalar somente o Servidor de indexação\n\n---\n\nSiga os passos abaixo para a instalação:\n\nObservação\n\nSe você já possui um arquivo de configuração (install.conf) previamente configurado, pode seguir diretamente para o passo 2.\n\n- Abra o **Console** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.install.ExecuteInstall solr\n```\n\n- A execução do comando irá gerar o arquivo de configurações **install.conf**.\n\n- Edite o arquivo **install.conf** alterando as variáveis para atender as configurações desejadas para a instalação do produto.\n\nAtenção!\n\nQuando informar o diretório onde o **solr** será instalado, no parâmetro INSTALL\\_PATH, deve-se usar uma barra (/) como separador de pastas.\n\nPara o **Servidor de indexação** ser instalado neste momento, o parâmetro **install.solr** deve ter o valor **true**. Também é necessário alterar o valor do parâmetro **solr.remote** se a instalação será feita para/em ambiente remoto e **solr.cloud** se a instalação será feita para/em ambiente cloud.\n\nSe já houver uma instalação do **JDK**, o seu caminho/diretório deve ser informado como valor no parâmetro **solr.jdk**. Se o valor do parâmetro permanecer em branco o JDK será instalado automaticamente.\n\n- Se o arquivo de configuração (install.conf) já existe e está em um diretório diferente, passe como parâmetro no o **caminho absoluto** do arquivo de configuração (install.conf). Isso significa que, em deve ser incluído o caminho onde o arquivo de configuração está salvo:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.install.ExecuteInstall solr \\install.conf\n```\n\n- **Pronto!** Ao finalizar a instalação no Console, o serviço do **Servidor de indexação** estará pronto para ser iniciado.\n\nDica!\n\nSe desejar configurar **alta disponibilidade (*Cluster*)**, continue a instalação conforme os procedimentos descritos na documentação [Servidor de indexação em alta disponibilidade](../../../Configuração/Configuração de Ambiente/Servidor de indexação dedicado/Servidor de indexação em alta disponibilidade.md).\n\n# Passo a passo para instalar somente o RealTime\n\n---\n\nPara realizar a instalação, siga os passos abaixo:\n\nObservação\n\nSe você já possui um arquivo de configuração (install.conf) previamente configurado, pode seguir diretamente para o passo 2.\n\n- Abra o **Console** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.install.ExecuteInstall nodejs\n```\n\n- A execução do comando irá gerar o arquivo de configurações **install.conf**.\n\n- Edite o arquivo **install.conf** alterando as variáveis para atender as configurações desejadas para a instalação do produto.\n\nAtenção!\n\nQuando informar o diretório onde o **nodejs** será instalado, no parâmetro INSTALL\\_PATH, deve-se usar uma barra (/) como separador de pastas.\n\nPara o **nodejs** ser instalado neste momento, o parâmetro **install.node** deve ter o valor **true**.\n\n- Se o arquivo de configuração (install.conf) já existe e está em um diretório diferente, passe como parâmetro no o **caminho absoluto** do arquivo de configuração (install.conf). Isso significa que, em deve ser incluído o caminho onde o arquivo de configuração está salvo:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.install.ExecuteInstall nodejs \\install.conf\n```\n\n- **Pronto!** Ao finalizar a instalação no Console, o serviço do **RealTime** estará pronto para ser iniciado.\n\n# Atualização dos Módulos\n\n---\n\nAs instruções para realizar o atualização dos serviços do Fluig estão informados abaixo:\n\n- Abra o **Console** no diretório onde o pacote de instalação foi descompactado e execute o comando abaixo. Se o Fluig foi instalado de forma completa ou seja, com todos os módulos, não será necessário atualizar os módulos Servidor de indexação e RealTime separadamente, sendo preciso apenas executar este comando:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate \n```\n\n- - Abra o **Console** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate solr \n```\n\n- - Abra o **Console** no diretório onde o pacote de instalação foi descompactado e execute o comando:\n\n```\n./jdk-64/bin/java -cp fluig-installer.jar com.fluig.wcm.update.FluigUpdate nodejs \n```\n\n# Exceção Firewall\n\n---\n\nCaso o servidor onde a plataforma foi instalada possua *firewall* ativo é necessário adicionar exceções para as seguintes portas utilizadas pela plataforma:\n\n- Porta do Servidor de Aplicação do Fluig;\n- Porta do Servidor para RealTime;\n- Porta do Servidor de Chat.\n\n# Inicialização\n\n---\n\nOs procedimentos de inicialização estão disponíveis na página [Inicializar Fluig - Linux](Inicializar Fluig - Linux.md).\n\nDica!\n\nPara informações sobre acesso e utilização da plataforma, acesse o [Guia rápido da plataforma](../../../Sobre a plataforma/Guia rápido da plataforma.md), acompanhe os primeiros passos e se familiarize com o produto!" }, { "metadata": { "title": "Universo TOTVS 2024", "source": "https://tdn.totvs.com/display/fluig/Universo+TOTVS+2024", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024.md" }, "content": "Universo TOTVS 2024\n\n\n---\n\n![Universo TOTVS GIF](..\\..\\images\\GIFuniverso-TOTVS.gif)\n\n## Participe dos nossos webinars, com apresentações que foram destaque no Universo TOTVS 2024.\n\n## Inscreva-se agora clicando no tema de seu interesse.\n\n[Empodere\nas áreas de negócio da sua empresa: desburocratizando a criação de processos](https://www.meetup.com/pt-BR/totvsdevelopers/events/301976812/)\n\n[Simplifique\na gestão de senhas e MFA com o TOTVS Identity](https://www.meetup.com/pt-BR/totvsdevelopers/events/301976328/)\n\n[Do\nTradicional ao Inovador: Como o TOTVS Fluig pode Transformar a Experiência de Cadastros](https://www.meetup.com/pt-BR/totvsdevelopers/events/301984827/)\n\n[Smartlink\nno TOTVS iPaaS: integração de ERPs sem a necessidade de APIs](https://www.meetup.com/pt-BR/totvsdevelopers/events/302197527/)\n\n[Técnicas\npara dar mais segurança à sua Plataforma Fluig: 5 dicas práticas](https://www.meetup.com/pt-BR/totvsdevelopers/events/302797423/)\n\n[Autonomia\nfacilitada: Gestão integrada de tarefas e solicitações no TOTVS Collab](https://www.meetup.com/pt-BR/totvsdevelopers/events/302798370/)\n\n[10 dicas para Tunnar seu Fluig, melhorando desempenho e estabilidade](https://www.meetup.com/totvsdevelopers/events/303717454/)\n\n[Conheça melhorias para facilitar seu dia a dia com o novo app TOTVS Fluig](https://www.meetup.com/pt-BR/totvsdevelopers/events/303717588/)" }, { "metadata": { "title": "Universo TOTVS 2025", "source": "https://tdn.totvs.com/display/fluig/Universo+TOTVS+2025", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025.md" }, "content": "Universo TOTVS 2025\n\n\n![Universo TOTVS GIF](..\\..\\images\\imagem-2025-06-09-235834817.png)\n\n## Apresentações que foram destaque no Universo TOTVS 2025.\n\n## Acesse agora o material de apoio das palestras.\n\n[5 dicas práticas para dar mais segurança ao TOTVS Fluig](https://www.meetup.com/pt-BR/totvsdevelopers/events/302797423/)\n\n[10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade](https://www.meetup.com/totvsdevelopers/events/303717454/)" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n\n![Universo TOTVS GIF](..\\..\\..\\images\\GIFuniverso-TOTVS.gif)\n\n## Palestrantes\n\n![Palestrante 1 - Juliano](..\\..\\..\\images\\Captura-de-tela-2024-06-17-164711.png)\n\nJuliano Gontarski\n\n![Palestrante 2 - Silvano](..\\..\\..\\images\\Captura-de-tela-2024-06-17-164908.png)\n\nSilvano Rocha\n\n**Apresentação:** [10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade](/download/attachments/847892744/10%20dicas%20para%20turbinar%20seu%20TOTVS%20Fluig%2C%20melhorando%20desempenho%20e%20estabilidade.pdf?version=1&modificationDate=1719324107364&api=v2)\n\nNesta página, compilaremos alguns pontos importantes para otimizar a entrega do serviço Fluig, passando por dicas de infraestrutura e também revisando alguns pontos de Desenvolimentos. \n Vamos revisar alguns fatores, parâmetros e diretrizes que podem transformar a jornada com o Fluig em uma viagem tranquila, minimizando imprevistos com ações simples e eficientes\n\n# 1 Saindo das configurações padrão\n\n### Pequenos ajustes para sair ‘da caixinha’\n\n## **Algumas Configurações básicas costumam ficar esquecidas:**" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n\n- ## **Quantidade de Conexões do Fluig com o Banco de Dados (FluigDS, FluigDSRO e Customs)**\n\n Não existe uma configuração padrão para o número de conexões com o banco pois cada forma de uso da Plataforma pode demandar mais ou menos conexões, mas para sair da caixinha - ou sair das configurações padrão do instalador - pode-se ajustar inicialmente o **max-pool-size** para 300 em cada um dos Datasources. \n \n Para casos onde a demanda de uso é grande, pode ser necessário um ajuste fino nestes parâmetros, ou ainda considerar um crescimento horizontal da Infraestrutura. Falaremos sobre Load Balance mais à frente. \n \n O TOTVS Fluig por padrão tem configurados no arquivo domain.xml 3 Datasources para atender às diversas necessidades operacionais. Sendo eles **FluigDS** e **FluigDSRO** de uso exclusivo da Plataforma e **AppDS** que é voltado para uso em customizados. Abaixo um exemplo de configuração sugerida para estes Datasources:\n\n**FluigDS - domain.xml**\n\n```\n \n jdbc:mysql://localhost:3306/fluig_mysql?useSSL=false&nullDatabaseMeansCurrent=true\n mysqlDriver\n TRANSACTION_READ_COMMITTED\n \n 10\n 300\n ...\n \n```\n\n**FluigDSRO - domain.xml**\n\n```\n \n jdbc:mysql://localhost:3306/fluig_mysql?useSSL=false&nullDatabaseMeansCurrent=true\n mysqlDriver\n TRANSACTION_READ_COMMITTED\n \n 5\n 300\n...\n \n```\n\n**AppDS - domain.xml**\n\n```\n\n        jdbc:mysql://localhost:3306/fluig_mysql?useSSL=false&nullDatabaseMeansCurrent=true\n mysqlDriver\n TRANSACTION_READ_COMMITTED\n \n 5\n 300\n...\n \n```\n\n           O arquivo domain.xml pode ser encontrado no seguinte caminho***: \\appserver\\domain\\configuration\\domain.xml.*** A quantidade máxima de conexões pode ser ajustada no parâmetro ****.\n\nSempre realize um Backup do arquivo domain.xml antes de realizar alterações. \nAs alterações serão aplicadas somente após a reinicialização da Plataforma.\n\n- ## **Adequação das Filas Assíncronas**\n\nTal como no Banco de Dados, não existe uma configuração padrão para as Filas Assíncronas da Plataforma. Entretanto, alguns ajustes simples podem trazer uma melhor entrega do serviço sem um aumento considerável no consumo de recursos do servidor; \nAbaixo, listo uma **sugestão** de parametrização que costuma atender a maioria dos casos de forma satisfatória:\n\n**Filas Assíncronas - domain.xml**\n\n```\n \t \n \n \n \n \n \n \n \n \n \n \n```\n\nO arquivo domain.xml pode ser encontrado no seguinte caminho*: **\\appserver\\domain\\configuration\\domain.xml**.*Sempre realize um Backup do arquivo domain.xml antes de realizar alterações. \nAs alterações serão aplicadas somente após a reinicialização da Plataforma.\n\n- ## **Ajuste deMemória (XMX, MetaSpace)**\n\nPor padrão. as configurações de memória que o instalador fornece são:\n\nsize=\"2g\" (memória inicial de consumo)\n\nmax-size=\"4g\" (máximo a ser consumido)\n\nPara um ambiente de desenvolvimento local, muitas vezes estes parâmetros são suficientes. Porém, para um ambiente de homologação ou produção, é necessário alterar esses valores. \n \nEsta alteração é feita no arquivo host.xml, que pode ser localizado em: **\\appserver\\domain\\configuration\\host.xml.**\n\nNão é recomendado alterar a quantidade inicial (mínima) de memória alocada **(size=\"2g\")**, pois a plataforma alocará memória de acordo com a necessidade sem que ultrapasse o valor máximo declarado em max-size, podendo retornar até o valor mínimo sempre que a demanda de uso da plataforma diminuir.\n\nPortanto, na tag o parâmetro a ser ajustado é o 'max-size'. \nNos testes de performance realizados pela equipe de produto, o melhor valor para este parâmetro é **12g,** sendo que acima deste valor não há ganho real de performance. Falaremos mais sobre como ir além deste ponto no tópico seguinte 'Dimensionamento'. \n \nAlém disto, recomenda-se também ampliar o valor do parâmetro MaxMetaspaceSize, de 1024m (1g) para 2g, conforme exemplo abaixo:\n\n**Ajuste de Memória - host.xml**\n\n```\n \n \n \n \n \n```\n\nEsta parametrização sugerida faz um bom uso dos recursos de memória, sem desperdiçar ou alocar recursos que serão utilizadas de forma não otimizada. \n \nÉ importante garantir que o servidor tenha memória suficiente para suportar esta configuração. \nTenha em mente que o Sistema operacional também consome memória, então para o ajuste sugerido, deve haver pelo menos 18g de memória instalada no servidor (12g + 2g + 4g para o S.O.). \nNa documentação [Modelo de dimensionamento](../../Especificações Técnicas/Dimensionamento/Modelo de dimensionamento.md) podem ser encontrados mais detalhes e recomendações sobre o assunto.\n\nSempre realize um Backup do arquivo host.xml antes de realizar alterações. \nAs alterações serão aplicadas somente após a reinicialização da Plataforma.\n\n- # **Limite de Arquivos do **Linux** e parametrizações que dependem do Sistema Operacional, como permissões e liberações de Firewall**\n\nA instalação do Fluig depende diretamente do comportamento de das parametrizações do S.O. e da Topologia de Rede em que esteja sendo executado, portanto alguns detalhes devem ser verificados, listamos alguns abaixo: \n \n-Permissionamento no sistema de arquivos: \nGaranta que o serviço Fluig seja Owner do diretório da instalação, bem como do Volume da plataforma; \n \n-Liberação em Firewall: \nPor se tratar de uma aplicação onLine, é imprescindível garantir que as portas e endereços envolvidos estejam com a correta liberação. Consulte [Portas e endereços](../../Especificações Técnicas/Portas e endereços.md) para mais detalhes; \n \n-Caso o servidor seja Linux, recomendamos visitar a documentação de [Configurações sugeridas em ambientes Linux](https://tdn.totvs.com.br/pages/viewpage.action?pageId=242389225) para o perfeito funcionamento neste S.O.\n\n# 2 Dimensionamento" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n### Observar as demandas e responsabilidades atribuídas à Plataforma, e trabalhar com uma entrega coerente de disponibilidade de serviço" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n\n- ## **Crescimento Horizontal x Vertical**\n\nApós atingir o limite de memória no ajuste das parametrizações padrão, que vimos no tópico anterior, o Crescimento da entrega de disponibilidade de serviço deve ser planejado de forma Horizontal.\n\nOu seja, se a demanda aumenta, ao invés de ultrapassar o limite recomendado de máximo de memória para o serviço Fluig devem ser disponibilizados mais servidores em paralelo, implementando o Balanceamento de Carga.\n\nPara implementar da forma correta, recomendamos avaliar as documentações [Modelo de dimensionamento](https://tdn.totvs.com.br/display/fluig/Modelo+de+dimensionamento) e [Alta disponibilidade e Balanceamento de carga](https://tdn.totvs.com.br/display/fluig/Alta+disponibilidade+e+Balanceamento+de+carga), que trazem as diretrizes recomendadas para esta implementação.\n\n- ## **Demanda Uso x Quantidade de Nós (capacidade de processamento)**\n\nA partir de 100 usuários acessando a plataforma em paralelo já é recomendada a implementação do Balanceamento de Carga com pelo menos dois Servidores Fluig.  \nMesmo com menos usuários, é uma boa prática projetar este crescimento, avaliando possíveis projetos futuros e pavimentando o caminho para que a implementação do Balanceamento seja realizada. \n \nAlém do Balanceamento de Carga, ferramentas como o Apache e NGinx podem atuar como um Proxy Reverso, atuando como uma camada extra de segurança, e ampliando a maturidade da sua topologia de rede. \nPara mais dicas de segurança, visite também [Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas](https://tdn.totvs.com.br/pages/viewpage.action?pageId=847899962)\n\n- ## **Avaliar as Demandas de integração para adequar a entrega de disponibilidade**\n\nMuitas vezes observamos o acesso realizado por usuários físicos, mas desconsideramos que as integrações de entrada (ERP e sistemas terceiros) e integrações de saída (Datasets sincronizados, Chamadas de webservices, etc) também demandam recursos computacionais. \nSempre considere estas demandas ao realizar o dimensionamento da Plataforma, para evitar impactos aos usuários físicos e garantir uma entrega de qualidade no serviço da Plataforma.\n\n# 3 Otimização dos Dados da Plataforma" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n### Ferramentas nativas do Fluig para uso rotineiro, e algumas dicas extras" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n\n- ## **Limpeza de Notificações,** **Limpeza de Lixeira e** **Compactação de Solicitações**\n\nAlgumas ações básicas podem ser feitas utilizando a ferramenta nativa embarcada na plataforma, e trazem vantagens para manutenção de dados a longo prazo; \nVerifique **[Plataforma ❙ Agendador de tarefas](https://tdn.totvs.com/pages/viewpage.action?pageId=234455387)** e avalie como estão suas configurações de Limpeza de Notificações, limpeza de Lixeira e Compactação de Solicitações.\n\nEstas ações visam otimizar dados das tabelas e expurgar informações que não precisam mais ocupar espaço em Banco de Dados. Mais detalhes sobre cada um dos tópicos podem ser encontrados na documentação oficial.\n\n- ## **Avaliar documentos  nunca acessados**\n\n**SQL - Documentos nunca acessados**\n\n```sql\n/* Anexos de processos nunca acessados */\n\nSELECT nr_versao, nr_documento, nm_arquivo_fisico, num_tam_arq_fisic FROM documento d WHERE nr_acessos = 0 AND tp_documento=7 OR (tp_documento=2 AND EXISTS(SELECT ap.NR_DOCUMENTO FROM anexo_proces ap WHERE ap.NR_DOCUMENTO = d.NR_DOCUMENTO) ) ORDER BY num_tam_arq_fisic DESC, nr_documento DESC\n\n/* Documentos que não são anexos de processos, nunca acessados */\n\nSELECT nr_versao, nr_documento, nm_arquivo_fisico, num_tam_arq_fisic FROM documento d WHERE nr_acessos = 0 AND tp_documento=2 AND not EXISTS(SELECT ap.NR_DOCUMENTO FROM anexo_proces ap WHERE ap.NR_DOCUMENTO = d.NR_DOCUMENTO ) ORDER BY num_tam_arq_fisic DESC, nr_documento DESC\n```\n\n```\nNunca elimine informações diretamente das tabelas da plataforma.\n```\n\nOs documentos que forem identificados para eliminação devem ser eliminados através da Navegação de Documentos, ou das APIs Públicas de manutenção de Documentos.\n\n- ## **Avaliar documentos c****om validade expirada**\n\n**SQL - Documentos nunca acessados**\n\n```sql\n/* documentos com a data de expiração menor do que a data atual */\nSELECT distinct(nr_documento) FROM documento WHERE dt_expiracao < CURDATE()\n```\n\n```\nNunca elimine informações diretamente das tabelas da plataforma.\n```\n\nOs documentos que forem identificados para eliminação devem ser eliminados através da Navegação de Documentos, ou das APIs Públicas de manutenção de Documentos.\n\n- ## **Expurgo da tabela fdn\\_accesslog**\n\nA tabela fdn\\_accesslog registra todas as tentativas de login com erro, com sucesso e logout da Plataforma. \nOs dados desta tabela podem servir para auditoria de acesso, mas após extraídos relatórios e informações relevantes, as informações podem ser apagadas da tabela para diminuir o volume de dados do Banco de Dados.\n\n**SQL - Documentos nunca acessados**\n\n```sql\n/*\n log_type:\n0 - LOGIN, \n1 - LOGINERROR, \n2 - LOGOUT\n\naccess_date\nData no formato 'YYYY-MM-DD HH:mm:ss'\n*/\nSELECT * FROM fdn_accesslog\n```\n\nDiferente de outras tabelas da plataforma, a tabela fdn\\_accesslog pode ter dados eliminados diretamente no banco de dados.\n\n# 4 Chamadas de Serviço Padronizadas" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n### A interface de integração da Plataforma é completa e segura\n\n- ## **Sempre consumir APIs documentadas**\n\nNas integrações com aplicações externas e APIs da Plataforma, é importante garantir que ocorram de forma segura e confiável.\n\nAs APIs documentadas são uma forma de 'contrato', onde a documentação da API garante que a assinatura seguirá coerente ao longo das atualizações das Plataformas.\n\n- ## **Usar o Cadastro de Serviços como Interface de Integração**\n\nO Cadastro de Serviços da Plataforma traz diversas vantagens, como por exemplo a rastreabilidade do número total de chamadas, bem como a diferenciação das chamadas com sucesso e as que retornaram erro, em cada API cadastrada.\n\nAlém disso, nas APIs configuradas é possível consultar um Log detalhado destas tentativas de integração. \nConsulte a documentação [Plataforma ❙ Serviços](https://tdn.totvs.com/pages/viewpage.action?pageId=243660796) para avaliar todas as funcionalidades.\n\n![](..\\..\\..\\images\\image-2024-6-16_22-47-28.png)\n\n- ## **Tirar proveito da Modernização e Evolução constantes da interface da Plataforma**\n\nUtilizar as interfaces da Plataforma para implementar suas integrações garante que, caso surjam novas ferramentas, Melhorias e correções, você seja contemplado sem maiores esforços. \n \nUma recomendação é sempre complementar o seu desenvolvimento de integrações avaliando a performance de APIs fora do contexto da Plataforma, utilizando ferramentas como PostMan para observar o comportamento das APIs isoladamente.\n\n# 5 Controles de logs\n\n### Um dos Maiores Aliados do desenvolvedor" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n\n- ## **Log de chamadas de Serviço - Request x Response**\n\nTão importante quanto fazer um desenvolvimento bem feito, é ter um acompanhamento dessas chamadas. \nO Log das chamadas de Serviço é uma interface complementar ao Log Principal da plataforma, Nichado para rastrear as interações com algum serviço específico cadastrado na Plataforma.\n\n- ## **Log Principal - server.log**\n\nTempos e Detalhes de execução de Serviços, Dataset e Eventos da Plataforma. Confira também [Plataforma ❙ Controle de log](https://tdn.totvs.com.br/pages/viewpage.action?pageId=236428687)\n\n- ## **Log Por Usuário**\n\nLog específico para as ações realizadas na Sessão de um usuário específico. Muito útil para isolar e avaliar comportamentos inesperados reportados por usuários da plataforma. Confira também [Controle de Log](https://tdn.totvs.com.br/display/fluig/Controle+de+Log)\n\n- ## **API de monitoramento de tempos de Execução**\n\nAPI com a listagem dos tempos médios em Milissegundos de execuções das APIs e ferramentas internas da Plataforma.  \nAcessar a URL abaixo com um usuário Administrador: \n \n[URL Flig]/api/public/wcm/chronos/meanTimes \n \n![](..\\..\\..\\images\\image-2024-6-16_23-35-54.png)\n\n# 6 Cuidados durante a construção de Processos\n\n### Quando pequenos detalhes mudam tudo" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n\n- ****Integrações no lugar certo - preferencialmente em atividade de serviço, evitar eventos do tipo ‘After’ (ex.: AfterTaskComplete)****Os eventos de processo devem ser evitados para execução de integração. Atividades de Serviço foram implementadas para trazer maior garantia de que as transações de integração e operações com maior tempo de processamento ocorram em segundo plano, sem congelar as ações dos usuários. \n Apesar de não recomendado, ainda é possível utilizar os eventos de Processo para realizar este tipo de chamada. \n Caso seja indispensável realizar integrações em eventos entre tarefas, priorize eventos do tipo ‘Before’, onde a transação ainda não foi concluída, em detrimento dos eventos do tipo ‘After’, onde a transação já foi concluída e as informações de formulário e decisões do processo já foram consolidadas em banco de dados.\n- **Atividade de Serviço - Execução Imediata x Execução Agendada**Além disso, é importante observar se as integrações precisam ocorrer no momento em que o usuário envia a solicitação, ou se podem ser executadas em um segundo momento, por exemplo após o expediente, evitando concorrência de recursos com os usuários.\n- ****Dimensionar ‘Tempo de Transação x Desempenho da Integração’ para prevenir o estouro das transações****Outro ponto que vale destacar, é observar o desempenho de cada integração que será realizada dentro de um processo, afim de dimensionar corretamente os tempos de execução de tarefas de serviço, e avaliar quais possíveis impactos nas transações da plataforma.\n- **Evitar looping entre tentativas de integração, capturas de erros e fluxos automáticos**Por fim, é de extrema importância avaliar também um limite para as tentativas de integração em tarefas de serviço, caso haja fluxo automático de saída para a tarefa de contenção. \n **![](..\\..\\..\\images\\image-2024-6-18_20-15-5.png)**Se uma integração já foi executada por 100 tentativas, e ainda não teve sucesso, é pouco provável que na 101 ela vá funcionar. Então criar um mecanismo de escape para evitar um loop eterno é a melhor prática.\n\n# 7 Página Home" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n### Uma boa experiência na Plataforma inicia com um bom primeiro passo; A página inicial deve ser leve, rápida e objetiva" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n\n- **Uma boa experiência na Plataforma inicia com um bom primeiro passo; A página inicial deve ser leve, rápida e objetiva** \n \n ![](..\\..\\..\\images\\homeGIF.gif) \n \n **Todo usuário que acessa a plataforma passa pela página página Inicial.** **Geralmente diversas vezes ao dia!**\n- **Carregue recursos de forma assíncrona ou utilize Promises**Sempre que for possível, utilizar chamadas assíncronas para que a home não fique presa. O número de ***threads* para chamadas síncronas do *Browser*** é limitado, e se muitas chamadas síncronas forem realizadas em paralelo, isto ocasionará no congelamento da página.Utilize chamadas assíncronas, ou Promises para realizar chamadas com menor impacto e realizar um carregamento de página mais fluído.\n- **Imagens dimensionadas corretamente**Observe o tamanho dos seus Banners e widgets para que as imagens sejam geradas com o tamanho correto. \n Se seu Banner principal tem, por exemplo, 800 pixels de largura, não há necessidade de que a imagem tenha um tamanho maior do que isto, pois serão desperdiçados recursos computacionais do servidor, espaço no volume, largura de banda e processamento do Browser para redimensionar a imagem para o tamanho desejado.\n- **Otimize cada recurso utilizado**Assim como as imagens, é possível facilmente compactar recursos como JavaScript para que tenham o menor impacto possível no carregamento de páginas web.Além disto, é importante avaliar se as chamadas de Datasets e recursos de outras fontes de dados estão otimizadas. As chamadas de Datasets do TOTVS Fluig possuem parâmetros como Fields e Constraints, para que sejam retornados somente os campos desejados,  e os registros já filtrados para que sejam trafegados somente os dados que se deseja utilizar em tela. **Consulte e saiba mais.**\n- ****Abuse dos Datasets Sincronizados, evitando Integrações Síncronas em tempo de execução****Tanto na home quanto nas demais páginas da plataforma, quando for carregar dados de ERPs ou Plataformas externas, priorize a elaboração de Datasets Sincronizados, que podem realizar um cache local da informação para que as informações fiquem disponíveis em armazenamento do próprio TOTVS Fluig.A sincronização de Datasets tem como objetivo reduzir o número de acessos a serviços de dados fornecidos por produtos externos à plataforma TOTVS Fluig. É uma prática comum trazer dados de sistemas externos para complementar informações do formulário de um processo ou realizar validações em eventos com base nas informações retornadas por este dataset. \n Saiba mais em \n\n# 8 Integração Assíncrona" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n### A Maioria das Integrações pode ocorrer enquanto o usuário se ocupa com outras tarefas\n\n### Em um universo de plataformas cada vez mais integradas, é imprescindível entender quais integrações precisam ocorrer enquanto o usuário aguarda, e quais podem ser executadas enquanto o usuário realiza outra tarefa;\n\nIntegrações de negócio Geralmente podem ocorrer do lado do servidor, garantindo uma maior fluidez das atividades dos usuários em tela e liberando recursos computacionais;\n\nCada vez que um usuário aguarda uma integração em tela, também estão comprometidas as Threads do Browser e topologia de rede envolvida.\n\nDestacamos alguns motivos para priorizar integrações assíncronas:\n\n- Evita o bloqueio das operações do usuário \n ![](..\\..\\..\\images\\image-2024-7-3_14-47-5.png)\n- Múltiplas tentativas sem impacto direto para a operação\n- Pode ser executada em horário de menor demanda, não competindo diretamente com os usuários.\n\nPara evitar\n\n# 9 Datasets\n\n### Boas práticas garantem que este grande aliado não se torne uma dor de cabeça\n\nNa Implementação ou Consumo dos seus Datasets, considere:\n\n- Trafegar somente o necessário - Observe o uso de Fields, SQLLimit e PKs nas chamadas\n- Centralização para reaproveitamento - menos chamadas em tela\n- Observar o tempo total de execução em sincronizações\n- Cuidado com o agendamento e o intervalo de execução\n- Captura e tratamento de erros (try / catch)\n- Liberação de recursos de Integração (Stream, Connection, Statement, ResultSet)\n\n# 10 Gestão do Banco de Dados\n\n### Preocupações em tempo de Projeto, Ações de Rotina e manutenções básicas" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig%2C+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig, melhorando desempenho e estabilidade\n\n\nTarefas que podem ser realizadas pelo DBA de forma preventiva:\n\n- Análise de eficiência dos Índices Padrão\n- Manutenção de MetaListas - Criação de índices e otimização conforme uso das tabelas de formulário\n- ‘Optimize tables’ em tabelas mais movimentadas\n- Avaliação recorrente do comportamento do BD\n\n# + Bônus: Percepção de Lentidão\n\nÉ importante saber diferenciar o que é lentidão do que são processos lentos;\n\nAproveite estas dicas para tirar do usuário a Percepção da Lentidão\n\nNem todo processo lento precisa prender o usuário\n\n ![](..\\..\\..\\images\\dataset-compare-v3.gif)" }, { "metadata": { "title": "Construa um portal interno com a identidade visual da sua empresa usando TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Construa+um+portal+interno+com+a+identidade+visual+da+sua+empresa+usando+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Construa um portal interno com a identidade visual da sua empresa usando TOTVS Fluig.md" }, "content": "Construa um portal interno com a identidade visual da sua empresa usando TOTVS Fluig\n\n\n![Universo TOTVS GIF](..\\..\\..\\images\\GIFuniverso-TOTVS.gif)\n\n## Palestrantes\n\n![Palestrante 1 - Anderson](..\\..\\..\\images\\38297904-1403725943093250-4760301241307758592-n-3.jpg)\n\nAnderson Simões\n\n![Palestrante 2 - Larissa](..\\..\\..\\images\\f3804450-9503-4152-b87e-0c440c5d4e8a.jpg)\n\nLarissa Romano\n\n**Apresentação:** [Construa um portal interno com a identidade visual da sua empresa usando TOTVS Fluig](/display/fluig/Construa+um+portal+interno+com+a+identidade+visual+da+sua+empresa+usando+TOTVS+Fluig?preview=/849554727/852327319/Construa%20um%20portal%20interno%20com%20a%20identidade%20visual%20da%20sua%20empresa%20usando%20TOTVS%20Fluig%20(1).pdf)\n\n#\n\n## **Introdução:**" }, { "metadata": { "title": "Construa um portal interno com a identidade visual da sua empresa usando TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Construa+um+portal+interno+com+a+identidade+visual+da+sua+empresa+usando+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Construa um portal interno com a identidade visual da sua empresa usando TOTVS Fluig.md" }, "content": "Construa um portal interno com a identidade visual da sua empresa usando TOTVS Fluig\n\n\nO propósito deste material é auxiliar na personalização da identidade visual de sua empresa, utilizando os recursos disponibilizados pelo TOTVS Fluig.\n\nA personalização de Temas está disponível a partir da versão [1.8.0 Mist](https://tdn.totvs.com/pages/viewpage.action?pageId=680958031#Atualiza%C3%A7%C3%A3oMist(1.8)-Portais), a nova experiência de gestão de páginas (Minhas páginas) está disponível a partir da versão [1.8.0-230117](https://tdn.totvs.com/pages/viewpage.action?pageId=695600349#Atualiza%C3%A7%C3%B5es(1.8.0)-230117)\n\n**Treinamentos gratuitos para ajudar nessa jornada:**\n\n- [Adapte seu layout ao novo construtor de páginas](https://academy.fluig.com/theme/totvs_fluig_academy/landpage.php?course=72)\n- [Trilha iniciando o desenvolvimento de Portais com o Totvs Fluig Plataforma](https://academy.fluig.com/theme/totvs_fluig_academy/trilha.php?codigo=8)\n - #### WCM - Gestão de portais\n - #### TOTVS Fluig Dev Start\n - #### Como fazer - Instalar Eclipse 2019-R9 + Fluig Studio\n - #### Iniciando o desenvolvimento de widgets\n - #### Preferências da widget, como salvar e recuperar os dados\n - #### Templates Mustache em widgets, aprenda a desenvolver\n- [Style Guide - Modal](https://academy.fluig.com/theme/totvs_fluig_academy/landpage.php?course=106)\n\n## **Sobre os recursos citados do TOTVS Fluig:**\n\n- [Social e Comunidades](https://tdn.totvs.com/pages/viewpage.action?pageId=233762842)\n- [Widgets](https://tdn.totvs.com/pages/viewpage.action?pageId=234455977)\n- [Slots](https://tdn.totvs.com/x/roP5DQ)\n- [Layouts](https://tdn.totvs.com/x/sYP5DQ)\n\n## **Kit Intranet (Widgets disponibilizadas):**" }, { "metadata": { "title": "Construa um portal interno com a identidade visual da sua empresa usando TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Construa+um+portal+interno+com+a+identidade+visual+da+sua+empresa+usando+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Construa um portal interno com a identidade visual da sua empresa usando TOTVS Fluig.md" }, "content": "Construa um portal interno com a identidade visual da sua empresa usando TOTVS Fluig\n\n\n- Acesse o link [Git](https://git.fluig.com/projects/SAMPLES/repos/kit-intranet/browse), realize download, descompacte o arquivo:\n\n![](..\\..\\..\\images\\image-2024-6-16_15-10-40.png)\n\n- Para realizar a importação na plataforma, acesse o **Painel de controle**, no menu de **Personalização** a função **Importar e Exportar Páginas.**\n- Clique em **Importar Páginas**:\n\n![](..\\..\\..\\images\\image-2024-6-16_15-14-15.png)\n\n- Selecione o arquivo **kitintranet**, da pasta a qual foi descompactada anteriormente:\n\n![](..\\..\\..\\images\\image-2024-6-16_16-4-46.png)\n\n## **Temas**\n\nPara realizar a alteração do tema, acesse o **Painel de controle**, no menu de **Personalização** a função **Temas**.\n\n![](..\\..\\..\\images\\image-2024-6-13_18-19-38.png)\n\n## **Páginas**\n\nPara realizar a criação, edição ou exclusão de uma página, acesse o **Painel de controle**, no menu de **Personalização** a função **Minhas páginas**.\n\n![](..\\..\\..\\images\\image-2024-6-25_12-17-30.png)" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nEsta documentação foi elaborada com o objetivo de detalhar as melhores práticas, dicas e truques apresentados na sessão **“Aprimore seu código! Dicas e truques para criar portais no TOTVS Fluig”**, realizada durante o **Universo TOTVS 2025**.\n\nO material visa apoiar desenvolvedores na criação de portais modernos, seguros e alinhados com os padrões da plataforma TOTVS Fluig. Aqui você encontrará explicações aprofundadas sobre cada dica apresentada na palestra, exemplos práticos e orientações para aplicar esses conhecimentos no seu dia a dia.\n\n### **Utilize sempre os componentes do Style Guide para o desenvolvimento de suas widgets**\n\nO Style Guide é o guia de estilos oficial do TOTVS Fluig, contendo mais de 70 componentes para uso, contando com uma documentação rica em exemplos práticos de implementação.\n\nSua estrutura de grid system foi projetada para tornar o layout responsivo, garantindo a melhor visualização em diferentes dispositivos e resoluções.\n\nAlém de acelerar e simplificar o desenvolvimento de recursos na plataforma, o Style Guide padroniza o layout das páginas e recursos desenvolvidos, facilitando o uso diário por diversas áreas da empresa.\n\nO Style-Guide é utilizado pelo time de desenvolvimento do TOTVS Fluig e desta forma, está sempre em constante atualização com novas funcionalidades e componentes.\n\nVeja um exemplo de componente contido na documentação\n\nObservação técnica: Sempre englobar sua implementação HTML em uma div principal com a classe fluig-style-guide \n\n```\n
\n    \n
\n```\n\nSua documentação oficial pode ser acessada através do link: \n\n### **Utilize o Grid System do Style Guide para atender a responsividade do layout**" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nComo citado anteriormente, o **Style Guide** contempla o que chamamos de **Grid System**, uma técnica de desenvolvimento que facilita a implementação de um layout **responsivo** que atenda diferentes dispositivos e resoluções mantendo a interface com uma boa visualização.\n\nAtravés do uso de classes css é possível definir a largura que determinado componente irá ocupar da tela de acordo com a resolução do dispositivo em que será renderizado. Além disso, é possível detalhar a largura do componente de acordo com o dispositivo utilizado.\n\n| | | |\n| --- | --- | --- |\n| col-xs (Extra Small) | < 768px | Telefones móveis |\n| col-sm (Small) | ≥ 768px | Tablets e telefones grandes |\n| col-md (Medium) | ≥ 992px | Computadores de mesa e laptops |\n| col-lg (Large) | ≥ 1200px | Computadores de mesa com telas grandes (monitores) |\n\nPara maior detalhamento sobre o Grid System, consulte a documentação oficial no Style-Guide: [Fluig Style-Guide | Grid System](https://style.fluig.com/css.html#grid)\n\n### **Evite CSS customizado desnecessário e use classes helpers**\n\nO **Fluig Style Guide** oferece uma série de classes helpers pré-definidas para controle de espaçamentos, alinhamentos, cores e estruturação. Ao usar essas classes:\n\n- Você garante que sua interface estará **alinhada ao padrão visual da TOTVS**;\n- Facilita a **manutenção e evolução** do portal;\n- Reduz a chance de gerar inconsistências no layout;\n- Evita inflar o CSS com regras repetidas ou desnecessárias.\n\nAo invés de criar um CSS próprio para alinhar e espaçar elementos, use as classes helpers que já existem no Style Guide, como:\n\n```\n
\n

Atenção!

\n

Uma mensagem para o usuário!

\n
\n```\n\n### **Caso precisar criar um arquivo CSS: Use a classe da widget como escopo no CSS**" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nQuando você define o CSS usando a classe raiz da sua widget como escopo, você:\n\n- **Isola o estilo da widget**, evitando que ele afete outros elementos da página ou de outras widgets;\n- **Protege o layout** de ser sobrescrito por estilos globais ou de outras widgets;\n- Garante que o CSS seja aplicado **apenas onde deve**.\n\n```\n.my-widget .header {\n ...\n}\n```\n\n### **Utilize variáveis CSS para identidade visual**\n\nVariáveis CSS permitem:\n\n- Manter uma **identidade visual consistente** em toda a interface;\n- Fazer **alterações globais rápidas**, como mudar uma cor ou um espaçamento, ajustando apenas um valor no lugar central;\n- Tornar o código CSS mais legível e fácil de dar manutenção.\n\n```\n.my-widget .header {\n background-color: var(--fs-color-neutral-light-00);\n color: var(--fs-color-neutral-dark-90);\n}\n```\n\n### **Cuidado com a área de toque e com o posicionamento das ações no desenvolvimento de interfaces**" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nSe a solução desenvolvida for utilizada frequentemente no aplicativo do TOTVS Fluig, ou até mesmo no navegador mobile, é essencial considerar cuidadosamente o posicionamento dos elementos HTML na interface durante o desenvolvimento. Ou seja, os componentes devem estar posicionados de maneira que facilite a área de clique do usuário.\n\nTrata-se também de um quesito de acessibilidade. Se os componentes não estiverem bem posicionados, pessoas com algum tipo de deficiência ou limitação motora, podem enfrentar dificuldades ainda maiores se as áreas de toque não forem adequadas.\n\nAlém disso, um posicionamento cuidadoso das ações pode ajudar a evitar erros acidentais, garantindo que os usuários selecionem a opção desejada com facilidade.\n\nPara informações mais detalhadas sobre o desenvolvimento mobile, consulte as documentações oficiais relacionadas ao desenvolvimento de formulários e widgets com foco no aplicativo do TOTVS Fluig.\n\nDesenvolvimento de formulários: [Desenvolvimento de formulário mobile - TOTVS Fluig - TDN](https://tdn.totvs.com/pages/releaseview.action?pageId=146181573)\n\nDesenvolvimento de widgets: [Desenvolvimento de widgets mobile - TOTVS Fluig - TDN](../../Configuração/Mobile/Desenvolvimento de widgets mobile.md)\n\n### **Busque incluir os atributos de acessibilidade em seus códigos**" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nOs atributos de **acessibilidade** no desenvolvimento de interfaces desempenham um papel crucial, pois facilitam o acesso a conteúdos digitais para pessoas com deficiências visuais, auditivas, motoras ou cognitivas.\n\nAlém disso, aprimoram a **experiência** geral do usuário, tornando o site mais navegável e compreensível para todos, incluindo idosos e pessoas com limitações temporárias.\n\nConstruir componentes e páginas com atributos de acessibilidade demonstra um **compromisso** com a inclusão e a diversidade, uma prática ética e socialmente responsável para qualquer organização e indivíduo.\n\nVeja abaixo, alguns dos principais atributos\n\n**role (Papel de acessibilidade)**\n\nDefine o papel de um elemento na interface de usuário.\n\n```\n\n```\n\n**aria-label (Etiqueta acessível)**\n\nFornece um rótulo a elementos interativos que não possuem um texto visível.\n\n```\n\n```\n\n**alt (Texto alternativo para imagens)**\n\nDescrição textual das imagens para leitores de tela.\n\n```\n\"Logo\n```\n\n**aria-hidden (Conteúdo oculto)**\n\nEspecifica que um elemento é invisível para leitores de tela.\n\n```\n
Este conteúdo é oculto.
\n```\n\n### **Sempre faça integrações com APIs de forma assíncrona**" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nPrimeiramente, precisamos compreender a diferença entre uma requisição síncrona e assíncrona\n\n**Síncrona:** Em uma chamada síncrona, o código é executado de maneira sequencial e linear. Isto significa que a execução da próxima linha de código só começa depois que a chamada atual é finalizada\n\n**Assíncrona**: Em uma chamada assíncrona, o código não espera pela conclusão da chamada atual para continuar sua execução. O controle é imediatamente retornado ao thread principal, permitindo que outras operações continuem executando.\n\nRequisições assíncronas geram benefícios tanto do lado técnico quanto ao lado da experiência do usuário.\n\nVamos conferir algumas vantagens em implementar chamadas assíncronas?\n\n**Evitar Bloqueio da Interface do Usuário**\n\nSe você fizer chamadas síncronas a uma API, o JavaScript bloqueará a execução até que a resposta da API seja recebida. Isso na prática impede o uso da aplicação, bloqueando qualquer interação, como cliques ou digitação, até que a chamada seja concluída.\n\n**Melhor Desempenho e Experiência do Usuário**\n\nInterações assíncronas permitem que o navegador continue a processar outras tarefas enquanto espera pela resposta da API. Isso resulta em uma experiência de usuário mais efetiva e interativa, sem travamentos ou qualquer impedimento no uso de outros recursos.\n\n**Melhor Manipulação de Erros**\n\nAs operações assíncronas permitem um trabalho mais efetivo com possíveis erros. Promises e async/await fornecem maneiras claras e estruturadas para capturar e lidar com erros, como falhas de rede ou respostas inválidas, sem bloquear a execução do restante do código.\n\n### **Priorize integrações com Datasets de forma assíncrona**" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\n**O que é um dataset no TOTVS Fluig?**\n\nA plataforma Fluig permite disponibilizar informações provindas de várias fontes de dados através de formas variadas de apresentação, dependendo da necessidade de cada cliente. Esse recurso é atendido pelo componente Dataset, que padroniza o acesso às informações, independente da origem dos dados.\n\nAssim como nas chamadas para APIs, os datasets do TOTVS Fluig também devem ser consultados de forma assíncrona. Isto porque uma das responsabilidades de um dataset é retornar um conjunto de informações, que dependendo da quantidade de itens a serem retornados, pode gerar uma demora na finalização da consulta. Então porque não utilizar dos benefícios de uma chamada assíncrona quando o assunto é dataset?\n\nPara conhecer mais sobre o desenvolvimento de datasets avançados no Fluig, consulte a documentação oficial: [Desenvolvimento de datasets avançados no TOTVS Fluig](https://tdn.totvs.com/pages/releaseview.action?pageId=412888219)\n\n### **Faça chamadas simultâneas em paralelo para não prejudicar a performance**" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nO uso do **Promise.all** permite realizar chamadas simultâneas em paralelo, facilitando a performance no desenvolvimento web.\n\n```\nasync callMultiple() {\n    const resultados = await Promise.all({\n        $.ajax({\n            url: ''\n        }),\n        $.ajax({\n            url: ''\n        })\n    });\n}\n```\n\nPor quais motivos devo utilizar o Promise.all?\n\n**Redução do Tempo Total de Espera**\n\nQuando várias requisições assíncronas são iniciadas ao mesmo tempo e executadas em paralelo, o tempo total de execução diminui, uma vez que as requisições são realizadas em conjunto, ao invés de serem executadas de maneira individual com um tempo de resposta para cada uma das chamadas. Isto tem um impacto significativo no carregamento de uma página ou na resposta de uma ação feita pelo usuário.\n\n**Melhoria na Experiência do Usuário**\n\nCom a execução paralela, os dados necessários para renderizar uma página ou completar uma ação do usuário são obtidos mais rapidamente. Isso proporciona uma experiência de usuário mais fluida e eficiente.\n\n**Facilidade de Manutenção e Escalabilidade**\n\nChamadas em paralelo facilitam a manutenção do código, pois a lógica de tratamento de erros e o fluxo de execução ficam centralizados. Isso torna o código mais legível e escalável.\n\n### **Sempre faça tratamento de erros e melhore a experiência do usuário com exceções**" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nO tratamento de erros é essencial no mundo da programação. O desenvolvimento de uma solução nunca deve ser projetado pensando unicamente no cenário de sucesso, ou melhor dizendo, o objetivo final de uma regra de negócio. Na prática, o funcionamento de uma aplicação se dá por meio de diversos fatores como infraestrutura, conexão de rede, conhecimento do usuário, combinação de dados, dentre outros. Todos esses elementos podem causar falhas ou cenários não esperados por quem faz o uso de um determinado recurso. \n\nPor este motivo, o código fonte deve possuir um tratamento de erros inteligente, identificando falhas mais comuns como a falta de informações suficientes para um processamento ou baixa conexão, até erros mais genéricos que não foram pensados durante o desenvolvimento ou que de fato não são esperados na prática.\n\n**E na prática, como funciona…?**\n\nVamos analisar o código fonte abaixo\n\nNa função processarDados verificamos se os dados recebidos como parâmetro são realmente válidos, e caso não sejam, será retornado um erro com a mensagem *Dados inválidos*.\n\nAo chamar a função processarDados, caso ela seja executada com sucesso será exibido um alerta com o resultado de seu processamento (função de callback then). Caso contrário, será apresentado um alerta ao usuário com uma breve descrição do erro (função de callback catch).\n\n```\nconst processarDados = (dados) => {\n    return new Promise((resolve, reject) => {\n        if (!dados) {\n            reject(new Error(\"Dados inválidos\"));\n        } else {\n            // Aqui fica a lógica a ser processada\n            // Exemplo: processamento fictício\n            const resultado = dados.map(item => item * 2);\n            resolve(resultado);\n        }\n    });\n};\n// Exemplo de uso da função\nconst dados = [1, 2, 3, 4];\n\nprocessarDados(dados)\n    .then(resultado => {\n        alert(resultado);  // Output: [2, 4, 6, 8]\n    })\n    .catch(erro => {\n      alert(\"Ocorreu um erro:\", erro.message);\n    });\n```\n\nDesta forma, o usuário ficará ciente do que realmente ocorreu durante o uso do sistema." }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n### **Sempre habilite “Strict mode” em seus códigos JavaScript**\n\nO Strict Mode é uma funcionalidade do JavaScript que introduz um conjunto de regras mais rígidas para o interpretador de linguagem seguir durante a execução do código. Isso ajuda a evitar erros comuns e a promover boas práticas na codificação.\n\nMas afinal, por que devo utilizar o Strict Mode?\n\n**Facilidade de implementação**\n\nPara habilitar o Strict Mode em seu código javascript, basta no início do arquivo aplicar o seguinte trecho de código\n\n```\n'use strict';\n```\n\n**Identificação de erros silenciosos**\n\nO strict mode ajuda a identificar e lançar erros em tempo de desenvolvimento para práticas de programação que podem levar a bugs que seriam identificados apenas na execução do código a nível de usuário, o que chamamos de erros silenciosos. Por exemplo, atribuir valores a variáveis não declaradas resultará em um erro ao invés de criar uma nova variável de maneira informal\n\n**Melhoria da Legibilidade e Manutenção**\n\nO strict mode promove boas práticas de desenvolvimento, como declarar variáveis antes de usá-las, o que pode melhorar a legibilidade do código e facilitar sua manutenção. \n\n**Preparação para o Futuro**\n\nO strict mode desativa o uso de palavras-chave reservadas para possíveis futuras versões do JavaScript, ajudando a garantir que o código seja mais compatível com versões futuras da linguagem.\n\n### **Utilize a sempre a última versão da linguagem (ES6+)**" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nExistem diversas vantagens no uso da última versão da linguagem Javascript. O ES6 possui diversas features que versões antigas da linguagem, como o ES5, não contemplam.\n\nConfira abaixo algumas features de versões mais recentes da linguagem\n\n**Novos Recursos e Sintaxe Melhorada**\n\n**Arrow Functions:** Proporcionam uma sintaxe mais curta e clara para funções.\n\n \n\n```\nconst soma = (a, b) => a + b;\n```\n\n**Template Literals:** Facilitam a criação de strings complexas com interpolação de variáveis.\n\n```\nconst nome = \"João\";\nconsole.log(`Olá, ${nome}!`);\n```\n\n**Desestruturação:** Permite extrair dados de arrays ou objetos de forma mais concisa.\n\n```\nconst [a, b] = [1, 2];\nconst { nome, idade } = pessoa;\n```\n\n**Melhoria no Gerenciamento de Promises**\n\n**Async/Await:** Facilita o trabalho com código assíncrono, tornando-o mais legível e parecido com código síncrono.\n\n```\nconst fetchData = async () => {\n  try {\n    const response = await fetch('url');\n    const data = await response.json();\n    console.log(data);\n  } catch (error) {\n    console.error('Erro:', error);\n  }\n};\n```\n\n**Desempenho e Eficiência**\n\n**Novas APIs e Melhores Implementações:** Melhorias no motor de JavaScript dos navegadores resultam em código que executa de maneira mais eficiente.\n\n**Melhorias de Performance:** Recursos como Map e Set oferecem implementações de alta performance para estruturas de dados comumente usadas.\n\n**Manutenção e Escalabilidade**\n\n**Código Mais Limpo e Legível:** Sintaxe moderna torna o código mais fácil de ler e manter.\n\n**Segurança**\n\n**Correções de Bugs e Vulnerabilidades:** Versões mais novas frequentemente corrigem problemas de segurança que podem estar presentes em versões anteriores da linguagem.\n\n### **Utilize `WCMAPI.fireEvent` para comunicação entre widgets.**" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nÉ comum termos **múltiplas widgets em uma mesma página**, cada uma com funções distintas, mas que, em determinados momentos, precisam se comunicar. O \"`WCMAPI.fireEvent\"` foi criado exatamente para facilitar essa comunicação, de forma **desacoplada e segura**.\n\nDiferente de manipulações diretas no DOM ou uso de variáveis globais, o \"`WCMAPI.fireEvent\"` permite que widgets emitam e escutem eventos personalizados, **sem gerar dependências diretas entre elas**. Isso torna a arquitetura do portal mais modular e facilita a manutenção e evolução do código.\n\n**Como funciona?**\n\n- Um widget pode **emitir um evento** com o `WCMAPI.fireEvent`, informando o nome do evento e um objeto de dados.\n- Outra widget pode **escutar esse evento** usando o `WCMAPI.addListener`, e então reagir à informação enviada.\n\n```\nWCMAPI.fireEvent('MY_EVENT', { message: 'Tarefa finalizada' });\n```\n\n```\nWCMAPI.addListener(this, 'MY_EVENT', (evName, data) => {\n console.log(data.message);\n});\n```\n\n### **Habilite sempre o suporte ao aplicativo My Fluig pela sua widget no [application.info](http://application.info)**" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nAo desenvolver uma widget, é essencial conhecer o arquivo **[application.info](http://application.info)**. Este arquivo possibilita uma série de parametrizações essenciais para o funcionamento da widget. Um dos parâmetros mais comuns é o **application.mobileapp** que permite habilitar ou desabilitar o suporte da widget ao **aplicativo My Fluig.**\n\n```\napplication.mobileapp=false\n```\n\nEsse parâmetro faz com que no modo edição de uma página, seja exibida uma opção na widget onde o usuário pode definir se aquela widget será visível no aplicativo ou não\n\nConheça mais sobre o desenvolvimento de widgets e outras propriedades importantes do application info \n \n[Desenvolvimento de widgets e Layouts](https://tdn.totvs.com/pages/releaseview.action?pageId=113803693)\n\n[Propriedades do arquivo application.info](../../Recurso de Páginas e Widgets (WCM).md)/Estrutura de páginas/Arquivo application.info.md)\n\n### **Segurança com DOMPurify: Proteção contra XSS**\n\nEm aplicações web  é comum exibir conteúdos fornecidos por usuários (ex.: comentários, campos de formulários, informações vindas de APIs externas). Esses conteúdos podem conter códigos maliciosos inseridos intencionalmente (ou até por descuido), que, ao serem renderizados no navegador, podem gerar ataques do tipo **XSS (Cross-Site Scripting)**.\n\nO **DOMPurify** é uma biblioteca leve e eficiente projetada para **sanitizar HTML**, removendo qualquer elemento ou atributo potencialmente perigoso antes que ele seja inserido no DOM. Isso impede a execução de scripts não autorizados e protege seus usuários e o próprio ambiente TOTVS Fluig.\n\n#### Enviando dados para a API (POST)" }, { "metadata": { "title": "Dicas e truques para criar portais no TOTVS Fluig", "source": "https://tdn.totvs.com/display/fluig/Dicas+e+truques+para+criar+portais+no+TOTVS+Fluig", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para criar portais no TOTVS Fluig.md" }, "content": "Dicas e truques para criar portais no TOTVS Fluig\n\n\nAntes de enviar dados coletados de inputs, sanitize:\n\n```\n// POST\nsaveData: async function() {\n const dataValue = document.querySelector('#input-text').value;\n\n await fetch('', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n value: DOMPurify.sanitize(dataValue)\n })\n });\n}\n```\n\n#### Exibindo dados da API (GET)\n\nAntes de exibir na página, sanitize:\n\n```\n// GET\ngetData: async function() {\n const response = await fetch('', {\n method: 'GET'\n });\n\n const result = await response.json();\n\n // dado retornado do backend sanitizado\n const cleanValue = DOMPurify.sanitize(result);\n}\n```" }, { "metadata": { "title": "Dicas e truques para Gestão de documentos no TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328283", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para Gestão de documentos no TOTVS Fluig.md" }, "content": "Dicas e truques para Gestão de documentos no TOTVS Fluig\n\n\n![Universo TOTVS GIF](..\\..\\..\\images\\GIFuniverso-TOTVS.gif)\n\n# **Palestrantes**\n\n![](..\\..\\..\\images\\image-2024-6-25_19-29-8.png)\n\n## **Desafios**\n\n“Com aproximadamente 600 terceiros, a gente teve a necessidade de uma ferramenta para **controlar nossos****processos**e isso veio junto com o projeto de **paperless**que implantamos em toda empresa.”\n\n**[Jaguar Mining](https://www.youtube.com/watch?v=6kK85Y03zaU), empresa brasileira de capital estrangeiro.**\n\n“O trabalhador de escritório médio ainda utiliza cerca de **10.000 folhas de papel** por ano… **gastam mais de US$ 120 bilhões** em formulários impressos.”\n\n**[Forbes](https://www.forbes.com/sites/forbestechcouncil/2020/04/02/going-paperless-a-journey-worth-taking/?sh=2a36e2895ca1), 2020.**\n\n## **Problemas Resolvidos com a Gestão Eletrônica de Documentos**\n\n**![](..\\..\\..\\images\\image-2024-6-25_19-32-9.png)**\n\nGED: É uma forma digital de lidar com arquivos, facilitando o acesso e a gestão dessas informações.\n\n## **Dicas e Truques na Gestão de Documentos**" }, { "metadata": { "title": "Dicas e truques para Gestão de documentos no TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328283", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para Gestão de documentos no TOTVS Fluig.md" }, "content": "Dicas e truques para Gestão de documentos no TOTVS Fluig\n\n\n![](..\\..\\..\\images\\image-2024-6-25_19-33-54.png)\n\n**A plataforma TOTVS Fluig é a solução para a gestão eletrônica de documentos.**\n\n**Taxonomia:** Uma distração ou inexperiência de um colaborador pode fazer com que um documento em papel acabe na pasta errada ou no lixo. **Com o TOTVS Fluig, você pode criar e automatizar toda uma taxonomia, tornando o arquivamento uma ação lógica e eficiente, de acordo com a realidade do seu negócio.**\n\n**Visualização e Marca d’água:** Com o visualizador da plataforma, você pode visualizar seus documentos e configurar marca d'água neles. Isso facilita o rastreamento de cópias dos seus documentos internos.\n\n**Edição e complementos:** Se precisar editar seus documentos, não é necessário fazer o download. Você pode fazer as edições na plataforma. Além disso, é possível adicionar complementos e anotações de acordo com a necessidade.\n\n![](..\\..\\..\\images\\GIF%20ECM.gif)\n\n![](..\\..\\..\\images\\image-2024-6-25_19-34-17.png)\n\n**Expiração de documentos e notificações:** Como saber se os prazos estão dentro do esperado, sendo cumpridos? Perder o prazos ou a renovação de um contrato pode resultar em multas, interrupção de faturamento ou de fornecimentos importantes. **Com a Gestão Eletrônica de Documentos, você pode cadastrar o vencimento de todos os seus documentos e configurar notificações para ser lembrado com antecedência, permitindo tempo suficiente para realizar as renovações necessárias.**\n\n**Controle de Versões:** Acabei de editar uma versão erroneamente, ou preciso buscar uma versão anterior… e agora? Controlar as versões e revisões fica mais fácil.  Em projetos complexos, controlar versões documentos, permitindo reverter a versões anteriores e garante a integridade dos dados ao longo do tempo.\n\n**Permissões de acesso e políticas de uso:** Garantem que apenas pessoas autorizadas possam ver ou editar documentos, diminuindo o risco de vazamento de informações sensíveis.\n\n**Busca:**Meu cliente acabou de ligar e precisa de um detalhe do contrato imediatamente, é o que você ouve do outro lado da linha. **As funcionalidades de pesquisa e filtros de documentos permitem encontrar qualquer informação necessária de forma fácil e rápida.**\n\n**![](..\\..\\..\\images\\GIF%20ECM2.gif)**" }, { "metadata": { "title": "Dicas e truques para Gestão de documentos no TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328283", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para Gestão de documentos no TOTVS Fluig.md" }, "content": "Dicas e truques para Gestão de documentos no TOTVS Fluig\n\n## **Aplicativo My Fluig**\n\nAcesse os seus **documentos**  de forma **fácil** e **segura.**\n\n**![](..\\..\\..\\images\\image-2024-6-25_19-37-25.png)**\n\nCom o aplicativo My Fluig, você pode gerenciar seus documentos de forma simples e segura, **armazenando, visualizando e compartilhando-os em qualquer lugar.**\n\n## **Potencialize o seu Processo**\n\nTemos uma solução de parceiro que complementa e potencializa esta gestão de documentos. Que se chama OCR by Estrela Antares ou também conhecido por alguns clientes como Syncros. Vocês já devem ter ouvido falar sobre uma tecnologia chamada OCR é que a conversão de documentos digitalizados em texto editável e pesquisável.\n\n![](..\\..\\..\\images\\image-2024-6-25_19-39-15.png)\n\n## **Inove na Gestão de Documentos**\n\n![](..\\..\\..\\images\\GIF%20SYNCROS.gif)\n\n## **Vamos ver juntos como é Fácil! Na prática!**" }, { "metadata": { "title": "Dicas e truques para Gestão de documentos no TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328283", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para Gestão de documentos no TOTVS Fluig.md" }, "content": "Dicas e truques para Gestão de documentos no TOTVS Fluig\n\n\nAna Júlia, da equipe de TI, está liderando um inovador projeto de digitalização na empresa para otimizar recursos e reduzir custos com impressão, envio e arquivamento de documentos físicos. O projeto visa melhorar: \n\n- **Controle de prazos;**\n\n- **Gestão do ciclo de vida dos documentos;**\n\n- **Rastreabilidade;**\n\n- **Agilidade na busca de informações.**\n\nAumentando a eficiência, segurança e a conformidade legal da empresa.\n\n- **[Taxonomia de Documentos](../../Recurso de Documentos (ECM).md)/Taxonomia de Documentos.md)**\n- **[Plataforma ❙ Visualização do documento](https://tdn.totvs.com/pages/viewpage.action?pageId=235325435)**\n- **[Plataforma | Marca d'água](https://tdn.totvs.com/pages/viewpage.action?pageId=234455302)**\n\n![](..\\..\\..\\images\\ECMPARTE1.gif)\n\n- **[Drag and drop de documentos](../../Recurso de Documentos (ECM).md)/Drag and drop de documentos e pastas.md)**\n\n![](..\\..\\..\\images\\ECMPARTE2.gif)\n\n- **[Plataforma ❙ Editar conteúdo de documento](https://tdn.totvs.com/pages/viewpage.action?pageId=233765735)**\n- **[Plataforma ❙ Efetuar check-in do documento](https://tdn.totvs.com/pages/viewpage.action?pageId=235325678)**\n- **[Plataforma ❙ Efetuar check-out do documento](https://tdn.totvs.com/pages/viewpage.action?pageId=235325675)**\n- **[Plataforma ❙ Restaurar versão de documento](https://tdn.totvs.com/pages/viewpage.action?pageId=243636503)**\n\n![](..\\..\\..\\images\\ECMPARTE3.gif)\n\n- **[Plataforma ❙ Atualizar arquivo físico de documento](https://tdn.totvs.com/pages/viewpage.action?pageId=233765728)**\n\n![](..\\..\\..\\images\\ECMPARTE4.gif)\n\n- **[Plataforma ❙ Complementar documento](https://tdn.totvs.com/pages/viewpage.action?pageId=561630856)**\n\n![](..\\..\\..\\images\\ECMPARTE5.gif)\n\n- **[Plataforma ❙ Propriedades do documento](https://tdn.totvs.com/pages/viewpage.action?pageId=243648184)**\n\n![](..\\..\\..\\images\\ECMPARTE6.gif)\n\n- **[Plataforma ❙ Definir critérios de aprovação para pasta ou para documento](https://tdn.totvs.com/pages/viewpage.action?pageId=243008763)**\n- **[Plataforma ❙ Definir critérios de segurança para pasta ou para documento](https://tdn.totvs.com/pages/viewpage.action?pageId=243008857)**\n\n![](..\\..\\..\\images\\ECMPARTE7.gif)\n\n- **[Plataforma ❙ Política de uso](https://tdn.totvs.com/pages/viewpage.action?pageId=236430748)**\n- **[Plataforma ❙ Busca por documentos](https://tdn.totvs.com/pages/viewpage.action?pageId=233763874)**" }, { "metadata": { "title": "Dicas e truques para Gestão de documentos no TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328283", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas e truques para Gestão de documentos no TOTVS Fluig.md" }, "content": "Dicas e truques para Gestão de documentos no TOTVS Fluig\n\n## **Precisa de Apoio?**\n\n- [TOTVS Fluig Academy](https://academy.fluig.com/)\n- Conheça o Works\n- [Plataforma ❙ Prime Fluig](../../Sobre a plataforma/Plataforma ❙ Prime Fluig.md)" }, { "metadata": { "title": "Dicas para uma melhor performance de suas integrações do TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849107443", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas para uma melhor performance de suas integrações do TOTVS Fluig.md" }, "content": "Dicas para uma melhor performance de suas integrações do TOTVS Fluig\n\n\n![Universo TOTVS GIF](..\\..\\..\\images\\GIFuniverso-TOTVS.gif)\n\n## Palestrantes" }, { "metadata": { "title": "Dicas para uma melhor performance de suas integrações do TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849107443", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Dicas para uma melhor performance de suas integrações do TOTVS Fluig.md" }, "content": "Dicas para uma melhor performance de suas integrações do TOTVS Fluig\n\n\n![Palestrante 1 - Diego](..\\..\\..\\images\\21b75d65-65a6-4892-8ca9-a78d31b0ad68.jpg)\n\nDiego Zimmermann\n\n![Palestrante 2 - Jhonatan](..\\..\\..\\images\\jhonatan.jpg)\n\nJhonatan Serafim\n\n**Apresentação:** [Técnicas para uma melhor performance de suas integrações do TOTVS Fluig](/pages/viewpageattachments.action?pageId=849107443&preview=/849107443/852897540/T%C3%A9cnicas%20para%20uma%20melhor%20performance%20de%20suas%20integra%C3%A7%C3%B5es%20do%20TOTVS%20Fluig.pdf)\n\nAprenda algumas dicas e truques que ajudarão a melhorar a experiência e performance de suas integrações no TOTVS Fluig, conhecendo e utilizando da melhor maneira possível os recursos disponíveis na plataforma.\n\n# Conheça as APIs TOTVS e TOTVS Fluig\n\n- [APIs TOTVS](https://api.totvs.com.br/)\n- [APIs Fluig](https://api.fluig.com/)\n\n# Utilize o nosso guia de estilo\n\n- [Mais sobre o style-guide](../../Desenvolvimento sobre a plataforma/Guia de Estilos.md)\n\n# Etapas auxiliares para analisar a origem de um possível problema de integração\n\n- Monitore o desempenho do sistema\n- Teste API separadamente (por exemplo, com o [Postman](https://www.postman.com/))\n- Avalie o código de sua customização\n- Considere o tráfego da rede e a conectividade\n- Consulte a [Central de Diagnóstico](https://tdn.totvs.com/x/rO9iJg) e logs da plataforma\n\n# Recursos da plataforma que ajudam em suas integrações\n\n- [Guia de instalação do Fluig Studio](../../Instalação e Atualização/Guia de instalação Fluig Studio.md)\n- [Atividade de serviço](../../Desenvolvimento sobre a plataforma/Fluig Studio/Configuração de Processos com Componentes Avançados (BPMN 2.0).md)/Atividades Workflow.md)\n- Conheça o [TOTVS iPaaS](https://www.totvs.com/totvs-ipaas), plataforma oficial de integração da TOTVS\n- Datasets:\n - [Dataset simples](../../Desenvolvimento sobre a plataforma/Desenvolvimento de Datasets/Dataset Simples.md)\n - [Construção de Dataset avançado](../../Desenvolvimento sobre a plataforma/Desenvolvimento de Datasets/Construção do Dataset Avançado.md)\n - [Sincronização de Datasets](../../Desenvolvimento sobre a plataforma/Desenvolvimento de Datasets/Sincronização de datasets.md)\n\n# Treinamentos gratuitos para ajudar nessa jornada\n\n- [Integração TOTVS Fluig x TOTVS RM](https://academy.fluig.com/theme/totvs_fluig_academy/landpage.php?course=63)\n- [Primeiros passos TOTVS iPaaS](https://academy.fluig.com/theme/totvs_fluig_academy/landpage.php?course=84)\n- [Construindo integrações com TOTVS iPaaS](https://academy.fluig.com/theme/totvs_fluig_academy/landpage.php?course=87)\n- Mais treinamentos, acesse o portal [TOTVS Fluig Academy](https://academy.fluig.com/)" }, { "metadata": { "title": "Do Tradicional ao Inovador: Como o TOTVS Fluig pode Transformar a Experiência de Cadastros", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328296", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Do Tradicional ao Inovador Como o TOTVS Fluig pode Transformar a Experiência de Cadastros.md" }, "content": "Do Tradicional ao Inovador: Como o TOTVS Fluig pode Transformar a Experiência de Cadastros\n\n\n![Universo TOTVS GIF](..\\..\\..\\images\\GIFuniverso-TOTVS.gif)\n\n# **Palestrantes**\n\n![](..\\..\\..\\images\\image-2024-6-25_15-31-25.png)\n\n## **Desafios enfrentados pelas Empresas**\n\n- Dependência de **processos manuais**.\n- Ausência de **padronização**.\n- Deficiência na rastreabilidade e **auditoria**.\n- Excesso de **controles paralelos**.\n- Solicitações **descentralizadas**.\n- Cadastros **fragmentados** e **inconsistentes**.\n- Dificuldade de **integração** entre os sistemas.\n- Falta de **visibilidade** e **transparência** do processo.\n\n## **Por que implementar a gestão de processos?**\n\n- O trabalhador de escritório médio ainda utiliza cerca de **10.000** folhas de papel por ano. *Fonte: Gartner*\n- Uma gestão eficiente faz as empresas produzir até **30%** mais rápido. *Fonte: Sebrae*\n- A automação de processos reduz significativamente erros humanos, com algumas empresas relatando uma diminuição de até 90% nos erros após a implementação de BPM. *Fonte: Medium*\n\n## **Transformando a experiência de processos**\n\nCom o TOTVS Fluig e o TOTVS iPaaS\n\n## **Uso do TOTVS Fluig para** **alavancar fluxos de Processos**\n\nIntegração com qualquer API\n\n![](..\\..\\..\\images\\image-2024-6-25_14-15-32.png)\n\n## **TOTVS iPaaS**\n\nA plataforma oficial de integrações da TOTVS\n\n- Criação de fluxos apenas arrastando componentes.\n- Monitoramento e rastreabilidade.\n- Criação de Regras de negócios.\n- Diversos aplicativos nativos e personalizáveis.\n\n**![](..\\..\\..\\images\\image-2024-6-25_18-15-23.png)**\n\n## **Utilizando o TOTVS iPaaS integrado ao TOTVS Fluig**\n\n**![](..\\..\\..\\images\\image-2024-6-25_14-17-9.png)**\n\n## **Na prática, como funciona a integração de processos**\n\n## **Simplificando** **o fluxo de cadastros**" }, { "metadata": { "title": "Do Tradicional ao Inovador: Como o TOTVS Fluig pode Transformar a Experiência de Cadastros", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328296", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Do Tradicional ao Inovador Como o TOTVS Fluig pode Transformar a Experiência de Cadastros.md" }, "content": "Do Tradicional ao Inovador: Como o TOTVS Fluig pode Transformar a Experiência de Cadastros\n\n\n**Problematização:**\n\n**Juana** é atendente em uma instituição de ensino e é responsável por **receber as fichas** dos novos alunos. \n  \nEste **processo manual** envolve preencher os dados e encaminhar as fichas para o coordenador **Pedro** realizar o **cadastro no sistema**, o que é **demorado** e sujeito a **erros**.\n\nA morosidade e a possibilidade de inconsistências causam **atrasos e reclamações**.\n\nA falta de automação resulta em **retrabalho** e baixa eficiência, destacando a necessidade de uma **solução tecnológica** que **agilize** e torne o processo mais preciso.\n\n## **Processo de Cadastro de Aluno**\n\nComo resolver esse problema da Juana?\n\n![](..\\..\\..\\images\\image-2024-6-25_14-21-6.png)\n\n## **Processo completo Rodando**\n\nLink do projeto do processo TOTVS Fluig: [fluig-universo-eclipse.zip](https://tdn.totvs.com/download/attachments/852328296/fluig-universo-eclipse.zip?version=1&modificationDate=1719422115987&api=v2)\n\n![](..\\..\\..\\images\\0-mostrando-processo-completo-ezgif.com-video-to-gif-converter.gif)\n\n## **Por dentro do Processo**\n\n![](..\\..\\..\\images\\1-mostrando-a-construcao-processo-no-eclipse-ezgif.com-video-to-gif-converter.gif)\n\n## **Por dentro da Integração**\n\n![](..\\..\\..\\images\\2-mostrando-a-configuracao-da-integracao-com-ipaas-ezgif.com-video-to-gif-converter.gif)\n\n## **Como fica no TOTVS iPaaS**\n\n![](..\\..\\..\\images\\3-mostrando-o-ipaas-ezgif.com-video-to-gif-converter.gif)\n\n## **TOTVS Flows**\n\n## **Como o Flows podem acelerar a produtividade?**\n\nOs Flows são processos pré-definidos, desenvolvidos e parametrizados pelo time Fluig ou por Parceiros, que podem ser adquiridos mediante uma assinatura.\n\nExiste os Flows Essentials e os Flows Advanced.\n\n## **Flows Essentials**\n\nProcessos prontos e auto instaláveis by TOTVS\n\n![](..\\..\\..\\images\\image-2024-6-25_14-39-1.png)\n\n## **Flows Advanced**" }, { "metadata": { "title": "Do Tradicional ao Inovador: Como o TOTVS Fluig pode Transformar a Experiência de Cadastros", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328296", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Do Tradicional ao Inovador Como o TOTVS Fluig pode Transformar a Experiência de Cadastros.md" }, "content": "Do Tradicional ao Inovador: Como o TOTVS Fluig pode Transformar a Experiência de Cadastros\n\n\nProcessos pré-definidos e integrados com ERP\n\n![](..\\..\\..\\images\\image-2024-6-25_14-40-38.png)\n\n## **Precisa de apoio?**\n\n- APIs do Fluig: \n- APIs da TOTVS: \n- Fluig Style Guide: \n- TOTVS Fluig Academy: \n- Conheça o Works\n- Conheça o PRIME Fluig: " }, { "metadata": { "title": "Empodere as áreas de negócio da sua empresa: desburocratizando a criação de processos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328312", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Empodere as áreas de negócio da sua empresa desburocratizando a criação de processos.md" }, "content": "Empodere as áreas de negócio da sua empresa: desburocratizando a criação de processos\n\n\n![Universo TOTVS GIF](..\\..\\..\\images\\GIFuniverso-TOTVS.gif)\n\n## **Palestrantes**\n\n![](..\\..\\..\\images\\image-2024-6-28_13-48-1.png)\n\nFaça o download dessa apresentação aqui: [Empodere as áreas de negócio da sua empresa](https://tdn.totvs.com/download/attachments/852328312/Empodere%20as%20%C3%A1reas%20de%20neg%C3%B3cio%20da%20sua%20empresa_%20desburocratizando%20a%20cria%C3%A7%C3%A3o%20de%20processos.pdf?version=1&modificationDate=1719505246903&api=v2)\n\n## **Introdução:**\n\nO propósito deste material é apresentar como é possível gerar mais produtividade e receita utilizando o novo módulo de processos (desenhador e formulário) para dar autonomia para as áreas de negócio das empresas.\n\n## **Desafios enfrentados pelas empresas:**\n\nEstudos indicam que ineficiências operacionais podem custar de 20% a 30% da receita anual das empresas​ ([Avitus Group](https://avitusgroup.com/safety-management/biz/5-costs-of-operational-inefficiency/))​​ ([Process St.](https://www.process.st/process-transparency/))​.\n\nFatores como a falta de transparência e a gestão centralizada de processos podem levar a erros, retrabalhos e decisões baseadas em informações desatualizadas, aumentando ainda mais os custos operacionais e reduzindo a competitividade.\n\n## **Problematização**" }, { "metadata": { "title": "Empodere as áreas de negócio da sua empresa: desburocratizando a criação de processos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328312", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Empodere as áreas de negócio da sua empresa desburocratizando a criação de processos.md" }, "content": "Empodere as áreas de negócio da sua empresa: desburocratizando a criação de processos\n\n\n**Case: LogiFlez Transportes**\n\nA TI centralizava todas as implementações de novos processos e por isso vivia sobrecarregada. Era RH, suporte técnico, produção, manutenção, marketing entre outras áreas da empresa pedindo para criar novos processos ou corrigir problemas nos processos já existentes. \n \nIsso tudo virava um caos e a fila de atividades da TI só crescia, criando um grande gargalo, onde todo mundo precisava esperar muito tempo para ter seus problemas resolvidos. \n \nE tempo, a gente sabe que é dinheiro!  \n \n*Quando as áreas de negócio precisam esperar pela TI para criar ou modificar processos, isso pode causar atrasos significativos. Em mercados competitivos, a velocidade é crucial para aproveitar oportunidades e responder rapidamente às mudanças de demanda​.* \n \nCom a chegada da black friday a área de Operações da **Logiflex transportes** identificou a necessidade urgente de ajustar os processos de entrega devido o aumento de demanda que estava por vir.\n\nQualquer ajuste precisava ser implementado rapidamente para evitar atrasos e perdas de clientes.\n\nSó que equipe de TI estava com muitas atividades e não conseguiu realizar os ajutes a tempo suficiente. E infelizmente esses ajustes não foram realizados a tempo por conta dessa dependência da equipe de TI e LogiFlex perdeu contratos importantes para concorrentes mais ágeis gerando frustração de toda a equipe.\n\n**Conclusão** \nApesar da logiflex transportes da história não existir, essa é infelizmente a realidade de muitas empresas que perdem eficiência, produtividade e oportunidades de receita por não darem autonomia para que as áreas de negócio criem seus próprios processos, além de que, centralizar toda criação e manutenção de seus processos nas área de TI, faz com que eles fiquem extremamente sobrecarregados em vez de se concentrarem em projetos mais estratégicos de inovações tecnológicas que também pode trazer retorno financeiro para a empresa." }, { "metadata": { "title": "Empodere as áreas de negócio da sua empresa: desburocratizando a criação de processos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328312", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Empodere as áreas de negócio da sua empresa desburocratizando a criação de processos.md" }, "content": "Empodere as áreas de negócio da sua empresa: desburocratizando a criação de processos\n\n### Então chega de deixar dinheiro na mesa e vamos ver a seguir como o TOTVS Fluig pode ajudar vocês usarem todo o potencial de negócio e tecnologia para que sua empresa cresça cada vez mais!\n\n## **Transformando a experiência de processos**\n\nOs novos recursos do editor de formulário e desenhador de processo oferecem, uma interface intuitiva do que garante uma implementação rápida e facilitam a criação e manutenção de qualquer fluxo de trabalho.\n\n### **Versão beta novo Desenhador de processos:**\n\n![](..\\..\\..\\images\\TOTVS%20Fluig%20Plataforma%20-%20Configurar%20Processos%20-%20Google%20Chrome%202024-06-12%2014-15-16_2.gif)\n\n*Esse é uma versão “demo” do novo desenhador de processos, que tem o propósito de ser muito mais intuitivo e fácil de usar, proporcionando autonomia para as pessoas criarem e darem manutenção para qualquer fluxo de trabalho, sem depender exclusivamente de uma pessoa técnica para construí-lo.*\n\n### **Novo Editor de formulário:**\n\n![](..\\..\\..\\images\\TOTVS%20Fluig%20Plataforma%20-%20Configurar%20Processos%20-%20Google%20Chrome%202024-06-12%2014-15-16_1.gif)\n\n*Junto com o desenhador de processo, fluxos de atividades, também temos uma grande evolução no editor de formulário, disponibilizado de forma fácil todos os componentes e configurações necessárias para construir o formulário que será usado na abertura da solicitação e outras atividades do processo.*\n\nAlém de processos como solicitação de equipamento, também será possível criar processos como: inclusão de contrato, solicitação de reembolso, entre outros.\n\n## **Solicitação de Contrato**\n\n**![](..\\..\\..\\images\\image-2024-6-25_17-5-54.png)    ![](..\\..\\..\\images\\image-2024-6-25_17-6-3.png)**\n\n## **Solicitação de Reembolso**\n\n**![](..\\..\\..\\images\\image-2024-6-25_17-6-24.png)    ![](..\\..\\..\\images\\image-2024-6-25_17-6-33.png)**\n\n## **Potencialize a sua rotina com o TOTVS Fluig, Vamos à Prática!**" }, { "metadata": { "title": "Empodere as áreas de negócio da sua empresa: desburocratizando a criação de processos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328312", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Empodere as áreas de negócio da sua empresa desburocratizando a criação de processos.md" }, "content": "Empodere as áreas de negócio da sua empresa: desburocratizando a criação de processos\n\n\nVamos demonstrar a criação um processo de **Solicitação de férias** com as novas interfaces do desenhador de processos e editor de formulário.\n\n## **Passo a passo:**\n\n1- Criar Diagrama\n\n2 - Criar Formulário\n\n3 - Publicar\n\n4 - Abrir Solicitação\n\n![](..\\..\\..\\images\\image-2024-6-25_17-8-16.png)\n\n### 1 - Criar Diagrama\n\n![](..\\..\\..\\images\\CPT2406281304-1180x528.gif)\n\n### 2 - Adicionar Atividades\n\n![](..\\..\\..\\images\\CPT2406281319-1170x522.gif)\n\n### 3 - Configurar Atividades\n\n![](..\\..\\..\\images\\CPT2406281314-1188x540.gif)\n\n### 5 - Adicionar scripts de processo\n\n![](..\\..\\..\\images\\CPT2406281322-1160x516.gif)\n\n### 6 - Criar formulário e adicionar título\n\n![](..\\..\\..\\images\\Adicionarttulodoformulario-ezgif.com-crop.gif)\n\n### 7 - Adicionar dados gerais\n\n![](..\\..\\..\\images\\Dadosdasfriass-ezgif.com-crop.gif)\n\n### 8 - Adicionar dados das Férias\n\n![](..\\..\\..\\images\\dadosaprovao-ezgif.com-video-to-gif-converter.gif)\n\n### 9 - Abrir solicitação de férias\n\n![](..\\..\\..\\images\\CPT2406281334-1311x613.gif)\n\n## **Com os novos módulos vai ficar muito mais fácil construir um processo pelo TOTVS Fluig!**\n\nMensagem para times de Negócio\n\n# **Não dependa exclusivamente da equipe de TI para construir os seus processos!**\n\n**Aumente a eficiência, produtividade e capacidade de responder mais rapidamente às demandas do mercado.**\n\nMensagem para times de TI\n\n# **Com um backlog reduzido, você ganha mais tempo para inovar!**\n\n**Ao aliviar a  TI da tarefa constante de construir e gerenciar processos administrativos, o novo editor de processos do Fluig permitem que a**\n\n**TI se concentre em áreas mais estratégicas e inovadoras. Isso não só melhora a eficiência e a produtividade geral da empresa, mas também posiciona a TI**\n\n**como um parceiro crucial para o crescimento e sucesso contínuo do negócio.**\n\n# **Para relembrar:**\n\n## **Dar autonomia para a áreas promove:**" }, { "metadata": { "title": "Empodere as áreas de negócio da sua empresa: desburocratizando a criação de processos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852328312", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Empodere as áreas de negócio da sua empresa desburocratizando a criação de processos.md" }, "content": "Empodere as áreas de negócio da sua empresa: desburocratizando a criação de processos\n\n\n- Aumento da competitividade e a **capacidade de inovação** **dentro das empresas;**\n- Economia de tempo e dinheiro, permitindo o **reinvestimento em áreas estratégicas;**\n- Funcionários concentrados em atividades **de maior valor agregado**;\n- O empoderamento dos colaboradores, resultando em um **ambiente de trabalho mais dinâmico e produtivo**.\n\nPara maiores detalhes, faça o download dessa apresentação aqui: [Empodere as áreas de negócio da sua empresa](https://tdn.totvs.com/download/attachments/852328312/Empodere%20as%20%C3%A1reas%20de%20neg%C3%B3cio%20da%20sua%20empresa_%20desburocratizando%20a%20cria%C3%A7%C3%A3o%20de%20processos.pdf?version=1&modificationDate=1719505246903&api=v2)" }, { "metadata": { "title": "My Approval: boas práticas que aceleram a tomada de decisão (TOTVS Fluig)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849554714", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\My Approval boas práticas que aceleram a tomada de decisão (TOTVS Fluig).md" }, "content": "My Approval: boas práticas que aceleram a tomada de decisão (TOTVS Fluig)\n\n\n![Universo TOTVS GIF](..\\..\\..\\images\\GIFuniverso-TOTVS.gif)\n\n## Palestrantes\n\n![Palestrante 1 - Anderson](..\\..\\..\\images\\38297904-1403725943093250-4760301241307758592-n-3.jpg)\n\nAnderson Simões\n\n![Palestrante 2 - Diego](..\\..\\..\\images\\21b75d65-65a6-4892-8ca9-a78d31b0ad68.jpg)\n\nDiego Zimmermann\n\n**Apresentação:** [My Approval: boas práticas que aceleram a tomada de decisão (TOTVS Fluig)](/pages/viewpage.action?pageId=849554714&preview=/849554714/852315630/My%20Approval_%20boas%20práticas%20que%20aceleram%20a%20tomada%20de%20decisão%20(TOTVS%20Fluig).pdf)\n\n#\n\n## **Introdução:**\n\nO propósito deste material é auxiliar na criação de um fluxo para o uso do aplicativo My Approval, destacando boas práticas e pontos de atenção durante a modelagem do processo.\n\n**Treinamento** **My Approval** **no** **Academy****:**\n\nTreinamento My Approval no Academy:\n\n[Como fazer - Instalar e usar o My Approval](https://academy.fluig.com/theme/totvs_fluig_academy/landpage.php?course=93)\n\n## **Modelagem de processo para o aplicativo My Approval**:\n\n**01.** No menu lateral, acionar **Processos**.\n\n**02.** Acionar **Configurar Processos**.\n\n**03.** Selecione o processo, em seguida selecione **Editar**.\n\n**04.**No Eclipse ou através da edição de processo, selecione a atividade que deseja configurar, clique no icone de engrenagem\n\n![](..\\..\\..\\images\\image-2024-6-13_19-27-6.png)\n\n**05.** Na aba **Mobile** será possível configurar o processo para o **My Approval**:\n\n[Lista de Marcadores](https://tdn.totvs.com/pages/copypage.action) ![](..\\..\\..\\images\\image-2024-6-13_19-20-34.png)\n\n## **Boas práticas:**" }, { "metadata": { "title": "My Approval: boas práticas que aceleram a tomada de decisão (TOTVS Fluig)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849554714", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\My Approval boas práticas que aceleram a tomada de decisão (TOTVS Fluig).md" }, "content": "My Approval: boas práticas que aceleram a tomada de decisão (TOTVS Fluig)\n\n\n- **Modelagem de fluxo**: Deve haver ao menos dois destinos configurados para a atividade configurada, sendo um para aprovação e outro para rejeição. Caso haja mais de dois destinos, os demais estarão disponíveis em **Mais ações** **(⋮).**\n- **Analise seu formulário**: Identifique os campos que devem ter maior destaque e configure-os para serem exibidos com relevância. Esses campos são: Título, Destaque e Descrição.\n- **Atribuições:** Visando agilizar as ações, defina os responsáveis através do mecanismo de atribuição para as atividades de destino.\n- **Prazo:** Configure o prazo da atividade na aba **Geral**, a fim de que os responsáveis pelas atividades tenham ciência dos prazos.\n- **Notificações:** Configure as notificações nas abas **Acompanhamento** e **Atraso**\n\n- - **Notifica responsável** \n Quando assinalado, determina que o responsável pela atividade será notificado por *e-mail* quando ela estiver atrasada.\n\n- - **Tolerância** \n Tempo durante o qual a plataforma irá aguardar após o vencimento do prazo da atividade para começar a enviar o *e-mail* de notificação de atraso para o responsável, requisitante ou gestor, conforme as opções assinaladas.\n\n- - **Frequência** \n Intervalo de tempo entre cada envio de *e-mail* de notificação de atraso para o responsável, requisitante ou gestor, conforme as opções assinaladas.\n\n- - **Aviso de expiração** \n Tempo antes da expiração da tarefa a partir do qual será enviado *e-mail* de notificação de que a tarefa está para expirar para o responsável, requisitante ou gestor, conforme as opções assinaladas.\n\n- - **Notifica requisitante** \n Quando assinalado, determina que o requisitante da solicitação será notificado por *e-mail* quando essa atividade estiver atrasada.\n\n- - **Notifica gestor** \n Quando assinalado, determina que o gestor do processo será notificado por *e-mail* quando essa atividade estiver atrasada." }, { "metadata": { "title": "My Approval: boas práticas que aceleram a tomada de decisão (TOTVS Fluig)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=849554714", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\My Approval boas práticas que aceleram a tomada de decisão (TOTVS Fluig).md" }, "content": "My Approval: boas práticas que aceleram a tomada de decisão (TOTVS Fluig)\n\n## **Vale lembrar:**\n\n- No My Approval, os formulários são apenas para consulta.\n- Cuidados com eventos de processos e formulários: por exemplo, se você tiver campos obrigatórios definidos via evento de formulário *validateForms*, não será possível prosseguir com a solicitação, pois não será possível respondê-la via My Approval. Nesse caso, será necessário realizar o preenchimento via plataforma ou aplicativo My Fluig.\n- Cuidados com as atribuições: caso as atribuições não sejam configuradas na modelagem, será necessário definir um responsável de forma manual no momento da movimentação.\n- Todas as tarefas sob responsabilidade do usuário serão apresentadas no My Fluig. Portanto, para manter uma experiência uniforme, recomenda-se que os processos sejam modelados para uso no My Approval.\n- Não é possível anexar via My Approval, os anexos fixados na solicitação nas etapas anteriores ficaram disponíveis para visualização.\n\n## **Sobre o  Login:**\n\n- Caso você possua o identity configurado em seu ambiente, será possível realizar login o e-mail na primeira tela.\n- Caso tenha interesse em acessar seu ambiente de homologação do identity clique no icone de ajuda ![(interrogação)](..\\..\\..\\images\\help_16.svg), será apresentada a opção para acesso ao ambiente de homologação.\n- Caso não possua o identity configurado em seu ambiente, será necessário clicar na opção **Acessar com o Servidor**." }, { "metadata": { "title": "Simplifique a gestão de senhas e MFA com o TOTVS Identity", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=851312277", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Simplifique a gestão de senhas e MFA com o TOTVS Identity.md" }, "content": "Simplifique a gestão de senhas e MFA com o TOTVS Identity\n\n\nAcesse a apresentação original: [[No Code] Simplifique a gestão de senhas e MFA com o TOTVS Identity.pdf](https://tdn.totvs.com/download/attachments/851312277/%5BNo%20Code%5D%20Simplifique%20a%20gest%C3%A3o%20de%20senhas%20e%20MFA%20com%20o%20TOTVS%20Identity.pdf?version=2&modificationDate=1719327188620&api=v2)\n\n![Universo TOTVS GIF](..\\..\\..\\images\\GIFuniverso-TOTVS.gif)\n\n![Palestrante 1 - Andressa](..\\..\\..\\images\\Andressa.jpg)\n\nAndressa Anton\n\n![Palestrante 2 - Lucas](..\\..\\..\\images\\Lucas.jpg)\n\nLucas Almeida\n\n### Resumo\n\nNeste artigo você vai encontrar o que é o TOTVS Identity e como ele pode ajudar na gestão de usuários e senhas, e na ativação do MFA para os seus sistemas TOTVS ou não TOTVS, que forem integrados ao Identity. Além disso, é possível entender como funciona integração e login no TOTVS Fluig, TOTVS Agro Multicultivo, TOTVS RM, TOTVS Protheus e TOTVS Datasul. Também demonstraremos a configuração de um provedor de login externo para o Identity, o que permite que você use o seu provedor preferido para logar no seu sistema TOTVS, usando o TOTVS Identity como intermediário. Por fim, mostraremos como é experiência de login de um usuário a partir do launchpad do usuário no Identity.\n\n## O que é o TOTVS Identity e para que serve?\n\n---\n\n- Acesso único a sistemas Internos e Externos\n- Crie **aplicativos**, **usuários** e **grupos**  e gerencie os **acessos**\n- Permite integração com nuvens públicas e privadas\n- Segurança e Disponibilidade\n- Ambiente 100% monitorado\n\n![](..\\..\\..\\images\\image-2024-6-21_10-53-27.png)\n\n## Como o TOTVS Identity vai aumentar a segurança dos acessos?\n\n---\n\nO TOTVS Identity irá atuar como um intermediário no login de todas as aplicações que forem integradas a ele, funcionando como a primeira camada de acesso. Possuímos diversos recursos de segurança e passamos por testes periódicos rigorosos para garantir a robustez da nossa aplicação.\n\n## \n\n### Filtro de acesso por IPs" }, { "metadata": { "title": "Simplifique a gestão de senhas e MFA com o TOTVS Identity", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=851312277", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Simplifique a gestão de senhas e MFA com o TOTVS Identity.md" }, "content": "Simplifique a gestão de senhas e MFA com o TOTVS Identity\n\n\nBloqueie o acesso ao domínio da empresa no TOTVS Identity a todos os endereços IP externos, exceto aqueles explicitamente liberados pelo administrador.\n\n## \n\n### Política de senhas personalizada\n\nDefina a política de senhas conforme a necessidade da sua empresa.\n\n## \n\nNeste vídeo estamos demonstrando a configuração da política de senha personalizada, com o bloqueio de utilização de números e letras sequenciais e do nome próprio do usuário. Após a configuração da nova política, um usuário que esteja com uma senha que não está de acordo com a política será direcionado para o fluxo de troca de senha. Apenas após definir uma senha que atende aos requisitos configurados é que será possível realizar login.\n\n## Your browser does not support the HTML5 video element\n\n### Autenticação Multi Fator\n\n---\n\nTodo usuário do TOTVS Identity pode ativar o MFA em sua conta, basta ir até o seu perfil e nas configurações de segurança da conta e ativar seu MFA. Além disso, o administrador do Identity tem a possibilidade de definir grupos de usuários com MFA Obrigatório, o grupo Everyone é um grupo que contém todos os usuários do Identity e ele pode ser usado quando há a necessidade de obrigar o acesso com MFA para todos os usuários.\n\nO TOTVS Identity possui uma aplicação própria para a geração dos tokens, que é o My Safe ID, mas também é possível utilizar outros autenticadores.\n\nNo vídeo abaixo, estamos definindo MFA Obrigatório para um grupo de usuários do Identity. Dessa forma, no próximo login de um usuário deste grupo, ele será direcionado a definir MFA para conseguir realizar o login.\n\n## Your browser does not support the HTML5 video element\n\n### Protocolos de autenticação seguros" }, { "metadata": { "title": "Simplifique a gestão de senhas e MFA com o TOTVS Identity", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=851312277", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Simplifique a gestão de senhas e MFA com o TOTVS Identity.md" }, "content": "Simplifique a gestão de senhas e MFA com o TOTVS Identity\n\n\n---\n\nSAML 2.0 e OIDC: são protocolos comuns, muito usados por diversas aplicações, que permitem a autenticação dos usuários sem a necessidade do tráfego de suas senhas nas requisições.\n\nAs integrações a seguir, com TOTVS Fluig, TOTVS Agro Multicultivo, TOTVS RM, TOTVS Protheus e TOTVS Datasul utilizam o protocolo SAML 2.0. Todas estas configurações possuem documentação de apoio, veja mais em [Integração com ERPs TOTVS](https://tdn.totvs.com/pages/releaseview.action?pageId=344473176). No [Fluig Academy](https://academy.fluig.com/) você também encontra treinamentos com passo a passo detalhado da integração com Fluig, RM e Protheus.\n\n### Configurando a integração entre TOTVS Identity e TOTVS Fluig\n\n## **Your browser does not support the HTML5 video element**\n\n### Configurando a integração entre TOTVS Identity e TOTVS Agro Multicultivo\n\n## Your browser does not support the HTML5 video element\n\n### **Configurando a integração entre TOTVS Identity e TOTVS RM**\n\n## Your browser does not support the HTML5 video element\n\n### **Configurando a integração entre TOTVS Identity e TOTVS Protheus**\n\n## Your browser does not support the HTML5 video element\n\n### **Autenticando no TOTVS Datasul com o TOTVS Identity**\n\n## Your browser does not support the HTML5 video element\n\n## **Integração com MS Active Directory**" }, { "metadata": { "title": "Simplifique a gestão de senhas e MFA com o TOTVS Identity", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=851312277", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Simplifique a gestão de senhas e MFA com o TOTVS Identity.md" }, "content": "Simplifique a gestão de senhas e MFA com o TOTVS Identity\n\n\nA integração com o Active Directory usa uma aplicação nossa chamada SmartSync. Essa aplicação precisa ser instalada na rede local onde está o Active Directory, apenas com saída para a internet, pois ela irá realizar chamadas para o TOTVS Identity, mas nunca irá receber chamadas diretas, o que permite que a aplicação não tenha porta de entrada aberta na rede.\n\n![](..\\..\\..\\images\\image-2024-6-21_11-37-45.png)\n\nComo vantagens da utilização do SmartSync com o TOTVS Identity podemos citar que: não há limitação de Active Directories a serem configurados; não é requerido VPN para esta configuração; e os usuários e grupos do AD são importados e mantidos sempre sincronizados, ou seja, se você criar um usuário no AD ele será criado no Identity automaticamente, da mesma forma se desativar esse usuário no AD, ele será desativado no Identity, e se adicionar um grupo ao usuário no AD, ele receberá o vínculo do grupo também no Identity. O contrário também é possível, realizar as alterações no Identity e replicá-las no Active Directory.\n\n## **Autenticação por provedor externo**\n\nÉ possível usar aplicações como Microsoft Entra ID, Okta, Facebook, Google, LinkedIn e outros provedores que também suportem OAuth2 ou OIDC.\n\nNo vídeo abaixo, estamos usando o Microsoft Entra ID como exemplo de configuração. [Clique aqui](https://tdn.totvs.com/pages/releaseview.action?pageId=842293735) para acessar a documentação detalhada desta configuração, ou caso use outro provedor, acesse a documentação completa em [Cadastro de Provedores](https://tdn.totvs.com/pages/viewpage.action?pageId=769987653).\n\n[\nYour browser does not support the HTML5 video element\n](/download/attachments/851312277/8-Cadastro de provedor generico.mp4)\n\n### Fazendo login na URL direta do TOTVS Fluig com o provedor genérico cadastrado no TOTVS Identity" }, { "metadata": { "title": "Simplifique a gestão de senhas e MFA com o TOTVS Identity", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=851312277", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Simplifique a gestão de senhas e MFA com o TOTVS Identity.md" }, "content": "Simplifique a gestão de senhas e MFA com o TOTVS Identity\n\n\nNeste caso usamos o TOTVS Fluig como exemplo, mas em aplicações que possuam URL direta de acesso o comportamento será o mesmo.\n\n[\nYour browser does not support the HTML5 video element\n](/download/attachments/851312277/9-LogindiretoFluig.mp4)\n\n## **Experiência de login de usuário**\n\nUma vez que todas as aplicações foram configuradas no TOTVS Identity e atribuídas ao usuário, ele poderá se autenticar diretamente na aplicação como já está acostumado a fazer, pois a aplicação irá redirecionar o usuário para login no TOTVS Identity e depois de logado, voltará direto para a aplicação em questão. No entanto, o usuário também tem a possibilidade de acessar a Launchpad do Identity, onde estarão listadas todas as aplicações que o usuário tem acesso e então a partir do Launchpad, acessar as aplicações desejadas, assim todos os aplicativos de acesso ficam listados em um único local, facilitando a visualização do usuário.\n\n[\nYour browser does not support the HTML5 video element\n](/download/attachments/851312277/10-experiencia de login.mp4)\n\n## **Recapitulando**\n\n![](..\\..\\..\\images\\image-2024-6-21_12-11-26.png)\n\nO custo de licenciamento do TOTVS Identity é baixo comparado a outros sistemas de gestão de identidade do mercado, entre em contato com seu EAR para mais informações a respeito." }, { "metadata": { "title": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=847899962", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Técnicas para dar mais segurança à sua plataforma TOTVS Fluig 5 dicas práticas.md" }, "content": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas\n\n\n![Universo TOTVS GIF](..\\..\\..\\images\\GIFuniverso-TOTVS.gif)\n\n## Palestrantes\n\n![Palestrante 1 - Abner](..\\..\\..\\images\\Captura-de-tela-2024-06-07-160801.png)\n\nAbner Athayde\n\nApresentação\n\n![Palestrante 2 - Vanat](..\\..\\..\\images\\Captura-de-tela-2024-06-07-161141.png)\n\nRafael Vanat\n\n**Apresentação:** [Técnicas para dar mais segurança à sua Plataforma Fluig\\_ 5 dicas práticas.pdf](/pages/viewpage.action?pageId=847899962&preview=%2F847899962%2F852325873%2FT%C3%A9cnicas+para+dar+mais+seguran%C3%A7a+%C3%A0+sua+Plataforma+Fluig_+5+dicas+pr%C3%A1ticas.pdf)\n\n# Objetivo\n\n---\n\nVocê encontrará nesta documentação 5 dicas práticas para aumentar a segurança da sua plataforma TOTVS Fluig. Além disso, são fornecidas orientações detalhadas e links para a configuração e boas práticas de cada técnica, ajudando a garantir a proteção e eficiência do seu ambiente Fluig.\n\n# 1 Proxy reverso\n\n### Segurança, Escalabilidade e Manutenção Simplificada" }, { "metadata": { "title": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=847899962", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Técnicas para dar mais segurança à sua plataforma TOTVS Fluig 5 dicas práticas.md" }, "content": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas\n\n\n---\n\nO proxy reverso é um intermediário entre os clientes externos e os servidores internos. O proxy, encaminha a solicitação para o servidor apropriado dentro da rede interna e, em seguida, retorna a resposta ao cliente. Isso **oculta a verdadeira identidade dos servidores internos**, e possibilitando a **inclusão fácil de camadas de segurança**, sem a necessidade de manutenção na aplicação em si, como por exemplo aplicação de SSL;. Além disso, pode balancear a carga entre vários servidores, melhorando a **escalabilidade e a disponibilidade do serviço**.\n\nEm uma instalação da plataforma este tipo de servidor é usado para habilitar uma topologia de arquitetura chamada [DMZ](../../Configuração/Configuração de Ambiente/Topologia DMZ.md).\n\n![](..\\..\\..\\images\\Topologia%20Universo%20Simplificado.png \"TOTVS Fluig > Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas > Topologia Universo Simplificado.png\")\n\n**Documentação**\n\n- [Configuração de Proxy Reverso](../../Configuração/Configuração de Ambiente/Proxy reverso.md)\n- [Alta disponibilidade e Balanceamento de carga](/display/fluig/Alta+disponibilidade+e+Balanceamento+de+carga)\n\n# 2 HTTPS\n\n### Segurança e Privacidade Online" }, { "metadata": { "title": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=847899962", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Técnicas para dar mais segurança à sua plataforma TOTVS Fluig 5 dicas práticas.md" }, "content": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas\n\n\n---\n\nComo evolução do HTTP como protocolo de transferência de hipertexto, o HTTPS (Hypertext Transfer Protocol Secure) adicionando uma camada crucial de segurança e autenticidade.\n\n**Como funciona o HTTPS?**\n\nQuando você acessa um site com HTTPS, o navegador e o servidor realizam um 'handshake' SSL/TLS. Durante esse processo, eles trocam chaves criptográficas e estabelecem uma conexão segura.Após essa conexão ser estabelecida, todos os dados transferidos entre o navegador e o servidor são criptografados, garantindo a privacidade e a integridade das informações.\n\n \n\n**Documentação**\n\n- [Certificado HTTPS (SSL/TLS) Gratuito](../../Configuração/Configuração de Ambiente/HTTPS/Certificado HTTPS (SSLTLS) Gratuito.md) Gratuito.md)\n- [Configuração de níveis de segurança no HTTPS](../../Configuração/Configuração de Ambiente/HTTPS/Configuração de níveis de segurança no HTTPS.md)\n- [Configuração HTTPS da plataforma](../../Configuração/Configuração de Ambiente/HTTPS/Configuração HTTPS da plataforma.md)\n- [Utilizando OpenSSL para configurar HTTPS](../../Configuração/Configuração de Ambiente/HTTPS/Utilizando OpenSSL para configurar HTTPS.md)\n\n# 3 Gestão de acessos e senhas\n\n### Garantia de proteção, segurança e controle de acessos" }, { "metadata": { "title": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=847899962", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Técnicas para dar mais segurança à sua plataforma TOTVS Fluig 5 dicas práticas.md" }, "content": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas\n\n\n---\n\n**Acessos e Senhas**\n\nTroque a senha do usuário **wcmadmin** regularmente. Se possível, incentive seus usuários a trocarem a senha com regularidade e **implemente a utilização de senhas fortes.**\n\nPara um gerenciamento mais completo e seguro dos acessos, permissões e identidades, recomendamos implementar o **[TOTVS Identity](../../Configuração/Identity.md)** integrado com o Fluig.\n\nCaso já possua um Active Directory, valide as credenciais dos usuários do **TOTVS Fluig diretamente no AD via protocolo LDAP**. Consulte o procedimento em: [Configuração de autenticação utilizando LDAP.](../../Configuração/Configuração de Ambiente/Configuração de autenticação utilizando LDAP.md)\n\nVocê também pode utilizar os eventos [beforeCreateUser](/display/fluig/Desenvolvimento+de+Eventos#DesenvolvimentodeEventos-beforeCreateUser) e [beforeUpdateUser](/display/fluig/Desenvolvimento+de+Eventos#DesenvolvimentodeEventos-beforeUpdateUser) para criar regras de senhas fortes e [onLoginError](/display/fluig/Desenvolvimento+de+Eventos#DesenvolvimentodeEventos-onLoginError) para desenvolver sistema de bloqueios em caso de tentativa de invasão por força bruta. Mais informações em [Desenvolvimento de eventos.](../../Desenvolvimento sobre a plataforma/Desenvolvimento de Eventos.md)\n\n**Gerenciar acesso aos documentos**\n\n- **Crie uma organização lógica (Taxonomia):** Estruture documentos em categorias e subcategorias intuitivas.\n- **Defina permissões específicas:** Atribua acessos conforme a necessidade de cada usuário ou grupo.\n- **Use herança de permissões:** Simplifique a administração permitindo que permissões sejam herdadas.\n- **Controle a aprovação de documentos:** Assegure que documentos sejam revisados antes de serem publicados.\n- **Oriente sobre segurança:** Instrua usuários na definição correta de permissões.\n- **Cuidado com a permissão TODOS:** Evite seu uso para proteger informações confidenciais.\n- **Busca respeita acesso do usuário:** A busca exibe apenas documentos que o usuário tem permissão para ver.\n\n**Gerenciamento de Permissões**\n\n[Revise os recursos e suas opções de Permissão](/pages/viewpage.action?pageId=234455792), defina os papéis de usuário e administrador, atribuindo permissões específicas para usuários, papéis e grupos. Gerencie o acesso a recursos como funcionalidades sociais e de comunidades, documentos, processos, APIs, datasets internos, webservices, páginas, barra de pesquisa e ícone de notificações. Emita relatórios para revisar permissões e, se necessário, restaure as configurações padrão.\n\n \n\n**Documentação**\n\n- [TOTVS Identity](../../Configuração/Identity.md)\n- [Configuração de autenticação do TOTVS Fluig utilizando LDAP](../../Configuração/Configuração de Ambiente/Configuração de autenticação utilizando LDAP.md)\n- [Desenvolvimento de Eventos Globais](../../Desenvolvimento sobre a plataforma/Desenvolvimento de Eventos.md)\n- [Taxonomia de Documentos](../../Recurso de Documentos (ECM).md)/Taxonomia de Documentos.md)\n\n- [Definir critérios de segurança para pasta ou para documento](/pages/viewpage.action?pageId=243008857)\n\n- [Permissões](/pages/viewpage.action?pageId=234455792)\n- [Como expor dados em ambientes públicos](../../Configuração/Apps e Mashups/Como expor dados em ambientes públicos.md)\n\n# 4 Backup e criptografia" }, { "metadata": { "title": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=847899962", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Técnicas para dar mais segurança à sua plataforma TOTVS Fluig 5 dicas práticas.md" }, "content": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas\n\n### Garantia e proteção de senha do banco de dados\n\n---\n\nImplemente backups regulares, importante recurso remediativo, siga as melhores práticas e crie cópias tanto da aplicação da plataforma, pasta de instalação, volume completo e a base de dados. Pode ser manual ou automatizado, dependendo do que acharem melhor. Siga as dicas da nossa documentação: [Backup da aplicação](../../Instalação e Atualização/Backup da aplicação.md).\n\n- A melhor defesa contra a perda de dados.\n- Reduza o risco de violações de dados e ransomware.\n- Garanta a continuidade dos negócios em caso de incidentes.\n\n \n\n**Encriptação de Senha do Banco:**\n\nAumente a segurança das suas informações. Evite o acesso não autorizado à base de dados através de dois passos simples de [Encriptação de senha do banco de dados](/pages/releaseview.action?pageId=454434362)\n\n# 5 Atualização da Plataforma\n\n### Manutenção e segurança em dia.\n\n---\n\nAgilize seu suporte e mantenha-se sempre atualizado, fique atento ao selo ![](..\\..\\..\\images\\mandatory.png) **Mandatory:**atualizações que possuem correções críticas emergenciais.\n\n \n\n**Documentação**\n\n- [Atualização da plataforma](../../Sobre a plataforma/Atualização da plataforma.md)\n- [Guia de atualização da plataforma](../../Instalação e Atualização/Guia de atualização da plataforma.md)\n\n# + Eventos de Auditoria\n\n### Análise Detalhada de Atividades." }, { "metadata": { "title": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=847899962", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2024\\Técnicas para dar mais segurança à sua plataforma TOTVS Fluig 5 dicas práticas.md" }, "content": "Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas\n\n\n---\n\nO recurso Eventos de Auditoria permite registrar alterações realizadas na plataforma em recursos específicos como Papel, Usuários, Grupos, Processos, Datasets, Documentos, entre outros. Acesse nossa [documentação para conhecer e saber como obter.](../../Configuração/Eventos de auditoria.md)\n\n![](..\\..\\..\\images\\EventosAuditoria.png \"TOTVS Fluig > Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas > EventosAuditoria.png\")\n\n# ... Saiba mais!\n\n---\n\n \n\nChecklist para ter uma ambiente Seguro: [Boas práticas de segurança para o seu ambiente](../../Especificações Técnicas/Boas práticas de segurança para o seu ambiente.md)" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n\n\n## Palestrantes\n\n![Palestrante 1 - Abner](..\\..\\..\\images\\1718311044257.jpg)\n\nAbner Athayde\n\n![Palestrante 2 - Vanat](..\\..\\..\\images\\1744228622366.jpg)\n\nRogério Carvalho\n\n**Download da Apresentação:** [10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade](https://www.dropbox.com/scl/fi/e4ntnqccukqyf82hzhrh4/2025-10-dicas-para-turbinar-seu-TOTVS-Fluig-melhorando-desempenho-e-estabilidade.pdf?rlkey=j60abln5dnxhkz7z4ty4h8xnu&st=8btnt64g&dl=0)\n\n# Objetivo\n\n---\n\nNesta página, compilaremos alguns pontos importantes para otimizar a entrega do serviço Fluig, passando por dicas de infraestrutura e também revisando alguns pontos de Desenvolimentos.\nVamos revisar alguns fatores, parâmetros e diretrizes que podem transformar a jornada com o Fluig em uma viagem tranquila, minimizando imprevistos com ações simples e eficientes.\n\n## **Algumas Configurações básicas costumam ficar esquecidas:**" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n\n\n- ## **Quantidade de Conexões do Fluig com o Banco de Dados (FluigDS, FluigDSRO e Customs)**\n\n Não existe uma configuração padrão para o número de conexões com o banco pois cada forma de uso da Plataforma pode demandar mais ou menos conexões, mas para sair da caixinha - ou sair das configurações padrão do instalador - pode-se ajustar inicialmente o **max-pool-size** para 300 em cada um dos Datasources. \n \n Para casos onde a demanda de uso é grande, pode ser necessário um ajuste fino nestes parâmetros, ou ainda considerar um crescimento horizontal da Infraestrutura. Falaremos sobre Load Balance mais à frente. \n \n O TOTVS Fluig por padrão tem configurados no arquivo domain.xml 3 Datasources para atender às diversas necessidades operacionais. Sendo eles **FluigDS** e **FluigDSRO** de uso exclusivo da Plataforma e **AppDS** que é voltado para uso em customizados. Abaixo um exemplo de configuração sugerida para estes Datasources:\n\n**FluigDS - domain.xml**\n\n```\n \n jdbc:mysql://localhost:3306/fluig_mysql?useSSL=false&nullDatabaseMeansCurrent=true\n mysqlDriver\n TRANSACTION_READ_COMMITTED\n \n 10\n 300\n ...\n \n```\n\n**FluigDSRO - domain.xml**\n\n```\n \n jdbc:mysql://localhost:3306/fluig_mysql?useSSL=false&nullDatabaseMeansCurrent=true\n mysqlDriver\n TRANSACTION_READ_COMMITTED\n \n 5\n 300\n...\n \n```\n\n**AppDS - domain.xml**\n\n```\n\n        jdbc:mysql://localhost:3306/fluig_mysql?useSSL=false&nullDatabaseMeansCurrent=true\n mysqlDriver\n TRANSACTION_READ_COMMITTED\n \n 5\n 300\n...\n \n```\n\n           O arquivo domain.xml pode ser encontrado no seguinte caminho***: \\appserver\\domain\\configuration\\domain.xml.*** A quantidade máxima de conexões pode ser ajustada no parâmetro ****.\n\nSempre realize um Backup do arquivo domain.xml antes de realizar alterações. \nAs alterações serão aplicadas somente após a reinicialização da Plataforma.\n\n- ## **Adequação das Filas Assíncronas**\n\nTal como no Banco de Dados, não existe uma configuração padrão para as Filas Assíncronas da Plataforma. Entretanto, alguns ajustes simples podem trazer uma melhor entrega do serviço sem um aumento considerável no consumo de recursos do servidor; \nAbaixo, listo uma **sugestão** de parametrização que costuma atender a maioria dos casos de forma satisfatória:\n\n**Filas Assíncronas - domain.xml**\n\n```\n \t \n \n \n \n \n \n \n \n \n \n \n```\n\nO arquivo domain.xml pode ser encontrado no seguinte caminho*: **\\appserver\\domain\\configuration\\domain.xml**.*Sempre realize um Backup do arquivo domain.xml antes de realizar alterações. \nAs alterações serão aplicadas somente após a reinicialização da Plataforma.\n\n- ## **Ajuste de Memória (XMX, MetaSpace)**\n\nPor padrão. as configurações de memória que o instalador fornece são:\n\nsize=\"2g\" (memória inicial de consumo)\n\nmax-size=\"4g\" (máximo a ser consumido)\n\nPara um ambiente de desenvolvimento local, muitas vezes estes parâmetros são suficientes. Porém, para um ambiente de homologação ou produção, é necessário alterar esses valores. \n \nEsta alteração é feita no arquivo host.xml, que pode ser localizado em: **\\appserver\\domain\\configuration\\host.xml.**\n\nNão é recomendado alterar a quantidade inicial (mínima) de memória alocada **(size=\"2g\")**, pois a plataforma alocará memória de acordo com a necessidade sem que ultrapasse o valor máximo declarado em max-size, podendo retornar até o valor mínimo sempre que a demanda de uso da plataforma diminuir.\n\nPortanto, na tag o parâmetro a ser ajustado é o 'max-size'. \nNos testes de performance realizados pela equipe de produto, o melhor valor para este parâmetro é **12g,** sendo que acima deste valor não há ganho real de performance. Falaremos mais sobre como ir além deste ponto no tópico seguinte 'Dimensionamento'. \n \nAlém disto, recomenda-se também ampliar o valor do parâmetro MaxMetaspaceSize, de 1024m (1g) para 2g, conforme exemplo abaixo:\n\n**Ajuste de Memória - host.xml**\n\n```\n \n \n \n \n \n```\n\nEsta parametrização sugerida faz um bom uso dos recursos de memória, sem desperdiçar ou alocar recursos que serão utilizadas de forma não otimizada. \n \nÉ importante garantir que o servidor tenha memória suficiente para suportar esta configuração. \nTenha em mente que o Sistema operacional também consome memória, então para o ajuste sugerido, deve haver pelo menos 18g de memória instalada no servidor (12g + 2g + 4g para o S.O.). \nNa documentação [Modelo de dimensionamento](../../Especificações Técnicas/Dimensionamento/Modelo de dimensionamento.md) podem ser encontrados mais detalhes e recomendações sobre o assunto.\n\nSempre realize um Backup do arquivo host.xml antes de realizar alterações. \nAs alterações serão aplicadas somente após a reinicialização da Plataforma.\n\n- # **Limite de Arquivos do Linux e parametrizações que dependem do Sistema Operacional, como permissões e liberações de Firewall**\n\nA instalação do Fluig depende diretamente do comportamento de das parametrizações do S.O. e da Topologia de Rede em que esteja sendo executado, portanto alguns detalhes devem ser verificados, listamos alguns abaixo: \n \n-Permissionamento no sistema de arquivos: \nGaranta que o serviço Fluig seja Owner do diretório da instalação, bem como do Volume da plataforma; \n \n-Liberação em Firewall: \nPor se tratar de uma aplicação onLine, é imprescindível garantir que as portas e endereços envolvidos estejam com a correta liberação. Consulte [Portas e endereços](../../Especificações Técnicas/Portas e endereços.md) para mais detalhes; \n \n-Caso o servidor seja Linux, recomendamos visitar a documentação de [Configurações sugeridas em ambientes Linux](https://tdn.totvs.com.br/pages/viewpage.action?pageId=242389225) para o perfeito funcionamento neste S.O.\n\n# 2 Dimensionamento" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n\n### Observar as demandas e responsabilidades atribuídas à Plataforma, e trabalhar com uma entrega coerente de disponibilidade de serviço" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n\n\n- ## **Crescimento Horizontal x Vertical**\n\nApós atingir o limite de memória no ajuste das parametrizações padrão, que vimos no tópico anterior, o Crescimento da entrega de disponibilidade de serviço deve ser planejado de forma Horizontal.\n\nOu seja, se a demanda aumenta, ao invés de ultrapassar o limite recomendado de máximo de memória para o serviço Fluig devem ser disponibilizados mais servidores em paralelo, implementando o Balanceamento de Carga.\n\nPara implementar da forma correta, recomendamos avaliar as documentações [Modelo de dimensionamento](https://tdn.totvs.com.br/display/fluig/Modelo+de+dimensionamento) e [Alta disponibilidade e Balanceamento de carga](https://tdn.totvs.com.br/display/fluig/Alta+disponibilidade+e+Balanceamento+de+carga), que trazem as diretrizes recomendadas para esta implementação.\n\n- ## **Demanda Uso x Quantidade de Nós (capacidade de processamento)**\n\nA partir de 100 usuários acessando a plataforma em paralelo já é recomendada a implementação do Balanceamento de Carga com pelo menos dois Servidores Fluig.  \nMesmo com menos usuários, é uma boa prática projetar este crescimento, avaliando possíveis projetos futuros e pavimentando o caminho para que a implementação do Balanceamento seja realizada. \n \nAlém do Balanceamento de Carga, ferramentas como o Apache e NGinx podem atuar como um Proxy Reverso, atuando como uma camada extra de segurança, e ampliando a maturidade da sua topologia de rede. \nPara mais dicas de segurança, visite também [Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas](https://tdn.totvs.com.br/pages/viewpage.action?pageId=847899962)\n\n- ## **Avaliar as Demandas de integração para adequar a entrega de disponibilidade**\n\nMuitas vezes observamos o acesso realizado por usuários físicos, mas desconsideramos que as integrações de entrada (ERP e sistemas terceiros) e integrações de saída (Datasets sincronizados, Chamadas de webservices, etc) também demandam recursos computacionais. \nSempre considere estas demandas ao realizar o dimensionamento da Plataforma, para evitar impactos aos usuários físicos e garantir uma entrega de qualidade no serviço da Plataforma.\n\n# 3 Otimização dos Dados da Plataforma" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n\n### Ferramentas nativas do Fluig para uso rotineiro, e algumas dicas extras" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n\n\n- ## **Limpeza de Notificações,** **Limpeza de Lixeira e** **Compactação de Solicitações**\n\nAlgumas ações básicas podem ser feitas utilizando a ferramenta nativa embarcada na plataforma, e trazem vantagens para manutenção de dados a longo prazo; \nVerifique **[Plataforma ❙ Agendador de tarefas](https://tdn.totvs.com/pages/viewpage.action?pageId=234455387)** e avalie como estão suas configurações de Limpeza de Notificações, limpeza de Lixeira e Compactação de Solicitações.\n\nEstas ações visam otimizar dados das tabelas e expurgar informações que não precisam mais ocupar espaço em Banco de Dados. Mais detalhes sobre cada um dos tópicos podem ser encontrados na documentação oficial.\n\n- ## **Avaliar documentos  nunca acessados**\n\n**SQL - Documentos nunca acessados**\n\n```sql\n/* Anexos de processos nunca acessados */\n\nSELECT nr_versao, nr_documento, nm_arquivo_fisico, num_tam_arq_fisic FROM documento d WHERE nr_acessos = 0 AND tp_documento=7 OR (tp_documento=2 AND EXISTS(SELECT ap.NR_DOCUMENTO FROM anexo_proces ap WHERE ap.NR_DOCUMENTO = d.NR_DOCUMENTO) ) ORDER BY num_tam_arq_fisic DESC, nr_documento DESC\n\n/* Documentos que não são anexos de processos, nunca acessados */\n\nSELECT nr_versao, nr_documento, nm_arquivo_fisico, num_tam_arq_fisic FROM documento d WHERE nr_acessos = 0 AND tp_documento=2 AND not EXISTS(SELECT ap.NR_DOCUMENTO FROM anexo_proces ap WHERE ap.NR_DOCUMENTO = d.NR_DOCUMENTO ) ORDER BY num_tam_arq_fisic DESC, nr_documento DESC\n```\n\n```\nNunca elimine informações diretamente das tabelas da plataforma.\n```\n\nOs documentos que forem identificados para eliminação devem ser eliminados através da Navegação de Documentos, ou das APIs Públicas de manutenção de Documentos.\n\n- ## **Avaliar documentos c****om validade expirada**\n\n**SQL - Documentos nunca acessados**\n\n```sql\n/* documentos com a data de expiração menor do que a data atual */\nSELECT distinct(nr_documento) FROM documento WHERE dt_expiracao < CURDATE()\n```\n\n```\nNunca elimine informações diretamente das tabelas da plataforma.\n```\n\nOs documentos que forem identificados para eliminação devem ser eliminados através da Navegação de Documentos, ou das APIs Públicas de manutenção de Documentos.\n\n- ## **Expurgo da tabela fdn\\_accesslog**\n\nA tabela fdn\\_accesslog registra todas as tentativas de login com erro, com sucesso e logout da Plataforma. \nOs dados desta tabela podem servir para auditoria de acesso, mas após extraídos relatórios e informações relevantes, as informações podem ser apagadas da tabela para diminuir o volume de dados do Banco de Dados.\n\n**SQL - Documentos nunca acessados**\n\n```sql\n/*\n log_type:\n0 - LOGIN, \n1 - LOGINERROR, \n2 - LOGOUT\n\naccess_date\nData no formato 'YYYY-MM-DD HH:mm:ss'\n*/\nSELECT * FROM fdn_accesslog\n```\n\nDiferente de outras tabelas da plataforma, a tabela fdn\\_accesslog pode ter dados eliminados diretamente no banco de dados.\n\n# 4 Chamadas de Serviço Padronizadas" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n\n### A interface de integração da Plataforma é completa e segura\n\n- ## **Sempre consumir APIs documentadas**\n\nNas integrações com aplicações externas e APIs da Plataforma, é importante garantir que ocorram de forma segura e confiável.\n\nAs APIs documentadas são uma forma de 'contrato', onde a documentação da API garante que a assinatura seguirá coerente ao longo das atualizações das Plataformas.\n\n- ## **Usar o Cadastro de Serviços como Interface de Integração**\n\nO Cadastro de Serviços da Plataforma traz diversas vantagens, como por exemplo a rastreabilidade do número total de chamadas, bem como a diferenciação das chamadas com sucesso e as que retornaram erro, em cada API cadastrada.\n\nAlém disso, nas APIs configuradas é possível consultar um Log detalhado destas tentativas de integração. \nConsulte a documentação [Plataforma ❙ Serviços](https://tdn.totvs.com/pages/viewpage.action?pageId=243660796) para avaliar todas as funcionalidades.\n\n![](..\\..\\..\\images\\image-2024-6-16_22-47-28.png)\n\n- ## **Tirar proveito da Modernização e Evolução constantes da interface da Plataforma**\n\nUtilizar as interfaces da Plataforma para implementar suas integrações garante que, caso surjam novas ferramentas, Melhorias e correções, você seja contemplado sem maiores esforços. \n \nUma recomendação é sempre complementar o seu desenvolvimento de integrações avaliando a performance de APIs fora do contexto da Plataforma, utilizando ferramentas como PostMan para observar o comportamento das APIs isoladamente.\n\n# 5 Controles de logs\n\n### Um dos Maiores Aliados do desenvolvedor" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n\n\n- ## **Log de chamadas de Serviço - Request x Response**\n\nTão importante quanto fazer um desenvolvimento bem feito, é ter um acompanhamento dessas chamadas. \nO Log das chamadas de Serviço é uma interface complementar ao Log Principal da plataforma, Nichado para rastrear as interações com algum serviço específico cadastrado na Plataforma.\n\n- ## **Log Principal - server.log**\n\nTempos e Detalhes de execução de Serviços, Dataset e Eventos da Plataforma. Confira também [Plataforma ❙ Controle de log](https://tdn.totvs.com.br/pages/viewpage.action?pageId=236428687)\n\n- ## **Log Por Usuário**\n\nLog específico para as ações realizadas na Sessão de um usuário específico. Muito útil para isolar e avaliar comportamentos inesperados reportados por usuários da plataforma. Confira também [Controle de Log](https://tdn.totvs.com.br/display/fluig/Controle+de+Log)\n\n- ## **API de monitoramento de tempos de Execução**\n\nAPI com a listagem dos tempos médios em Milissegundos de execuções das APIs e ferramentas internas da Plataforma.  \nAcessar a URL abaixo com um usuário Administrador: \n \n[URL Flig]/api/public/wcm/chronos/meanTimes \n \n![](..\\..\\..\\images\\image-2024-6-16_23-35-54.png)\n\n# 6 Cuidados durante a construção de Processos\n\n### Quando pequenos detalhes mudam tudo\n\n# 6 Cuidados durante a construção de Processos\n\n### Quando pequenos detalhes mudam tudo\n\n# 7 Página Home\n\n### Uma boa experiência na Plataforma inicia com um bom primeiro passo; A página inicial deve ser leve, rápida e objetiva" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n\n\n- **Uma boa experiência na Plataforma inicia com um bom primeiro passo; A página inicial deve ser leve, rápida e objetiva** \n \n ![](..\\..\\..\\images\\homeGIF.gif) \n \n **Todo usuário que acessa a plataforma passa pela página página Inicial.** **Geralmente diversas vezes ao dia!**\n- **Carregue recursos de forma assíncrona ou utilize Promises**Sempre que for possível, utilizar chamadas assíncronas para que a home não fique presa. O número de ***threads* para chamadas síncronas do *Browser*** é limitado, e se muitas chamadas síncronas forem realizadas em paralelo, isto ocasionará no congelamento da página.Utilize chamadas assíncronas, ou Promises para realizar chamadas com menor impacto e realizar um carregamento de página mais fluído.\n- **Imagens dimensionadas corretamente**Observe o tamanho dos seus Banners e widgets para que as imagens sejam geradas com o tamanho correto. \n Se seu Banner principal tem, por exemplo, 800 pixels de largura, não há necessidade de que a imagem tenha um tamanho maior do que isto, pois serão desperdiçados recursos computacionais do servidor, espaço no volume, largura de banda e processamento do Browser para redimensionar a imagem para o tamanho desejado.\n- **Otimize cada recurso utilizado**Assim como as imagens, é possível facilmente compactar recursos como JavaScript para que tenham o menor impacto possível no carregamento de páginas web.Além disto, é importante avaliar se as chamadas de Datasets e recursos de outras fontes de dados estão otimizadas. As chamadas de Datasets do TOTVS Fluig possuem parâmetros como Fields e Constraints, para que sejam retornados somente os campos desejados,  e os registros já filtrados para que sejam trafegados somente os dados que se deseja utilizar em tela. **Consulte e saiba mais.**\n- **Abuse dos Datasets Sincronizados, evitando Integrações Síncronas em tempo de execução**Tanto na home quanto nas demais páginas da plataforma, quando for carregar dados de ERPs ou Plataformas externas, priorize a elaboração de Datasets Sincronizados, que podem realizar um cache local da informação para que as informações fiquem disponíveis em armazenamento do próprio TOTVS Fluig.A sincronização de Datasets tem como objetivo reduzir o número de acessos a serviços de dados fornecidos por produtos externos à plataforma TOTVS Fluig. É uma prática comum trazer dados de sistemas externos para complementar informações do formulário de um processo ou realizar validações em eventos com base nas informações retornadas por este dataset. \n Saiba mais em \n\n# 8 Integração Assíncrona" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n\n### A Maioria das Integrações pode ocorrer enquanto o usuário se ocupa com outras tarefas\n\n### Em um universo de plataformas cada vez mais integradas, é imprescindível entender quais integrações precisam ocorrer enquanto o usuário aguarda, e quais podem ser executadas enquanto o usuário realiza outra tarefa;\n\nIntegrações de negócio Geralmente podem ocorrer do lado do servidor, garantindo uma maior fluidez das atividades dos usuários em tela e liberando recursos computacionais;\n\nCada vez que um usuário aguarda uma integração em tela, também estão comprometidas as Threads do Browser e topologia de rede envolvida.\n\nDestacamos alguns motivos para priorizar integrações assíncronas:\n\n- Evita o bloqueio das operações do usuário \n ![](..\\..\\..\\images\\image-2024-7-3_14-47-5.png)\n- Múltiplas tentativas sem impacto direto para a operação\n- Pode ser executada em horário de menor demanda, não competindo diretamente com os usuários.\n\nPara evitar\n\n# 9 Datasets\n\n### Boas práticas garantem que este grande aliado não se torne uma dor de cabeça\n\nNa Implementação ou Consumo dos seus Datasets, considere:\n\n- Trafegar somente o necessário - Observe o uso de Fields, SQLLimit e PKs nas chamadas\n- Centralização para reaproveitamento - menos chamadas em tela\n- Observar o tempo total de execução em sincronizações\n- Cuidado com o agendamento e o intervalo de execução\n- Captura e tratamento de erros (try / catch)\n- Liberação de recursos de Integração (Stream, Connection, Statement, ResultSet)\n\n# 10 Gestão do Banco de Dados\n\n### Preocupações em tempo de Projeto, Ações de Rotina e manutenções básicas" }, { "metadata": { "title": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade", "source": "https://tdn.totvs.com/display/fluig/10+dicas+para+turbinar+seu+TOTVS+Fluig+melhorando+desempenho+e+estabilidade", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade.md" }, "content": "10 dicas para turbinar seu TOTVS Fluig melhorando desempenho e estabilidade\n\n\nTarefas que podem ser realizadas pelo DBA de forma preventiva:\n\n- Análise de eficiência dos Índices Padrão\n- Manutenção de MetaListas - Criação de índices e otimização conforme uso das tabelas de formulário\n- ‘Optimize tables’ em tabelas mais movimentadas\n- Avaliação recorrente do comportamento do BD\n\n# + Bônus: Percepção de Lentidão\n\nÉ importante saber diferenciar o que é lentidão do que são processos lentos;\n\nAproveite estas dicas para tirar do usuário a Percepção da Lentidão\n\nNem todo processo lento precisa prender o usuário\n\n ![](..\\..\\..\\images\\dataset-compare-v3.gif)" }, { "metadata": { "title": "5 dicas práticas para dar mais segurança ao TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=953006932", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\5 dicas práticas para dar mais segurança ao TOTVS Fluig.md" }, "content": "5 dicas práticas para dar mais segurança ao TOTVS Fluig\n\n\n## Palestrantes\n\n![Palestrante 1 - Abner](..\\..\\..\\images\\1718311044257.jpg)\n\nAbner Athayde\n\n![Palestrante 2 - Vanat](..\\..\\..\\images\\1744228622366.jpg)\n\nRogério Carvalho\n\n**Download da Apresentação:** [5 dicas práticas para dar mais segurança ao TOTVS Fluig](https://www.dropbox.com/scl/fi/snqwribo561s7p1ofykm8/2025-5-dicas-pr-ticas-para-dar-mais-seguran-a-ao-TOTVS-Fluig.pdf?rlkey=d7y8cyy3siqvu10sgipzt886o&st=7nz4tqwm&dl=0)\n\n# Objetivo\n\n---\n\nVocê encontrará nesta documentação 5 dicas práticas para aumentar a segurança da sua plataforma TOTVS Fluig. Além disso, são fornecidas orientações detalhadas e links para a configuração e boas práticas de cada técnica, ajudando a garantir a proteção e eficiência do seu ambiente Fluig.\n\n# 2 HTTPS\n\n### Segurança e Privacidade Online" }, { "metadata": { "title": "5 dicas práticas para dar mais segurança ao TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=953006932", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\5 dicas práticas para dar mais segurança ao TOTVS Fluig.md" }, "content": "5 dicas práticas para dar mais segurança ao TOTVS Fluig\n\n\n---\n\nComo evolução do HTTP como protocolo de transferência de hipertexto, o HTTPS (Hypertext Transfer Protocol Secure) adicionando uma camada crucial de segurança e autenticidade.\n\n**Como funciona o HTTPS?**\n\nQuando você acessa um site com HTTPS, o navegador e o servidor realizam um 'handshake' SSL/TLS. Durante esse processo, eles trocam chaves criptográficas e estabelecem uma conexão segura.Após essa conexão ser estabelecida, todos os dados transferidos entre o navegador e o servidor são criptografados, garantindo a privacidade e a integridade das informações.\n\n \n\n**Documentação**\n\n- [Certificado HTTPS (SSL/TLS) Gratuito](../../Configuração/Configuração de Ambiente/HTTPS/Certificado HTTPS (SSLTLS) Gratuito.md) Gratuito.md)\n- [Configuração de níveis de segurança no HTTPS](../../Configuração/Configuração de Ambiente/HTTPS/Configuração de níveis de segurança no HTTPS.md)\n- [Configuração HTTPS da plataforma](../../Configuração/Configuração de Ambiente/HTTPS/Configuração HTTPS da plataforma.md)\n- [Utilizando OpenSSL para configurar HTTPS](../../Configuração/Configuração de Ambiente/HTTPS/Utilizando OpenSSL para configurar HTTPS.md)\n\n# 3 Gestão de acessos e senhas\n\n### Garantia de proteção, segurança e controle de acessos" }, { "metadata": { "title": "5 dicas práticas para dar mais segurança ao TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=953006932", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\5 dicas práticas para dar mais segurança ao TOTVS Fluig.md" }, "content": "5 dicas práticas para dar mais segurança ao TOTVS Fluig\n\n\n---\n\n**Acessos e Senhas**\n\nTroque a senha do usuário **wcmadmin** regularmente. Se possível, incentive seus usuários a trocarem a senha com regularidade e **implemente a utilização de senhas fortes.**\n\nPara um gerenciamento mais completo e seguro dos acessos, permissões e identidades, recomendamos implementar o **[TOTVS Identity](../../Configuração/Identity.md)** integrado com o Fluig.\n\nCaso já possua um Active Directory, valide as credenciais dos usuários do **TOTVS Fluig diretamente no AD via protocolo LDAP**. Consulte o procedimento em: [Configuração de autenticação utilizando LDAP.](../../Configuração/Configuração de Ambiente/Configuração de autenticação utilizando LDAP.md)\n\nVocê também pode utilizar os eventos [beforeCreateUser](/display/fluig/Desenvolvimento+de+Eventos#DesenvolvimentodeEventos-beforeCreateUser) e [beforeUpdateUser](/display/fluig/Desenvolvimento+de+Eventos#DesenvolvimentodeEventos-beforeUpdateUser) para criar regras de senhas fortes e [onLoginError](/display/fluig/Desenvolvimento+de+Eventos#DesenvolvimentodeEventos-onLoginError) para desenvolver sistema de bloqueios em caso de tentativa de invasão por força bruta. Mais informações em [Desenvolvimento de eventos.](../../Desenvolvimento sobre a plataforma/Desenvolvimento de Eventos.md)\n\n**Gerenciar acesso aos documentos**\n\n- **Crie uma organização lógica (Taxonomia):** Estruture documentos em categorias e subcategorias intuitivas.\n- **Defina permissões específicas:** Atribua acessos conforme a necessidade de cada usuário ou grupo.\n- **Use herança de permissões:** Simplifique a administração permitindo que permissões sejam herdadas.\n- **Controle a aprovação de documentos:** Assegure que documentos sejam revisados antes de serem publicados.\n- **Oriente sobre segurança:** Instrua usuários na definição correta de permissões.\n- **Cuidado com a permissão TODOS:** Evite seu uso para proteger informações confidenciais.\n- **Busca respeita acesso do usuário:** A busca exibe apenas documentos que o usuário tem permissão para ver.\n\n**Gerenciamento de Permissões**\n\n[Revise os recursos e suas opções de Permissão](/pages/viewpage.action?pageId=234455792), defina os papéis de usuário e administrador, atribuindo permissões específicas para usuários, papéis e grupos. Gerencie o acesso a recursos como funcionalidades sociais e de comunidades, documentos, processos, APIs, datasets internos, webservices, páginas, barra de pesquisa e ícone de notificações. Emita relatórios para revisar permissões e, se necessário, restaure as configurações padrão.\n\n \n\n**Documentação**\n\n- [TOTVS Identity](../../Configuração/Identity.md)\n- [Configuração de autenticação do TOTVS Fluig utilizando LDAP](../../Configuração/Configuração de Ambiente/Configuração de autenticação utilizando LDAP.md)\n- [Desenvolvimento de Eventos Globais](../../Desenvolvimento sobre a plataforma/Desenvolvimento de Eventos.md)\n- [Taxonomia de Documentos](../../Recurso de Documentos (ECM).md)/Taxonomia de Documentos.md)\n\n- [Definir critérios de segurança para pasta ou para documento](/pages/viewpage.action?pageId=243008857)\n\n- [Permissões](/pages/viewpage.action?pageId=234455792)\n- [Como expor dados em ambientes públicos](../../Configuração/Apps e Mashups/Como expor dados em ambientes públicos.md)\n\n# 4 Backup e criptografia" }, { "metadata": { "title": "5 dicas práticas para dar mais segurança ao TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=953006932", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\5 dicas práticas para dar mais segurança ao TOTVS Fluig.md" }, "content": "5 dicas práticas para dar mais segurança ao TOTVS Fluig\n\n### Garantia e proteção de senha do banco de dados\n\n---\n\nImplemente backups regulares, importante recurso remediativo, siga as melhores práticas e crie cópias tanto da aplicação da plataforma, pasta de instalação, volume completo e a base de dados. Pode ser manual ou automatizado, dependendo do que acharem melhor. Siga as dicas da nossa documentação: [Backup da aplicação](../../Instalação e Atualização/Backup da aplicação.md).\n\n- A melhor defesa contra a perda de dados.\n- Reduza o risco de violações de dados e ransomware.\n- Garanta a continuidade dos negócios em caso de incidentes.\n\n \n\n**Encriptação de Senha do Banco:**\n\nAumente a segurança das suas informações. Evite o acesso não autorizado à base de dados através de dois passos simples de [Encriptação de senha do banco de dados](/pages/releaseview.action?pageId=454434362)\n\n# 5 Atualização da Plataforma\n\n### Manutenção e segurança em dia.\n\n---\n\nAgilize seu suporte e mantenha-se sempre atualizado, fique atento ao selo ![](..\\..\\..\\images\\mandatory.png) **Mandatory:**atualizações que possuem correções críticas emergenciais.\n\n \n\n**Documentação**\n\n- [Atualização da plataforma](../../Sobre a plataforma/Atualização da plataforma.md)\n- [Guia de atualização da plataforma](../../Instalação e Atualização/Guia de atualização da plataforma.md)\n\n# + Eventos de Auditoria\n\n### Análise Detalhada de Atividades." }, { "metadata": { "title": "5 dicas práticas para dar mais segurança ao TOTVS Fluig", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=953006932", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\5 dicas práticas para dar mais segurança ao TOTVS Fluig.md" }, "content": "5 dicas práticas para dar mais segurança ao TOTVS Fluig\n\n\n---\n\nO recurso Eventos de Auditoria permite registrar alterações realizadas na plataforma em recursos específicos como Papel, Usuários, Grupos, Processos, Datasets, Documentos, entre outros. Acesse nossa [documentação para conhecer e saber como obter.](../../Configuração/Eventos de auditoria.md)\n\n![](..\\..\\..\\images\\EventosAuditoria.png \"TOTVS Fluig > Técnicas para dar mais segurança à sua plataforma TOTVS Fluig: 5 dicas práticas > EventosAuditoria.png\")\n\n# ... Saiba mais!\n\n---\n\n \n\nChecklist para ter uma ambiente Seguro: [Boas práticas de segurança para o seu ambiente](../../Especificações Técnicas/Boas práticas de segurança para o seu ambiente.md)" }, { "metadata": { "title": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=953014428", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\Seu Negócio + Rápido e Eficiente Criação de Página no Fluig Sem Código.md" }, "content": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código\n\n\n### Palestrantes\n\n![Palestrante 1 - Alyson](..\\..\\..\\images\\retrato.jpg)\n\nAlyson\n\n![Palestrante 2 - Alexandre](..\\..\\..\\images\\retrato-Ale.jpg)\n\nAlexandre\n\n![Palestrante 3 - Rafael](..\\..\\..\\images\\retratovanat.jpg)\n\nRafael\n\n**Apresentação:**\n[Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código](https://docs.google.com/presentation/d/1Dr4-DfjpMxLvyzmNgwkMqA2ekSCCsVFsHRHt52nSThA/edit?usp=sharing)\n\n- [📘 Guia Fluig – Criação de Páginas com Widgets padrões e do Kit Intranet](#SeuNegócio+RápidoeEficiente:CriaçãodePáginanoFluigSemCódigo-📘GuiaFluig–CriaçãodePáginascomWidgetspadrõesedoKitIntranet)\n - [📦 Importando o Kit Intranet](#SeuNegócio+RápidoeEficiente:CriaçãodePáginanoFluigSemCódigo-📦ImportandooKitIntranet)\n - [🏭 Página: Indústria](#SeuNegócio+RápidoeEficiente:CriaçãodePáginanoFluigSemCódigo-🏭Página:Indústria)\n - [🚛 Página: Logística](#SeuNegócio+RápidoeEficiente:CriaçãodePáginanoFluigSemCódigo-🚛Página:Logística)\n - [🧑‍💼Página: Recursos Humanos](#SeuNegócio+RápidoeEficiente:CriaçãodePáginanoFluigSemCódigo-🧑‍💼Página:RecursosHumanos)\n - [✅ Publicação](#SeuNegócio+RápidoeEficiente:CriaçãodePáginanoFluigSemCódigo-✅Publicação)\n - [Treinamentos gratuitos para ajudar nessa jornada:](#SeuNegócio+RápidoeEficiente:CriaçãodePáginanoFluigSemCódigo-Treinamentosgratuitosparaajudarnessajornada:)\n - [Sobre os recursos citados do TOTVS Fluig:](#SeuNegócio+RápidoeEficiente:CriaçãodePáginanoFluigSemCódigo-SobreosrecursoscitadosdoTOTVSFluig:)\n\n# **📘 Guia Fluig – Criação de Páginas com** **Widgets padrões e do Kit Intranet**\n\nEste guia ensina como importar o **Kit Intranet**, criar páginas específicas (Indústria, Logística e Recursos Humanos) e configurar os principais **widgets visuais e funcionais** do Fluig.\n\n---\n\n## **📦 Importando o Kit Intranet**" }, { "metadata": { "title": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=953014428", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\Seu Negócio + Rápido e Eficiente Criação de Página no Fluig Sem Código.md" }, "content": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código\n\n\n1. Acesse o menu **Painel de Controle > Importar/Exportar páginas> Importar página**.\n2. Clique em **Selecionar Arquivo** e envie o arquivo `.zip` do Kit Intranet: \n 👉 **[Kit Intranet](../../Configuração/Apps e Mashups/Kit Intranet.md)**\n3. Clique em **Importar** e aguarde a confirmação de sucesso.\n\n---\n\n## **🏭 Página: Indústria**\n\nCriando a Página\n\n### 📄 Criando a Página\n\n1. Vá em **Painel de Controle > Minhas Páginas> Nova Página**.\n2. Preencha:\n\n - **Título:** Indústria\n - **URL:** industria\n3. Escolha o **layout desejado**.\n4. Clique em **Salvar e Editar Conteúdo**.\n\nAdicionando Widgets\n\n### 🧱 Adicionando Widgets" }, { "metadata": { "title": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=953014428", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\Seu Negócio + Rápido e Eficiente Criação de Página no Fluig Sem Código.md" }, "content": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código\n\n\n🎞️ **[Slideshow](https://tdn.totvs.com/display/public/fluig/Kit+Intranet#KitIntranet-WidgetSlideshow)**\n\n- Arraste o widget **Slideshow** para a área desejada.\n- Selecione imagens ou configure caminho no GED.\n- Clique em **Salvar**.\n\n📋 **[Listar Registros de Datasets](https://tdn.totvs.com/pages/viewpage.action?pageId=234455977#Plataforma%E2%9D%99Widgets-ListarRegistrosdeDatasets)**\n\n- Arraste o widget **Listar Registros de Datasets**.\n- Clique em **Editar Widget**.\n- Escolha o **dataset** relacionado à produção/estoque.\n- Configure os campos a exibir, filtros e nome de exibição.\n- Clique em **Salvar**.\n\n✏️ **[Editor de Conteúdo](https://tdn.totvs.com/pages/viewpage.action?pageId=342306655)**\n\n- Arraste o widget **Editor de Conteúdo**.\n- Digite textos, instruções ou notícias internas.\n- Use o ícone de corrente para adicionar links.\n- Clique em **Salvar**.\n\n🧩 [**Processos favoritos**](https://tdn.totvs.com/pages/viewpage.action?pageId=234455977#Plataforma%E2%9D%99Widgets-ProcessosFavoritos)\n\n- Arraste o widget de **Processos favoritos**.\n- Escolha os processos desejados.\n- Configure filtros e ordenações.\n- Clique em **Salvar**.\n\n🔗 **[Links Úteis](https://tdn.totvs.com/pages/viewpage.action?pageId=864324175)**\n\n- Arraste o widget **Links Úteis**.\n- Adicione nome e URL de sistemas, documentos etc.\n- Clique em **Salvar**.\n\n**📋 [Cardápio](https://tdn.totvs.com/display/public/fluig/Kit+Intranet#KitIntranet-WidgetCard%C3%A1pio)**\n\n- **Arraste o widget Cardápio**\n- Configure o formulário\n- Clique em **Salvar**.\n\n![](..\\..\\..\\images\\Imagem1.gif)\n\n## **🚛 Página: Logística**\n\nCriando a Página\n\n### 📄Criando a Página" }, { "metadata": { "title": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=953014428", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\Seu Negócio + Rápido e Eficiente Criação de Página no Fluig Sem Código.md" }, "content": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código\n\n\n1. Vá em **Painel de Controle > Páginas > Nova Página**.\n2. Preencha:\n\n - **Título:** Logística\n - **URL:** logistica\n3. Escolha o layout.\n4. Clique em **Salvar e Editar Conteúdo**.\n\nAdicionando Widgets\n\n🧱Adicionando Widgets\n\n🌐 **[Endereço Web](https://tdn.totvs.com/pages/viewpage.action?pageId=234455977#Plataforma%E2%9D%99Widgets-Endere%C3%A7oWEB)**\n\n- Arraste o widget **Endereço Web**.\n- Clique em **Editar Widget**.\n- Insira a **URL externa** (ex: painel de rastreamento).\n- Defina a **altura do iframe**.\n- Clique em **Salvar**.\n\n📢 [**Mural de Avisos**](https://tdn.totvs.com/pages/viewpage.action?pageId=234455977#Plataforma%E2%9D%99Widgets-MuraldeAvisos)\n\n- Arraste o widget **Mural de Avisos**.\n- Configure a fonte de dados (avisos recentes ou dataset).\n- Defina quantidade e ordenação.\n- Clique em **Salvar**.\n\n[📊 **Gráfico de Processos e Tarefas**](https://tdn.totvs.com/pages/viewpage.action?pageId=317296930)\n\n- Arraste o widget.\n- Escolha o tipo de gráfico (pizza, barra).\n- Selecione os processos e filtros desejados.\n- Clique em **Salvar**.\n\n⏳ [**Tarefas Pendentes**](https://tdn.totvs.com/pages/viewpage.action?pageId=234455977#Plataforma%E2%9D%99Widgets-TarefasPendentes)\n\n- Arraste o widget.\n- Configure por status, processo ou usuário.\n- Defina a quantidade de itens.\n- Clique em **Salvar**.\n\n🎞️ **[Slideshow](https://tdn.totvs.com/display/public/fluig/Kit+Intranet#KitIntranet-WidgetSlideshow)**\n\n- Arraste o widget.\n- Clique em **Editar Widget**.\n- Selecione imagens logísticas ou operacionais.\n- Defina tempo de transição e clique em **Salvar**.\n\n[✏️ **Editor de Conteúdo**](https://tdn.totvs.com/pages/viewpage.action?pageId=342306655)\n\n- Arraste o widget.\n- Insira textos, orientações ou procedimentos.\n- Use hiperlinks para documentos, formulários e portais.\n- Clique em **Salvar**.\n\n![](..\\..\\..\\images\\Imagem2.gif)\n\n## **🧑‍💼Página: Recursos Humanos**\n\nCriando a Página\n\n### 📄 Criando a Página" }, { "metadata": { "title": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=953014428", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\Seu Negócio + Rápido e Eficiente Criação de Página no Fluig Sem Código.md" }, "content": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código\n\n\n1. Acesse **Painel de Controle > Páginas > Nova Página**.\n2. Preencha:\n\n - **Título:** Recursos Humanos\n - **URL:** recursos-humanos\n3. Escolha um layout com 2 ou 3 colunas.\n4. Salve e edite o conteúdo.\n\nAdicionando Widgets\n\n🧱 Adicionando Widgets\n\n🎂 **[Aniversariantes](https://tdn.totvs.com/display/public/fluig/Kit+Intranet#KitIntranet-WidgetAniversariantes)**\n\n- Arraste o widget **Aniversariantes**.\n- Configure dataset com datas de nascimento.\n- Filtre por mês atual.\n- Clique em **Salvar**.\n\n[📆 **Adicionar ao Calendário**](../../Configuração/Apps e Mashups/Widget Adicionar ao calendário.md) **\\***\n\n- Arraste o widget.\n- Adicione nome do evento, data, horário e descrição.\n- Permite exportar para Google/Outlook.\n- Clique em **Salvar**.\n\n🌐 **[Endereço Web](https://tdn.totvs.com/pages/viewpage.action?pageId=234455977#Plataforma%E2%9D%99Widgets-Endere%C3%A7oWEB)**\n\n- Arraste o widget.\n- Configure link de sistemas externos (benefícios, folha, etc).\n- Defina altura e salve.\n\n📋 **[Listar Registros de Dataset](https://tdn.totvs.com/pages/viewpage.action?pageId=234455977#Plataforma%E2%9D%99Widgets-ListarRegistrosdeDatasets)**\n\n- Arraste o widget Listar registros de Dataset\n- Escolha o dataset (colaboradores, treinamentos, férias).\n- Defina os campos visíveis e filtros.\n- Clique em **Salvar**.\n\n🤝 **[Convênios](https://tdn.totvs.com/display/public/fluig/Kit+Intranet#KitIntranet-WidgetConv%C3%AAnios)**\n\n- Arraste o widget.\n- Configure com dataset de convênios (nome, tipo, contato).\n- Salve.\n\n🎞️ **[Slideshow](https://tdn.totvs.com/display/public/fluig/Kit+Intranet#KitIntranet-WidgetSlideshow)**\n\n- Arraste o widget Slideshow\n- Adicione imagens de campanhas internas.\n- Defina tempo de exibição e salve.\n\n**\\***Para importar a widget **Adicionar ao calendário** siga as instruções deste material: **[Widget Adicionar ao calendário](../../Configuração/Apps e Mashups/Widget Adicionar ao calendário.md)**\n\n![](..\\..\\..\\images\\Imagem3.gif)" }, { "metadata": { "title": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=953014428", "path": "\\Plataforma Documentação técnica\\Palestras - Universo TOTVS\\Universo TOTVS 2025\\Seu Negócio + Rápido e Eficiente Criação de Página no Fluig Sem Código.md" }, "content": "Seu Negócio + Rápido e Eficiente: Criação de Página no Fluig Sem Código\n\n## **✅ Publicação**\n\nApós configurar cada página:\n\n1. Clique em **Publicar Página**.\n2. Acesse pelos seguintes caminhos:\n\n - **`https:///portal/p/industria`**\n - **`https:///portal/p/logistica`**\n - **`https:///portal/p/recursos-humanos`**\n\n## **Treinamentos gratuitos para ajudar nessa jornada:**\n\n- [Adapte seu layout ao novo construtor de páginas](https://academy.fluig.com/theme/totvs_fluig_academy/landpage.php?course=72)\n- [Trilha iniciando o desenvolvimento de Portais com o Totvs Fluig Plataforma](https://academy.fluig.com/theme/totvs_fluig_academy/trilha.php?codigo=8)\n - #### WCM - Gestão de portais\n - #### TOTVS Fluig Dev Start\n - #### Como fazer - Instalar Eclipse 2019-R9 + Fluig Studio\n - #### Iniciando o desenvolvimento de widgets\n - #### Preferências da widget, como salvar e recuperar os dados\n - #### Templates Mustache em widgets, aprenda a desenvolver\n- [Style Guide - Modal](https://academy.fluig.com/theme/totvs_fluig_academy/landpage.php?course=106)\n\n## **Sobre os recursos citados do TOTVS Fluig:**\n\n- [Social e Comunidades](https://tdn.totvs.com/pages/viewpage.action?pageId=233762842)\n- [Widgets](https://tdn.totvs.com/pages/viewpage.action?pageId=234455977)\n- [Slots](https://tdn.totvs.com/x/roP5DQ)\n- [Layouts](https://tdn.totvs.com/x/sYP5DQ)" }, { "metadata": { "title": "Personalização da página de login", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=428928481", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da página de login.md" }, "content": "Personalização da página de login\n\n\nA personalização da página de login depende do [Tema](https://tdn.totvs.com/pages/viewpage.action?pageId=234455751) em vigor na plataforma.\n\nConfira a documentação de acordo com o tema abaixo:\n\n- [Personalização da página de login no tema Clássico](Personalização da página de login/Personalização da página de login no tema Clássico.md)\n- [Personalização da página de login no tema Snowflake](Personalização da página de login/Personalização da página de login no tema Snowflake.md)\n\n- Página de login customizada conforme o tema Clássico:\n\n![](..\\..\\images\\Login%20Personaliza%20Cl%C3%A1ssico.png)\n\n- Página de login customizada conforme o tema Snowflake:\n\n![](..\\..\\images\\P%C3%A1gina%20login%20personalizada%20165.png)" }, { "metadata": { "title": "Personalização da URL para redirecionamento mobile", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185732379", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da URL para redirecionamento mobile.md" }, "content": "Personalização da URL para redirecionamento mobile\n\n\n# Índice\n\n*- 1 [Objetivo](#PersonalizaçãodaURLpararedirecionamentomobile-Objetivo)\n - 1.1 [Alteração da URL para redirecionamento mobile](#PersonalizaçãodaURLpararedirecionamentomobile-AlteraçãodaURLpararedirecionamentomobile)\n - 1.2 [Como montar a URL de redirecionamento](#PersonalizaçãodaURLpararedirecionamentomobile-ComomontaraURLderedirecionamento)*\n\n# Objetivo\n\n---\n\nConforme informado na [Matriz de Portabilidade](../Especificações Técnicas/Matriz de Portabilidade.md), o TOTVS Fluig Plataforma não é homologado para acesso pelo navegador mobile, apenas pelo aplicativo My fluig. Quando é realizado o acesso via navegador mobile, a plataforma apresenta uma tela sugerindo o download do aplicativo [![](..\\..\\images\\photo-off.png)](https://tdn.totvs.com/download/attachments/185732379/Screenshot_2021-05-04-14-48-48-136_com.android.chrome.jpg?version=1&modificationDate=1620151191083&api=v2)**[Veja a imagem](https://tdn.totvs.com/download/attachments/185732379/Screenshot_2021-05-04-14-48-48-136_com.android.chrome.jpg?version=1&modificationDate=1620151191083&api=v2)**. O campo URL para redirecionamento mobile configura a URL para qual o usuário será direcionado ao acionar o link \"continuar mesmo assim\".\n\n## Alteração da URL para redirecionamento mobile" }, { "metadata": { "title": "Personalização da URL para redirecionamento mobile", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185732379", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da URL para redirecionamento mobile.md" }, "content": "Personalização da URL para redirecionamento mobile\n\n\nPara alterar a URL da página de redirecionamento *mobile*, realize os seguintes passos:\n\n1. Efetue o *login* na plataforma utilizando o usuário **wcmadmin**, e então acesse **Painel de Controle  ► WCM ► Configurações do Sistema**.\n2. Na tela de configurações do sistema, acesse a aba **Personalização**.\n3. Informe a URL da página no campo **URL para redirecionamento *mobile***.Pode ser informada uma URL padrão da plataforma ou algo específico (por exemplo, pode ser uma comunidade ou uma página customizada). \n \n ![](..\\..\\images\\personalizacao.png)\n4. Clique no botão **Salvar**.\n\nApós salvar essa configuração, quando os usuários forem acessar a plataforma via navegador mobile e acionarem o link \"continuar mesmo assim\" (da tela de sugestão do download do aplicativo), a plataforma irá redirecionar para a URL informada.\n\n## Como montar a URL de redirecionamento" }, { "metadata": { "title": "Personalização da URL para redirecionamento mobile", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185732379", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da URL para redirecionamento mobile.md" }, "content": "Personalização da URL para redirecionamento mobile\n\n\nQuando requisita a página de redirecionamento, a plataforma envia dois parâmetros que podem ser utilizados na lógica desta página de redirecionamento:\n\n- **cssClass:** sistema operacional utilizado quando acessada a página de redirecionamento. Seu valor pode ser **ios** ou **android.**\n- **urlMobile:** URL requisitada originalmente pelo usuário.\n\nTeste sua URL!\n\nÉ importante testar a configuração dessa URL, pois caso sejam informados dados inválidos neste campo e a URL for construída incorretamente, a plataforma pode entrar em um loop infinito e redirecionar novamente para a tela de login após a autenticação.\n\n- Exemplo para redirecionar para uma página customizada: \n- Exemplo de URL incorreta: \n\nNos casos onde o usuário configurar a URL [https://URLFLUIG/portal](https://urlfluig/portal \"Follow link\") por exemplo, e ainda assim desejar acessar a plataforma pelo navegador mobile, deve ser implementado o login personalizado conforme descrito nas páginas [Personalização da página de login no tema Clássico](Personalização da página de login/Personalização da página de login no tema Clássico.md) e [Personalização da página de login no tema Snowflake](Personalização da página de login/Personalização da página de login no tema Snowflake.md)." }, { "metadata": { "title": "Personalização de e-mail", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=183730587", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail.md" }, "content": "Personalização de e-mail\n\n\n# Introdução\n\nDiversos e-mails são disparados no Fluig, variando de notificações simples a alertas urgentes. Além disso, você pode criar seus próprios templates de e-mail e envia-los através dos scripts de personalização. Esta documentação reúne as principais informações sobre interceptar as notificações padrões do Fluig e como criar os seus próprios templates de e-mails personalizados.\n\n# [Interceptando e personalizando o e-mail padrão (onNotify)](Personalização de e-mail/Interceptando e personalizando o e-mail padrão (onNotify).md).md)\n\nO **onNotify** é um [evento global](../Desenvolvimento sobre a plataforma/Desenvolvimento de Eventos.md) do Fluig que pode ser criado para interceptar notificações padrão do Fluig, permitindo alterações ou a geração de logs.\n\n# [Envio de e-mails personalizados (notifier.nofity)](Personalização de e-mail/Envio de e-mails personalizados (notifier.notify).md).md)\n\nEnviando seus e-mails personalizados, podendo adicionar parâmetros e destinatários.\n\n# [Criação de templates de e-mail](Personalização de e-mail/Criação de templates de e-mail.md)\n\nUm guia de como criar templates flexíveis e poderosos para serem usados no Fluig.\n\n# [Personalizando o template de e-mail padrão](Personalização de e-mail/Personalizando o template de e-mail padrão.md)\n\nUm guia de como alterar dos templates de e-mail padrões do Fluig" }, { "metadata": { "title": "Personalização de favicon", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=187831456", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de favicon.md" }, "content": "Personalização de favicon\n\n\n# Índice\n\n- 1 [Objetivo](#Personalizaçãodefavicon-Objetivo)\n- 2 [Configurando o favicon para uma empresa](#Personalizaçãodefavicon-Configurandoofaviconparaumaempresa)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar como pode ser personalizado o ícone favorito (favicon) do TOTVS Fluig Plataforma.\n\n# Configurando o favicon para uma empresa\n\n---\n\nPara maior personalização da plataforma, é possível definir o *link* do ícone favorito (favicon). Para realizar esta alteração, seguir os seguintes passos:\n\n- Efetuar a autenticação na plataforma utilizando um usuário administrador da empresa.\n\n- Acessar**Painel de Controle  → WCM → Tema → Gerenciar tema**.\n\nAmbos os temas da plataforma suportam a personalização do favicon. No exemplo a seguir será demonstrada a alteração no tema clássico, porém o procedimento é o mesmo para o tema Snowflake.\n\n![](..\\..\\images\\Image%2011%2016%20001.png)\n\n- Na seção Imagem do favicon, acionar ***Choose File***.\n\n- Selecionar uma imagem de extensão **\".ico\"** do sistema de arquivos.\n\nObservação\n\nA plataforma aceita apenas *links* para o formato .ico do mime-type image/x-icon. O tamanho recomendado é 32 x 32 pixels.\n\n![](..\\..\\images\\Image%2011%2016%20002.png)\n\n- Após selecionar a imagem, acionar **Salvar tema** para confirmar a alteração.\n\n**![](..\\..\\images\\Image%2011%2016%20004.png)**\n\n- Reiniciar o navegador e acessar novamente a plataforma para visualizar a alteração.\n\n**![](..\\..\\images\\favicon3.png)**" }, { "metadata": { "title": "Personalização de todas as páginas da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=232816834", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de todas as páginas da plataforma.md" }, "content": "Personalização de todas as páginas da plataforma" }, { "metadata": { "title": "Personalização de todas as páginas da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=232816834", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de todas as páginas da plataforma.md" }, "content": "Personalização de todas as páginas da plataforma\n\n\n![](..\\..\\images\\pratica.png)\n\n**COLOQUE EM PRÁTICA!** \nEssa página contém as instruções principais e exemplos de implementação, servindo como ponto de partida para seu desenvolvimento. Os exemplos devem ser analisados e adaptados para cada cenário e necessidade específica, lembrando que as implementações realizadas são de responsabilidade do cliente e não possuem suporte do time TOTVS Fluig.\n\nPlataforma em Cloud\n\nClientes cloud precisam entrar em contato com o time de Cloud com os arquivos já configurados para que seja incluído no diretório do servidor.\n\n# - 1 [Objetivo](#Personalizaçãodetodasaspáginasdaplataforma-trueÍndicenoneObjetivo) - 2 [Personalização de todas as páginas](#Personalizaçãodetodasaspáginasdaplataforma-Personalizaçãodetodasaspáginas) - 3 [Exemplo simples de personalização](#Personalizaçãodetodasaspáginasdaplataforma-Exemplosimplesdepersonalização) - 4 [Exemplo avançado de personalização](#Personalizaçãodetodasaspáginasdaplataforma-Exemploavançadodepersonalização) Objetivo\n\n---\n\nEste guia tem por objetivo indicar como é feita a personalização de páginas do TOTVS Fluig Plataforma.\n\n# Personalização de todas as páginas\n\n---\n\nPara personalizar todas as páginas da plataforma siga os passos a seguir:\n\n- Procure pela pasta **[diretório\\_instalação]/repository/wcmdir.** Dentro dela, crie uma nova pasta chamada **custompage**.\n\nAtenção\n\nCaso as configurações da plataforma tenham sido alteradas manualmente (por exemplo, para ambientes com alta disponibilidade), abra em um editor de texto o arquivo **[diretório\\_instalação]/appserver/domain/configuration/standalone.xml** e procure nele pela propriedade **. O mesmo se aplica ao **custompagehead.ftl**, porém nesse caso, o mesmo apenas será inserido para o tenant em questão\n\n- Opcionalmente, crie na mesma pasta um arquivo chamado **custompage.ftl**. Nesse arquivo crie o fragmento de conteúdo HTML que será inserido nas páginas.\n\n Atenção\n\n O conteúdo do arquivo **custompage.ftl** será literalmente inserido imediatamente antes de fechar a tag ****. O mesmo se aplica ao **custompage****.ftl**, porém nesse caso, o mesmo apenas será inserido para o tenant em questão.\n\n**Ilustração:**\n\n![](..\\..\\images\\local-do-arquivo-ilustra%C3%A7%C3%A3o.png)\n\n# Exemplo simples de personalização\n\n---\n\n**1.** Após a etapa de criação dos arquivos, importe o código abaixo para dentro do arquivo **custompagehead.ftl**:\n\n**custompagehead.ftl**\n\n```\n\n```\n\n**Resultado:**\n\n---\n\nA cor dos itens no menu lateral irão mudar para ciano nos temas **R****esponsivo** e **S****nowflake**, já no tema **C****lássico** irá mudar apenas o label do item, conforme apresentado nas imagens abaixo:\n\n![](..\\..\\images\\exemplo1-responsivetheme.png)\n\n![](..\\..\\images\\exemplo1-liquidtheme.png)\n\n![](..\\..\\images\\exemplo1-themedefault.png)\n\n# Exemplo avançado de personalização\n\n---\n\n**1.** Após a etapa de criação dos arquivos, importe o código abaixo para dentro do arquivo **custompage.ftl**:\n\n**custompage.ftl**\n\n```\n<#if themeCode?has_content>\n\t<#assign fluigThemeCode = themeCode>\n<#else>\n\t<#assign fluigThemeCode = \"themedefault\">\n\n\n\n\n
\n
\n Atenção! \n amanhã o Fluig estará fora do ar para atualização\n
\n
\n```\n\n**Resultado:**\n\n---\n\nSerá apresentado um componente de alerta fixado acima do header principal em todas as páginas dos temas **Responsivo**, **Snowflake** e **Clássico**, conforme nas imagens abaixo:\n\n![](..\\..\\images\\exemplo2-responsivetheme.png)\n\n![](..\\..\\images\\exemplo2-liquidtheme.png)\n\n![](..\\..\\images\\exemplo2-themedefault.png)" }, { "metadata": { "title": "Personalização do logotipo da página de login", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=185732348", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização do logotipo da página de login.md" }, "content": "Personalização do logotipo da página de login\n\n\n- 1 [Objetivo](#Personalizaçãodologotipodapáginadelogin-Objetivo)\n- 2 [Alterar imagem de logotipo](#Personalizaçãodologotipodapáginadelogin-Alterarimagemdelogotipo)\n\n# Objetivo\n\n---\n\nEste guia tem por objetivo indicar como é feita a personalização do logotipo da página de login do TOTVS Fluig Plataforma.\n\n# Alterar imagem de logotipo\n\n---\n\nUma das personalizações é a alteração do logotipo na página de *login*.\n\nPara alterar o logotipo, realize os seguintes passos:\n\n1. Efetue o *login* na plataforma utilizando o usuário **wcmadmin**, e então acesse **Painel de Controle  ► WCM ► Configurações do Sistema**.\n2. Na tela de configurações do sistema, acesse a aba **Personalização**.\n3. Para alterar a imagem de logotipo da página de *login*, informe a URL da imagem no campo **URL da imagem de logo (página de *login*)**.\n4. Para alterar a imagem de logotipo da página de *login* do aplicativo *mobile*, informe a URL da imagem no campo **URL da imagem de logo (página de *login mobile*)**. \n \n ![](..\\..\\images\\personalizacao.png)\n5. Clique no botão **Salvar**.\n\n![](..\\..\\images\\login-logo.png)\n\nRecomendamos que o logotipo **não ultrapasse as dimensões** **315px de largura por 200px de altura** e seja uma imagem no formato **JPG** ou **PNG**. Caso contrário, o logo pode não aparecer ou aparecer deformado.\n\n**Vídeo How to**\n\n---\n\nVeja a seguir o vídeo que demonstra o processo de atualização da imagem da página de login." }, { "metadata": { "title": "Personalização do título na aba do navegador", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=187831460", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização do título na aba do navegador.md" }, "content": "Personalização do título na aba do navegador\n\n\n# Índice\n\n- 1 [Objetivo](#Personalizaçãodotítulonaabadonavegador-Objetivo)\n- 2 [Configurando o título de guia para uma empresa no TOTVS Fluig](#Personalizaçãodotítulonaabadonavegador-ConfigurandootítulodeguiaparaumaempresanoTOTVSFluig)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é apresentar como personalizar o título das guias de navegação (abas) da plataforma TOTVS Fluig.\n\n# Configurando o título de guia para uma empresa no TOTVS Fluig\n\n---\n\nPara maior personalização da plataforma TOTVS Fluig, é possível indicar qual o título das guias (abas). Para realizar esta alteração realize os seguintes passos:\n\n1. Efetue a autenticação no fluig utilizando o usuário **wcmadmin**, e então acesse **Painel de Controle  ► WCM ► Empresas**.\n2. Selecione a empresa que deseja alterar o título das guias (abas) e então clique na opção **Editar**.\n3. A tela de edição de empresa será apresentada. Clique no botão **Cadastrar dados adicionais****.**\n4. A tela de dados adicionais da empresa será apresentada. No campo **Chave**informe o valor **portalTitle**e no campo **Valor**informe o título desejado para as guias.\n5. Clique no botão **Salvar** para salvar os dados adicionais. O item **portalTitle**será adicionado na listagem de dados adicionais da empresa:\n\n ![](..\\..\\images\\portalTitle.png)\n6. Clique no botão **Salvar** para salvar as alterações na empresa e efetivar a alteração do título das guias para esta empresa. O resultado ficará como no exemplo abaixo:\n\n![](..\\..\\images\\header.png)" }, { "metadata": { "title": "Temas", "source": "https://tdn.totvs.com/display/fluig/Temas", "path": "\\Plataforma Documentação técnica\\Personalização\\Temas.md" }, "content": "Temas\n\n\n# Índice\n\n- 1 [Obtendo o tema via CSS](#Temas-ObtendootemaviaCSS)\n- 2 [Obtendo o tema via FTL](#Temas-ObtendootemaviaFTL)\n- 3 [Obtendo o tema via JavaScript](#Temas-ObtendootemaviaJavaScript)\n- 4 [Variáveis CSS do tema responsivo](#Temas-VariáveisCSSdotemaresponsivo)\n- 5 [Descrição das variáveis](#Temas-Descriçãodasvariáveis)\n- 6 [Como utilizar as variáveis em meu desenvolvimento](#Temas-Comoutilizarasvariáveisemmeudesenvolvimento)\n\nEste guia visa orientar os desenvolvedores a como obter que está em uso no TOTVS Fluig Plataforma. Hoje temos 3 formas de obter o tema selecionado em sua empresa. Via **CSS**, via **FTL** e via **JavaScript**.\n\n### **Obtendo o tema via CSS**\n\n---\n\nHoje, no Fluig Plataforma, será adicionado sempre na tag da página, o código do tema selecionado como uma classe, conforme exemplo abaixo:\n\n![](..\\..\\images\\tag%20body.png)\n\nCom essa classe sendo aplicada no body, você pode construir o seu CSS como no exemplo abaixo:\n\n![](..\\..\\images\\css%20exemplo.png)\n\n### Obtendo o tema via FTL\n\n---\n\nTambém é possível obter o tema via FTL através da variável freemarker `*${fluigThemeCode}*` com o código do tema selecionado, como no exemplo abaixo:\n\n![](..\\..\\images\\tema%20via%20FLT.png)\n\nRecomendamos que seja feita essa validação para garantir que o código funcione corretamente.\n\nDessa forma, a variável `*${fluigThemeCode}*` será preenchida com o código do tema selecionado, permitindo que seja utilizada da forma que o desenvolvedor preferir.\n\n### Obtendo o tema via JavaScript\n\n---\n\nPara obter o tema selecionado via JavaScript, é necessário acessar uma API Rest que retorna o código do tema, como no exemplo abaixo:\n\n![](..\\..\\images\\tema%20via%20javascript.png)\n\n### Variáveis CSS do tema responsivo" }, { "metadata": { "title": "Temas", "source": "https://tdn.totvs.com/display/fluig/Temas", "path": "\\Plataforma Documentação técnica\\Personalização\\Temas.md" }, "content": "Temas\n\n\n---\n\nAs variáveis CSS abaixo são exportadas **somente pelo tema responsivo**. Nos demais temas **não é possível obter essas variáveis**.\n\nHoje, no tema responsivo, é exportado diversas variáveis CSS para auxiliar na construção do tema da sua empresa.\n\n- Para maiores informações sobre Variáveis CSS, acesse o link de referência: \n\n### Descrição das variáveis\n\n---\n\n| Variável | Descrição |\n| --- | --- |\n| --themeResponsiveBgColor | Hexadecimal da cor de fundo da página |\n| --themeResponsiveBgContrastColor | Hexadecimal da cor contrastante da cor de fundo da página |\n| --themeResponsiveMenuBgColor | Hexadecimal da cor de fundo do menu |\n| --themeResponsiveMenuBgHoverColor | Hexadecimal da cor de hover dos itens de menu |\n| --themeResponsiveMenuActiveColor | Hexadecimal da cor do menu ativo |\n| --themeResponsiveMenuActionColor | Hexadecimal da cor do menu de ação |\n| --themeResponsiveHeaderBgColor | Hexadecimal da cor de fundo do header |\n| --themeResponsiveHeaderActionColor | Hexadecimal da cor das ações no header |\n| --themeResponsiveBrandColor | Hexadecimal da cor da marca da empresa |\n| --themeResponsiveBgImage | Url da imagem de fundo da página |\n| --themeResponsiveHeaderBgImage | Url da imagem de fundo do header |\n| --themeResponsiveBgImageRepeat | Propriedade com a informação se a imagem de fundo da página irá se repetir (repeat | no-repeat) |\n| --themeResponsiveBgImageCover | Propriedade com a informação se a imagem de fundo da página irá ocupar o espaço todo disponível (cover | unset) |\n| --themeResponsiveHeaderBgImageRepeat | Propriedade com a informação se a imagem de fundo do header irá se repetir (repeat | no-repeat) |\n| --themeResponsiveHeaderBgImageCover | Propriedade com a informação se a imagem de fundo do header irá ocupar o espaço todo disponível (cover | unset) |\n\n### Como utilizar as variáveis em meu desenvolvimento" }, { "metadata": { "title": "Temas", "source": "https://tdn.totvs.com/display/fluig/Temas", "path": "\\Plataforma Documentação técnica\\Personalização\\Temas.md" }, "content": "Temas\n\n\n---\n\nPara utilizar essas variáveis CSS, pode ser usado o exemplo abaixo:\n\n![](..\\..\\images\\variavel%20desenvolvimento.png)" }, { "metadata": { "title": "Personalização da página de login no tema Clássico", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=258277647", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da página de login\\Personalização da página de login no tema Clássico.md" }, "content": "Personalização da página de login no tema Clássico\n\n\nAtenção\n\nEsta página é destinada para atualizações 1.6.0 até 1.6.4 do TOTVS Fluig Plataforma.\n\nPlataforma em Cloud\n\nClientes cloud precisam entrar em contato com o time de Cloud com os arquivos já configurados para que seja incluído no diretório do servidor.\n\n# Índice\n\n- 1 [Página de login personalizada](#PersonalizaçãodapáginadeloginnotemaClássico-Páginadeloginpersonalizada)\n - 1.1 [Passos para personalização](#PersonalizaçãodapáginadeloginnotemaClássico-Passosparapersonalização)\n - 1.2 [Exemplo de personalização](#PersonalizaçãodapáginadeloginnotemaClássico-Exemplodepersonalização)\n\n# Página de login personalizada\n\n---\n\nTodos os componentes da página de login podem ser personalizados, basta que sejam alterados os arquivos indicados nesta documentação. As personalizações exigem que o responsável tenha os conhecimentos básicos em HTML, JavaScript e CSS.\n\nAtenção!\n\nEssa página contém as principais instruções de como efetuar a personalização, servindo como ponto de partida para seu desenvolvimento. Lembrando que qualquer personalização realizada na plataforma é de responsabilidade do cliente e não possui suporte do time TOTVS Fluig.\n\n## Passos para personalização" }, { "metadata": { "title": "Personalização da página de login no tema Clássico", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=258277647", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da página de login\\Personalização da página de login no tema Clássico.md" }, "content": "Personalização da página de login no tema Clássico\n\n\n---\n\nPara personalizar a página de login siga os passos abaixo:\n\n- Acesse o diretório **[diretório\\_instalação]/repository/wcmdir/**. Dentro dele, crie uma nova pasta chamada **customlogin**.\n\nAtenção\n\nCaso as configurações da plataforma tenham sido alteradas manualmente (por exemplo, para ambientes com alta disponibilidade), abra em um editor de texto o arquivo **[diretório\\_instalação]/appserver/domain/configuration/domain.xml** e localize nele a propriedade abaixo:\n\n```\n\n```\n\nNeste parâmetro estará informado o caminho alternativo do diretório [diretório\\_instalação]/repository/wcmdir/.\n\n- Dentro dessa pasta recém criada, crie um arquivo chamado **login.html.** Nesse arquivo crie o fragmento de conteúdo HTML que será inserido na página de login. O conteúdo do arquivo **login.html** será literalmente inserido dentro do HTML final da página de login, dentro de uma tag **
**, substituindo a logomarca. Portanto, não poderá conter as tags ****, **** ou ****.\n\n- Opcionalmente, crie na mesma pasta um arquivo chamado **loginhead.html**. Nesse arquivo crie o conteúdo HTML que importa os **CSS** que serão utilizados pela personalização. O conteúdo do arquivo **loginhead.html** será literalmente inserido dentro do HTML final da página de login, dentro da tag ****, portanto deverá conter apenas tags que importam recursos como **CSS**.\n\n- Opcionalmente, crie na mesma pasta um arquivo chamado **loginscript.html**. Nesse arquivo crie o conteúdo HTML que importa os **JS** que serão utilizados pela personalização. O conteúdo do arquivo **loginscript****.html** será literalmente inserido dentro do HTML final da página de login, ao final da tag ****, portanto deverá conter apenas tags que importam recursos como **JS**.\n\nA configuração com o arquivo **loginscript.html** foi adicionada na atualização **1.7.0-210504**. Caso esteja uma atualização anterior, como paliativo o JS pode ser importado no arquivo ****loginhead.html****, no entanto podem ocorrer inconsistências no login via mobile (aplicativo My Fluig).\n\n- Caso utilize recursos estáticos, copie-os dentro desta mesma pasta, como arquivos JS, CSS e imagens. Esses recursos estáticos estarão acessíveis abaixo da URL **/portal/resources/customlogin/**.\n\n- Caso utilize o aplicativo Mobile, a personalização do login via Mobile pode ser feita da mesma forma. Basta criar os arquivos **mlogin.html, mloginscript.html** e **mloginhead.html**.\n\n- Reinicie os serviços do fluig.\n\nSempre que houver o login personalizado na empresa, ao acessar a plataforma pelo navegador do dispositivo mobile, esta página de login será respeitada e será apresentada no momento de realizar a autenticação." }, { "metadata": { "title": "Personalização da página de login no tema Clássico", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=258277647", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da página de login\\Personalização da página de login no tema Clássico.md" }, "content": "Personalização da página de login no tema Clássico\n\n## Exemplo de personalização" }, { "metadata": { "title": "Personalização da página de login no tema Clássico", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=258277647", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da página de login\\Personalização da página de login no tema Clássico.md" }, "content": "Personalização da página de login no tema Clássico\n\n\n---\n\nPrimeiramente foram criados os arquivos descritos acima em \"[diretório\\_instalação]/repository/wcmdir/customlogin/\". Em seguida foram executados os seguintes procedimentos:\n\n**1.**Importe o arquivo CSS customizado **login.css**.\n\n**loginhead.html**\n\n```\n\n```\n\n**2.** Insira a imagem **Sua-Empresa-Horizontal.png**, juntamente com o texto \"**logotxt**\". Ex:  ![](..\\..\\..\\images\\Sua-Empresa-Horizontal.png)\n\n**login.html**\n\n```\n\n

\n```\n\n**3**. Importe o arquivo JavaScript customizado **login.js**.\n\n**loginscript.html**\n\n```\n\n```\n\nFique atento\n\nTodo conteúdo HTML deve seguir as normas do Style Guide (definidas aqui: ).\n\n**4.** Ao terminar de carregar a página, substitua o texto \"**logotxt**\" pela data atual.\n\n**login.js**\n\n```\n$(document).ready(function(){\n var today = new Date();\n var dd = today.getDate();\n var mm = today.getMonth()+1;\n var yyyy = today.getFullYear();\n if(dd<10) {\n dd='0'+dd\n }\n if(mm<10) {\n mm='0'+mm\n }\n today = dd + '/' + mm + '/' + yyyy;\n $(\"#logotxt\").html(\"Hoje é: \" + today);\n})\n```\n\n**5.**Deixe o **\"logotxt\"**em negrito.\n\n**login.css**\n\n```\n#logotxt {\n font-weight: bold;\n}\n```\n\n**6.** Customização também para o mobile.\n\n**mloginhead.html**\n\n```\n\n```\n\n**mlogin.html**\n\n```\n\n

\n```\n\n**mloginscript.html**\n\n```\n\n```\n\n**Resultado:**\n\n---\n\nAlteração de logomarca e exibição de data.\n\n![](..\\..\\..\\images\\Screen%20Shot%202015-12-11%20at%204.05.17%20PM.png)\n\nImportante\n\n- Todos os arquivos utilizados no exemplo também estão disponíveis em [http://git.fluig.com/](https://git.fluig.com/projects/SAMPLES). Para ver o exemplo vejo o arquivo [**login-personalizado**](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse/login-personalizado) do repositório [Componentes](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse)\n- A personalização da página de login pode ser feita apenas a partir da atualização 1.5.5" }, { "metadata": { "title": "Personalização da página de login no tema Snowflake", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=427053004", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da página de login\\Personalização da página de login no tema Snowflake.md" }, "content": "Personalização da página de login no tema Snowflake\n\n\nFique atento!\n\nEsta página é válida para atualizações **1.6.5 (Liquid)** e **superiores** do TOTVS Fluig.\n\nPlataforma em Cloud\n\nClientes cloud precisam entrar em contato com o time de Cloud com os arquivos já configurados para que seja incluído no diretório do servidor.\n\n- [Página de login personalizada](#PersonalizaçãodapáginadeloginnotemaSnowflake-Páginadeloginpersonalizada)\n - [Criação da página de login personalizada](#PersonalizaçãodapáginadeloginnotemaSnowflake-Criaçãodapáginadeloginpersonalizada)\n - [Exemplo de personalização](#PersonalizaçãodapáginadeloginnotemaSnowflake-Exemplodepersonalização)\n\n# Página de *login* personalizada\n\n---\n\nTodos os componentes da página de *login* podem ser personalizados, basta que sejam alterados os arquivos indicados nesta documentação. As personalizações exigem que o responsável tenha os conhecimentos básicos em HTML, JavaScript e CSS.\n\nImportante!\n\nEssa página contém as principais instruções de como efetuar a personalização, servindo como ponto de partida para seu desenvolvimento. Lembrando que qualquer personalização realizada na plataforma é de responsabilidade do cliente e não possui suporte do time TOTVS Fluig.\n\n## Criação da página de *login* personalizada" }, { "metadata": { "title": "Personalização da página de login no tema Snowflake", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=427053004", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da página de login\\Personalização da página de login no tema Snowflake.md" }, "content": "Personalização da página de login no tema Snowflake\n\n\n---\n\nPara personalizar a página de *login* siga os passos a seguir:\n\n- Acesse o diretório **[Instalação fluig]/repository/wcmdir/**. Dentro dele, crie uma nova pasta chamada **customlogin**.\n\nImportante!\n\nCaso as configurações do Fluig tenham sido alteradas manualmente (por exemplo, para ambientes com alta disponibilidade), abra em um editor de texto o arquivo:\n\n- **a partir da atualização 2.0:** [diretório\\_instalação]/appserver/standalone/configuration/**standalone.xml**;\n\n- **da atualização 1.6.5 até a 1.8.2**: [diretório\\_instalação]/appserver/domain/configuration/**domain.xml**.\n\nNo arquivo correspondente à atualização que você utiliza, localize a propriedade abaixo:\n\n```\n\n```\n\nNeste parâmetro estará informado o caminho alternativo do diretório [diretório\\_instalação]/repository/wcmdir/.\n\n- Dentro dessa pasta recém criada, crie um arquivo chamado **loginsnowflake.html.** Nesse arquivo crie o fragmento de conteúdo HTML que será inserido na página de *login*. O conteúdo do arquivo **loginsnowflake****.html** será literalmente inserido dentro do HTML final da página de *login*, dentro de uma tag **
**. Portanto, não poderá conter as tags ****, **** ou ****.\n\n- Opcionalmente, crie na mesma pasta um arquivo chamado **loginhead.html**. Nesse arquivo crie o conteúdo HTML que importa os **CSS** que serão utilizados pela personalização. O conteúdo do arquivo **loginhead.html** será literalmente inserido dentro do HTML final da página de *login*, dentro da tag ****, portanto deverá conter apenas tags que importam recursos como **CSS**.\n\n- Opcionalmente, crie na mesma pasta um arquivo chamado **loginscript.html**. Nesse arquivo crie o conteúdo HTML que importa os **JS** que serão utilizados pela personalização. O conteúdo do arquivo **loginscript****.html** será literalmente inserido dentro do HTML final da página de *login*, ao final da tag ****, portanto deverá conter apenas tags que importam recursos como **JS**.\n\nImportante!\n\nA configuração com o arquivo **loginscript.html** foi adicionada na atualização**Update 1.7.0-210504**. Caso esteja uma atualização anterior, como paliativo o JS pode ser importado no arquivo ****loginhead.html****, no entanto podem ocorrer inconsistências no *login* via mobile (aplicativo My Fluig).\n\n- Caso utilize recursos estáticos, copie-os dentro desta mesma pasta, como arquivos JS, CSS e imagens. Esses recursos estáticos estarão acessíveis abaixo da URL **/portal/resources/customlogin/**.\n\n- Caso utilize o aplicativo Mobile, a personalização do *login* via Mobile pode ser feita da mesma forma. Basta criar os arquivos **mlogin.html**, mloginscript.html**** e **mloginhead.html**.\n\n- Reinicie os serviços do fluig.\n\nDica!\n\nSempre que houver o *login* personalizado na empresa, ao acessar a plataforma pelo navegador do dispositivo mobile, esta página de *login* será respeitada e será apresentada no momento de realizar a autenticação." }, { "metadata": { "title": "Personalização da página de login no tema Snowflake", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=427053004", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da página de login\\Personalização da página de login no tema Snowflake.md" }, "content": "Personalização da página de login no tema Snowflake\n\n## Exemplo de personalização" }, { "metadata": { "title": "Personalização da página de login no tema Snowflake", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=427053004", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização da página de login\\Personalização da página de login no tema Snowflake.md" }, "content": "Personalização da página de login no tema Snowflake\n\n\n---\n\nPrimeiramente foram criados os arquivos descritos acima em \"[diretório\\_instalação]/repository/wcmdir/customlogin/\". Em seguida foram executados os seguintes procedimentos:\n\n**01.** Importe o arquivo JavaScript customizado **loginsnowflake.js** e o arquivo de estilo **loginsnowflake.css**.\n\n**loginhead.html**\n\n```\n\n```\n\n**loginscript.html**\n\n```\n\n```\n\n**02.** Insira aqui o código HTML de customização da sua página.\n\n**loginsnowflake.html**\n\n```\n

\n```\n\nImportante!\n\nTodo conteúdo HTML deve seguir as normas do Style Guide (definidas aqui: ).\n\n**03.** O arquivo js, ao terminar de carregar a página, insere a data atual no elemento \"login\\_datetime\" \n\n**loginsnowflake.js**\n\n```\n$(document).ready(function(){\n var today = new Date();\n var dd = today.getDate();\n var mm = today.getMonth()+1;\n var yyyy = today.getFullYear();\n if(dd<10) {\n dd='0'+dd\n }\n if(mm<10) {\n mm='0'+mm\n }\n today = dd + '/' + mm + '/' + yyyy;\n $(\"#login_datetime\").html(\"Data: \" + today);\n})\n```\n\n**04.** O arquivo css deve conter as classes de personalização do seu HTML.\n\n**loginsnowflake.css**\n\n```\n#login_datetime {\n\tposition: absolute;\n text-align: center;\n width: 100%;\n left: 0px;\n bottom: 10%;\n}\n```\n\n**Resultado:**\n\n---\n\nExibição de data na parte inferior da tela.\n\n![](..\\..\\..\\images\\P%C3%A1gina%20login%20personalizada%20165.png)\n\nImportante!\n\n- Todos os arquivos utilizados no exemplo também estão disponíveis abaixo:\n - [loginsnowflake.js](https://tdn.totvs.com/download/attachments/427053004/loginsnowflake.js?version=1&modificationDate=1540816727720&api=v2)\n - [loginsnowflake.html](https://tdn.totvs.com/download/attachments/427053004/loginsnowflake.html?version=1&modificationDate=1540816727850&api=v2)\n - [loginsnowflake.css](https://tdn.totvs.com/download/attachments/427053004/loginsnowflake.css?version=1&modificationDate=1540816727977&api=v2)\n- A personalização da página de *login* com o tema Snowflake pode ser feita apenas a partir da **atualização 1.6.5 - Liquid**." }, { "metadata": { "title": "Criação de templates de e-mail", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852917268", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail\\Criação de templates de e-mail.md" }, "content": "Criação de templates de e-mail\n\n\n# Índice\n\n- 1 [Introdução](#Criaçãodetemplatesdeemail-Introdução)\n- 2 [Template](#Criaçãodetemplatesdeemail-Template)\n- 3 [Exemplos de Template](#Criaçãodetemplatesdeemail-ExemplosdeTemplate)\n - 3.1 [E-mail simples com uso de dois parâmetros, conforme este exemplo](#Criaçãodetemplatesdeemail-E-mailsimplescomusodedoisparâmetros,conformeesteexemplo)\n - 3.2 [E-mail simples com dados do formulário este exemplo](#Criaçãodetemplatesdeemail-E-mailsimplescomdadosdoformulárioesteexemplo)\n - 3.3 [Criando um e-mail sobre aprovação do pedido com comportamentos diferentes caso seja aprovado ou reprovado](#Criaçãodetemplatesdeemail-Criandoume-mailsobreaprovaçãodopedidocomcomportamentosdiferentescasosejaaprovadooureprovado)\n - 3.4 [Utilizando um parâmetro que é uma lista de tarefas](#Criaçãodetemplatesdeemail-Utilizandoumparâmetroqueéumalistadetarefas)\n\n# Introdução\n\nO Fluig permite você [criar seus próprios templates de e-mail](https://tdn.totvs.com/pages/viewpage.action?pageId=234455436) e envia-los através dos scripts de personalização pelo método **[notifier.notify](Envio de e-mails personalizados (notifier.notify).md).md)**.\n\nEstá documentação vai ensinar você como adicionar os seus parâmetros no template e como criar templates complexos de envio de e-mail.\n\n# Template\n\nPara a criação de templates de e-mails no TOTVS Fluig, utilizamos a linguagem de templates Freemarker. Ele permite a inserção de lógica em templates HTML, proporcionando uma grande flexibilidade na customização de e-mails. Com isso, você pode utilizar:\n\n- **Variáveis**: Inserção de valores dinâmicos no conteúdo do e-mail.\n- **Condicionais**: Criação de diferentes partes do template com base em condições específicas.\n- **Loops**: Iteração sobre listas para gerar conteúdo repetitivo dinamicamente.\n\nO Fluig 1.8.1 utiliza a versão 2.3.28 Freemarker.\n\n# Exemplos de Template" }, { "metadata": { "title": "Criação de templates de e-mail", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852917268", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail\\Criação de templates de e-mail.md" }, "content": "Criação de templates de e-mail\n\n## E-mail simples com uso de dois parâmetros, conforme [este exemplo](Envio de e-mails personalizados (notifier.notify).md).md)\n\n```\nOlá,\n\nAqui está o link para a documentação: ${descricao}.\n\nAtenciosamente,\nEquipe TOTVS\n```\n\n## E-mail simples com dados do formulário [este exemplo](Envio de e-mails personalizados (notifier.notify).md).md)\n\n```\nOlá,\n\nAqui estão os detalhes do formulário atualizado:\n
    \n
  • Autor: ${WDK_DocumentAuthor}
  • \n
  • Descrição: ${WDK_DocumentDescription}
  • \n
  • Número do Formulário: ${WDK_DocumentNumber}
  • \n
  • Data de Atualização: ${WDK_DocumentUpdatedDate}
  • \n
  • Versão: ${WDK_DocumentVersion}
  • \n
  • Acesse o Formulário: Clique aqui
  • \n
\n\nAtenciosamente,\nEquipe TOTVS  \n```\n\n## Criando um e-mail sobre aprovação do pedido com comportamentos diferentes caso seja aprovado ou reprovado\n\n```\nOlá,\n\n<#if pedidoAprovado>\n Seu pedido foi aprovado!\n<#else>\n Infelizmente seu pedido foi reprovado.\n\n\n<#if observacao??>\n
\n  Observação: ${observacao}\n
\n\n\nAtenciosamente,\nEquipe TOTVS\n```\n\n## Utilizando um parâmetro que é uma lista de tarefas\n\n```\nOlá,\n\n<#if tarefas?has_content>\nVocê tem as seguintes tarefas pendentes:\n
    \n<#list tarefas as tarefa>\n
  • ${tarefa}
  • \n\n
\n<#else>\nVocê não tem tarefas pendentes.\n\n\nAtenciosamente,\nEquipe TOTVS\n```" }, { "metadata": { "title": "Envio de e-mails personalizados (notifier.notify)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852915615", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail\\Envio de e-mails personalizados (notifier.notify).md" }, "content": "Envio de e-mails personalizados (notifier.notify)" }, { "metadata": { "title": "Envio de e-mails personalizados (notifier.notify)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852915615", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail\\Envio de e-mails personalizados (notifier.notify).md" }, "content": "Envio de e-mails personalizados (notifier.notify)\n\n\n# Índice\n\n- 1 [Introdução](#Enviodeemailspersonalizados(notifier.notify)-Introdução)\n- 2 [Sintaxe](#Enviodeemailspersonalizados(notifier.notify)-Sintaxe)\n- 3 [Parâmetros](#Enviodeemailspersonalizados(notifier.notify)-Parâmetros)\n - 3.1 [sender](#Enviodeemailspersonalizados(notifier.notify)-sender)\n - 3.2 [cardId](#Enviodeemailspersonalizados(notifier.notify)-cardId)\n - 3.3 [template](#Enviodeemailspersonalizados(notifier.notify)-template)\n - 3.4 [params](#Enviodeemailspersonalizados(notifier.notify)-params)\n - 3.5 [receivers](#Enviodeemailspersonalizados(notifier.notify)-receivers)\n - 3.6 [mimeType](#Enviodeemailspersonalizados(notifier.notify)-mimeType)\n- 4 [Exemplos](#Enviodeemailspersonalizados(notifier.notify)-Exemplos)\n - 4.1 [Envio de e-mail configurando alguns parâmetros](#Enviodeemailspersonalizados(notifier.notify)-Enviodee-mailconfigurandoalgunsparâmetros)\n - 4.2 [Envio de e-mail informando um formulário](#Enviodeemailspersonalizados(notifier.notify)-Enviodee-mailinformandoumformulário)\n- 5 [Pontos de atenção](#Enviodeemailspersonalizados(notifier.notify)-Pontosdeatenção)\n - 5.1 [Envio de mensagens para e-mails externos](#Enviodeemailspersonalizados(notifier.notify)-Enviodemensagensparae-mailsexternos)\n - 5.2 [Envio de dados de um formulário via solicitação](#Enviodeemailspersonalizados(notifier.notify)-Enviodedadosdeumformulárioviasolicitação)\n\n# Introdução\n\nAlém dos diversos e-mails são disparados no Fluig, você pode [criar seus próprios templates de e-mail](https://tdn.totvs.com/pages/viewpage.action?pageId=234455436) e envia-los através dos scripts de personalização pelo método **notifier.notify**\n\nPara estes e-mails funcionarem, é necessário que tenha sido feita a [configuração de envio de e-mail](http://tdn.totvs.com/x/CAZbDw).\n\n# Sintaxe\n\n```\nnotifier.notify(sender, template, params, receivers, mimeType);\nnotifier.notify(sender, cardId, template, params, receivers, mimeType);\n```\n\n# Parâmetros" }, { "metadata": { "title": "Envio de e-mails personalizados (notifier.notify)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852915615", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail\\Envio de e-mails personalizados (notifier.notify).md" }, "content": "Envio de e-mails personalizados (notifier.notify)\n\n## sender\n\nUma string contendo a matrícula (código do usuário) do usuário que será usado como remetente do e-mail caso não tenha sido configurado o remetente padrão na configuração de e-mail. Caso tenha sido configurado o remetente padrão, essa parâmetro será ignorado.\n\n## cardId\n\nO código do registro de formulário vinculado à este e-mail. Informar o código do formulário adiciona alguns parâmetros adicionais que podem ser usados nos templates de e-mail:\n\n| Parâmetro | Descrição |\n| --- | --- |\n| WDK\\_CardContent | Conteúdo HTML do formulário (simula a visualização) |\n| WDK\\_DocumentAuthor | Nome do Autor |\n| WDK\\_DocumentComments | Comentário adicional |\n| WDK\\_DocumentDescription | Descrição do formulário |\n| WDK\\_DocumentIconImage | Imagem do ícone do formulário |\n| WDK\\_DocumentNumber | Número do formulário |\n| WDK\\_DocumentUpdatedDate | Data de atualização do formulário |\n| WDK\\_DocumentVersion | Versão do formulário |\n| WDK\\_DocumentViewLink | Link para acesso ao formulário |\n\n## template\n\nUma string informando o código do template de e-mail que está sendo enviado. É o código usado no cadastro de template de e-mail.\n\n## params\n\nÉ um mapa de dados que permite incluir parâmetros para que sejam apresentados no e-mail. O nome dos parâmetros informados nesse mapa devem ser os mesmos que são utilizados dentro do arquivo de template.\n\nAlém dos parâmetros de uso no template, também pode ser adicionado a chave \"subject\" que será usado como assunto do e-mail. Caso não seja informado nada, o assunto do e-mail será \"Fluig\"\n\nPor padrão, são adicionados dois parâmetros em todas as notificações e eles podem ser usados no template de e-mail:\n\n| Parâmetro | Descrição |\n| --- | --- |\n| WDK\\_VirtualDir | Diretório Virtual |\n| WDK\\_AdviceUser | Nome do colaborador remetente |\n\n## receivers" }, { "metadata": { "title": "Envio de e-mails personalizados (notifier.notify)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852915615", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail\\Envio de e-mails personalizados (notifier.notify).md" }, "content": "Envio de e-mails personalizados (notifier.notify)\n\n\nUma lista de strings com os códigos dos usuários para quem o e-mail será enviado ou os e-mails dos destinatários. Essa lista pode conter códigos de usuários e e-mails externos simultaneamente.\n\n## mimeType\n\nUma string que especifica o tipo de mídia do conteúdo do e-mail. Normalmente, usa-se \"text/html\" mas existe também a opção \"text/plain\".\n\n# Exemplos\n\n## Envio de e-mail configurando alguns parâmetros\n\n```\ntry {\n var matriculaRemetente = \"admin\";\n var templateCode = \"MeuTemplate\";\n \n\tvar parametros = new java.util.HashMap();\n\t\n\t// Este parâmetro é obrigatório e representa o assunto do e-mail\n\tparametros.put(\"subject\", \"Consulte nossa documentação\");\n\n\t// Monta mapa com parâmetros do template \n\tparametros.put(\"documentacao\", \"https://tdn.totvs.com/display/fluig/\");\n\tparametros.put(\"descricao\", \"Documentação Fluig\");\n\n\t// Monta lista de destinatários\n\tvar destinatarios = new java.util.ArrayList();\n\tdestinatarios.add(\"matriculaUsuario\"); // Matrícula do usuário\n\tdestinatarios.add(\"usuario@fluig.com\"); // E-mail externo\n\n\t//Envia e-mail\n\tnotifier.notify(matriculaRemetente, templateCode, parametros, destinatarios, \"text/html\");\n\n} catch(e) {\n\tlog.info(e);\n}\n```\n\n## Envio de e-mail informando um formulário\n\n```\ntry {\n var matriculaRemetente = \"admin\";\n var templateCode = \"MeuTemplate\";\n\tvar codigoForm = 85;\n \n\tvar parametros = new java.util.HashMap();\n\tparametros.put(\"subject\", \"Informações sobre o cadastro\");\n\n\t// Monta lista de destinatários\n\tvar destinatarios = new java.util.ArrayList();\n\tdestinatarios.add(\"matriculaUsuario\"); // Matrícula do usuário\n\n\t//Envia e-mail\n\tnotifier.notify(matriculaRemetente, codigoForm, templateCode, parametros, destinatarios, \"text/html\");\n\n} catch(e) {\n\tlog.info(e);\n}\n```\n\n# Pontos de atenção\n\n## Envio de mensagens para e-mails externos" }, { "metadata": { "title": "Envio de e-mails personalizados (notifier.notify)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852915615", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail\\Envio de e-mails personalizados (notifier.notify).md" }, "content": "Envio de e-mails personalizados (notifier.notify)\n\n\nPara que o envio de e-mails externos seja concluído corretamente o servidor SMTP responsável deve estar habilitado para enviar e-mails para fora da intranet do seu servidor.\n\n## Envio de dados de um formulário via solicitação\n\nPode-se usam os eventos de personalização do processo para envio de e-mails.\n\nPorém, quando tenta enviar os dados de um formulário na primeira atividade do processo, você deve chamar a notificação no método beforeStateEntry ou afterStateEntry. Caso contrário, com o formulário ainda não foi criado na tabela de dados, esse envio não irá funcionar." }, { "metadata": { "title": "Interceptando e personalizando o e-mail padrão (onNotify)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852912430", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail\\Interceptando e personalizando o e-mail padrão (onNotify).md" }, "content": "Interceptando e personalizando o e-mail padrão (onNotify)\n\n\n# Índice\n\n- 1 [Introdução](#Interceptandoepersonalizandooemailpadrão(onNotify)-Introdução)\n- 2 [Sintaxe](#Interceptandoepersonalizandooemailpadrão(onNotify)-Sintaxe)\n- 3 [Parâmetros](#Interceptandoepersonalizandooemailpadrão(onNotify)-Parâmetros)\n - 3.1 [subject](#Interceptandoepersonalizandooemailpadrão(onNotify)-subject)\n - 3.2 [receivers](#Interceptandoepersonalizandooemailpadrão(onNotify)-receivers)\n - 3.3 [template](#Interceptandoepersonalizandooemailpadrão(onNotify)-template)\n - 3.4 [params](#Interceptandoepersonalizandooemailpadrão(onNotify)-params)\n- 4 [Exemplos](#Interceptandoepersonalizandooemailpadrão(onNotify)-Exemplos)\n - 4.1 [Alterando o Assunto quando o e-mail for do tipo \"Tarefa sob sua responsabilidade em atraso\"](#Interceptandoepersonalizandooemailpadrão(onNotify)-AlterandooAssuntoquandooe-mailfordotipo\"Tarefasobsuaresponsabilidadeematraso\")\n - 4.2 [Adicionando um destinatário quando o e-mail for do tipo \"Notificação de nova atividade sob sua gerência\"](#Interceptandoepersonalizandooemailpadrão(onNotify)-Adicionandoumdestinatárioquandooe-mailfordotipo\"Notificaçãodenovaatividadesobsuagerência\")\n - 4.3 [Adicionando um parâmetro o e-mail for do tipo \"Solicitação cancelada\"](#Interceptandoepersonalizandooemailpadrão(onNotify)-Adicionandoumparâmetrooe-mailfordotipo\"Solicitaçãocancelada\")\n\n# Introdução\n\nDiversos e-mails são disparados no Fluig, variando de notificações simples a alertas urgentes. O **onNotify** é um [evento global](../../Desenvolvimento sobre a plataforma/Desenvolvimento de Eventos.md) do Fluig que pode ser criado para interceptar notificações padrão do Fluig, permitindo alterações ou a geração de logs.\n\n# Sintaxe\n\n```\nfuncion onNotify(subject, receivers, template, params) {\n}\n```\n\n# Parâmetros\n\n## subject" }, { "metadata": { "title": "Interceptando e personalizando o e-mail padrão (onNotify)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852912430", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail\\Interceptando e personalizando o e-mail padrão (onNotify).md" }, "content": "Interceptando e personalizando o e-mail padrão (onNotify)\n\n\nUma lista de string que, quando adicionada algum item, modifica o assunto do e-mail para todos os destinatários. Apesar de ser uma lista, apenas o primeiro item da lista será considerado. Então, caso sejam adicionados dois assuntos, somente o primeiro item será usado.\n\n## receivers\n\nUma lista de Strings com os e-mails dos destinatários. Também é possível adicionar outros e-mails, de usuários do sistema ou mesmo e-mails externos, caso seja necessário notificar uma pessoa que não tenho acesso ao sistema.\n\n## template\n\nUma String contendo o código do template (ou tipo) de e-mail que está sendo enviado, permitindo que seja alterado apenas um tipo específico de e-mail. É recomendável que sempre seja verificado o código do template, para evitar que ocorram alterações em outros tipos de e-mail, que não necessitariam de personalização. Este parâmetro é fixo e alterações nele não mudaram o tipo de template a ser utilizado.\n\n## params\n\nÉ um mapa de dados que permite alterar/incluir parâmetros para que sejam apresentados no e-mail. O nome dos parâmetros informados nesse mapa devem ser os mesmos que são utilizados dentro do arquivo de template.\n\n# Exemplos\n\n## Alterando o Assunto quando o e-mail for do tipo \"Tarefa sob sua responsabilidade em atraso\"\n\n```\nfunction onNotify(subject, receivers, template, params) {\n\tif (template.equals(\"TPLOVERDUE_TASK_USER_RESPONSIBLE\") != null) {\n\t\tlog.info(\"Modificando o assunto do e-mail para 'URGENTE: Uma tarefa que você é responsável está atrasada');\n\t\tsubject.add(\"URGENTE: Uma tarefa que você é responsável está atrasada\");\n\t}\n}\n```\n\n## Adicionando um destinatário quando o e-mail for do tipo \"Notificação de nova atividade sob sua gerência\"" }, { "metadata": { "title": "Interceptando e personalizando o e-mail padrão (onNotify)", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=852912430", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail\\Interceptando e personalizando o e-mail padrão (onNotify).md" }, "content": "Interceptando e personalizando o e-mail padrão (onNotify)\n\n\n```\nfunction onNotify(subject, receivers, template, params) {\n\tif (template.equals(\"TPLPROCESS_NEW_STATE_TO_MANAGER\") != null) {\n\t\tlog.info(\"Adicionando o e-mail 'usuario@dominio.com' a lista de destinatários da notificação de 'Nova atividade sob sua gerência'\");\n\t\treceivers.add(\"usuario@dominio.com\");\n\t}\n}\n```\n\n## Adicionando um parâmetro o e-mail for do tipo \"Solicitação cancelada\"\n\n```\nfunction onNotify(subject, receivers, template, params) {\n\tif (template.equals(\"TPLPROCESS_CANCELED\") != null) {\n\t\tlog.info(\"Adicionando o parâmetro 'MEU_CAMPO' com o valor 'VALOR'\");\n\t\tparams.put(\"MEU_CAMPO\",\"VALOR\");\n\t}\n}\n```" }, { "metadata": { "title": "Personalizando o template de e-mail padrão", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=145362064", "path": "\\Plataforma Documentação técnica\\Personalização\\Personalização de e-mail\\Personalizando o template de e-mail padrão.md" }, "content": "Personalizando o template de e-mail padrão\n\n\n# Índice\n\n- 1 [Objetivo](#Personalizandootemplatedeemailpadrão-Objetivo)\n- 2 [Personalização do template de e-mail](#Personalizandootemplatedeemailpadrão-Personalizaçãodotemplatedee-mail)\n- 3 [Desenvolvendo o cabeçalho de e-mails](#Personalizandootemplatedeemailpadrão-Desenvolvendoocabeçalhodee-mails)\n\n# Objetivo\n\n---\n\nO objetivo deste guia é orientar a personalização de *templates* e cabeçalhos dos *e-mails* que são enviados pelo TOTVS Fluig Plataforma.\n\nPlataforma TOTVS Fluig em cloud\n\nCaso a plataforma seja hospedada em cloud, para solicitar os arquivos para personalização, é preciso acionar a equipe de Cloud. Eles disponibilizam a pasta do Volume ao cliente e recebem os arquivos alterados, que serão substituídos no ambiente cloud.\n\n# Personalização do template de e-mail\n\n---\n\nTodos os *templates* contidos no diretório **\\templates\\tplmail\\** podem ser personalizados, contanto que não sejam alteradas e nem removidas as tags padrões de cada *template,* conforme o do exemplo abaixo:\n\n```\n${PARAMETRO_DE_EMAIL!''}\n```\n\n# Desenvolvendo o cabeçalho de e-mails\n\n---\n\nPara clientes que já possuem a plataforma instalada e desejam personalizar o cabeçalho dos *templates* de *e-mail*, é necessário efetuar os passos abaixo:\n\n1. Para alterar a imagem do cabeçalho dos *e-mails*, substitua a imagem **head\\_background.gif** existente em: **\\custom\\assets\\** por outra imagem com o mesmo nome e extensão.\n\nAtenção!\n\nRessaltamos que no processo de atualizações da plataforma as personalizações realizadas nos *templates* serão perdidas.\n\nÉ de grande importância realizar um *backup* da pasta **\\templates\\tplmail\\** para que as personalizações existentes possam ser recuperadas posteriormente." }, { "metadata": { "title": "Criação de Relatórios no Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=243630888", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Criação de Relatórios no Analytics.md" }, "content": "Criação de Relatórios no Analytics" }, { "metadata": { "title": "Criação de Relatórios no Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=243630888", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Criação de Relatórios no Analytics.md" }, "content": "Criação de Relatórios no Analytics\n\n\n# Índice\n\n- 1 [Objetivo](#CriaçãodeRelatóriosnoAnalytics-Objetivo)\n- 2 [Conceitos](#CriaçãodeRelatóriosnoAnalytics-Conceitos)\n- 3 [Alterando o Idioma](#CriaçãodeRelatóriosnoAnalytics-AlterandooIdioma)\n- 4 [Datasets](#CriaçãodeRelatóriosnoAnalytics-Datasets)\n- 5 [Criando o Relatório](#CriaçãodeRelatóriosnoAnalytics-CriandooRelatório)\n- 6 [Definindo as Métricas (What)](#CriaçãodeRelatóriosnoAnalytics-DefinindoasMétricas(What)what)\n- 7 [Definindo os Atributos (How)](#CriaçãodeRelatóriosnoAnalytics-DefinindoosAtributos(How)how)\n- 8 [Adicionando Filtros (Filter)](#CriaçãodeRelatóriosnoAnalytics-AdicionandoFiltros(Filter)filter)\n- 9 [Finalizando o Relatório](#CriaçãodeRelatóriosnoAnalytics-FinalizandooRelatório)\n- 10 [Incluindo o Relatório em um Dashboard](#CriaçãodeRelatóriosnoAnalytics-IncluindooRelatórioemumDashboard)\n- 11 [Sobre KPIs](#CriaçãodeRelatóriosnoAnalytics-SobreKPIs)\n\n# Objetivo\n\nO objetivo deste guia é demonstrar como é feita a criação de um relatório no Analytics, utilizando as métricas e atributos disponibilizados por padrão pela plataforma. Apresentar também informações sobre os datasets que recebem informações de forma incremental do TOTVS Fluig Plataforma, dashboards e painéis KPIs.\n\nQuer conhecer ainda mais sobre o **Analytics**? Assista o treinamento de **[Gestão de Indicadores - Analytics](http://academy.fluig.com/courses/gestao-de-indicadores-analytics)** disponível no **[Fluig Academy](http://academy.fluig.com/)**.\n\n# Conceitos\n\n| Termo | Descrição | Exemplo |\n| --- | --- | --- |\n| Fatos | Medida numérica individual relacionada a um Data Set. São dados quantitativos, ou seja, campos que tem operações matemáticas. São a menor unidade de dados e sempre são números. | Apoios (Ex.: 325) Documentos (Ex.: 2650) |\n| Atributos | Descritores usados para delimitar métricas e contextualizar os dados em um relatório. São dados qualitativos, ou seja, que classificam os dados. Podem ser textos ou números. | por Mês, Marca por Solicitante |\n| Métricas | Agregação de fatos ou contagem de atributos, que são exibidos como números em relatórios. São definidas por cálculos de agregação. Métricas representam o que está sendo medido em um relatório. | Espaço ocupado Solicitações em atraso |\n| Relatório | Visualização de dados em tabelas ou gráficos. Contém pelo menos uma métrica (o que está sendo medido), geralmente classificada por atributos (que dividem a métrica). | Posts / Mês Páginas mais acessadas |\n\n# Alterando o Idioma\n\nSe desejar mudar o idioma da página do seu projeto, acesse o Analytics e siga os passos abaixo:\n\n- Na barra superior da página, clique sobre o **Nome do Usuário** logado (ao lado do botão Help);\n- Após clique em **Account;**\n\n![](..\\..\\images\\1.jpg)\n\n- Clique sobre o link **Change Language**;\n\n![](..\\..\\images\\2.jpg)\n\n- Clique sobre a listagem e **selecione o idioma** desejado (Exemplo: Português Brasileiro);\n- Após clique em **Save**.\n\n![](..\\..\\images\\3.jpg)![](..\\..\\images\\4.jpg)\n\n- **Pronto!** Note que todas palavras da interface da página, passíveis de tradução, foram alteradas para o idioma selecionado.\n\n![](..\\..\\images\\6.jpg)\n\n# Datasets\n\nNo Analytics apenas os dados da plataforma TOTVS Fluig são enviados para análise. Confira abaixo como consultar as informações de cada dataset no Analytics:\n\n- Na barra superior do Analytics, clique na opção **Administrar** (*Manage*). Nesta tela será apresentado a listagem de **datasets** do projeto selecionado, a data e hora do último *upload* de dados da plataforma, o autor e o Status.\n\nPara consultar os campos de cada dataset acesse a página [Dados para Relatórios](Criação de Relatórios no Analytics/Dados para Relatórios.md).\n\n![](..\\..\\images\\Image%2016.jpg)\n\n- Clicando sobre cada dataset é possível consultar o histório de *uploads* que exibe as últimas atualizações enviadas pela plataforma para os datasets do Analytics. Também são apresentados os **[Objetos de Conjunto de Dados](Criação de Relatórios no Analytics/Dados para Relatórios.md)** separados por Atributos e Fatos.\n- Entendendo os Objetos que compões cada dataset fica mais simples desenvolver relatórios e KPIs personalizados gerando conhecimento relevante para tomada de decisão do seu negócio.\n- Siga os tópicos abaixo e veja como é simples e rápido criar relatórios no Analytics.\n\n![](..\\..\\images\\Image%2017.jpg)\n\n# Criando o Relatório\n\nPara iniciar a criação de um novo relatório, acesse o Analytics e siga os passos abaixo:\n\n- Na barra superior do Analytics, clique na opção **Relatórios** (*Reports*).\n\n![](..\\..\\images\\Image%202.jpg)\n\n- Nesta página serão exibidos todos os relatórios existentes na ferramenta, inclusive aqueles disponibilizados por padrão, como TOP Usuários, Acessos, Número de Solicitações, etc.\n\n- Para criar um novo relatório, clique no botão **Criar Relatório** (*Create Report*).\n\n![](..\\..\\images\\Image%203.jpg)\n\n- Será exibida a página padrão para criação dos relatórios no Analytics. A partir deste momento, o administrador poderá selecionar as métricas, atributos e filtros que deseja incluir no relatório.\n\n- Para isso serão utilizados os painéis **[O Quê](https://tdn.totvs.com/pages/viewpage.action?pageId=243630888)** (*What*), [**Como**](https://tdn.totvs.com/pages/viewpage.action?pageId=243630888) *(How*) e **[Filtrar](https://tdn.totvs.com/pages/viewpage.action?pageId=243630888)** (*Filter*).\n\n![](..\\..\\images\\Image%206.jpg)\n\n# Definindo as Métricas (What)\n\nNeste painel é realizada a seleção das métricas, ou seja, dos números que o administrador deseja exibir no relatório.\n\n- Ao clicar no botão O Quê (*What*), todas as métricas são exibidas na coluna central, pois por padrão a pasta Todas as Métricas (*All Metrics*) virá selecionada.\n\n- Na coluna à esquerda, é possível filtrar pelas pastas (Documentos, Processos, Social e WCM) as métricas que são incluídas por padrão no Analytics.\n\n![](..\\..\\images\\Image%207.jpg)\n\n- Para escolher uma métrica, basta marcar a caixa de seleção que fica ao lado do nome.\n\n- Clicando diretamente sobre o nome da métrica é possível visualizar detalhes sobre o cálculo dos fatos que a compõe e o formato de exibição da métrica no relatório.\n\n![](..\\..\\images\\Image%208.jpg)\n\n- Nesse ponto já é possível gerar um relatório simplificado, apenas com métricas. Basta clicar no botão **Concluído** (*Done*) e o relatório exibirá os dados das métricas selecionadas em formato de tabela.\n\n- Contudo, para criar relatórios mais elaborados e relevantes, convém aplicar os atributos disponíveis no painel **[Como](https://tdn.totvs.com/pages/viewpage.action?pageId=243630888)** (*How*).\n\n![](..\\..\\images\\Image%209.jpg)\n\n# Definindo os Atributos (How)\n\nNeste painel é realizada a seleção dos atributos, ou seja, como os dados do relatório serão segmentados.\n\n- Ao clicar no botão **Como** (*How*) será exibido o painel com os atributos disponíveis de acordo com a métrica escolhida na seção **O Quê** (*What*).\n\nVeja [aqui](Criação de Relatórios no Analytics/Dados para Relatórios.md) o detalhamento dos atributos existentes.\n\nAtributos incompatíveis com a métrica selecionada não serão habilitados.\n\n![](..\\..\\images\\Image%2010.jpg)\n\n- Clicando sobre o nome do atributo é possível obter mais informações, bem como mais opções de visualização no relatório.\n\n- O botão **L/T** determina se o atributo será exibido à esquerda (*Left*) ou no topo (*Top*), caso o modo de visualização do relatório esteja definido como tabela (*Table*).\n\n![](..\\..\\images\\Image%2011.jpg)\n\n- Após selecionar o atributo desejado, clique no botão **Concluído** (*Done*)para aplicar as configurações ao relatório. O resultado deverá ser exibido em formato Tabela.\n\n- Para alterar o formato, utilize os botões no canto superior direito para exibir gráficos de linha, barras, pizza, etc.\n\n**![](..\\..\\images\\Screenshot%2008_07%20008.jpg)**\n\n**Tabela**\n\n![](..\\..\\images\\Image%2013.jpg)\n\n**Gráfico de Linha**\n\n![](..\\..\\images\\Image%2014.jpg)\n\n**Gráfico de** **Barras**\n\n![](..\\..\\images\\Image%2015.jpg)\n\n**Gráfico de Pizza**\n\n# Adicionando Filtros (Filter)\n\nO painel de filtros possibilita a inclusão e remoção de determinados conjuntos de dados do relatório. É possível escolher entre os seguintes tipos de filtros:\n\n- Permite filtrar os dados do relatório por subcategorias de um atributo. Pode-se optar por valores específicos (Ex.: Abr 16) ou relativos (Ex.: 3 meses atrás).\n\n- No exemplo abaixo, o filtro será configurado para exibir apenas solicitações cujo nome do solicitante é John Steel (solicitacaoNomeSolicitante *is* \"John Steel\"):\n\n![](..\\..\\images\\Screenshot%2008_07%20001.png)\n\n**Seleção do atributo solicitacaoNomeSolicitante e condição *is* (1) e do valor \"John Steel\" (2)**\n\n![](..\\..\\images\\Screenshot%2008_07%20006.png)\n\n**Com o filtro aplicado, apenas os processos abertos por este usuário serão considerados no relatório.**\n\n- Permite escolher os dados exibidos no relatório com base na classificação dos valores de determinado atributo: os maiores (*Top*) ou os menores (*Bottom*).\n\n- No exemplo abaixo, o filtro será configurado para exibir apenas os 3 meses com maior quantidade de solicitações abertas (*Top* 3).\n\n![](..\\..\\images\\Screenshot%2008_07%20005.png)\n\n**Seleção da quantidade de resultados que será exibida no relatório (1); atributo createDate (2); ordenação pelo Número de Solicitações (3).**\n\n![](..\\..\\images\\Screenshot%2008_07%20004.png)\n\n**Com o filtro aplicado, apenas o três meses com o maior número de solicitações abertas são exibidos no relatório.**\n\n- Permite definir um critério para inclusão de dados no relatório, excluindo aqueles que não se encaixam no valor estipulado.\n\n- No exemplo abaixo, o filtro será configurado para exibir apenas os meses em que o número de solicitações abertas foi maior ou igual a 10.\n\n![](..\\..\\images\\Screenshot%2008_07%20003.png)\n\n**Seleção do atributo createDate (1) onde a métrica Número de Solicitações é maior ou igual (*is greater than or equal to*) a 10 (2).**\n\n![](..\\..\\images\\Screenshot%2008_07%20007.png)\n\n**Com o filtro aplicado, apenas os meses em que 10 ou mais solicitações tenham sido criadas são exibidos no relatório.**\n\n# Finalizando o Relatório\n\nApós selecionar as métricas, atributos e filtros, o relatório já pode ser salvo e disponibilizado para visualização em um dashboard.\n\n- Informe um título para o relatório clicando sobre a caixa de texto **Untitled report** e clique **Save.**\n\n![](..\\..\\images\\Screenshot%2011_07%20004.png)\n\n- Clique sobre o botão **Create** para informar os últimos parâmetros para a criação do relatório.\n\n![](..\\..\\images\\Screenshot%2011_07%20009.png)\n\n- Na janela que será exibida informe:\n\n1. Tags e a pasta em que o relatório será armazenado (opcional);\n2. Visibilidade do relatório: ao marcar esta opção, o relatório poderá ser visualizado por todos os usuários do Analytics;\n3. Permissão de edição: define que tipo de usuário pode editar o relatório. Por padrão, administradores e editores possuem permissão, mas é possível limitar a edição apenas aos administradores.\n\n- Por fim, clique no botão **Create** na parte inferior para concluir a criação do relatório.\n\n![](..\\..\\images\\Screenshot%2011_07%20005.png)\n\n# Incluindo o Relatório em um Dashboard\n\n**Relatórios** são tabelas ou gráficos que apresentam informações sobre uma ou mais métricas, ou seja, sobre os dados que se deseja medir.\n\n***Dashboards*** são utilizados para exibir e organizar relatórios, de forma a tornar o acesso à estas informações simples e ágil.\n\nPara incluir um novo relatório em um *dashboard*, siga as instruções abaixo:\n\n- Na barra superior do Analytics, clique na opção **Dashboards**.\n\n![](..\\..\\images\\Screenshot%2011_07%20007.png)\n\n- Selecione em qual aba do *dashboard* deseja incluir o relatório. No exemplo abaixo, a aba será **Processos** (1).\n\n- Em seguida, clique no botão com ícone de engrenagem, no canto superior direito (2) e selecione **Edit** (3).\n\n![](..\\..\\images\\Screenshot%2011_07%20010.png)\n\n- Na barra superior que será exibida, clique sobre a opção **Report** (1).\n\n- Serão listados todos os relatórios disponíveis. Selecione o relatório desejado (2).\n\n![](..\\..\\images\\Screenshot%2011_07%20011.png)\n\n- O relatório será adicionado ao *dashboard*.\n\n![](..\\..\\images\\Screenshot%2011_07%20012.png)\n\n- Utilize as bordas da caixa de seleção para ajustar o tamanho dos relatórios. Desmarque a seleção para movê-los para o lugar apropriado.\n\n![](..\\..\\images\\Screenshot%2011_07%20013.png)\n\n- Clique sobre o botão **Save** no canto superior direito para salvar as alterações ao *dashboard*.\n\n![](..\\..\\images\\Screenshot%2011_07%20014.png)\n\n# Sobre KPIs\n\nAcesse o link e conheça a documentação completa sobre [painéis KPI](https://help.gooddata.com/display/doc/KPI+Dashboards).\n\nPainéis KPIs (*Key Performance Indicators*) ou Indicadores Chaves de Performance são *dashboards* que podem ser utilizados para mostrar/acompanhar o desempenho de fatores críticos levando em consideração os objetivos da sua empresa.\n\nSegundo a GoodData esse recurso permite:\n\n- Rastrear como um KPI é alterado ao longo do tempo e compará-lo com os períodos anteriores.\n- Definir alertas e receber notificações quando os KPIs atingirem um limite.\n- Vincular KPIs de ligação a outros *dashboards*.\n- Obter insights mais importantes próximos aos seu KPI relevantes para ter uma visão geral melhor dos seus processos de negócios.\n\nVocê pode adicionar quantos dashboards de KPI quiser ao projeto do Analytics. O painel KPI é compartilhado com todos os usuários do projeto. Qualquer mudança que é feita no painel KPI é imediatamente visível para todos os usuários do projeto.\n\nPara adicionar, editar ou excluir um painel KPI e necessário ter permissão de Editor ou Administrador do projeto no Analytics.\n\n![](..\\..\\images\\Image%2019.jpg)\n\nVocê pode configurar alertas de e-mail para receber notificações sobre quando um valor de KPI no painel KPI atingir um limite determinado. Porém, é permitido configurar apenas um alerta em cada KPI. Somente usuários com permissão de Administrador ou Editor do projeto podem configurar o alerta que será ativado para seu e-mail cadastrado no Analytics.\n\n![](..\\..\\images\\Image%2020.jpg)" }, { "metadata": { "title": "Guia de Implantação do Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107381593", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Guia de Implantação do Analytics.md" }, "content": "Guia de Implantação do Analytics" }, { "metadata": { "title": "Guia de Implantação do Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107381593", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Guia de Implantação do Analytics.md" }, "content": "Guia de Implantação do Analytics\n\n\n# Índice\n\n- 1 [Objetivo](#GuiadeImplantaçãodoAnalytics-Objetivo)\n- 2 [Descrição](#GuiadeImplantaçãodoAnalytics-Descrição)\n- 3 [Pré-requisitos](#GuiadeImplantaçãodoAnalytics-Pré-requisitos)\n- 4 [Habilitar o Analytics na plataforma](#GuiadeImplantaçãodoAnalytics-HabilitaroAnalyticsnaplataforma)\n- 5 [Envio dos Dados](#GuiadeImplantaçãodoAnalytics-EnviodosDados)\n\n# Objetivo\n\nO objetivo deste guia é demonstrar como é realizada a implantação do Analytics, apresentando os passos para habilitar o ambiente e configurar os eventos.\n\nQuer conhecer ainda mais sobre o **Analytics**? Assista o treinamento sobre um projeto **[GoodData](http://www.academy.fluig.com/courses/gooddata)** disponível no **[Fluig Academy](http://academy.fluig.com/)**.\n\n# Descrição\n\nO TOTVS Fluig Plataforma possui o Analytics, que permite a criação de Dashboards e Relatórios para acompanhamento de indicadores de informações que acontecem dentro da plataforma. O serviço está disponível apenas na nuvem, o que garante que todo o grande processamento de novas informações e análise dos dados aconteça com grande escalabilidade.\n\n# Pré-requisitos\n\nNota\n\nComo o serviço de Analytics está na nuvem, o servidor deverá estar habilitado para comunicação na porta **443** para **analytics.fluig.com**, caso não esteja habilitado não será possível enviar os dados.\n\n# Habilitar o Analytics na plataforma\n\nPara habilitar o Analytics no seu ambiente, os seguintes passos devem ser seguidos:\n\nObter um **projeto Analytics**. Nele será possível criar o conjunto de um ou mais *dashboards* no Analytics.\n\nAbra um ticket através do [Portal de Clientes](http://suporte.totvs.com/) em \"**Suporte → Entre em contato e fale conosco!**\" preenchendo os seguintes campos:\n\n| | |\n| --- | --- |\n| **Organização** | Selecionar a organização/Empresa |\n| **Assunto** | Criação de projeto Analytics |\n| **Descrição** | Informações para criação do contexto: 1. Nome da Empresa; 2. CNPJ; 3. Código do cliente TOTVS; 4. Código do contexto a ser criado (normalmente nome da empresa, pode conter espaço, caracteres sem acentuação e números); 5. Nome e sobrenome do administrador; 6. E-mail do administrador do ambiente Analytics; 7. Release do TOTVS Fluig Plataforma (ex: 1.6.4-180904) |\n| **Tipo de Solicitação** | Suporte Técnico |\n| **Impacto** | Dúvida sobre o produto |\n| **País** | Brasil |\n| **Agrupador de serviços** | fluig |\n| **Produto** | fluig |\n| **Módulo** | Ambiente |\n| **Agrupador de Rotina** | Acesso |\n| **Ambiente** | fluig **→** Informar o tipo de Ambiente (Produção ou Homologação) |\n| **Versão** | Informar a release da plataforma TOTVS Fluig |\n\n- Ao receber o ticket com as informações acima, a equipe de atendimento TOTVS Fluig criará o projeto solicitado, podendo ser um para produção e outro para homologação se este também for solicitado.\n- O administrador receberá por e-mail um convite para participar do projeto no Analytics e como resposta no ticket, receberá o código do(s) projeto(s) criado(s).\n- Ao receber o e-mail com a resposta do ticket, você poderá seguir para o **passo 2** onde poderá configurar a integração do Analytics à plataforma TOTVS Fluig de forma simples e ágil.\n- Para que a integração ocorra o e-mail informado na criação do projeto precisa ser do administrador do Fluig.\n\nImportante!\n\nSe você é cliente Cloud, porém não tem acesso à senha do usuário **wcmadmin** entre em contato com time de suporte Cloud para que a senha seja disponibilizada.\n\nNo ambiente da plataforma que se deseja ligar a integração com o Analytics, será necessário acessar com o usuário '**wcmadmin**', acionar o menu **P****ainel de controle** > agrupador **WCM** e acionar a opção**Empresas**.\n\nSelecione a **empresa** que deseja habilitar o Analytics e acione **editar**.\n\nÉ permitido integrar apenas uma empresa (*tenant*) por projeto no Analytics.\n\nClique em **Cadastrar dados adicionais** e na tela adicione as seguintes chaves e valores:\n\n| Chave | Valor |\n| --- | --- |\n| **analytics.gd.project.id** | |\n| **analytics.gd.user** | |\n| **analytics.gd.pass** | |\n| **analytics.gd.active** | true |\n\n![](..\\..\\images\\image2013-12-9%2001341.png)\n\nImportante!\n\nSe utilizar um valor do tipo **senha** recomendamos clicar no botão Esconder Senha (hide password) levando em consideração a Segurança da Informação.\n\n \n![](..\\..\\images\\Image%202.jpg)\n\n![](..\\..\\images\\Image%203.jpg)\n\nUtilizando este recurso, mesmo logado com usuário administrador e acessando os Dados Adicionais ou executando uma requisição REST a senha apresentada permanecerá em segredo.\n\n![](..\\..\\images\\Image%204.jpg)\n\nCom o convite recebido por e-mail, faça seu cadastro no Analytics. Com esse usuário e senha será possível acompanhar os dados enviados ao Analytics.\n\n![](..\\..\\images\\ANA-6.png)\n\nAviso\n\nNão divulgue seu código de projeto, esse é a chave para acesso ao seu projeto.\n\n# Envio dos Dados\n\nOs dados são enviados em **intervalos regulares de 30 minutos,** sendo que são enviados apenas dados alterados durante o período. A comunicação sempre é feita do servidor da plataforma para o Analytics**,**sendo necessária a **liberação do firewall** para acesso aos endereços abaixo:\n\n- \n- [https://secure.gooddata.com](https://secure.gooddata.com/)\n- [https://na1.secure.gooddata.com](https://na1.secure.gooddata.com/)\n- [https://na1-di.gooddata.com](https://na1-di.gooddata.com/)\n- [https://secure-di.gooddata.com](https://secure-di.gooddata.com/)\n\nPara enviar dados específicos de processos Workflow, o evento beforeSendData deve ser utilizado para configuração dos dados que são enviados para o Analytics.\n\nO primeiro parâmetro, **customField**, é um array de String já instanciado contendo 30 posições (de 0 a 29) . O segundo parâmetro, **customFact***,* também é um array com mais de 10 posições onde os dados devem ser do tipo double e o seu conteúdo será tratado como um \"fato\"*.*\n\nA grande **diferença** entre um campo **customField** e **customFact** é que um campo fato (customFact), por se tratar de um número, pode realizar operações como soma, média, máximo e mínimo portanto, poderá ser calculado. segue alguns exemplos de tipos de campos e em qual valor deveria ficar:\n\n| Campo | Campo a ser enviado | Justificativa |\n| --- | --- | --- |\n| Região do pedido de compra | *customField* | Como só se deseja contar em que regiões foram solicitados os pedidos, não é necessário ser um campo fato. |\n| Nome do solicitante | *customField* | Apenas será usado como agrupador. |\n| Valor total do pedido | *customFact* | Para tirar informações como valor de pedido médio de uma região. |\n| Número de itens no pedido | *customFact* | Somar quantos itens foram solicitados por um solicitante. |\n\nAbaixo um exemplo de implementação do evento preenchendo dois campos:\n\nAtenção\n\nNote a conversão do campo customFact para Double. Além disso, deve-se ressaltar que **campos do tipo \"fato\" não suportam a utilização de máscaras**.\n\n**Exemplo de Evento do Workflows**\n\n```\nfunction beforeSendData(customFields, customFacts) {\n customFields[0] =\"1\";\n customFields[1] =hAPI.getCardValue(\"campo_do_formulario\");\n\n customFacts[0]=10.53;\n customFacts[1]=java.lang.Double.parseDouble(hAPI.getCardValue(\"campo_valor\"));\n}\n```\n\nAtenção\n\nPara obter mais informações acesse [Criação de Relatórios no Analytics](Criação de Relatórios no Analytics.md). Nesta página são apresentadas definições e um passo a passo para criação de relatórios." }, { "metadata": { "title": "Importação de dados históricos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126717843", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Importação de dados históricos.md" }, "content": "Importação de dados históricos" }, { "metadata": { "title": "Importação de dados históricos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126717843", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Importação de dados históricos.md" }, "content": "Importação de dados históricos\n\n\n- [Pré-requisitos](#Importaçãodedadoshistóricos-Pré-requisitos)\n - [Consulta do dia e hora do seu último envio de dados da plataforma ao Analytics](#Importaçãodedadoshistóricos-ConsultadodiaehoradoseuúltimoenviodedadosdaplataformaaoAnalytics)\n- [Download do importador](#Importaçãodedadoshistóricos-Downloaddoimportador)\n- [Execução do Importador](#Importaçãodedadoshistóricos-ExecuçãodoImportador)\n - [Execução simples (gera e envia todos os dados em modo visual)](#Importaçãodedadoshistóricos-Execuçãosimples(geraeenviatodososdadosemmodovisual))\n - [Execução modo texto (gera e envia todos os dados)](#Importaçãodedadoshistóricos-Execuçãomodotexto(geraeenviatodososdados))\n - [Execução modo texto (somente gera dados)](#Importaçãodedadoshistóricos-Execuçãomodotexto(somentegeradados))\n - [Execução modo texto (somente enviar dados)](#Importaçãodedadoshistóricos-Execuçãomodotexto(somenteenviardados))\n - [Execução modo texto (deletar dados)](#Importaçãodedadoshistóricos-Execuçãomodotexto(deletardados))\n - [Execução modo texto (executando eventos e conferindo log)](#Importaçãodedadoshistóricos-Execuçãomodotexto(executandoeventoseconferindolog))\n\n# Pré-requisitos\n\n---\n\n- Estar em uma atualização do TOTVS Fluig Plataforma 1.6.3 - EP 15, 1.6.4-180606 ou superior;\n\n- Acesso ao servidor onde a plataforma TOTVS Fluig está instalada (leitura);\n\n- Analytics habilitado e configurado. Para mais informações, [clique aqui](http://tdn.totvs.com/pages/viewpage.action?pageId=107381593#enable-analytics-steps-2);\n\n- Java 8 instalado;\n\nPlataforma em Cloud\n\nClientes cloud precisam entrar em contato com o time de Cloud informando a empresa (Produção ou homologação) código do projeto Analytics (Recebido no convite de ativação), tenant da empresa e período desejado para que seja realizado a importação dos dados.\n\nAtenção!\n\nPara a correta importação dos dados das solicitações de processos customizados que possuem mais de uma versão, o importador fará a verificação da existência do evento beforeSendData().\n\nCaso o importador encontre na implementação desse evento, respectivamente, a declaração de campos ou fatos personalizados, ele criará os arquivo necessários para o envio destes dados automaticamente. O código dentro do evento deve seguir o formato abaixo:\n\n**Exemplo de declaração de campos e fatos personalizados no evento beforeSendData**\n\n```\ncustomFields[0] = hAPI.getCardValue(\"fieldname\");\ncustomFacts[0] = java.lang.Double.parseDouble(hAPI.getCardValue(\"fieldname\"));\n```\n\nSendo que \"customFields[0]\" é responsável pelo envio de dados tipo texto, e \"customFacts[0]\" pelo envio de dados do tipo numérico.\n\nCaso existam campos que utilizem funções específicas (*split*, por exemplo) para a definição do seu valor, o campo não será considerado nesta criação automática do arquivo." }, { "metadata": { "title": "Importação de dados históricos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126717843", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Importação de dados históricos.md" }, "content": "Importação de dados históricos\n\n## Consulta do dia e hora do seu último envio de dados da plataforma ao Analytics" }, { "metadata": { "title": "Importação de dados históricos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126717843", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Importação de dados históricos.md" }, "content": "Importação de dados históricos\n\n\nPara a consulta do envio de dados, siga os passos abaixo:\n\n- Acesse o endereço analytics.fluig.com\n\n![](..\\..\\images\\login%20analytics.png)\n\n- Clique sobre Manage > Solicitação\n\n![](..\\..\\images\\erro%20de%20dados%20analytics%202.png)\n\n- Para verificar se houve alguma interrupção no envio de dados do TOTVS Fluig Plataforma para o Analytics, procure por um intervalo de tempo onde os dados não foram sincronizados. No exemplo abaixo a última atualização foi no dia 25/05/2018 retornando no dia 07/06/2018. -Data em que este exemplo foi incluído na documentação.\n\n![](..\\..\\images\\erro%20de%20dados%20analytics.png)\n\n# Download do importador\n\n---\n\nPara o processo de importação, não é preciso parar o serviço do fluig (este procedimento pode ser realizado enquanto o TOTVS Fluig Plataforma está em execução).\n\nPrimeiramente, será necessário efetuar o *download* do artefato correspondente à atualização da plataforma para o qual o importador será executado, disponível **[aqui](https://suporte.totvs.com/portal/p/10098/download?e=987523)**.\n\nAtenção!\n\nInformamos que este importador de dados é compatível com as versões: **1.7.1** e **inferiores**.\n\nPara as versões **1.8.0** e **superiores** o importador compatível pode ser baixado **[aqui](https://suporte.totvs.com/portal/p/10098/customer-portal-dashboard/services/downloads)**.\n\n# Execução do Importador\n\n---\n\nApós efetuar o *download*, a importação de dados históricos pode ser realizada de duas formas. Segue abaixo:\n\nFique atento!\n\nCaso o erro abaixo seja exibido na execução do importador, significa que o arquivo de validação do modo de startup do Wildfly não foi gerado e será necessário cria-lo manualmente.\n\njava.io.FileNotFoundException: /appserver/bin/  wildfly-config (No such file or directory)\n\nPara isso:\n\n- Acesse a pasta /appserver/bin/\n- Crie o arquivo wildfly-config, e informe se o modo de inicialização do Fluig é \"domain\" ou \"standalone\" incluindo apenas um dos dois modos de inicialização.\n- Após isso, execute novamente o importador.\n\nObservação\n\nNão é oferecido suporte à campos pai x filho nos eventos beforeSendData, quando realizada a extração manual." }, { "metadata": { "title": "Importação de dados históricos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126717843", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Importação de dados históricos.md" }, "content": "Importação de dados históricos\n\n## Execução simples (gera e envia todos os dados em modo visual)\n\n1. Coloque o importador dentro do diretório raiz da instalação da plataforma.\n2. Execute o importador com um duplo clique ou via linha de comando (substituindo pele versão do importador):\n\n ```\n java -jar analytics-import-.jar\n ```\n3. Informe o diretório onde a plataforma está instalada, o código do tenant (empresa), o código do projeto no Analytics para onde os dados serão enviados, e o período (data inicial e final) dos dados a serem importados. O código do projeto no Analytics é o mesmo inserido na configuração da empresa, com a chave analytics.gd.project.id.\n4. Clique no botão **Iniciar importação** e aguarde o processo de importação\n\n![](..\\..\\images\\image2018-6-7_13-29-4.png)\n\n## Execução modo texto (gera e envia todos os dados)\n\n---\n\n1. Coloque o importador dentro do diretório raiz da instalação da plataforma\n2. Execute o importador informando os seguintes parâmetros na linha de comando:\n\n```\njava -jar analytics-import-.jar \n```\n\n**Exemplo**\n\n```\njava -jar analytics-import-1.6-v3.jar c:\\fluig 1 abc123def456ghi789jkl012mno345pq 10/01/2017 10/02/2017\n```\n\nATENÇÃO\n\nO formato da data informada deverá ser **DD/MM/AAAA**\n\n## Execução modo texto (somente gera dados)\n\n---\n\n1.Coloque o importador dentro do diretório raiz da instalação da plataforma.\n\n2.Execute o importador informando os seguintes parâmetros na linha de comando:\n\n```\njava -jar analytics-import-.jar gerar\n```\n\n**Exemplo**\n\n```\n java -jar analytics-import-1.6-v3.jar c:\\fluig 1 abc123def456ghi789jkl012mno345pq 10/01/2017 10/02/2017 gerar\n```\n\nATENÇÃO\n\nO formato da data informada deverá ser **DD/MM/AAAA**\n\n## Execução modo texto (somente enviar dados)" }, { "metadata": { "title": "Importação de dados históricos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126717843", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Importação de dados históricos.md" }, "content": "Importação de dados históricos\n\n\n---\n\n1.Coloque o importador dentro do diretório raiz da instalação da plataforma.\n\n2.Execute o importador informando os seguintes parâmetros na linha de comando:\n\n```\njava -jar analytics-import-.jar enviar\n```\n\n**Exemplo**\n\n```\njava -jar analytics-import-1.6-v3.jar c:\\fluig 1 abc123def456ghi789jkl012mno345pq 10/01/2017 10/02/2017 enviar\n```\n\nATENÇÃO\n\nO formato da data informada deverá ser **DD/MM/AAAA**\n\n## Execução modo texto (deletar dados)\n\n---\n\n1.Coloque o importador dentro do diretório raiz da instalação da plataforma.\n\n2.Execute o importador informando os seguintes parâmetros na linha de comando:\n\n```\njava -jar analytics-import-.jar deletar \n```\n\n**Exemplo**\n\n```\njava -jar analytics-import-1.6-v3.jar c:\\fluig 1 abc123def456ghi789jkl012mno345pq deletar dataset.solicitacao\n```\n\nSegue datasets válidos:\n\n- dataset.solicitacao\n- dataset.documento\n- dataset.pagehit\n- dataset.events\n- dataset.author\n- dataset.place\n\nAo término da execução do processo de importação, será gerado um *log* no diretório onde o arquivo *analytics-import.jar* foi executado.\n\n## Execução modo texto (executando eventos e conferindo log)" }, { "metadata": { "title": "Importação de dados históricos", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126717843", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Importação de dados históricos.md" }, "content": "Importação de dados históricos\n\n\n---\n\n1.Coloque o importador dentro do diretório raiz da instalação da plataforma.\n\n2.Execute o importador informando os seguintes parâmetros na linha de comando:\n\n```\njava -jar analytics-import-.jar gerar true SCHEMA\n```\n\n**Exemplo**\n\n```\n java -jar analytics-import-1.6-v3.jar c:\\fluig 1 abc123def456ghi789jkl012mno345pq 10/01/2017 10/02/2017 gerar true SCHEMA\n```\n\nEste recurso faz com que os eventos beforeSendData das solicitações sejam executados mapeando os campos dos formulários. Os eventos só irão simular a execução de eventos com hAPI.getCardValue(\"Campo\") e hAPI.getCardData() e gerar logs, outros métodos não serão executados.\n\nO parâmetro SCHEMA só é necessário em bases ORACLE, caso contrário há a possibilidade de causar erro nos importadores.\n\nApós a execução neste modo, um log contendo quais eventos foram executados com sucesso e com erro serão exibidos, bem como o select para pesquisar cada registro que o importador utilizou para enviar dados de formulários, sendo bem mais fácil verificar o acontecimento de erros e inconsistências." }, { "metadata": { "title": "Integração plataforma x Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244921190", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Integração plataforma x Analytics.md" }, "content": "Integração plataforma x Analytics\n\n\n# Índice\n\n- 1 [Objetivo](#IntegraçãoplataformaxAnalytics-Objetivo)\n- 2 [GoodData Analytics](#IntegraçãoplataformaxAnalytics-GoodDataAnalytics)\n - 2.1 [O que é?](#IntegraçãoplataformaxAnalytics-Oqueé?)\n - 2.2 [Para que serve?](#IntegraçãoplataformaxAnalytics-Paraqueserve?)\n - 2.3 [Como funciona?](#IntegraçãoplataformaxAnalytics-Comofunciona?)\n - 2.4 [Como utilizar?](#IntegraçãoplataformaxAnalytics-Comoutilizar?)\n- 3 [TOTVS Fluig Plataforma X GoodData Analytics](#IntegraçãoplataformaxAnalytics-TOTVSFluigPlataformaXGoodDataAnalytics)\n - 3.1 [O que é?](#IntegraçãoplataformaxAnalytics-Oqueé?.1)\n - 3.2 [Para que serve?](#IntegraçãoplataformaxAnalytics-Paraqueserve?.1)\n - 3.3 [Como funciona?](#IntegraçãoplataformaxAnalytics-Comofunciona?.1)\n - 3.4 [Que erro é esse?](#IntegraçãoplataformaxAnalytics-Queerroéesse?)\n - 3.5 [Como utilizar?](#IntegraçãoplataformaxAnalytics-Comoutilizar?.1)\n\n# Objetivo\n\nOs objetivos deste documento são:\n\n- Resumir que é o Analytics e quais os recursos disponíveis.\n- Detalhar como funciona a integração do Analytics com o TOTVS Fluig Plataforma.\n- Informar as vantagens e recomendações quanto à utilização do mesmo.\n\n# GoodData Analytics\n\n![](..\\..\\images\\ANA-1.png)\n\n### O que é?\n\nO GoodData Analytics é uma ferramenta de *BI (Business Intelligence)*fornecida pela GoodData. É uma plataforma em *Cloud* que fornece meios de integração, armazenamento, acompanhamento e análise de dados através da geração de relatórios e serviços *REST* através de protocolo seguro *HTTPS*.\n\n### Para que serve?\n\nSendo uma ferramenta de BI, a principal função do Analytics é facilitar a análise visual de grandes volumes de dados através de armazenamento dimensional, ou seja, facilitar a visualização de cargas de dados extensas a fim de auxiliar em ações de tomada de decisões e acompanhamento de fluxo de dados.\n\n### Como funciona?" }, { "metadata": { "title": "Integração plataforma x Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244921190", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Integração plataforma x Analytics.md" }, "content": "Integração plataforma x Analytics\n\n\nO Analytics utiliza o conceito de *datasets*para agrupar os dados em registros, os quais são formados por dois tipos macros de valores: atributos e fatos.\n\n![](..\\..\\images\\ANA-2.png)\n\n*Datasets:*Datasets são os grupos de dados como são enviados para o Analytics. Possuem um conjunto de atributos e fatos que juntos formam a composição de seus registros. O conjunto dos datasets de um projeto é chamado de *Model*e pode ser visualizado de maneira gráfica de dentro do Analytics.\n\n![](..\\..\\images\\ANA-3.png)\n\n*Attributes:*Atributos são os dados brutos enviados ao Analytics, ou seja, todo dado não sumarizável que faz parte de um registro de um determinado dataset, cujos quais complementam as dimensões dos dados.\n\n*Facts:*Fatos são semelhantes aos atributos, porém ao invés de complementar uma dimensão de dados, eles compõem dados numéricos que são utilizados para mensurar os conjuntos de dados pesquisados nos relatórios.\n\n*Metrics:*Apesar de fatos serem dados utilizados para sumarizações, em muitos casos eles tendem a ser insuficientemente tratados para que possam ser exibidos de modo adequado em um relatório, desta forma eles devem ser utilizados para a geração de uma métrica. Métricas podem ser apenas uma passagem para os fatos ou, de maneira mais comum, ser utilizadas como um filtro para tornar os dados numéricos mais fáceis de serem interpretados pelo usuário. Assim, as métricas são a forma como relatórios são sumarizados dentro da GoodData, portanto todo fato enviado, para ser utilizado em um relatório, deve estar contido dentro de uma métrica.\n\n*Variables:*Em casos onde é necessário atribuir valores específicos por usuário para a constituição de uma métrica, é possível criar uma variável. Variáveis podem ser criadas e atribuídas através da aba Manage do Analytics, possuindo um valor definido por padrão e podendo ser atribuída a cada usuário específico através de uma tabela, no formato de dado numérico para ser calculado juntamente a fatos, formando uma métrica, ou então um atributo definido a fim de agrupar os usuários ou realizar funções durante o processamento dos relatórios de maneira diferenciada." }, { "metadata": { "title": "Integração plataforma x Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244921190", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Integração plataforma x Analytics.md" }, "content": "Integração plataforma x Analytics\n\n### Como utilizar?" }, { "metadata": { "title": "Integração plataforma x Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244921190", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Integração plataforma x Analytics.md" }, "content": "Integração plataforma x Analytics\n\n\nA maneira mais comum de se utilizar o Analytics é através da criação de *Dashboards* e *Reports*.\n\n![](..\\..\\images\\ANA-6.png)\n\n*Dashboard:*Dashboard nada mais é que uma espécie de página constituída por um conjunto de *Reports,*servindo para agrupar relatórios que compreendem um mesmo contexto, facilitando a visualização das informações e sua interpretação.\n\n*Reports:*A maneira como o Analytics sumariza e agrupa os dados brutos a fim de apresentá-los aos seus usuários é através de relatórios. Os relatórios são criados pelo usuário tendo como base as métricas e atributos dos datasets carregados no Analytics.\n\n![](..\\..\\images\\ANA-4.png)\n\nAtravés da visão de criação do relatório, é possível definir:\n\n*What:*O que vai ser mensurado, ou seja, as métricas utilizadas para se criar o relatório. Nesta visão também é possível criar métricas novas ou alterar métricas existentes.\n\n*How:*Pelo quê está sendo mensurado, ou seja, quais dados serão utilizados para agrupar as sumarizações. São os atributos em si dos datasets relacionados às métricas utilizadas. Os atributos passíveis de serem utilizados aparecerão em destaque em uma fonte mais escura. Ao selecionar um atributo, será exibido se ele será listado de forma lateral (L) ou no topo (T), para que a tabela seja formada da maneira que o usuário deseja.\n\n*Filter:*Nesta fase o relatório já está disponível para o usuário, porém é possível filtrar os dados tendo como base os atributos dos dataset, por exemplo, para que os registros que contém determinado atributo não sejam sumarizados. Também é possível realizar *drilldowns* e formatações de dados apresentados nos formulários e alterar a apresentação dos mesmos entre tipos de tabelas e gráficos.\n\nDica\n\nConsulte nossa documentação sobre [Criação de Relatórios no Analytics](Criação de Relatórios no Analytics.md).\n\nComo mencionado, a GoodData disponibiliza um conjunto de serviços REST para suas funções. Para um determinado projeto, é possível acessar a biblioteca REST padrão através do *link* https://analytics.fluig.com/gdc/projects/[CODIGO\\_DO\\_PROJETO].\n\n![](..\\..\\images\\ANA-5.png)\n\n- Para verificar a documentação da API, acesse [GoodData API](http://developer.gooddata.com/api)\n\n- Para informações mais detalhadas sobre o funcionamento e recursos do Analytics, segue o link (em inglês): [GoodData Help](https://help.gooddata.com/display/doc/GoodData+Help)\n\n# TOTVS Fluig Plataforma X GoodData Analytics" }, { "metadata": { "title": "Integração plataforma x Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244921190", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Integração plataforma x Analytics.md" }, "content": "Integração plataforma x Analytics\n\n### O que é?\n\nPara facilitar o monitoramento de dados trafegados pela plataforma, é oferecida a possibilidade de integração com a GoodData Analytics, onde é fornecido um *Model*padrão, bem como um ambiente Analytics, um conjunto de relatórios, métricas e *dashboards* pré programados.\n\nA lista de relatórios e *dashboards* do modelo padrão pode ser encontrada em [Relatórios Analytics](http://tdn.totvs.com/x/6pE3D) e a lista de dados de datasets em [Dados para Relatórios.](http://tdn.totvs.com/x/kg9vBg)\n\nFique atento\n\nSe a widget Analytics estiver habilitada para a visualização no aplicativo Fluig mobile considere os passos descritos na documentação: [Suporte a páginas e widgets no aplicativo mobile](../Configuração/Mobile/Suporte a páginas e widgets no aplicativo Fluig mobile.md).\n\n### Para que serve?\n\nA integração da plataforma com o GoodData Analytics serve para facilitar a análise de determinados dados referentes ao uso da plataforma. Ao todo, a plataforma possui quatro grandes grupos de datasets:\n\n| Dataset | Finalidade |\n| --- | --- |\n| Processos | Monitorar o andamento das solicitações. Os dados gravados na GoodData são referentes sempre ao estado atual da solicitação como um todo e servem para sumarizar o andamento e os dados de conclusão de cada solicitação. |\n| Documentos | Monitorar os documentos publicados no ECM |\n| Hits | Monitorar o acesso dos usuários a cada página da plataforma, possuindo dados como páginas mais acessadas por usuários e horários de acesso (conforme relógio do servidor) |\n| Social | Monitorar os dados referentes a eventos sociais, comunidades e publicações. |\n\n### Como funciona?" }, { "metadata": { "title": "Integração plataforma x Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244921190", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Integração plataforma x Analytics.md" }, "content": "Integração plataforma x Analytics\n\n\nPara ativar a integração da plataforma com o GoodData Analytics é necessário seguir os passos conforme a documentação: [Guia de Implantação Analytics.](http://tdn.totvs.com/x/WYNmBg)\n\nCaso deseje enviar os dados anteriores à integração com o Analytics, é necessário executar a rotina de importação de dados históricos. Para maiores informações, acesse [Importação de dados históricos.](http://tdn.totvs.com/x/k4_NBw)\n\nO procedimento acima envia todos os dados históricos para o Analytics referentes a documentos, solicitações e eventos sociais, entretanto os dados dos formulários das solicitações não são enviados por padrão, para tal é necessário verificar a documentação [Enviando dados do formulário.](http://tdn.totvs.com/x/7o_NBw)\n\nPor fim, é importante ressaltar que **dados do dataset HitPages não são enviados como histórico.**\n\nAssim que ativada a integração, movimentações de processos, acessos a páginas, publicações e alterações de documentos, bem como utilização de recursos sociais irão disparar eventos JMS para um serviço do própria plataforma que irá gravar estes dados em uma tabela chamada ANL\\_SENDDATA.\n\nCaso a utilização do servidor seja muito alta, é necessário que haja um aumento na quantidade de requisições possíveis na fila JMS para impedir que a fila entre em sobrecarga e ocorram problemas na gravação do registro na ANL\\_SENDDATA, causando inconsistências nos dados do Analytics.\n\nQuando o servidor atinge os minutos **10**e **40**de cada hora (Por exemplo: 10:40, 11:10, 11:40, 12:10, etc.), a rotina de envio de dados ao Analytics é iniciada. Nesta rotina o servidor coleta os dados da tabela ANL\\_SENDDATA e monta arquivos separados por dataset para serem compactados e enviados ao serviço de importação de dados do Analytics, sendo que a cada arquivo enviado com sucesso, os dados daquele dataset são apagados da tabela ANL\\_SENDDATA. Caso ocorra um problema durante o envio dos dados o servidor retornará um erro e os dados daquele dataset específico não são apagados, ficando na fila para o próximo envio." }, { "metadata": { "title": "Integração plataforma x Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244921190", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Integração plataforma x Analytics.md" }, "content": "Integração plataforma x Analytics\n\n### Que erro é esse?" }, { "metadata": { "title": "Integração plataforma x Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244921190", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Integração plataforma x Analytics.md" }, "content": "Integração plataforma x Analytics\n\n\nAlém de indisponibilidade do servidor Analytics, outros problemas que podem ocorrer durante o envio de dados para o Analytics são:\n\n| Erro | Descrição |\n| --- | --- |\n| *400 Bad Request* | Esse erro costuma ocorrer quando os dados do dataset não correspondem aos dados esperados pelo Analytics. Pode ocorrer caso o modelo do projeto informado esteja desatualizado ou alguma informação esteja formatada de maneira errada no arquivo do dataset. |\n| *401 Unauthorized* | Erro caso o login e senha informados na configuração na plataforma estejam errados. |\n| *403 Forbidden* | Erro caso o servidor não tenha acesso ao ambiente Analytics. É importante lembrar que a porta 443 do servidor onde a plataforma está hospedada deve estar liberada para acesso aos endereços informados no [Guia de Implantação do Analytics](Guia de Implantação do Analytics.md). |\n\nOutro erro comum ocorre quando o usuário do Analytics configurado na plataforma teve algum problema de acesso e ativou o CAPTCHA de segurança do Analytics, sendo necessário autenticar-se novamente e de forma manual no servidor do Analytics e informar o CAPTCHA para que a integração volte a funcionar. Por isso é recomendado que o usuário que visualiza os dados e monta os relatórios do Analytics não seja o mesmo configurado na plataforma para realizar a integração de dados, evitando assim falha humana e uma possível dessincronização dos dados.\n\nOs datasets que o modelo padrão da plataforma configura no modelo do Analytics possuem dados incrementais, ou seja, os dados são apenas adicionados e atualizados, nunca removidos. A única exceção é o dataset de solicitações em atraso, sendo que este sempre é apagado e regerado a cada envio dos dados para o Analytics.\n\nÉ importante ressaltar que, em ambientes em Cluster, o ideal é que apenas um dos ambientes seja o responsável pelo envio de dados para o Analytics, assim evitando que dois ambientes realizem o envio das mesmas informações e acabe ocasionando problemas de sincronia, principalmente no dataset de solicitações em atraso.\n\nApós enviados os dados, as informações quanto ao sucesso do upload podem ser consultadas através da aba Manage do Analytics, dentro das opções de cada dataset, sendo que caso um ícone de aviso apareça ao lado do informativo de *upload*, significa que ocorreu algum problema com aquela atualização em específico.\n\nPara verificar os logs do Analytics, é necessário consultá-lo através das APIs da própria GoodData, conforme explicado anteriormente. Caso ocorra um erro de comunicação entre a plataforma e o Analytics, ele estará explicitado no log da plataforma entre os informativos de início e fim do procedimento de envio de dados, respectivamente *Starting Analytics file upload*e *Completed Analytics file upload*." }, { "metadata": { "title": "Integração plataforma x Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=244921190", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Integração plataforma x Analytics.md" }, "content": "Integração plataforma x Analytics\n\n### Como utilizar?\n\nÉ possível utilizar os relatórios padrões construídos a partir do modelo importado para a utilização com a plataforma bem como criar novos relatórios e dashboards.\n\nA partir daqui, toda a utilização fica a cargo da GoodData. Caso seja detectada alguma inconsistência de dados, é possível realizar a importação de dados históricos a fim de ressincronizá-los, porém é importante lembrar que a importação de histórico **apaga os dados de acesso às páginas e os dados de formulários das solicitações,**sendo assim as documentações de importação devem ser revistas e um [modelo de importação](http://tdn.totvs.com/pages/viewpage.action?pageId=126717934) precisa ser criado para que não hajam problemas de perda de dados." }, { "metadata": { "title": "Manipulação de dados dos processos para o Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=95618104", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Manipulação de dados dos processos para o Analytics.md" }, "content": "Manipulação de dados dos processos para o Analytics\n\n\nEm todas as movimentações de um processo os dados do mesmo são enviados ao Analytics mantendo sua versão atual. Informações referentes ao processo são enviados automaticamente e informações do formulário podem ser manipuladas no evento **beforeSendData.**\n\nA função para tratar esse evento do processo possui dois parâmetros customFields e customFacts.\n\nO primeiro parâmetro, customField*s,* é um *array* de *String* já instanciado contendo 30 posições (de 0 a 29) . O segundo parâmetro, customFacts, também é um *array* mas de 10 posições onde os dados devem ser do tipo *double* e o seu conteúdo será tratado como um \"fato\".\n\nApenas a partir da atualização 1.4.13 existem 30 campos customField\n\nFique atento a isso em seus códigos.\n\nAbaixo um exemplo de implementação:\n\n**beforeSendData**\n\n```\nfunction beforeSendData(customFields, customFacts) {\n customFields[0] =\"1\";\n customFields[1] =hAPI.getCardValue(\"campo_do_formulario\");\n\n customFacts[0]=10.53;\n customFacts[1]=java.lang.Double.parseDouble(hAPI.getCardValue(\"campo_valor\"));\n }\n```\n\n### Envio de Dados pelo Editor de Formulários\n\nÉ possível definir os campos de formulário que deverão ser enviados para o Analytics através do editor de formulários *web* da plataforma.\n\nPara isso, é preciso assinalar a opção **Usar Analytics?** nos campos de formulário que serão remetidos para a ferramenta. O limite no número de posições é o mesmo disponível para envio através do evento beforeSendData.\n\nCampos de formulário dos tipos Número e Avaliação serão considerados \"fatos\" no Analytics, enquanto os demais campos são enviados como \"atributos\".\n\n![](..\\..\\images\\Screenshot%2022_06%20001.png)\n\n**O ícone ao lado do nome do campo indica que a opção Usar Analytics? foi marcada**\n\nFormulários desenvolvidos via fluig Studio e exportados para a plataforma não poderão ser alterados pelo editor *web*." }, { "metadata": { "title": "Relatórios Analytics - 2.2.0", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=621782513", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Relatórios Analytics - 2.2.0.md" }, "content": "Relatórios Analytics - 2.2.0" }, { "metadata": { "title": "Relatórios Analytics - 2.2.0", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=621782513", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Relatórios Analytics - 2.2.0.md" }, "content": "Relatórios Analytics - 2.2.0\n\n\n# Índice\n\n \n\n- 1 [Painel de Indicadores](#RelatóriosAnalytics2.2.0-PaineldeIndicadores)\n- 2 [Relatórios de Processos](#RelatóriosAnalytics2.2.0-RelatóriosdeProcessos)\n- 3 [Relatórios de Documentos](#RelatóriosAnalytics2.2.0-RelatóriosdeDocumentos)\n- 4 [Relatórios de Social](#RelatóriosAnalytics2.2.0-RelatóriosdeSocial)\n- 5 [Relatórios de WCM](#RelatóriosAnalytics2.2.0-RelatóriosdeWCM)\n- 6 [Relatórios do No-Code (Apps Tasks e Forms)](#RelatóriosAnalytics2.2.0-RelatóriosdoNo-Code(AppsTaskseForms))\n- 7 [Lista Completa de Relatórios](#RelatóriosAnalytics2.2.0-ListaCompletadeRelatórios)\n\nO Analytics é a ferramenta responsável por transformar os dados brutos em informações gerenciais e úteis para tomada de decisões. Fornece visões atuais e históricas dos processos de negócio e das principais funcionalidades do TOTVS Fluig Plataforma: Processos, Documentos, Social e WCM (Portais).\n\nA versão 2 do Analytics utiliza novas visualizações para melhor entregar a informação da utilização do Fluig Plataforma. \n\nVeja a seguir os relatórios disponíveis por padrão no Analytics versão 2 juntamente com seu modelo de apresentação dos resultados.\n\nDica\n\nConfira também a **aba KPIs de cada módulo** (Processos, Documentos, Social, WCM e No-Code), presente nesta documentação e dentro da plataforma.\n\nDica\n\nAgora o Fluig Analytics possui um novo **Painel de Indicadores** com informações sumarizadas de cada módulo do seu Fluig Plataforma em uma única tela!\n\n# Painel de Indicadores\n\nO novo painel de indicadores do Fluig Analytics versão 2 é uma visualização que sumariza as principais informações de cada módulo do seu Fluig Plataforma, assim facilitando a gestão dos indicadores. Caso seja necessário se aprofundar em um dos módulos, basta clicar nos números que você será direcionado para a aba específica do módulo!\n\n![](..\\..\\images\\image2021-10-19_11-38-31.png)\n\n# Relatórios de Processos\n\nO Analytics versão 2 foi desenvolvido utilizando o conceito de um painel principal com diversas análises combinadas, afim de trazer um panorama da operação.\n\nNo painel principal de Processos há essa visualização:\n\n![](..\\..\\images\\image2021-8-13_14-3-24.png)\n\nAbaixo está detalhada a informação que cada indicador do painel principal traz:\n\n**# - Quantidade de Solicitações por Data de Criação**\n\nExibe a quantidade de solicitações criadas por mês no período selecionado.\n\nNome completo do relatório: [LC] - # - Quantidade de Solicitações por Data de Criação\n\nRelatório faz drill-down para: [TB] - # - Detalhado Solicitações e Processos\n\n- Métrica utilizada : # - Quantidade de Solicitações\n- Descrição da métrica: Determina a quantidade de solicitações.\n\n**# - Quantidade de Atualizações em Solicitações**\n\nExibe a quantidade de atualizações em solicitações no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Atualizações em Solicitações\n\nRelatório faz drill-down para: [TB] - # - Detalhado Atualizações em Solicitações\n\n- Métrica utilizada : # - Quantidade de Atualizações em Solicitações\n- Descrição da métrica: Determina a quantidade de atualizações em solicitações no período selecionado.\n\n**# - Quantidade de Solicitações por Processo**\n\nExibe a quantidade de solicitações por processo no período selecionado.\n\nNome completo do relatório: [PC] - # - Quantidade de Solicitações por Processo\n\n- Métrica utilizada : # - Quantidade de Solicitações\n- Descrição da métrica: Determina a quantidade de solicitações.\n\n**# Solicitações**\n\nExibe a quantidade de solicitações no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Solicitações\n\nRelatório faz drill-down para: [TB] - # - Detalhado Solicitações e Processos\n\n- Métrica utilizada : # - Quantidade de Solicitações\n- Descrição da métrica: Determina a quantidade de solicitações.\n\n**# Solicitações Fechadas**\n\nExibe a quantidade de solicitações que foram fechadas no período selecionado. Não contabiliza solicitações canceladas.\n\nNome completo do relatório: [KPI] - # - Solicitações Fechadas\n\nRelatório faz drill-down para: [TB] - # - Detalhado Solicitações Fechadas\n\n- Métrica utilizada : # - Solicitações Fechadas\n- Descrição da métrica: Determina a quantidade de solicitações que já foram fechadas. Não contabiliza solicitações canceladas.\n\n**# Solicitações Abertas**\n\nExibe a quantidade de solicitações que estão abertas no período selecionado.\n\nNome completo do relatório: [KPI] - # - Solicitações Abertas\n\nRelatório faz drill-down para: [TB] - # - Detalhado Solicitações Abertas\n\n- Métrica utilizada : # - Solicitações Abertas\n- Descrição da métrica: Determina a quantidade de solicitações que estão abertas.\n\n**# Solicitações em Atraso**\n\nExibe a quantidade de solicitações atrasadas no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Solicitações Em Atraso\n\nRelatório faz drill-down para: [TB] - # - Detalhado Solicitações em Atraso\n\n- Métrica utilizada : # - Quantidade de Solicitações Em Atraso\n- Descrição da métrica: Determina a quantidade de solicitações atrasadas.\n\n**# Solicitantes**\n\nExibe a quantidade de solicitantes no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Solicitantes\n\nRelatório faz drill-down para: [TB] - # - Detalhado Solicitantes\n\n- Métrica utilizada : # - Quantidade de Solicitantes\n- Descrição da métrica: Determina a contagem de usuários que solicitaram algum processo.\n\n**# Responsáveis**\n\nExibe a quantidade de responsáveis no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Responsáveis\n\nRelatório faz drill-down para: [TB] - # - Detalhado Responsáveis\n\n- Métrica utilizada : # - Quantidade de Responsáveis\n- Descrição da métrica: Determina a contagem de responsáveis por processos.\n\nExibe os 5 solicitantes com a maior quantidade de dias de atraso em solicitações e sua quantidade de solicitações em atraso no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-31-19.png)\n\nNome completo do relatório: [BC] - # - TOP 5 Solicitações em Atraso e Dias de Atraso por Solicitante\n\nRelatório faz drill-down para: [TB] - # - Detalhado Solicitações em Atraso\n\n- Métrica utilizada : # - Quantidade de Dias de Atraso da Solicitação\n- Descrição da métrica: Determina a quantidade de dias de atraso de uma solicitação atrasada.\n\n- Métrica utilizada : # - Quantidade de Solicitações Em Atraso\n- Descrição da métrica: Determina a quantidade de solicitações atrasadas.\n\nExibe os 5 responsáveis com a maior quantidade de dias de atraso em solicitações e sua quantidade de solicitações em atraso no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-31-42.png)\n\nNome completo do relatório: [BC] - # - TOP 5 Solicitações em Atraso e Dias de Atraso por Responsável\n\nRelatório faz drill-down para: [TB] - # - Detalhado Solicitações em Atraso\n\n- Métrica utilizada : # - Quantidade de Dias de Atraso da Solicitação\n- Descrição da métrica: Determina a quantidade de dias de atraso de uma solicitação atrasada.\n\n- Métrica utilizada : # - Quantidade de Solicitações Em Atraso\n- Descrição da métrica: Determina a quantidade de solicitações atrasadas.\n\nExibe o detalhamento das solicitações e seus respectivos processos no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-31-59.png)\n\nNome completo do relatório: [TB] - # - Detalhado Solicitações e Processos\n\n- Métrica utilizada : # - Quantidade de Dias de Atraso da Solicitação\n- Descrição da métrica: Determina a quantidade de dias de atraso de uma solicitação atrasada.\n\n- Métrica utilizada : # - Quantidade de Solicitações\n- Descrição da métrica: Determina a quantidade de solicitações.\n\nA aba KPIs pode ser acessada pelo menu superior da plataforma, clicando no botão \"KPIs\".\n\n![](..\\..\\images\\image2021-6-15_8-55-15.png)\n\nNela teremos todos os relatórios já existentes nos dashboards convencionais, mas em uma interface mais intuitiva e adaptável para dispositivos móveis.\n\nNa aba KPIs de Processos você encontrará essas visualizações:\n\n![](..\\..\\images\\image2021-8-13_14-17-25.png)\n\n**# - Solicitações**\n\nExibe a quantidade de solicitações no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Solicitações\n- Descrição da métrica: Determina a quantidade de solicitações.\n\n**# - Solicitações Fechadas**\n\nExibe a quantidade de solicitações que foram fechadas no período selecionado. Não contabiliza solicitações canceladas.\n\n- Métrica utilizada : # - Solicitações Fechadas\n- Descrição da métrica: Determina a quantidade de solicitações que já foram fechadas. Não contabiliza solicitações canceladas.\n\n**# - Solicitações Abertas**\n\nExibe a quantidade de solicitações que estão abertas no período selecionado.\n\n- Métrica utilizada : # - Solicitações Abertas\n- Descrição da métrica: Determina a quantidade de solicitações que estão abertas.\n\n**# - Solicitações em Atraso**\n\nExibe a quantidade de solicitações atrasadas no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Solicitações Em Atraso\n- Descrição da métrica: Determina a quantidade de solicitações atrasadas.\n\n**# - Atualizações em Solicitações**\n\nExibe a quantidade de atualizações em solicitações no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Atualizações em Solicitações\n- Descrição da métrica: Determina a quantidade de atualizações em solicitações no período selecionado.\n\n**#  - Responsáveis**\n\nExibe a quantidade de responsáveis no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Responsáveis\n- Descrição da métrica: Determina a contagem de responsáveis por processos.\n\n**# - Solicitantes**\n\nExibe a quantidade de solicitantes no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Solicitantes\n- Descrição da métrica: Determina a contagem de usuários que solicitaram algum processo.\n\n![](..\\..\\images\\image2021-6-15_8-57-40.png)\n\n**# - Quantidade de Solicitações por Data de Criação**\n\nExibe a quantidade de solicitações criadas por mês no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Solicitações\n- Descrição da métrica: Determina a quantidade de solicitações.\n\n![](..\\..\\images\\image2021-6-15_8-57-56.png)\n\n**# - Quantidade de Solicitações por Processo**\n\nExibe a quantidade de solicitações por processo no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Solicitações\n- Descrição da métrica: Determina a quantidade de solicitações.\n\n![](..\\..\\images\\image2021-6-15_8-58-15.png)\n\n**# - TOP 5 Solicitantes com Solicitações em Atraso e dias de Atraso**\n\nExibe os 5 solicitantes com a maior quantidade de dias de atraso em solicitações e sua quantidade de solicitações em atraso no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Dias de Atraso da Solicitação\n- Descrição da métrica: Determina a quantidade de dias de atraso de uma solicitação atrasada.\n\n- Métrica utilizada : # - Quantidade de Solicitações Em Atraso\n- Descrição da métrica: Determina a quantidade de solicitações atrasadas.\n\n![](..\\..\\images\\image2021-6-15_8-58-27.png)\n\n**# - TOP 5 Responsáveis com Solicitações em Atraso e dias de Atraso**\n\nExibe os 5 responsáveis com a maior quantidade de dias de atraso em solicitações e sua quantidade de solicitações em atraso no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Dias de Atraso da Solicitação\n- Descrição da métrica: Determina a quantidade de dias de atraso de uma solicitação atrasada.\n\n- Métrica utilizada : # - Quantidade de Solicitações Em Atraso\n- Descrição da métrica: Determina a quantidade de solicitações atrasadas.\n\n \n\n# Relatórios de Documentos\n\nO Analytics versão 2 foi desenvolvido utilizando o conceito de um painel principal com diversas análises combinadas, afim de trazer um panorama da operação.\n\nNo painel principal de Documentos há essa visualização:\n\n![](..\\..\\images\\image2021-8-13_14-9-5.png)\n\nAbaixo está detalhada a informação que cada indicador do painel principal traz:\n\n**# - Quantidade Acumulada de Documentos e Tamanho dos Arquivos**\n\nExibe a quantidade acumulada de documentos até a data atual e o tamanho acumulado dos arquivos de documentos até a data atual no período selecionado.\n\nNome completo do relatório: [LC] - # - Total de Documentos e Quantidade em MB de Arquivos\n\nRelatório faz drill-down para: [TB] - # - Detalhado Documentos\n\n- Métrica utilizada : # - Quantidade Acumulada de Documentos\n- Descrição da métrica: Determina a quantidade acumulada de documentos até a data atual, de acordo com a data selecionada.\n\n- Métrica utilizada : # - Tamanho Acumulado dos Arquivos de Documentos\n- Descrição da métrica: Determina o tamanho acumulado dos arquivos de documentos até a data atual, de acordo com a data selecionada.\n\n**# - Quantidade de Documentos sem Acessos**\n\nExibe a quantidade de Documentos criados no período selecionado que não possuem nenhum acesso e tem tamanho de arquivo.\n\nNome completo do relatório: [KPI] - # - Quantidade de Documentos Sem Acesso e Com Tamanho de Arquivo\n\nRelatório faz drill-down para: [TB] - # - Detalhado Documentos Sem Acesso e Com Tamanho de Arquivo\n\n- Métrica utilizada : # - Quantidade de Documentos Sem Acesso e Com Tamanho de Arquivo\n- Descrição da métrica: Determina a quantidade de Documentos que não possuem nenhum acesso e tem tamanho de arquivo.\n\n**# - Acessos**\n\nExibe a quantidade de acessos de documentos no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Acessos\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de Acessos\n\n- Métrica utilizada : # - Quantidade de Acessos\n- Descrição da métrica: Determina a quantidade de acessos à documentos.\n\n**# - Acessos por Tipo de Documento**\n\nExibe a quantidade de acessos por tipo de documento no período selecionado.\n\nNome completo do relatório: [PC] - # - Acessos por Tipo de Documento\n\n- Métrica utilizada : # - Quantidade de Acessos\n- Descrição da métrica: Determina a quantidade de acessos à documentos.\n\n**# Documentos**\n\nExibe a quantidade de documentos no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Documentos\n\nRelatório faz drill-down para: [TB] - # - Detalhado Documentos\n\n- Métrica utilizada : # - Quantidade de Documentos\n- Descrição da métrica: Determina a quantidade de documentos.\n\n**# Documentos com Download**\n\nExibe a quantidade de documentos com arquivo de download no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Documentos com Download\n\nRelatório faz drill-down para: [TB] - # - Detalhado Documentos com Download\n\n- Métrica utilizada : # - Quantidade de Documentos com Download\n- Descrição da métrica: Determina a quantidade de documentos com arquivo de download.\n\n**# Tamanho**\n\nExibe o tamanho acumulado dos arquivos de documentos até a data atual no período selecionado.\n\nNome completo do relatório: [KPI] - # - Tamanho Acumulado em Mega Bytes dos Arquivos de Documentos\n\nRelatório faz drill-down para: [TB] - # - Detalhado Tamanho em MB\n\n- Métrica utilizada : # - Tamanho Acumulado dos Arquivos de Documentos\n- Descrição da métrica: Determina o tamanho acumulado dos arquivos de documentos até a data atual, de acordo com a data selecionada.\n\n**# Autores**\n\nExibe a quantidade de autores de documentos no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Autores\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de Autores\n\n- Métrica utilizada : # - Quantidade de Autores\n- Descrição da métrica: Determina a quantidade de autores de documentos.\n\n**# Publicadores**\n\nExibe a quantidade de publicadores de documentos no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Publicadores\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de Publicadores\n\n- Métrica utilizada : # - Quantidade de Publicadores\n- Descrição da métrica: Determina a quantidade de publicadores de documentos.\n\nExibe os 5 documentos com a maior quantidade de acessos no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-32-42.png)\n\nNome completo do relatório: [BC] - # - TOP 5 Documentos por Número de Acessos\n\nRelatório faz drill-down para: [TB] - # - Detalhado Documentos\n\n- Métrica utilizada : # - Quantidade de Acessos\n- Descrição da métrica: Determina a quantidade de acessos à documentos.\n\n- Métrica utilizada : % - Quantidade de Acessos\n- Descrição da métrica: Determina a porcentagem de acessos à documentos.\n\nExibe os 5 formatos de arquivo com a maior quantidade de documentos e seu tamanho de arquivo no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-33-6.png)\n\nNome completo do relatório: [BC] - # - TOP 5 Quantidade de Documentos por Extensão e Tamanho de Arquivo\n\nRelatório faz drill-down para: [TB] - # - Detalhado Documentos\n\n- Métrica utilizada : # - Quantidade de Documentos\n- Descrição da métrica: Determina a quantidade de documentos.\n\n- Métrica utilizada : # - Tamanho do Arquivo do Documento em Bytes\n- Descrição da métrica: Determina o tamanho dos arquivos de documentos em bytes. Essa métrica é formatada para apresentar seu valor dependendo da quantidade de bytes (Kilobytes, Megabytes ou Gigabytes).\n\nExibe o detalhamento dos documentos no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-33-20.png)\n\nNome completo do relatório: [TB] - # - Detalhado Documentos\n\n- Métrica utilizada : # - Quantidade de Acessos\n- Descrição da métrica: Determina a quantidade de acessos à documentos.\n\n- Métrica utilizada : # - Quantidade de Documentos\n- Descrição da métrica: Determina a quantidade de documentos.\n\n- Métrica utilizada : # - Tamanho do Arquivo do Documento em Bytes\n- Descrição da métrica: Determina o tamanho dos arquivos de documentos em bytes. Essa métrica é formatada para apresentar seu valor dependendo da quantidade de bytes (Kilobytes, Megabytes ou Gigabytes).\n\nA aba KPIs pode ser acessada pelo menu superior da plataforma, clicando no botão \"KPIs\".\n\n![](..\\..\\images\\image2021-6-15_8-55-15.png)\n\nNela teremos todos os relatórios já existentes nos dashboards convencionais, mas em uma interface mais intuitiva e adaptável para dispositivos móveis.\n\nNa aba KPIs de Documentos você encontrará essas visualizações:\n\n![](..\\..\\images\\image2021-8-13_14-11-45.png)\n\n**# - Documentos**\n\nExibe a quantidade de documentos no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Documentos\n- Descrição da métrica: Determina a quantidade de documentos.\n\n**# - Documentos sem Acessos**\n\nExibe a quantidade de Documentos criados no período selecionado que não possuem nenhum acesso e tem tamanho de arquivo.\n\n- Métrica utilizada : # - Quantidade de Documentos Sem Acesso e Com Tamanho de Arquivo\n- Descrição da métrica: Determina a quantidade de Documentos que não possuem nenhum acesso e tem tamanho de arquivo.\n\n**# - Documentos com Download**\n\nExibe a quantidade de documentos com arquivo de download no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Documentos com Download\n- Descrição da métrica: Determina a quantidade de documentos com arquivo de download.\n\n**# - Tamanho**\n\nExibe o tamanho acumulado dos arquivos de documentos até a data atual no período selecionado.\n\n- Métrica utilizada : # - Tamanho Acumulado dos Arquivos de Documentos\n- Descrição da métrica: Determina o tamanho acumulado dos arquivos de documentos até a data atual, de acordo com a data selecionada.\n\n**# - Autores**\n\nExibe a quantidade de autores de documentos no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Autores\n- Descrição da métrica: Determina a quantidade de autores de documentos.\n\n**# - Publicadores**\n\nExibe a quantidade de publicadores de documentos no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Publicadores\n- Descrição da métrica: Determina a quantidade de publicadores de documentos.\n\n![](..\\..\\images\\image2021-6-15_9-0-13.png)\n\n**# - Quantidade Acumulada de Documentos e Tamanho dos Arquivos**\n\nExibe a quantidade acumulada de documentos até a data atual e o tamanho acumulado dos arquivos de documentos até a data atual no período selecionado.\n\n- Métrica utilizada : # - Quantidade Acumulada de Documentos\n- Descrição da métrica: Determina a quantidade acumulada de documentos até a data atual, de acordo com a data selecionada.\n\n- Métrica utilizada : # - Tamanho Acumulado dos Arquivos de Documentos\n- Descrição da métrica: Determina o tamanho acumulado dos arquivos de documentos até a data atual, de acordo com a data selecionada.\n\n![](..\\..\\images\\image2021-6-15_9-0-26.png)\n\n**# - Acessos por Tipo de Documento**\n\nExibe a quantidade de acessos por tipo de documento no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Acessos\n- Descrição da métrica: Determina a quantidade de acessos à documentos.\n\n![](..\\..\\images\\image2021-6-15_9-0-42.png)\n\n**# - TOP 5 Documentos por Número de Acessos**\n\nExibe os 5 documentos com a maior quantidade de acessos no período selecionado.\n\nRelatório faz drill-down para: [TB] - # - Detalhado Documentos\n\n- Métrica utilizada : # - Quantidade de Acessos\n- Descrição da métrica: Determina a quantidade de acessos à documentos.\n\n- Métrica utilizada : % - Quantidade de Acessos\n- Descrição da métrica: Determina a porcentagem de acessos à documentos.\n\n![](..\\..\\images\\image2021-6-15_9-0-59.png)\n\n**# - TOP 5 Extensões por Número de Documento e Tamanho de Arquivo**\n\nExibe os 5 formatos de arquivo com a maior quantidade de documentos e seu tamanho de arquivo no período selecionado.\n\nRelatório faz drill-down para: [TB] - # - Detalhado Documentos\n\n- Métrica utilizada : # - Quantidade de Documentos\n- Descrição da métrica: Determina a quantidade de documentos.\n\n- Métrica utilizada : # - Tamanho do Arquivo do Documento em Bytes\n- Descrição da métrica: Determina o tamanho dos arquivos de documentos em bytes. Essa métrica é formatada para apresentar seu valor dependendo da quantidade de bytes (Kilobytes, Megabytes ou Gigabytes).\n\n# Relatórios de Social\n\nO Analytics versão 2 foi desenvolvido utilizando o conceito de um painel principal com diversas análises combinadas, afim de trazer um panorama da operação.\n\nNo painel principal de Social há essa visualização:\n\n![](..\\..\\images\\image2021-8-13_14-13-32.png)\n\nAbaixo está detalhada a informação que cada indicador do painel principal traz:\n\n**# - Posts e Comentários por Data**\n\nExibe a quantidade de posts e comentários por mês no período selecionado.\n\nNome completo do relatório: [LC] - # - Quantidade de Posts e Comentários por Data\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de Posts e Comentários por Data\n\n- Métrica utilizada : # - Quantidade de Comentários\n- Descrição da métrica: Determina a quantidade de comentários.\n\n- Métrica utilizada : # - Quantidade de Posts\n- Descrição da métrica: Determina a quantidade de posts.\n\n**# - Quantidade de Usuários com Interações**\n\nExibe a quantidade de usuários com interações no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Usuários com Interação\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de Usuários com Interação\n\n- Métrica utilizada : # - Quantidade de Usuários com Interação\n- Descrição da métrica: Determina a quantidade de usuários com interações.\n\n**# - Quantidade de Interações por Tipo**\n\nExibe a quantidade de interações por tipo de interação no período selecionado.\n\nNome completo do relatório: [PC] - # - Quantidade de Interações por Tipo\n\n- Métrica utilizada : # - Quantidade de Eventos\n- Descrição da métrica: Determina a quantidade de eventos no Social.\n\n**# Interações**\n\nExibe a quantidade de interações no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Interações\n\nRelatório faz drill-down para: [TB] - # - Detalhado Social\n\n- Métrica utilizada : # - Quantidade de Eventos\n- Descrição da métrica: Determina a quantidade de eventos no Social.\n\n**# Menções**\n\nExibe a quantidade de menções no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Menções\n\nRelatório faz drill-down para: [TB] - # - Detalhado Social - Menções\n\n- Métrica utilizada : # - Quantidade de Menções\n- Descrição da métrica: Determina a quantidade de menções.\n\n**# Posts**\n\nExibe a quantidade de posts no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Posts\n\nRelatório faz drill-down para: [TB] - # - Detalhado Social - Posts\n\n- Métrica utilizada : # - Quantidade de Posts\n- Descrição da métrica: Determina a quantidade de posts.\n\n**# Likes**\n\nExibe a quantidade de likes no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Likes\n\nRelatório faz drill-down para: [TB] - # - Detalhado Social - Likes\n\n- Métrica utilizada : # - Quantidade de Likes\n- Descrição da métrica: Determina a quantidade de likes.\n\n**# Comunidades com Posts**\n\nExibe a quantidade de comunidades com posts no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Comunidades com Posts\n\nRelatório faz drill-down para: [TB] - # - Detalhado Social - Comunidades com Posts\n\n- Métrica utilizada : # - Quantidade de Comunidades com Posts\n- Descrição da métrica: Determina a quantidade de comunidades com posts.\n\n**# Comentários**\n\nExibe a quantidade de comentários no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Comentários\n\nRelatório faz drill-down para: [TB] - # - Detalhado Social - Comentários\n\n- Métrica utilizada : # - Quantidade de Comentários\n- Descrição da Métrica: Determina a quantidade de comentários.\n\nExibe os 5 usuários com a maior quantidade interações no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-34-16.png)\n\nNome completo do relatório: [BC] - # - TOP 5 Usuários com Mais Interações\n\nRelatório faz drill-down para: [TB] - # - Detalhado Social\n\n- Métrica utilizada : # - Quantidade de Eventos\n- Descrição da métrica: Determina a quantidade de eventos no Social.\n\n- Métrica utilizada : % - Quantidade de Eventos\n- Descrição da métrica: Determina a porcentagem de eventos no Social.\n\nExibe as 5 comunidades com a maior quantidade de interações no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-34-41.png)\n\nNome completo do relatório: [BC] - # - TOP 5 Comunidades com Mais Interações\n\nRelatório faz drill-down para: [TB] - # - Detalhado Interações em Comunidades\n\n- Métrica utilizada : # - Quantidade de Eventos em Comunidades\n- Descrição da métrica: Determina a quantidade de eventos em comunidades.\n\n- Métrica utilizada : % - Quantidade de Eventos em Comunidades\n- Descrição da métrica: Determina a porcentagem de eventos em comunidades.\n\nExibe o detalhamento das interações no Social no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-35-7.png)\n\nNome completo do relatório: [TB] - # - Detalhado Social\n\n- Métrica utilizada : # - Quantidade de Comentários\n- Descrição da métrica: Determina a quantidade de comentários.\n\n- Métrica utilizada : # - Quantidade de Compartilhamentos\n- Descrição da métrica: Determina a quantidade de compartilhamentos.\n\n- Métrica utilizada : # - Quantidade de Likes\n- Descrição da métrica: Determina a quantidade de likes.\n\n- Métrica utilizada : # - Quantidade de Menções\n- Descrição da métrica: Determina a quantidade de menções.\n\n- Métrica utilizada : # - Quantidade de Posts\n- Descrição da métrica: Determina a quantidade de posts.\n\n- Métrica utilizada : # - Quantidade de Seguidores\n- Descrição da métrica: Determina a quantidade de seguidores.\n\n- Métrica utilizada : # - Quantidade de Seguindo\n- Descrição da métrica: Determina a quantidade de pessoas seguindo.\n\nA aba KPIs pode ser acessada pelo menu superior da plataforma, clicando no botão \"KPIs\".\n\n![](..\\..\\images\\image2021-6-15_8-55-15.png)\n\nNela teremos todos os relatórios já existentes nos dashboards convencionais, mas em uma interface mais intuitiva e adaptável para dispositivos móveis.\n\nNa aba KPIs de Social você encontrará essas visualizações:\n\n![](..\\..\\images\\image2021-8-13_14-17-49.png)\n\n**# - Interações**\n\nExibe a quantidade de interações no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Eventos\n- Descrição da métrica: Determina a quantidade de eventos no Social.\n\n**# - Menções**\n\nExibe a quantidade de menções no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Menções\n- Descrição da métrica: Determina a quantidade de menções.\n\n**# - Posts**\n\nExibe a quantidade de posts no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Posts\n- Descrição da métrica: Determina a quantidade de posts.\n\n**# - Likes**\n\nExibe a quantidade de likes no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Likes\n- Descrição da métrica: Determina a quantidade de likes.\n\n**# - Quantidade de Usuários com Interação**\n\nExibe a quantidade de usuários com interações no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Usuários com Interação\n- Descrição da métrica: Determina a quantidade de usuários com interações.\n\n**# - Comentários**\n\nExibe a quantidade de comentários no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Comentários\n- Descrição da Métrica: Determina a quantidade de comentários.\n\n**# - Compartilhamentos**\n\nExibe a quantidade de comentários no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Compartilhamentos\n- Descrição da Métrica: Determina a quantidade de comentários.\n\n![](..\\..\\images\\image2021-6-15_9-1-48.png)\n\n**# - Posts e Comentários por Data**\n\nExibe a quantidade de posts e comentários por mês no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Comentários\n- Descrição da métrica: Determina a quantidade de comentários.\n\n- Métrica utilizada : # - Quantidade de Posts\n- Descrição da métrica: Determina a quantidade de posts.\n\n![](..\\..\\images\\image2021-6-15_9-2-1.png)\n\n**# - Quantidade de Interações por Tipo**\n\nExibe a quantidade de interações por tipo de interação no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Eventos\n- Descrição da métrica: Determina a quantidade de eventos no Social.\n\n![](..\\..\\images\\image2021-6-15_9-2-16.png)\n\n**# - TOP 5 Usuários com Mais Interações**\n\nExibe os 5 usuários com a maior quantidade interações no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Eventos\n- Descrição da métrica: Determina a quantidade de eventos no Social.\n\n- Métrica utilizada : % - Quantidade de Eventos\n- Descrição da métrica: Determina a porcentagem de eventos no Social.\n\n![](..\\..\\images\\image2021-6-15_9-2-30.png)\n\n**# - TOP 5 Comunidades com Mais Interações**\n\nExibe as 5 comunidades com a maior quantidade de interações no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Eventos em Comunidades\n- Descrição da métrica: Determina a quantidade de eventos em comunidades.\n\n- Métrica utilizada : % - Quantidade de Eventos em Comunidades\n- Descrição da métrica: Determina a porcentagem de eventos em comunidades.\n\n# Relatórios de WCM\n\nO Analytics versão 2 foi desenvolvido utilizando o conceito de um painel principal com diversas análises combinadas, afim de trazer um panorama da operação.\n\nNo painel principal de WCM há essa visualização:\n\n![](..\\..\\images\\image2021-8-13_14-19-24.png)\n\nAbaixo está detalhada a informação que cada indicador do painel principal traz:\n\n**# - Quantidade de Visualizações por Data e Tendência**\n\nExibe a quantidade de visualizações em páginas por mês no período selecionado.\n\nNome completo do relatório: [LC] - # - Quantidade de Visualizações por Data\n\nRelatório faz drill-down para: [TB] - # - Detalhado WCM\n\n- Métrica utilizada : # - Quantidade de Visualizações\n- Descrição da métrica: Determina a quantidade de visualizações em páginas.\n\n**# - Quantidade de Usuários que Acessam**\n\nExibe a quantidade de usuários que acessam no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de usuários que Acessam\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de usuários que Acessam\n\n- Métrica utilizada : # - Quantidade de usuários que Acessam\n- Descrição da métrica: Determina a quantidade de usuários que acessam.\n\n**# - Visualizações por parte do dia**\n\nExibe a quantidade de visualizações por parte do dia no período selecionado.\n\nNome completo do relatório: [PC] - # - Visualizações por parte do dia (manhã/tarde)\n\n- Métrica utilizada : % - Quantidade de Visualizações Manhã\n- Descrição da métrica: Determina o percentual de visualizações em páginas na parte da manhã em relação ao total de visualizações registrado.\n\n- Métrica utilizada : % - Quantidade de Visualizações Tarde\n- Descrição da métrica: Determina o percentual de visualizações em páginas na parte da tarde em relação ao total de visualizações registrado.\n\n**# Visualizações**\n\nExibe a quantidade de visualizações em páginas no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Visualizações\n\nRelatório faz drill-down para: [TB] - # - Detalhado WCM\n\n- Métrica utilizada : # - Quantidade de Visualizações\n- Descrição da métrica: Determina a quantidade de visualizações em páginas.\n\n**# Páginas**\n\nExibe a quantidade de páginas acessadas no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Páginas\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de Páginas\n\n- Métrica utilizada : # - Quantidade de Páginas\n- Descrição da métrica: Determina a quantidade de páginas.\n\n**# Média por Mês**\n\nExibe a média de acessos por mês no período selecionado.\n\nNome completo do relatório: [KPI] - # - Média de Acessos por Mês\n\n- Métrica utilizada : # - Média de Acessos por Mês\n- Descrição da métrica: Determina a média de acessos por mês.\n\n**# Média por Página**\n\nExibe a média de acessos por página no período selecionado.\n\nNome completo do relatório: [KPI] - # - Média de Acessos por Página\n\n- Métrica utilizada : # - Média de Acessos por Página\n- Descrição da métrica: Determina a média de acessos por página.\n\n**# Visualizações pela manhã**\n\nExibe a quantidade de visualizações em páginas na parte da manhã no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Visualizações Manhã\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de Visualizações Manhã\n\n- Métrica utilizada : # - Quantidade de Visualizações Manhã\n- Descrição da métrica: Determina a quantidade de visualizações em páginas na parte da manhã.\n\n**# Visualizações a tarde**\n\nExibe a quantidade de visualizações em páginas na parte da tarde no período selecionado.\n\nNome completo do relatório: [KPI] - # - Quantidade de Visualizações Tarde\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de Visualizações Tarde\n\n- Métrica utilizada : # - Quantidade de Visualizações Tarde\n- Descrição da métrica: Determina a quantidade de visualizações em páginas na parte da tarde.\n\nExibe as 5 páginas com a maior quantidade de acessos no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-35-42.png)\n\nNome completo do relatório: [BC] - # - TOP 5 Páginas Mais Acessadas\n\nRelatório faz drill-down para: [TB] - # - Detalhado WCM\n\n- Métrica utilizada : # - Quantidade de Visualizações\n- Descrição da métrica: Determina a quantidade de visualizações em páginas.\n\n- Métrica utilizada : % - Visualizações\n- Descrição da métrica: Determina o percentual de visualizações em relação ao total de visualizações registrado.\n\nExibe os 5 usuários com a maior quantidade de acessos no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-35-53.png)\n\nNome completo do relatório: [BC] - # - TOP 5 Usuários que Mais Acessam\n\nRelatório faz drill-down para: [TB] - # - Detalhado WCM\n\n- Métrica utilizada : # - Quantidade de Visualizações\n- Descrição da métrica: Determina a quantidade de visualizações em páginas.\n\n- Métrica utilizada : % - Visualizações\n- Descrição da métrica: Determina o percentual de visualizações em relação ao total de visualizações registrado.\n\nExibe o detalhamento das visualizações em páginas no período selecionado.\n\n![](..\\..\\images\\image2021-6-14_17-36-12.png)\n\nNome completo do relatório: [TB] - # - Detalhado WCM\n\n- Métrica utilizada : # - Quantidade de Visualizações\n- Descrição da métrica: Determina a quantidade de visualizações em páginas.\n\nA aba KPIs pode ser acessada pelo menu superior da plataforma, clicando no botão \"KPIs\".\n\n![](..\\..\\images\\image2021-6-15_8-55-15.png)\n\nNela teremos todos os relatórios já existentes nos dashboards convencionais, mas em uma interface mais intuitiva e adaptável para dispositivos móveis.\n\nNa aba KPIs de WCM você encontrará essas visualizações:\n\n![](..\\..\\images\\image2021-8-13_14-21-36.png)\n\n**# - Visualizações**\n\nExibe a quantidade de visualizações em páginas no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Visualizações\n- Descrição da métrica: Determina a quantidade de visualizações em páginas.\n\n**# - Páginas**\n\nExibe a quantidade de páginas acessadas no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Páginas\n- Descrição da métrica: Determina a quantidade de páginas.\n\n**# - Média por Página**\n\nExibe a média de acessos por página no período selecionado.\n\n- Métrica utilizada : # - Média de Acessos por Página\n- Descrição da métrica: Determina a média de acessos por página.\n\n**# - Média por Mês**\n\nExibe a média de acessos por mês no período selecionado.\n\n- Métrica utilizada : # - Média de Acessos por Mês\n- Descrição da métrica: Determina a média de acessos por mês.\n\n**# - Usuários que Acessam**\n\nExibe a quantidade de usuários que acessam no período selecionado.\n\n- Métrica utilizada : # - Quantidade de usuários que Acessam\n- Descrição da métrica: Determina a quantidade de usuários que acessam.\n\n**# - Visualizações pela manhã**\n\nExibe a quantidade de visualizações em páginas na parte da manhã no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Visualizações Manhã\n- Descrição da métrica: Determina a quantidade de visualizações em páginas na parte da manhã.\n\n**# - Visualizações a tarde**\n\nExibe a quantidade de visualizações em páginas na parte da tarde no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Visualizações Tarde\n- Descrição da métrica: Determina a quantidade de visualizações em páginas na parte da tarde.\n\n![](..\\..\\images\\image2021-6-15_9-4-16.png)\n\n**# - Quantidade de Visualizações por Data**\n\nExibe a quantidade de visualizações em páginas por mês no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Visualizações\n- Descrição da métrica: Determina a quantidade de visualizações em páginas.\n\n![](..\\..\\images\\image2021-6-15_9-4-34.png)\n\n**# - Visualizações por parte do dia**\n\nExibe a quantidade de visualizações por parte do dia no período selecionado.\n\n- Métrica utilizada : % - Quantidade de Visualizações Manhã\n- Descrição da métrica: Determina o percentual de visualizações em páginas na parte da manhã em relação ao total de visualizações registrado.\n\n- Métrica utilizada : % - Quantidade de Visualizações Tarde\n- Descrição da métrica: Determina o percentual de visualizações em páginas na parte da tarde em relação ao total de visualizações registrado.\n\n![](..\\..\\images\\image2021-6-15_9-4-49.png)\n\n**# - TOP 5 Páginas Mais Acessadas**\n\nExibe as 5 páginas com a maior quantidade de acessos no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Visualizações\n- Descrição da métrica: Determina a quantidade de visualizações em páginas.\n\n- Métrica utilizada : % - Visualizações\n- Descrição da métrica: Determina o percentual de visualizações em relação ao total de visualizações registrado.\n\n![](..\\..\\images\\image2021-6-15_9-5-3.png)\n\n**# - TOP 5 Usuários que Mais Acessam**\n\nExibe os 5 usuários com a maior quantidade de acessos no período selecionado.\n\n- Métrica utilizada : # - Quantidade de Visualizações\n- Descrição da métrica: Determina a quantidade de visualizações em páginas.\n\n- Métrica utilizada : % - Visualizações\n- Descrição da métrica: Determina o percentual de visualizações em relação ao total de visualizações registrado.\n\n# Relatórios do No-Code (Apps Tasks e Forms)\n\nO Analytics versão 2 foi desenvolvido utilizando o conceito de um painel principal com diversas análises combinadas, afim de trazer um panorama da operação.\n\nNo painel principal do No-Code há essa visualização:\n\n![](..\\..\\images\\image2021-10-4_10-2-31.png)\n\nAbaixo está detalhada a informação que cada indicador do painel principal traz:\n\n**# - Quantidade de Movimentações por Data e Tendência**\n\nExibe a quantidade de movimentações feitas por mês no período selecionado.\n\nNome completo do relatório: [LC] - # - Quantidade de Movimentações por Data\n\nRelatório faz drill-down para: [TB] - # - Detalhado No-Code\n\n- Métrica utilizada : # - Movimentações App Forms\n- Descrição da métrica: Determina a quantidade de movimentações no App Forms do Fluig No-Code.\n- Métrica utilizada : # - Movimentações App Tasks\n- Descrição da métrica: Determina a quantidade de movimentações no App Tasks do Fluig No-Code.\n\n**# - Usuários que não utilizam o App Tasks**\n\nExibe a quantidade de usuários que utilizam e não utilizam o App Tasks.\n\n**# Utilizando**\n\nExibe a quantidade de usuários que utilizam o App Tasks do Fluig No-Code.\n\nNome completo do relatório: [KPI] - # - Quantidade de Usuários que Utilizam o App Tasks\n\n- Métrica utilizada : # - Quantidade de Usuários que Utilizam o App Tasks\n- Descrição da métrica: Determina a quantidade de usuários que utilizam o App Tasks do Fluig No-Code.\n\n**# Sem Utilização**\n\nExibe a quantidade de usuários que não utilizam o App Tasks do Fluig No-Code.\n\nNome completo do relatório: [KPI] - # - Usuários que não utilizam o TASKS\n\n- Métrica utilizada : # - Usuários que não utilizam o TASKS\n- Descrição da métrica: Determina a quantidade de usuários que não utilizam o App Tasks do Fluig No-Code.\n\n**% Adesão Tasks**\n\nExibe a porcentagem de adesão do App Tasks do Fluig No-Code. O resultado é a divisão da quantidade de usuários que utilizam o App pela quantidade total de usuários (utilizando e não utilizando).\n\nNome completo do relatório: [KPI] - % - Adesão Tasks\n\n- Métrica utilizada : % - Adesão Tasks\n- Descrição da métrica: Determina a porcentagem de adesão do App Tasks do Fluig No-Code. O resultado é a divisão da quantidade de usuários que utilizam o App pela quantidade total de usuários (utilizando e não utilizando).\n\n**# - Porcentagem de Movimentações por App**\n\nExibe a porcentagem de movimentações por App do Fluig No-Code no período selecionado.\n\nNome completo do relatório: [PC] - % - Movimentações por App do Fluig No-Code\n\n- Métrica utilizada : # - Movimentações No-Code\n- Descrição da métrica: Determina a quantidade de movimentações nos Apps do Fluig No-Code.\n\n**# Movimentações**\n\nExibe a quantidade de movimentações nos Apps do Fluig No-Code.\n\nNome completo do relatório: [KPI] - # - Movimentações No-Code\n\nRelatório faz drill-down para: [TB] - # - Detalhado No-Code\n\n- Métrica utilizada : # - Movimentações No-Code\n- Descrição da métrica: Determina a quantidade de movimentações nos Apps do Fluig No-Code.\n\n**# Total de Movimentações no App Forms**\n\nExibe a quantidade de movimentações no App Forms do Fluig No-Code.\n\nNome completo do relatório: [KPI] - # - Movimentações App Forms\n\nRelatório faz drill-down para: [TB] - # - Detalhado Forms\n\n- Métrica utilizada : # - Movimentações App Forms\n- Descrição da métrica: Determina a quantidade de movimentações no App Forms do Fluig No-Code.\n\n**# Total de Movimentações no App Tasks**\n\nExibe a quantidade de movimentações no App Tasks do Fluig No-Code.\n\nNome completo do relatório: [KPI] - # - Movimentações App Tasks\n\nRelatório faz drill-down para: [TB] - # - Detalhado Tasks\n\n- Métrica utilizada : # - Movimentações App Tasks\n- Descrição da métrica: Determina a quantidade de movimentações no App Tasks do Fluig No-Code.\n\n**# Formulários (App Forms)**\n\nExibe a quantidade de formulários com movimentações no App Forms do Fluig No-Code.\n\nNome completo do relatório: [KPI] - # - Quantidade de Formulários\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de Formulários\n\n- Métrica utilizada : # - Quantidade de Formulários\n- Descrição da métrica:  Determina a quantidade de formulários com movimentações no App Forms do Fluig No-Code.\n\n**# Visualizações (App Forms)**\n\n**# Total de Visualizações**\n\nExibe a quantidade de visualizações em formulários do App Forms do Fluig No-Code.\n\nNome completo do relatório: [KPI] - # - Visualizações em Formulários\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de Formulários\n\n- Métrica utilizada : # - Visualizações em Formulários\n- Descrição da métrica: Determina a quantidade de visualizações em formulários do App Forms do Fluig No-Code.\n\n**# Média por Formulário**\n\nExibe a média de visualizações de formulários no App Forms do Fluig No-Code.\n\nNome completo do relatório: [KPI] - # - Média de Visualizações por Formulário\n\nRelatório faz drill-down para: [TB] - # - Detalhado Quantidade de Formulários\n\n- Métrica utilizada : # - Média de Visualizações por Formulário\n- Descrição da métrica: Determina a média de visualizações de formulários no App Forms do Fluig No-Code.\n\nExibe as 5 funções dos Apps do No-Code com a maior quantidade de movimentações e sua porcentagem período selecionado.\n\n![](..\\..\\images\\image2021-10-4_10-18-21.png)\n\nNome completo do relatório: [BC] - # - TOP 5 Funções mais utilizadas (App Tasks e App Forms)\n\nRelatório faz drill-down para: [TB] - # - Detalhado No-Code\n\n- Métrica utilizada : # - Movimentações No-Code\n- Descrição da métrica: Determina a quantidade de movimentações nos Apps do Fluig No-Code.\n\n- Métrica utilizada : % - Movimentações No-Code\n- Descrição da métrica: Determina a porcentagem de movimentações nos Apps do Fluig No-Code.\n\nExibe os 5 usuários com a maior quantidade de acessos no período selecionado.\n\n![](..\\..\\images\\image2021-10-19_11-39-28.png)\n\nNome completo do relatório: [BC] - # - TOP 5 Usuários que mais utilizam o No-Code (App Tasks e App Forms)\n\nRelatório faz drill-down para: [TB] - # - Detalhado No-Code\n\n- Métrica utilizada : # - Movimentações No-Code\n- Descrição da métrica: Determina a quantidade de movimentações nos Apps do Fluig No-Code.\n\n- Métrica utilizada : % - Movimentações No-Code\n- Descrição da métrica: Determina a porcentagem de movimentações nos Apps do Fluig No-Code.\n\nExibe o detalhamento das visualizações em páginas no período selecionado.\n\n![](..\\..\\images\\image2021-10-19_11-39-47.png)\n\nNome completo do relatório: [TB] - # - Detalhado No-Code\n\n- Métrica utilizada : # - Movimentações No-Code\n- Descrição da métrica: Determina a quantidade de movimentações nos Apps do Fluig No-Code.\n\nA aba KPIs pode ser acessada pelo menu superior da plataforma, clicando no botão \"KPIs\".\n\n![](..\\..\\images\\image2021-6-15_8-55-15.png)\n\nNela teremos todos os relatórios já existentes nos dashboards convencionais, mas em uma interface mais intuitiva e adaptável para dispositivos móveis.\n\nNa aba KPIs do No-Code você encontrará essas visualizações:\n\n![](..\\..\\images\\image2021-10-4_10-23-3.png)\n\n**# - Movimentações App Tasks**\n\nExibe a quantidade de movimentações no App Tasks do Fluig No-Code.\n\n- Métrica utilizada : # - Movimentações App Tasks\n- Descrição da métrica: Determina a quantidade de movimentações no App Tasks do Fluig No-Code.\n\n**# Utilizando**\n\nExibe a quantidade de usuários que utilizam o App Tasks do Fluig No-Code.\n\n- Métrica utilizada : # - Quantidade de Usuários que Utilizam o App Tasks\n- Descrição da métrica: Determina a quantidade de usuários que utilizam o App Tasks do Fluig No-Code.\n\n**# Sem Utilização**\n\nExibe a quantidade de usuários que não utilizam o App Tasks do Fluig No-Code.\n\n- Métrica utilizada : # - Usuários que não utilizam o TASKS\n- Descrição da métrica: Determina a quantidade de usuários que não utilizam o App Tasks do Fluig No-Code.\n\n**% Adesão Tasks**\n\nExibe a porcentagem de adesão do App Tasks do Fluig No-Code. O resultado é a divisão da quantidade de usuários que utilizam o App pela quantidade total de usuários (utilizando e não utilizando).\n\n- Métrica utilizada : % - Adesão Tasks\n- Descrição da métrica: Determina a porcentagem de adesão do App Tasks do Fluig No-Code. O resultado é a divisão da quantidade de usuários que utilizam o App pela quantidade total de usuários (utilizando e não utilizando).\n\n**# - Movimentações App Forms**\n\nExibe a quantidade de movimentações no App Forms do Fluig No-Code.\n\n- Métrica utilizada : # - Movimentações App Forms\n- Descrição da métrica: Determina a quantidade de movimentações no App Forms do Fluig No-Code.\n\n**# Formulários**\n\nExibe a quantidade de formulários com movimentações no App Forms do Fluig No-Code.\n\n- Métrica utilizada : # - Quantidade de Formulários\n- Descrição da métrica:  Determina a quantidade de formulários com movimentações no App Forms do Fluig No-Code.\n\n**# Total de Visualizações**\n\nExibe a quantidade de visualizações em formulários do App Forms do Fluig No-Code.\n\n- Métrica utilizada : # - Visualizações em Formulários\n- Descrição da métrica: Determina a quantidade de visualizações em formulários do App Forms do Fluig No-Code.\n\n**# Média por Formulário**\n\nExibe a média de visualizações de formulários no App Forms do Fluig No-Code.\n\n- Métrica utilizada : # - Média de Visualizações por Formulário\n- Descrição da métrica: Determina a média de visualizações de formulários no App Forms do Fluig No-Code.\n\n![](..\\..\\images\\image2021-10-4_10-27-59.png)\n\n**# - Quantidade de Movimentações por Data**\n\nExibe a quantidade de movimentações feitas por mês no período selecionado.\n\n- Métrica utilizada : # - Movimentações App Forms\n- Descrição da métrica: Determina a quantidade de movimentações no App Forms do Fluig No-Code.\n- Métrica utilizada : # - Movimentações App Tasks\n- Descrição da métrica: Determina a quantidade de movimentações no App Tasks do Fluig No-Code.\n\n![](..\\..\\images\\image2021-10-4_10-28-48.png)\n\n**# - Porcentagem de Movimentações por App**\n\nExibe a porcentagem de movimentações por App do Fluig No-Code no período selecionado.\n\n- Métrica utilizada : # - Movimentações No-Code\n- Descrição da métrica: Determina a quantidade de movimentações nos Apps do Fluig No-Code.\n\n![](..\\..\\images\\image2021-10-4_10-30-2.png)\n\nExibe as 5 funções dos Apps do No-Code com a maior quantidade de movimentações e sua porcentagem período selecionado.\n\n- Métrica utilizada : # - Movimentações No-Code\n- Descrição da métrica: Determina a quantidade de movimentações nos Apps do Fluig No-Code.\n\n- Métrica utilizada : % - Movimentações No-Code\n- Descrição da métrica: Determina a porcentagem de movimentações nos Apps do Fluig No-Code.\n\n![](..\\..\\images\\image2021-10-19_11-41-45.png)\n\nExibe os 5 usuários com a maior quantidade de acessos no período selecionado.\n\n- Métrica utilizada : # - Movimentações No-Code\n- Descrição da métrica: Determina a quantidade de movimentações nos Apps do Fluig No-Code.\n\n- Métrica utilizada : % - Movimentações No-Code\n- Descrição da métrica: Determina a porcentagem de movimentações nos Apps do Fluig No-Code.\n\n# Lista Completa de Relatórios\n\n[Painel] - # - Movimentações App Tasks \n[Painel] - # - Movimentações App Forms \n[Painel] - # - Quantidade de Comunidades com Posts \n[Painel] - # - Quantidade de Páginas \n[Painel] - # - Quantidade de Documentos \n[Painel] - # - Solicitações Abertas \n[Painel] - # - Quantidade de Acessos \n[Painel] - # - Quantidade de Eventos \n[Painel] - # - Quantidade de Visualizações \n[Painel] - # - Quantidade de Solicitações \n[BC] - # - TOP 5 Solicitações em Atraso e Dias de Atraso por Responsável \n[BC] - # - TOP 5 Solicitações em Atraso e Dias de Atraso por Solicitante \n[KPI] - # - Quantidade de Atualizações em Solicitações \n[KPI] - # - Quantidade de Responsáveis \n[KPI] - # - Quantidade de Solicitações \n[KPI] - # - Quantidade de Solicitações Em Atraso \n[KPI] - # - Quantidade de Solicitantes \n[KPI] - # - Solicitações Abertas \n[KPI] - # - Solicitações Fechadas \n[LC] - # - Quantidade de Solicitações por Data de Criação \n[PC] - # - Quantidade de Solicitações por Processo \n[TB] - # - Detalhado Atualizações em Solicitações \n[TB] - # - Detalhado Responsáveis \n[TB] - # - Detalhado Solicitações Abertas \n[TB] - # - Detalhado Solicitações e Processos \n[TB] - # - Detalhado Solicitações em Atraso \n[TB] - # - Detalhado Solicitações Fechadas \n[TB] - # - Detalhado Solicitantes \n[BC] - # - TOP 5 Documentos por Número de Acessos \n[BC] - # - TOP 5 Quantidade de Documentos por Extensão e Tamanho de Arquivo \n[KPI] - # - Quantidade de Acessos \n[KPI] - # - Quantidade de Autores \n[KPI] - # - Quantidade de Documentos \n[KPI] - # - Quantidade de Documentos com Download \n[KPI] - # - Quantidade de Documentos Sem Acesso e Com Tamanho de Arquivo \n[KPI] - # - Quantidade de Publicadores \n[KPI] - # - Tamanho Acumulado em Mega Bytes dos Arquivos de Documentos \n[LC] - # - Total de Documentos e Quantidade em MB de Arquivos \n[PC] - # - Acessos por Tipo de Documento \n[TB] - # - Detalhado Documentos \n[TB] - # - Detalhado Documentos com Download \n[TB] - # - Detalhado Documentos Sem Acesso e Com Tamanho de Arquivo \n[TB] - # - Detalhado Quantidade de Acessos \n[TB] - # - Detalhado Quantidade de Autores \n[TB] - # - Detalhado Quantidade de Publicadores \n[TB] - # - Detalhado Tamanho em MB \n[BC] - # - TOP 5 Comunidades com Mais Interações \n[BC] - # - TOP 5 Usuários com Mais Interações \n[KPI] - # - Quantidade de Comentários \n[KPI] - # - Quantidade de Comunidades com Posts \n[KPI] - # - Quantidade de Interações \n[KPI] - # - Quantidade de Likes \n[KPI] - # - Quantidade de Menções \n[KPI] - # - Quantidade de Posts \n[KPI] - # - Quantidade de Usuários com Interação \n[LC] - # - Quantidade de Posts e Comentários por Data \n[PC] - # - Quantidade de Interações por Tipo \n[TB] - # - Detalhado Interações em Comunidades \n[TB] - # - Detalhado Quantidade de Posts e Comentários por Data \n[TB] - # - Detalhado Quantidade de Usuários com Interação \n[TB] - # - Detalhado Social \n[TB] - # - Detalhado Social - Comentários \n[TB] - # - Detalhado Social - Comunidades com Posts \n[TB] - # - Detalhado Social - Likes \n[TB] - # - Detalhado Social - Menções \n[TB] - # - Detalhado Social - Posts \n[BC] - # - TOP 5 Páginas Mais Acessadas \n[BC] - # - TOP 5 Usuários que Mais Acessam \n[KPI] - # - Média de Acessos por Mês \n[KPI] - # - Média de Acessos por Página \n[KPI] - # - Quantidade de Páginas \n[KPI] - # - Quantidade de usuários que Acessam \n[KPI] - # - Quantidade de Visualizações \n[KPI] - # - Quantidade de Visualizações Manhã \n[KPI] - # - Quantidade de Visualizações Tarde \n[LC] - # - Quantidade de Visualizações por Data \n[PC] - # - Visualizações por parte do dia (manhã/tarde) \n[TB] - # - Detalhado Quantidade de Páginas \n[TB] - # - Detalhado Quantidade de usuários que Acessam \n[TB] - # - Detalhado Quantidade de Visualizações Manhã \n[TB] - # - Detalhado Quantidade de Visualizações Tarde \n[TB] - # - Detalhado WCM \n[TB] - # - Detalhado Tasks \n[TB] - # - Detalhado Forms \n[TB] - # - Detalhado Visualizações em Formulários \n[TB] - # - Detalhado Quantidade de Formulários \n[TB] - # - Detalhado No-Code \n[KPI] - # - Média de Visualizações por Formulário \n[KPI] - # - Visualizações em Formulários \n[KPI] - # - Quantidade de Formulários \n[KPI] - % - Adesão Tasks \n[KPI] - # - Quantidade de Usuários que Utilizam o App Tasks \n[BC] - # - TOP 5 Usuários que mais utilizam o No-Code (App Tasks e App Forms) \n[BC] - # - TOP 5 Funções mais utilizadas (App Tasks e App Forms) \n[KPI] - # - Movimentações App Tasks \n[KPI] - # - Movimentações App Forms \n[KPI] - # - Movimentações No-Code \n[PC] - % - Movimentações por App do Fluig No-Code \n[LC] - # - Quantidade de Movimentações por Data \n[KPI] - # - Usuários que não utilizam o TASKS" }, { "metadata": { "title": "Relatórios Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=204968426", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Relatórios Analytics.md" }, "content": "Relatórios Analytics" }, { "metadata": { "title": "Relatórios Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=204968426", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Relatórios Analytics.md" }, "content": "Relatórios Analytics\n\n\n# Índice\n\n \n\n- 1 [Relatórios de Processos](#RelatóriosAnalytics-RelatóriosdeProcessos)\n- 2 [Relatórios de Documentos](#RelatóriosAnalytics-RelatóriosdeDocumentos)\n- 3 [Relatórios de Social](#RelatóriosAnalytics-RelatóriosdeSocial)\n- 4 [Relatórios de WCM](#RelatóriosAnalytics-RelatóriosdeWCM)\n- 5 [Lista Completa de Relatórios](#RelatóriosAnalytics-ListaCompletadeRelatórios)\n\nO Analytics está na versão 2.0.0! Navegue até a documentação mais atualizada: [Relatórios Analytics - 2.0.0](Relatórios Analytics - 2.2.0.md)\n\nO Analytics é a ferramenta responsável por transformar os dados brutos em informações gerenciais e úteis para tomada de decisões. Fornece visões atuais e históricas dos processos de negócio e das principais funcionalidades do TOTVS Fluig Plataforma: Processos, Documentos, Social e WCM (Portais).\n\nVeja a seguir os relatórios disponíveis por padrão no Analytics juntamente com seu modelo de apresentação dos resultados.\n\n \n\n# Relatórios de Processos\n\n- Relatório que mostra os usuários que mais iniciaram solicitações do processo selecionado no filtro:\n- Modelo de apresentação do relatório:\n\n![](..\\..\\images\\filtro.jpg)\n\n![](..\\..\\images\\Usuarios%20que%20mais%20solicitam%20-%20processos.jpg)\n\n- Quantidade de solicitações do processo selecionado no filtro agrupados pela atividade atual.\n- Modelo de apresentação do relatório:\n\n![](..\\..\\images\\filtro.jpg)\n\n**![](..\\..\\images\\Volume%20por%20Atividade.jpg)**\n\n- Apresenta a quantidade total de solicitações abertas e o número de solicitações do processo selecionado na filtro.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Numero%20de%20solicitacoes.jpg)![](..\\..\\images\\filtro.jpg)**\n\n- Apresenta os cinco processos com maior quantidade de solicitações.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\TOP%20Processos.jpg)**\n\n- Apresenta a quantidade total de processos criados na plataforma.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Numero%20de%20processos.jpg)**\n\n- Apresenta a quantidade de solicitações com uma atividade em atraso agrupada por processos.\n- Modelo de apresentação do relatório:\n\n![](..\\..\\images\\TOP%20Atrasados.jpg)\n\n \n\n# Relatórios de Documentos\n\n- Apresenta em porcentagem, a quantidade de tipos de documentos, classificados por extensões, publicados na plataforma TOTVS Fluig.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\TOP%20Tipo%20de%20Documentos.jpg)**\n\n- Apresenta o espaço ocupado no volume físico de documento publicados.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Espaco%20Ocupado.jpg)**\n\n- Apresenta os documentos com o maior número de visualizações na plataforma.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\TOP%20Mais%20Acessados%20-%20DOC.jpg)**\n\n- Apresenta a quantidade total de visualizações dos documentos publicados.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Numero%20de%20Visualizacoes%20-%20Documentos.jpg)**\n\n- Apresenta a quantidade total de documentos publicados na plataforma TOTVS Fluig.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Numero%20de%20Documentos.jpg)**\n\n# Relatórios de Social\n\n- Apresenta as comunidades com maior número de participantes.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\TOP-Comunidades.jpg)**\n\n- Apresenta a quantidade total de apoios de todas as comunidades cadastradas.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Numero%20de%20Apoios.jpg)**\n\n- Apresenta os usuários com maior número de posts em comunidades.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Usuario%20com%20mais%20posts.jpg)**\n\n- Apresenta a quantidade total de posts realizadas nas comunidades cadastradas.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Numero%20de%20Posts.jpg)**\n\n- Apresenta os usuários com maior número de seguidores.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\TOP%20Usu%C3%A1rios-Social.jpg)**\n\n- Apresenta a quantidade de menções sociais por data, considerando os posts, comentários e compartilhamentos.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Mencoes%20por%20data2.jpg)**\n\n- Apresenta a quantidade de menções sociais, se referindo a comunidades e usuários.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Mencoes%20por%20tipo.jpg)**\n\n- Apresenta a quantidade de menções sociais por tipo de conteúdo, considerando os posts e comentários.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Mencoes%20por%20tipo%20de%20conteudo.jpg)**\n\n- Apresenta a quantidade de menções sociais dos usuários e comunidades, considerando os posts, comentários e compartilhamentos. Serão mostrados no gráfico valores >= 1.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Mencoes.jpg)**\n\n- Apresenta a quantidade total de menções sociais, considerando os posts, comentários e compartilhamento.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Numero%20de%20Mencoes.jpg)**\n\n- Apresenta a quantidade em porcentagem que cada elemento (conteúdo de Comunidades, Documentos e Post) recebeu de solicitações de notificação (Botão Notificar).\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Conteudos%20que%20notificam%20por%20tipo.jpg)**\n\n- Apresenta a quantidade de solicitações do Notificar que cada elemento (conteúdos de Comunidades, conteúdo de Documentos e Posts) teve por data.\n- Modelo de apresentação do relatório:\n\n![](..\\..\\images\\Conteudos%20que%20notificam%20-%20Evolucao%20de%20utilizacao%20da%20funcionalidade.jpg)\n\n- Apresenta os cinco usuários que mais solicitaram Notificar em conteúdos de Comunidades, Documentos e Posts.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\TOP%205%20-%20Usuarios%20notificados%20por%20conteudo.jpg)**\n\n- Apresenta os cinco conteúdos que tiveram maior quantidade de solicitação de Notificar. Podendo ser eles: conteúdo de Comunidades, Documentos ou Post.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\TOP%205%20-%20Conteudos%20que%20notificam.jpg)**\n\n- Apresenta uma listagem de todas as menções sociais referenciando usuários.\n- Modelo de apresentação do relatório:\n\n![](..\\..\\images\\usuarios%20mencionados.jpg)\n\n- Apresenta a quantidade de posts feitos em comunidades por mês.\n- Modelo de apresentação do relatório:\n\n![](..\\..\\images\\Posts%20Mes.jpg)\n\n# Relatórios de WCM\n\n- Apresenta a quantidade de acessos nas páginas da plataforma por hora. Exemplo: As 10hs houve 1156 acessos nas páginas deste ambiente.\n- Modelo de apresentação do relatório:\n\n![](..\\..\\images\\hits%20por%20hora.jpg)\n\n- Apresenta a quantidade total de acessos nas páginas da plataforma.\n- Modelo de apresentação do relatório:\n\n![](..\\..\\images\\Acessos.jpg)\n\n- Apresenta a quantidade de acessos nas páginas da plataforma TOTVS Fluig por data.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Hits%20por%20data.jpg)**\n\n- Apresenta em porcentagem quais são as páginas mais acessadas no plataforma.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\Paginas%20mais%20acessadas.jpg)**\n\n- Apresenta o número total de páginas da plataforma TOTVS Fluig.\n- Modelo de apresentação do relatório:\n\n**![](..\\..\\images\\paginas.jpg)**\n\n \n\n# Lista Completa de Relatórios\n\n \n\n- Usuários que mais solicitam\n- Volume por Atividade\n- Número de Solicitações\n- TOP Processos\n- Número de Processos\n- TOP Atrasados\n- TOP Tipos de Documentos\n- Espaço Ocupado\n- TOP Mais Acessados\n- Número de Visualizações\n- Número de Documentos\n- TOP – Comunidades\n- Número de Apoios\n- Usuários com mais posts\n- Número de posts\n- TOP Usuários\n- Menções por data\n- Menções por tipo\n- Menções por tipo de conteúdo\n- Menções\n- Número de Menções\n- Conteúdos que notificam por tipo\n- Conteúdos que notificam - Evolução da utilização\n- Top 5 - Usuários notificados por conteúdos\n- Top 5 - Conteúdos que notificam\n- Usuários Mencionados\n- Hits por hora\n- Acessos\n- Hits por data\n- Páginas mais acessadas\n- Número de páginas\n- Posts / Mês" }, { "metadata": { "title": "Utilização de URLs para renderizar dentro da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=127959306", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Utilização de URLs para renderizar dentro da plataforma.md" }, "content": "Utilização de URLs para renderizar dentro da plataforma\n\n\n# Índice\n\n- 1 [Objetivo](#UtilizaçãodeURLspararenderizardentrodaplataforma-Objetivo)\n- 2 [Pré-requisitos](#UtilizaçãodeURLspararenderizardentrodaplataforma-Pré-requisitos)\n- 3 [Utilização de URLs para renderizar](#UtilizaçãodeURLspararenderizardentrodaplataforma-UtilizaçãodeURLspararenderizar)\n - 3.1 [Passo a passo](#UtilizaçãodeURLspararenderizardentrodaplataforma-Passoapasso)\n\n# Objetivo\n\nEsse guia visa apresentar os passos necessários de configuração para que os *dashboards* e os relatórios do Analytics possam ser apresentados em outros ambientes.\n\n# Pré-requisitos\n\n- Conhecimento prévio em determinados pontos, principalmente uma visão geral sobre o TOTVS Fluig Plataforma e o card [Recurso de Analytics](../Recurso de Analytics.md)\n\n# Utilização de URLs para renderizar\n\nOs *dashboards* e relatórios do Analytics disponibilizam URLs para que as informações disponíveis nestas páginas também possam ser exibidos, de forma fácil e segura, em outros ambientes.\n\nPara obter essas URLs, acesse o Analytics – [analytics.fluig.com](https://analytics.fluig.com/) – escolha o relatório ou *dashboard* desejado e acione a opção “*Embed*”. Basta copiar a URL gerada e utilizar, por exemplo, em um documento externo da plataforma TOTVS Fluig.\n\n## Passo a passo" }, { "metadata": { "title": "Utilização de URLs para renderizar dentro da plataforma", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=127959306", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Utilização de URLs para renderizar dentro da plataforma.md" }, "content": "Utilização de URLs para renderizar dentro da plataforma\n\n\n- No *dashboard* desejado, selecione o ícone de uma engrenagem no canto superior direito, conforme ilustrado na imagem abaixo, e escolha a opção “*Embed*”.\n\n![](..\\..\\images\\embed_dashboard.png)\n\n**Figura 1 - Acesso à opção \"*Embed*\" de um dashboard.**\n\n- Ao clicar na opção “*Embed*” uma nova janela será aberta com a URL que deve ser utilizada para renderizar em outros ambientes os dashboards e/ou relatórios do Analytics. Observe a seta na imagem abaixo.\n\n![](..\\..\\images\\uri.png)\n\n**Figura 2 - Link em destaque para utilização na plataforma TOTVS Fluig**\n\n- Se o *dashboard* conter painéis (abas) e desejar que a URL direcione para a página de um painel específico, basta fazer da seguinte forma:\n\n- Copie a URL do *dashboard* conforme descrito acima;\n\n![](..\\..\\images\\Image%204.jpg)\n\n**Figura 3 - Tela do Embed de um dashboard**\n\n- - Abra uma página em seu navegador e cole a URL copiada. Será apresentado o *dashboard* completo com todos os painéis, conforme imagem abaixo:\n\n![](..\\..\\images\\Image%205.jpg)\n\n**Figura 4 - Exemplo de página contendo o Embed de um dashboard**\n\n- - Clique no painel desejado e copie a URL.\n\n![](..\\..\\images\\Image%206.jpg)\n\n**Figura 5 - Exemplo de seleção de URL de um painel do dashboard**\n\n- - Pronto. Agora você pode utilizar a URL do Painel específico. No momento em que a URL for acessada, será aberto o Painel selecionado.\n\nObservação\n\nIndependente do painel selecionado para acesso inicial, todos os demais painéis também estarão disponíveis para acesso, pois fazem parte do *dashboard* o qual foi gerado o Embed. Caso deseje restringir permissões de acesso é recomendado criar um *dashboard* específico para apresentação das informações.\n\n- A opção “*Embed*” também está disponível em relatórios específicos, conforme imagem abaixo.\n\n![](..\\..\\images\\embed_report.png)\n\n**Figura 6 - Acesso à opção \"*Embed*\" de um relatório específico**\n\nPara aplicar a URL obtida no Analytics em uma página da plataforma, utilize o [widget Analytics](http://tdn.totvs.com/x/IPxbDQ) disponibilizado na plataforma. Este widget suporta a [autenticação via TOTVS Identity](https://tdn.totvs.com/pages/viewpage.action?pageId=286207374), recomendada para habilitar a permissão de acesso do usuário logado ao Analytics." }, { "metadata": { "title": "Vídeos How to Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271648355", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Vídeos How to Analytics.md" }, "content": "Vídeos How to Analytics" }, { "metadata": { "title": "Vídeos How to Analytics", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=271648355", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Vídeos How to Analytics.md" }, "content": "Vídeos How to Analytics\n\n\nNo portal do conhecimento existe uma página exclusiva com vídeos How to sobre utilização do Analytics.\n\n**Deseja conferir?**\n\nAcesse os links a seguir e confira assista:\n\n# [Conhecendo e utilizando o Analytics](http://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+fluig+Analytics)\n\n1. [Analytics #01: Como integrar o Analytics com a plataforma](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#01:ComointegraroAnalyticscomoTOTVSFluigPlataforma)\n2. [Analytics #02: Como configurar o aplicativo do Analytics no Identity](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#02:ComoconfiguraroaplicativodoAnalyticsnoTOTVSIdentity)\n3. [Analytics #03: Como realizar a importação de dados históricos da plataforma para o Analytics](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#03:Comorealizaraimporta%C3%A7%C3%A3odedadoshist%C3%B3ricosdaplataformaparaoAnalytics)\n4. [Analytics #04: Como enviar dados de um formulário para o Analytics](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#04:Comoenviardadosdeumformul%C3%A1rioparaoAnalytics)\n5. [Analytics #05: Como configurar o envio de dados de um formulário de processo pelo editor web](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#05:Comoconfiguraroenviodedadosdeumformul%C3%A1riodeprocessopeloeditorweb)\n6. [Analytics #06: Como importar dados de formulário entre diferentes versões do processo](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#06:Comoimportardadosdeformul%C3%A1rioentrediferentesvers%C3%B5esdoprocesso)\n7. [Analytics #07: Como criar métricas com dados enviados por padrão ao Analytics](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#07:Comocriarm%C3%A9tricascomdadosenviadosporpadr%C3%A3oaoAnalytics)\n8. [Analytics #08: Como criar métricas customizadas com dados de formulário](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#08:Comocriarm%C3%A9tricascustomizadascomdadosdeformul%C3%A1rio)\n9. [Analytics #09: Como criar um relatório com dados enviados por padrão no Analytics](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#09:Comocriarumrelat%C3%B3riocomdadosenviadosporpadr%C3%A3onoAnalytics)\n10. [Analytics #10: Como criar um relatório com dados customizados no Analytics](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#10:Comocriarumrelat%C3%B3riocomdadoscustomizadosnoAnalytics)\n11. [Analytics #11: Como editar um relatório do Analytics](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#11:Comoeditarumrelat%C3%B3riodoAnalytics)\n12. [Analytics #12: Como editar um relatório customizado do Analytics](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#12:Comoeditarumrelat%C3%B3riocustomizadodoAnalytics)\n13. [Analytics #13: Como configurar os valores a serem apresentados no relatório](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#13:Comoconfigurarosvaloresaseremapresentadosnorelat%C3%B3rio)\n14. [Analytics #14: Como formatar a exibição numérica de relatórios](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#14:Comoformataraexibi%C3%A7%C3%A3onum%C3%A9ricaderelat%C3%B3rios)\n15. [Analytics #15: Como filtrar uma parte do relatório por uma métrica (Drill In)](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#15:Comofiltrarumapartedorelat%C3%B3rioporumam%C3%A9trica(DrillIn))\n16. [Analytics #16: Criar um relatório que redireciona para outro a partir dos dados selecionados](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#16:Criarumrelat%C3%B3rioqueredirecionaparaoutroapartirdosdadosselecionados)\n17. [Analytics #17: Como criar e editar um dashboard no Analytics](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#17:ComocriareeditarumdashboardnoAnalytics)\n18. [Analytics #18: Como configurar a widget ‘Analytics’ na plataforma com um relatório do Analytics](https://tdn.totvs.com/display/AF/Conhecendo+e+utilizando+o+Analytics#ConhecendoeutilizandooAnalytics-Analytics#18:Comoconfigurarawidget%E2%80%98Analytics%E2%80%99naplataformaTOTVSFluigcomumrelat%C3%B3riodoAnalytics)" }, { "metadata": { "title": "Dados para Relatórios", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107941778", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Criação de Relatórios no Analytics\\Dados para Relatórios.md" }, "content": "Dados para Relatórios\n\n\n# Índice\n\n- 1 [Visão Geral](#DadosparaRelatórios-VisãoGeral)\n- 2 [Pré-requisitos](#DadosparaRelatórios-Pré-requisitos)\n- 3 [BPM - Processos](#DadosparaRelatórios-BPM-Processos)\n - 3.1 [Dataset: solicitacao](#DadosparaRelatórios-Dataset:solicitacao)\n - 3.2 [Dataset: solicitacaoEmAtraso](#DadosparaRelatórios-Dataset:solicitacaoEmAtraso)\n- 4 [ECM - Documentos](#DadosparaRelatórios-ECM-Documentos)\n - 4.1 [Dataset: documento](#DadosparaRelatórios-Dataset:documento)\n- 5 [WCM - Portais - Hit de página](#DadosparaRelatórios-WCM-Portais-Hitdepágina)\n - 5.1 [Dataset: pageHit](#DadosparaRelatórios-Dataset:pageHit)\n- 6 [Social](#DadosparaRelatórios-Social)\n - 6.1 [Dataset: Events](#DadosparaRelatórios-Dataset:Events)\n - 6.2 [Dataset: Author](#DadosparaRelatórios-Dataset:Author)\n - 6.3 [Dataset: Place](#DadosparaRelatórios-Dataset:Place)\n - 6.4 [Dataset: WatchContent](#DadosparaRelatórios-Dataset:WatchContent)\n\n# Visão Geral\n\nNo *Analytics* apenas dados do TOTVS Fluig Plataforma são enviados para análise. Dentro dele são criados *Datasets* que se referem a conjuntos de dados enviados para geração de relatórios.\n\n# Pré-requisitos\n\nConhecer como é feita a criação de um relatório no Analytics e como consultar os datasets, conforme apresentado [neste link](../Criação de Relatórios no Analytics.md). \n\n# BPM - Processos\n\nAcompanhe a seguir as informações de Processo para geração dos relatórios.\n\n## Dataset: solicitacao" }, { "metadata": { "title": "Dados para Relatórios", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107941778", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Criação de Relatórios no Analytics\\Dados para Relatórios.md" }, "content": "Dados para Relatórios\n\n\n**Objetivo:** possuir dados das solicitações já abertas.\n\n| Campo | Tipo | Descrição | Exemplos de valores |\n| --- | --- | --- | --- |\n| solicitacaoId | Chave | Código da solicitação | 1001 4003 5851 |\n| solicitacaoVersaoProcesso | Atributo | Versão do processo que está executando | 1 2 3 |\n| solicitacaoIdProcesso | Atributo | Código do processo | vendas viagens |\n| solicitacaoDescricaoProcesso | Atributo | Descrição completa do processo | Solicitação de Viagens Pedido de Venda |\n| solicitacaoIdSolicitante | Atributo | Código (matricula) do usuário que solicitou o processo | nome.sobrenome |\n| solicitacaoNomeSolicitante | Atributo | Nome completo do solicitante | Nome Sobrnome |\n| solicitacaoIdResponsavel | Atributo | Código do usuário (ou identificador do pool) que é o responsável atual da atividade | nome.sobrenome papel |\n| solicitacaoNomeResponsavel | Atributo | Nome completo do usuário ou descrição do papel/grupo | Nome Sobrnome Grupo RH |\n| solicitacaoStatus | Atributo | Situação da solicitação | Aberto Fechado Cancelado |\n| solicitacaoIdAtividade | Atributo | Código da atividade | 3 6 8 |\n| solicitacaoNomeAtividade | Atributo | Descrição completa da atividade | Aprovação de Pedido |\n| solicitacaoCustom0 solicitacaoCustom1 solicitacaoCustom2  ... solicitacaoCustom29 | Atributo | 30 campos customizado para ser preenchido via evento para servir como atributos | |\n| solicitacaoFact0 solicitacaoFact1 solicitacaoFact2 ... solicitacaoFact9 | Fato | 10 campos customizado para ser preenchido via evento para servir como fatos | 2.00 3.55 11.58 22.62 |\n| createDate | Data | Data de criação da solicitação | 2013-10-10 |\n| updateDate | Data | Data da ultima movimentação da solicitação | 2013-10-10 |\n\n## Dataset: solicitacaoEmAtraso" }, { "metadata": { "title": "Dados para Relatórios", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107941778", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Criação de Relatórios no Analytics\\Dados para Relatórios.md" }, "content": "Dados para Relatórios\n\n\n**Objetivo:** possuir uma referência a solicitações com tarefas em atraso.\n\n**Observação**:  Para que esse dataset seja populado é necessário cadastrar a notificação de Tarefas Atrasadas na tela Painel de Controle/Agendador de Tarefas.\n\n| Campo | Tipo | Descrição | Exemplos de valores |\n| --- | --- | --- | --- |\n| solicitacaoId | Chave | Relaciona o dataset solicitacaoEmAtraso com o Dataset de solicitação | 1001 4003 5851 |\n| solicitacaoEmAtrasoPrazo | Data | Data de expiração da tarefa | 10/10/2010 |\n| solicitacaoEmAtrasoHora | Fato | Hora de expiração da tarefa. | 1  10  22 |\n\n# ECM - Documentos\n\nAcompanhe a seguir as informações de Documentos para geração dos relatórios.\n\n## Dataset: documento" }, { "metadata": { "title": "Dados para Relatórios", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107941778", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Criação de Relatórios no Analytics\\Dados para Relatórios.md" }, "content": "Dados para Relatórios\n\n\n**Objetivo:** possuir dados de visualização de documentos\n\n| Campo | Tipo | Descrição | Exemplos de valores |\n| --- | --- | --- | --- |\n| documentoId | Chave | Chave do documento composta pelo código e a versão | 8558\\_1000 8558\\_2000 82517\\_1000 |\n| documentoCodigo | Atributo | Código do documento | 8558 82517 |\n| documentoVersao | Atributo | Versão do documento | 1000 2000 |\n| documentoDescricao | Atributo | Descrição principal | Norma da Qualidade Melhores práticas de projetos Caso 229 - Cliente ACME |\n| documentoIdPublicador | Atributo | Código do usuário (matricula) que publicou o documento | nome.sobrenome |\n| documentoNomePublicador | Atributo | Nome completo do usuário que publicou o documento | Nome Sobrenome |\n| documentoIdAutor | Atributo | Código do usuário que elaborou o documento | nome.sobrenome |\n| documentoNomeAutor | Atributo | Nome completo do usuário que elaborou o documento | Nome Sobrenome |\n| documentoTipo | Atributo | Descrição do tipo de documento | Documento Pasta Formulário |\n| documentoAssunto | Atributo | Descrição do assunto | Padrão |\n| documentoIdPai | Atributo | Código da pasta/Formulário | 8871 |\n| documentoDescricaoPai | Atributo | Descrição da pasta/formulário | |\n| documentoExtensao | Atributo | Extensão do arquivo principal | PDF DOCX |\n| documentoDownload | Atributo | Informação se o download é permitido | true false |\n| documentoQtAcessos | Fato | Quantidade de acessos ao documento | 1 53 |\n| documentoTamanho | Fato | Tamanho em bytes dos arquivos | 1024 6370187 |\n| createDate | Data | Data de criação do documento | 2013-10-10 |\n| updateDate | Data | Data da ultima alteração | 2013-10-10 |\n\nImportante!\n\nDocumentos armazenados nas pastas particulares (Meus Documentos) **não são sincronizados** com o Analytics, pois estes diretórios são de uso e visualização exclusivas do usuário autenticado.\n\n# WCM - Portais - Hit de página\n\nAcompanhe a seguir as informações de Hit de página para geração dos relatórios." }, { "metadata": { "title": "Dados para Relatórios", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107941778", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Criação de Relatórios no Analytics\\Dados para Relatórios.md" }, "content": "Dados para Relatórios\n\n## Dataset: pageHit\n\n**Objetivo:** possuir informações sobre os acessos as páginas.\n\n| Campo | Tipo | Descrição | Exemplos de valores |\n| --- | --- | --- | --- |\n| pageHitIdHit | Chave | Identificador único do hit | usuario\\_87979879874212111 |\n| pageHitCodPagina | Atributo | Código da página | home cpaineladmin comurh |\n| pageHidDescPagina | Atributo | Descrição da página | Home Painel administração Comunidade RH |\n| pageHitLoginHit | Atributo | Login do usuário | [nome.sobrnome@empresacom](mailto:nome.sobrnome@empresacom) |\n| pageHitHora | Atributo | Hora do acesso | 17 |\n| pageHitMinuto | Atributo | Minuto  do acesso | 30 |\n| pageHitQtHit | Fato | Valor para fixo para calculo | sempre 1 |\n| hitDate | Data | Data do acesso | 10/10/2013 |\n\n# Social\n\nAcompanhe a seguir as informações Sociais para geração dos relatórios.\n\n## Dataset: Events" }, { "metadata": { "title": "Dados para Relatórios", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107941778", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Criação de Relatórios no Analytics\\Dados para Relatórios.md" }, "content": "Dados para Relatórios\n\n\n**Objetivo:** possuir eventos sociais que ocorram dentro da plataforma TOTVS Fluig. Atributo customizado que pode ser populado via API Pública.\n\n| Campo | Tipo | Descrição | Exemplos de valores |\n| --- | --- | --- | --- |\n| eventId | Chave | Código único do evento no formato {eventType}{entityID} | POST5578 COMMENT158936 |\n| eventType | Atributo | Tipo de evento social que ocorreu | LIKE POST COMMENT DENOUNCE  SHARE MENTION |\n| eventSubType | Atributo | Sub tipo de evento social que ocorreu | DEFAULT LIKE\\_POST LIKE\\_COMMENT SHARE\\_POST MENTION\\_SHARE MENTION\\_POST MENTION\\_COMMENT |\n| referenceId | Atributo | Código do evento raiz Ex: se é um comentário, esse código informa o Post que gerou o comentário | 331 21313 32772 |\n| customAttr0 | Atributo | Atributo customizado que pode ser populado via API Publica | |\n| customAttr1 | Atributo | Atributo customizado que pode ser populado via API Publica | |\n| customAttr2 | Atributo | Atributo customizado que pode ser populado via API Publica | |\n| placeId | Atributo | Código da comunidade ou usuário onde foi feita a ação Juntamente com esse campo existe um rótulo \"name\" | 554 -> CIPA 1122 -> Ana maria |\n| gdPost | Fato | Campo para soma | 1 |\n| customFact0 | Fato | Fato customizado que pode ser populado via API Publica | |\n| customFact1 | Fato | Fato customizado que pode ser populado via API Publica | |\n| customFact2 | Fato | Fato customizado que pode ser populado via API Publica | |\n| createDate | Data | Data de criação do evento | 2013-10-10 |\n| authorId | Chave | Código do autor que fez a ação Juntamente com esse campo existe um rótulo \"name\" | 1122 -> Ana Maria 3312 -> João Silva |\n| placeId | Chave | Código da comunidade ou usuário onde foi feita a ação Juntamente com esse campo existe um rótulo \"name\" | 554 -> CIPA 1122 -> Ana maria |\n\n## Dataset: Author" }, { "metadata": { "title": "Dados para Relatórios", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107941778", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Criação de Relatórios no Analytics\\Dados para Relatórios.md" }, "content": "Dados para Relatórios\n\n\n**Objetivo:** possuir dados dos autores de eventos sociais com informações de seu perfil na plataforma TOTVS Fluig\n\n| Campo | Tipo | Descrição | Exemplos de valores |\n| --- | --- | --- | --- |\n| authorId | Chave | Código o autor que fez a ação Juntamente com esse campo existe um rótulo \"name\" | 1122 -> Ana Maria 3312 -> João Silva |\n| removed | Atributo | Informa se o autor está desativado | 0 |\n| participations | Fato | Número de comunidades que o autor participa | 111 |\n| followers | Fato | Número de seguidores do autor | 222 |\n| followings | Fato | Número de usuários que o autor segue | 333 |\n| likes | Fato | Campo não utilizado | |\n| posts | Fato | Campo não utilizado | |\n| moderations | Fato | Campo não utilizado | |\n| images | Fato | Campo não utilizado | |\n| videos | Fato | Campo não utilizado | |\n\n## Dataset: Place\n\n**Objetivo:** possuir dados das comunidade onde foram feitas as ações sociais\n\n| Campo | Tipo | Descrição | Exemplos de valores |\n| --- | --- | --- | --- |\n| placeId | Chave | Código da comunidade ou usuário onde foi feita a ação Juntamente com esse campo existe um rótulo \"name\" | 554 -> CIPA 1122 -> Ana maria |\n| removed | Atributo | Informa se a comunidade está desativado | 0 |\n| placeType | Atributo | Informa se é uma comunidade ou é um usuário | COMMUNITY USER |\n| hidden | Atributo | | false true |\n| privateContent | Atributo | | false true |\n| requireApproval | Atributo | Necessita aprovação | false true |\n| members | Fato | Número de participantes na comunidade | 30 4454 9547 |\n| images | Fato | Campo não utilizado | |\n| videos | Fato | Campo não utilizado | |\n| documents | Fato | Campo não utilizado | |\n| articles | Fato | Campo não utilizado | |\n\n## Dataset: WatchContent" }, { "metadata": { "title": "Dados para Relatórios", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=107941778", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Criação de Relatórios no Analytics\\Dados para Relatórios.md" }, "content": "Dados para Relatórios\n\n\n**Objetivo:** Informações sobre os conteúdos observados pelos usuários\n\n| Campo | Tipo | Descrição | Exemplos de valores |\n| --- | --- | --- | --- |\n| watchId | Chave | Código único do watch | 345 |\n| wc\\_contentType | Atributo | Identifica o tipo de objeto a ser observado | COMMUNITY DOCUMENT POST |\n| wc\\_contentId | Atributo | Id do comunidade, post ou do documento que esta sendo observado | 123 |\n| wc\\_version | Atributo | caso o objeto for um documento traz a versão do documento que esta sendo observada | 1000 |\n| wc\\_parentType | Atributo | Campo não utilizado | |\n| wc\\_parentId | Atributo | caso o objeto for um documento  traz o id da pasta ou do formulário onde o documento esta publicado | 1 |\n| wc\\_removed | Atributo | Campo não utilizado | |\n| wc\\_fact | Fato | Fixo 1 | 1 |\n| placeId | Chave | Código da comunidade, post ou documento onde foi feita a ação Juntamente com esse campo existe um rótulo \"name\" | 554 -> CIPA 1122 -> Ana maria |\n| authorId | Chave | Código do autor que fez a ação Juntamente com esse campo existe um rótulo \"name\" | 1122 -> Ana Maria 3312 -> João Silva |\n| createDate | Data | Data de criação | 2016-10-10 |" }, { "metadata": { "title": "Enviando dados e fatos do formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126717934", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Importação de dados históricos\\Enviando dados e fatos do formulário.md" }, "content": "Enviando dados e fatos do formulário" }, { "metadata": { "title": "Enviando dados e fatos do formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126717934", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Importação de dados históricos\\Enviando dados e fatos do formulário.md" }, "content": "Enviando dados e fatos do formulário\n\n\n# Índice\n\n- 1 [Objetivo](#Enviandodadosefatosdoformulário-Objetivo)\n- 2 [Pré-requisitos](#Enviandodadosefatosdoformulário-Pré-requisitos)\n- 3 [Preparando a importação de dados de formulários de processos](#Enviandodadosefatosdoformulário-Preparandoaimportaçãodedadosdeformuláriosdeprocessos)\n - 3.1 [Importando dados de formulário entre diferentes versões do processo](#Enviandodadosefatosdoformulário-Importandodadosdeformulárioentrediferentesversõesdoprocesso)\n- 4 [Importando fatos de formulário](#Enviandodadosefatosdoformulário-Importandofatosdeformulário)\n - 4.1 [Importando fatos de formulário entre diferentes versões do processo](#Enviandodadosefatosdoformulário-Importandofatosdeformulárioentrediferentesversõesdoprocesso)\n\n# Objetivo\n\nEsse guia visa apresentar os passos necessários de configuração para que dados e fatos de **formulários de processos** sejam enviados para o Analytics.\n\nAtenção\n\nOs números de acessos (hits) de registros de formulários não são enviados ao analytics.\n\n# Pré-requisitos\n\n- Conhecimento prévio em determinados pontos, principalmente uma visão geral sobre o TOTVS Fluig Plataforma e o card [Recurso de Analytics](../../Recurso de Analytics.md)\n- Para configurar é necessário o código do processo e os campos do formulário que serão enviados.\n\nAtenção\n\nO Analytics permite o envio de até 10 campos customizados para cada solicitação workflow.\n\n# Preparando a importação de dados de formulários de processos\n\n1. Na pasta onde está o *analytics-import.jar* crie o diretório \"conf\"\n2. Crie o arquivo descritor (formato txt) com o código do processo dentro da pasta \"conf\" \n Ex.: RH.txt\n3. Edite o arquivo descritor e inclua os campos desejados (conforme o atributo *name* do formulário) que deverão ser enviados ao Analytics\n\nExemplo:\n\n**Formulário do processo workflow**\n\n```\n\n\n
\n\n\n
\n\n\n```\n\n**Exemplo Arquivo Descritor - RH.txt**\n\n```\nNomeParticipante\nCPFParticipande\n```\n\nNeste exemplo, os dados enviados ao Analytics estarão disponíveis nos campos *solicitacaoCustom0* e *solicitacaoCustom1*." }, { "metadata": { "title": "Enviando dados e fatos do formulário", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126717934", "path": "\\Plataforma Documentação técnica\\Recurso de Analytics\\Importação de dados históricos\\Enviando dados e fatos do formulário.md" }, "content": "Enviando dados e fatos do formulário\n\n### Importando dados de formulário entre diferentes versões do processo\n\nCaso versões diferentes do processo possuam campos diferentes do formulário, é possível criar arquivos descritores específicos para cada versão do processo.\n\nPara isso inclua um underline \"\\_\" e a versão ao nome do arquivo descritor (.txt).\n\nEx.: RH\\_2.txt\n\nDessa forma serão mapeados somente os campos do processo \"RH\" na versão 2.\n\n# Importando fatos de formulário\n\nPara a importação de fatos de formulário ao Analytics, é necessário seguir os passos abaixo.\n\n1. Na pasta onde está armazenado o *analytics-import.jar* crie um diretório chamado \"conf\"\n2. Crie o arquivo descritor no formato .fac dentro da pasta conf e use o código do processo como nome \n Ex.: RH.fac\n3. Edite o arquivo descritor e na primeira linha informe: \n 1. o formato número do fato a ser enviado\n 2. o caractere separador decimal\n 3. o caractere separador de milhar\n4. Informe nas demais linhas do arquivo descritor os campos a serem enviados como fatos.\n\nExemplo:\n\n**Exemplo Arquivo Descritor - RH.fac**\n\n```\n#.## , .\nNomeParticipante\nCPFParticipande\n```\n\n### Importando fatos de formulário entre diferentes versões do processo\n\nCaso versões diferentes do processo possuam fatos diferentes do formulário, é possível criar arquivos descritores específicos para cada versão do processo.\n\nPara isso inclua um underline \"\\_\" e a versão ao nome do arquivo descritor (.fac).\n\nEx.: RH\\_2.fac\n\nDessa forma serão mapeados somente os fatos do processo \"RH\" na versão 2." }, { "metadata": { "title": "Componentes de Publicação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=150635531", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Componentes de Publicação.md" }, "content": "Componentes de Publicação" }, { "metadata": { "title": "Componentes de Publicação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=150635531", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Componentes de Publicação.md" }, "content": "Componentes de Publicação\n\n\n# Índice\n\n- 1 [Social Poster - Componente de Publicação](#ComponentesdePublicação-SocialPoster-ComponentedePublicação)\n- 2 [Bind de elementos HTML a funções](#ComponentesdePublicação-BinddeelementosHTMLafunções)\n - 2.1 [Exemplo de um bind da função salvar em um botão](#ComponentesdePublicação-Exemplodeumbinddafunçãosalvaremumbotão)\n- 3 [Funções do componente](#ComponentesdePublicação-Funçõesdocomponente)\n - 3.1 [loadSocialPoster(alias)](#ComponentesdePublicação-loadSocialPoster(alias))\n - 3.2 [getDocumentEnabled(alias, cb)](#ComponentesdePublicação-getDocumentEnabled(alias,cb))\n - 3.3 [findSocialVOByAlias(alias, cb)](#ComponentesdePublicação-findSocialVOByAlias(alias,cb))\n - 3.4 [getSocialUserLogged(cb)](#ComponentesdePublicação-getSocialUserLogged(cb))\n - 3.5 [isSocialMember(alias, cb)](#ComponentesdePublicação-isSocialMember(alias,cb))\n - 3.6 [serviceSocialVOByAlias(alias, cb)](#ComponentesdePublicação-serviceSocialVOByAlias(alias,cb))\n - 3.7 [serviceSocialUserLogged(cb)](#ComponentesdePublicação-serviceSocialUserLogged(cb))\n - 3.8 [serviceSocialMember(alias, cb)](#ComponentesdePublicação-serviceSocialMember(alias,cb))\n - 3.9 [serviceSocialDocumentEnabled(alias, feature, cb)](#ComponentesdePublicação-serviceSocialDocumentEnabled(alias,feature,cb))\n - 3.10 [serviceCreatePost(options, cb)](#ComponentesdePublicação-serviceCreatePost(options,cb))\n - 3.11 [baseAjax(url, options, cb)](#ComponentesdePublicação-baseAjax(url,options,cb))\n - 3.12 [preventXSS(str)](#ComponentesdePublicação-preventXSS(str))\n - 3.13 [mentions()](#ComponentesdePublicação-mentions())\n - 3.14 [resetMentions()](#ComponentesdePublicação-resetMentions())\n - 3.15 [shareTextFocus(el, ev)](#ComponentesdePublicação-shareTextFocus(el,ev))\n - 3.16 [closePostShare(el, ev)](#ComponentesdePublicação-closePostShare(el,ev))\n - 3.17 [shareTextBlur(el, ev)](#ComponentesdePublicação-shareTextBlur(el,ev))\n - 3.18 [shareTextInput()](#ComponentesdePublicação-shareTextInput())\n - 3.19 [shareTextKeyUp(el, ev)](#ComponentesdePublicação-shareTextKeyUp(el,ev))\n - 3.20 [placeholderIE()](#ComponentesdePublicação-placeholderIE())\n - 3.21 [resetCountText()](#ComponentesdePublicação-resetCountText())\n - 3.22 [postFormSubmit(el, ev)](#ComponentesdePublicação-postFormSubmit(el,ev))\n - 3.23 [resetPostContent(el)](#ComponentesdePublicação-resetPostContent(el))\n - 3.24 [postCreate()](#ComponentesdePublicação-postCreate())\n - 3.25 [selectImageOpen()](#ComponentesdePublicação-selectImageOpen())\n - 3.26 [selectImageDone(event, data)](#ComponentesdePublicação-selectImageDone(event,data))\n - 3.27 [thumbURL(documentId, version)](#ComponentesdePublicação-thumbURL(documentId,version))\n - 3.28 [selectVideoOpen()](#ComponentesdePublicação-selectVideoOpen())\n - 3.29 [selectVideoDone(event, data)](#ComponentesdePublicação-selectVideoDone(event,data))\n - 3.30 [selectDocumentOpen()](#ComponentesdePublicação-selectDocumentOpen())\n - 3.31 [selectDocumentDone(event, object)](#ComponentesdePublicação-selectDocumentDone(event,object))\n - 3.32 [removeAttachedMedia(el, ev)](#ComponentesdePublicação-removeAttachedMedia(el,ev))\n - 3.33 [attachMedia(el, ev)](#ComponentesdePublicação-attachMedia(el,ev))\n - 3.34 [attachType(el)](#ComponentesdePublicação-attachType(el))" }, { "metadata": { "title": "Componentes de Publicação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=150635531", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Componentes de Publicação.md" }, "content": "Componentes de Publicação\n\n### Social Poster - Componente de Publicação\n\nA Social Poster é um componente de publicação que possibilita a criação de um post, no qual é possível anexar uma imagem, vídeo ou um documento.\n\nBem como todos os componentes da camada social do TOTVS Fluig Plataforma, a Timeline utiliza o facilitador SuperWidget na camada de Javascript. Para saber mais sobre o funcionamento, consulte o manual [Super Widget](https://tdn.totvs.com/pages/viewpage.action?pageId=111181988)\n\n### Bind de elementos HTML a funções\n\nPara associar um evento a um elemento HTML, é preciso seguir o formato abaixo.\n\nO componente HTML deve possuir um atributo **data-** o qual receberá o bind de funções da widget.\n\n#### Exemplo de um bind da função salvar em um botão\n\n**No HTML**\n\n```\n\n```\n\n**No arquivo .js da widget**\n\n```\nbindings: {\n local: {\n 'salvar-dados': ['click_salvarDados']\n }\n },\n\n//implementação da função salvar\nsalvarDados: function(el, ev) {\n //escreva a ação do botão salvar-dados aqui\n}, ...\n```\n\nA função atribuída a um elemento HTML possui 2 parâmetros:\n\n- **el:** Representa o próprio botão. No caso do exemplo: \n- **ev:** representa o objeto do evento disparado\n\nNote que não é necessário adicionar o prefixo **data-**.\n\nO array atribuído é uma string no padrão EVENTO\\_FUNÇÃO.\n\nVárias combinações de evento x função podem ser atribuídos a um único elemento.\n\nOs bindings feitos no objeto local são referentes a elementos HTML dentro do div da widget. E os binds feitos no objeto global são para elementos fora do div da widget, ou retirados do div da widget por outro script, como é o caso das modais do jQueryUI.\n\n### Funções do componente" }, { "metadata": { "title": "Componentes de Publicação", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=150635531", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Componentes de Publicação.md" }, "content": "Componentes de Publicação\n\n\nSegue abaixo o detalhamento das funções da Social Poster:\n\n| Função | Descrição |\n| --- | --- |\n| **loadSocialPoster(alias)** | Esta função centraliza todos os serviços necessários para o carregamento da página, monta um objeto 'view' que é renderizado via Mustache. Mustache é uma especificação de templates que não utiliza lógica, ou seja, não possui declarações com if, for, while etc, toda sua construção é baseada em tags. |\n| **getDocumentEnabled(alias, cb)** | Função para verificar se a pasta para cada tipo de recurso está habilitada. Realiza uma chamada REST e recupera os dados da comunidade que são passados para uma \"callback\". Os tipos verificados são: DOCUMENT, GALLERY\\_PHOTO e GALLERY\\_VIDEO. |\n| **findSocialVOByAlias(alias, cb)** | Retorna um objeto 'social' de acordo com o alias. Realiza uma chamada REST e recupera os dados \"social\" que são passados para uma \"callback\". Pode ser um usuário ou uma comunidade. |\n| **getSocialUserLogged(cb)** | Retorna o usuário logado. Realiza uma chamada REST e recupera os dados do usuário logado que são passados para uma \"callback\". |\n| **isSocialMember(alias, cb)** | Retorna um objeto com informação se o usuário é membro da comunidade. Realiza uma chamada REST e recupera informação se o usuárioé membro da comunidade e é passado para uma \"callback\". |\n| **isSocialDocumentEnabled(alias, feature, cb)** | Retorna objeto com informação se um recurso está habilitado. Realiza uma chamada REST e recupera os dados do recurso de acordo com o 'feature' e é passado para uma \"callback\". Os tipos de 'feature' são: DOCUMENT, GALLERY\\_PHOTO e GALLERY\\_VIDEO. |\n| serviceSocialVOByAlias(alias, cb) | Realiza uma chamada REST (API Publica) e recupera os dados sociais. |\n| serviceSocialUserLogged(cb) | Realiza uma chamada REST (API Publica) e recupera os dados do usuário logado. |\n| serviceSocialMember(alias, cb) | Realiza uma chamada REST (API Publica) e recupera os dados que retornam informação se um usuário é membro de uma comunidade. |\n| serviceSocialDocumentEnabled(alias, feature, cb) | Realiza uma chamada REST (API Publica) e recupera os dados de pastas de uma comunidade. |\n| serviceCreatePost(options, cb) | Realiza uma chamada REST (API Publica) que envia dados para criação de um post. |\n| baseAjax(url, options, cb) | Facilitador de uso do ajax |\n| preventXSS(str) | Função que utiliza uma expressão regular que sobrescreve sinais de 'maior' e 'menor'. |\n| mentions() | Função que aplica plugin 'mentionsInput' utilizado para 'menção' de usuários ou comunidades. |\n| resetMentions() | Função que 'limpa' plugin 'mentionsInput'. |\n| shareTextFocus(el, ev) | Ação do elemento data-post-share-text. Realiza tratamento quando área de post recebe foco. |\n| closePostShare(el, ev) | Ação do elemento data-close-post-share Realiza tratamento ao fechar área de post. |\n| shareTextBlur(el, ev) | Ação do elemento data-post-share-text. Realiza tratamento quando área de post recebe foco. |\n| shareTextInput() | Ação do elemento data-post-share-text. Realiza tratamento quando área de post recebe foco. |\n| shareTextKeyUp(el, ev) | Ação do elemento data-post-share-text. Realiza tratamento quando área de post recebe foco. |\n| placeholderIE() | Realiza tratamento para criação de 'placeholder' para o navegador internet explorer. |\n| resetCountText() | Realiza verificação da quantidade de caracteres digitadas no campo de post. |\n| postFormSubmit(el, ev) | Ação do elemento data-post-share-form. Realiza a recuperação dos dados do post para criá-lo. |\n| resetPostContent(el) | Ação que faz limpeza de todos os dados informados para criação do post. |\n| postCreate() | Associa funções a eventos relacionados a recursos que podem ser incluídos no post. (Documentos, fotos e vídeos) |\n| selectImageOpen() | Função que permite selecionar uma imagem de uma galeria. |\n| selectImageDone(event, data) | Ação disparada pelo evento \"selectImageEvent\", que notifica a socialposter para adicionar imagem selecionada no campo de post. |\n| thumbURL(documentId, version) | Função que faz a montagem do endereço de requisição de um documento de acordo com seu 'Id' e 'versão'. |\n| selectVideoOpen() | Função que permite selecionar um vídeo de uma galeria. |\n| selectVideoDone(event, data) | Ação disparada pelo evento \"selectVideoEvent\", que notifica a socialposter para adicionar vídeo selecionado no campo de post. |\n| selectDocumentOpen() | Função que permite selecionar um documento da comunidade, do repositório e permite ainda que um documento seja enviado. |\n| selectDocumentDone(event, object) | Ação disparada pelo evento \"selectDocumentEvent\", que notifica a socialposter para adicionar documento selecionado no campo de post. |\n| removeAttachedMedia(el, ev) | Ação que faz tratamento para remoção de um recurso que foi adicionado. |\n| attachMedia(el, ev) | Ação do elemento data-attach-media, responsável por identificar o tipo de anexo. |\n| attachType(el) | Função que verifica tipo de anexo e delega para função específica para o tratamento necessário. |" }, { "metadata": { "title": "Criando notificações personalizadas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126715128", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas.md" }, "content": "Criando notificações personalizadas" }, { "metadata": { "title": "Criando notificações personalizadas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126715128", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas.md" }, "content": "Criando notificações personalizadas\n\n\n# Índice\n\n- 1 [Objetivo](#Criandonotificaçõespersonalizadas-Objetivo)\n- 2 [Projeto de exemplo](#Criandonotificaçõespersonalizadas-Projetodeexemplo)\n- 3 [Entendendo os conceitos para criação de notificações personalizadas](#Criandonotificaçõespersonalizadas-Entendendoosconceitosparacriaçãodenotificaçõespersonalizadas)\n - 3.1 [Módulos de Notificações](#Criandonotificaçõespersonalizadas-MódulosdeNotificações)\n - 3.2 [Eventos de Notificações](#Criandonotificaçõespersonalizadas-EventosdeNotificações)\n - 3.3 [Atributos de Eventos de Notificações](#Criandonotificaçõespersonalizadas-AtributosdeEventosdeNotificações)\n - 3.4 [Notificações](#Criandonotificaçõespersonalizadas-Notificações)\n - 3.5 [Ações de Notificações](#Criandonotificaçõespersonalizadas-AçõesdeNotificações)\n- 4 [Utilizando a API de Notificações para criar eventos customizados](#Criandonotificaçõespersonalizadas-UtilizandoaAPIdeNotificaçõesparacriareventoscustomizados)\n - 4.1 [Cadastrando módulos de Notificações](#Criandonotificaçõespersonalizadas-CadastrandomódulosdeNotificações)\n - 4.2 [Cadastrando eventos de Notificações](#Criandonotificaçõespersonalizadas-CadastrandoeventosdeNotificações)\n - 4.3 [Enviando Notificações](#Criandonotificaçõespersonalizadas-EnviandoNotificações)\n - 4.4 [Desabilitando eventos de Notificações](#Criandonotificaçõespersonalizadas-DesabilitandoeventosdeNotificações)\n\n# Objetivo\n\n---\n\nAlém das notificações padrões da plataforma é possível criar novos tipos de notificações personalizadas através da API de Notificações do produto.\n\nÉ possível criar aplicativos, *widgets* etc., que criem e enviem notificações personalizadas, além de fazer este processo através de aplicações externas, utilizando a API Pública da plataforma Fluig.\n\nEste tutorial tem o objetivo de mostrar passo a passo como criar um aplicativo que cria uma notificação customizada e envia para os usuários da empresa (*tenant*). Para fazer este mesmo processo através da API Pública da plataforma Fluig, consulte a documentação [clicando aqui](http://api.fluig.com). As notificações enviadas pelo aplicativo são exibidas tanto na *web*, como nos dispositivos móveis.\n\nFique atento\n\nAs notificações da plataforma possuem uma limitação de **até 600** caracteres.\n\n# Projeto de exemplo\n\n---\n\nPara facilitar o entendimento e desenvolvimento deste tutorial, foi gerado um projeto de exemplo. Neste projeto, foi implementado um aplicativo que cria uma notificação customizada, simulando um aviso do RH Online: \"Seu holerite já está disponível\".\n\nLembrando que este projeto é apenas um exemplo, não tendo sido implementada nenhuma integração real com o sistema RH Online.\n\nPara testar o projeto, realizar os seguintes passos:\n\n- Para fazer o *download* da pasta, acesse a página do **[git.fluig.com](https://git.fluig.com/projects/SAMPLES)** clicando no repositório **[Componentes](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse)**, no arquivo **[notifications](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse/notifications)** utilize o exemplo \"**[alert-creator-sample](https://git.fluig.com/projects/SAMPLES/repos/componentes/browse/notifications/alert-creator-sample)**\".\n\n- Após obter o projeto, é necessário fazer a compilação.\n\n- O projeto utiliza o padrão [Maven](http://maven.apache.org/), portanto para compilar execute \"*mvn clean install*\" na raiz do projeto.\n\n- Serão gerados os componentes alert-creator-sample-server.ear e holeritweb.rar.\n\n- Para fazer o *deploy* dos componentes gerados, pare o serviço do Fluig e copie ambos os arquivos na pasta [Instalação do fluig]/appserver/apps. Em seguida, inicie novamente o fluig.\n\n- A partir de agora, o sistema deverá gerar um novo tipo de alerta. É possível verificar que o evento foi criado corretamente através da tela de [configuração de notificações](http://tdn.totvs.com/x/MIL5DQ).\n\n- Será apresentado um novo agrupamento, chamado **Notificações do RH**, com um novo tipo de notificação, conforme imagem a seguir:\n\n![](..\\..\\images\\config_notifica%C3%A7%C3%A3o_1.6.png)\n\n- Após a instalação do componente, o sistema enviará de 2 em 2 minutos uma notificação *fake* informando o usuário que o holerit está disponível no RH Online, conforme a imagem a seguir:\n\n![](..\\..\\images\\alerta_1.6.png)\n\nÉ recomendada a leitura de todo este material, mesmo que o desenvolvedor utilize o projeto de exemplo como base. Este tutorial apresenta conceitos importantes para trabalhar corretamente com notificações dentro do TOTVS Fluig Plataforma.\n\n# Entendendo os conceitos para criação de notificações personalizadas\n\n---" }, { "metadata": { "title": "Criando notificações personalizadas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126715128", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas.md" }, "content": "Criando notificações personalizadas\n\n### Módulos de Notificações\n\nOs módulos de notificação são apenas agrupadores, para que as notificações semelhantes se apresentem agrupadas para o usuário.\n\nOs módulos padrão do TOTVS Fuig Plataforma são:\n\n**Colaboração:** notificações de apoiar, comentar, etc.\n\n**Documentos:** notificações de indicação de leitura, atualização de versão, etc.\n\n**Processos:** notificações de movimentação de processo, tarefas atrasadas, etc.\n\n**Portal:** notificações de alteração no *layout* de páginas, etc.\n\nÉ possível criar novos módulos de notificações. No projeto exemplo, é criado um novo módulo chamado \"Notificações de RH\".\n\n### Eventos de Notificações\n\nAntes de criar notificações personalizadas, é importante que fique claro o conceito de \"Eventos de Notificações\". Um evento é uma representação de alguma ação que pode gerar notificações na platafdorma Fluig. O evento contém todas as configurações das notificações.\n\nPor exemplo, o evento de notificação \"LIKE\" possui o formato padrão de todas as notificações do tipo:\n\n- Fulano curtiu o post\n- Olha que post bacana...\n\nAtravés do evento o usuário pode configurar o recebimento de notificações. Por exemplo: é possível configurar o recebimento das notificações do tipo \"SHARE\" por *e-mail*, as notificações do tipo \"LIKE\" apenas pela Central de Notificações da plataforma Fluig, e não receber nenhuma notificação do tipo \"FOLLOW\\_REQUEST\\_ACCEPTED\".\n\nPara configurar este recebimento, o usuário deve acessar a tela de [configurações de notificações](http://tdn.totvs.com/x/iPTuDQ):\n\n![](..\\..\\images\\config_notifica%C3%A7%C3%A3o_user_1.6.png)\n\nPara criar notificações personalizadas, é necessário criar novos eventos de notificações. No projeto exemplo, é criado um novo evento chamado \"Holerit disponível no RH online\".\n\n### Atributos de Eventos de Notificações" }, { "metadata": { "title": "Criando notificações personalizadas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126715128", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas.md" }, "content": "Criando notificações personalizadas\n\n\nComo dito anteriormente, um evento contém as configurações das notificações. Estas configurações são:\n\n- **Requerido:**Indica se o usuário pode deixar de receber as notificações relacionadas ao evento. Se o evento for requerido, o usuário deverá obrigatoriamente receber as notificações referentes a ele. Um exemplo de notificação obrigatória é a solicitação de participação em uma comunidade. Obrigatoriamente o moderador da comunidade deve receber todos os pedidos de participação.\n\n- **Agrupado:** Indica se as notificações daquele evento são agrupadas por objeto. Caso a notificação seja agrupada, o sistema irá exibir assim: \"Fulano, Beltrano, Ciclano e mais 5 pessoas apoiaram o post 'Post do Fulano de Tal...'\". Caso a notificação não seja agrupada, o sistema gerará uma notificação nova para cada vez que uma ação for gerada sobre um objeto. Observação: Notificações agrupadas não podem ter ações associadas.\n\n- **Pode ser removido:** Indica se a notificação pode ser removida pelo usuário. Caso não possa, o sistema não deixará o usuário remover a notificação, até que seja executada alguma das ações disponibilizadas.\n\n- **Remove após executar uma ação:** Se configurada desta forma, após realizar alguma ação, o sistema excluirá automaticamente a notificação. Caso contrário, o sistema exibirá a notificação com uma mensagem informando a ação já executada. Por exemplo: \"Fulano quer seguir você. (Você já aceitou esta requisição)\". O sistema então permitirá que o usuário remova aquela notificação.\n\n- **Apenas para administradores:** Indica se aquele tipo de notificação é exclusivo para administradores da empresa (*tenant*).\n\n### Notificações" }, { "metadata": { "title": "Criando notificações personalizadas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126715128", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas.md" }, "content": "Criando notificações personalizadas\n\n\nAs notificações devem ser criadas obrigatoriamente com um evento associado. Desta forma a [Central de Notificações](http://tdn.totvs.com/x/OPDuDQ) poderá fazer o gerenciamento de criação, envio e exibição da notificação. As notificações criadas contém alguns objetos associados, que são:\n\n- **Usuários que enviaram a notificação:** Uma notificação pode ter nenhum, um ou vários usuários que enviaram a notificação. Na criação da notificação pode ser informado nenhum ou um usuário que está enviando. Caso a notificação seja agrupada, a Central de Notificações fará o agrupamento automaticamente.\n\n- **Objeto associado:** Uma notificação pode ter ou não um objeto associado. O objeto pode ser um post, um documento, ou qualquer objeto existente dentro ou fora do sistema. Na criação da notificação pode ser informado ou não um objeto associado.\n\n- **Lugar onde foi gerada:** Uma notificação pode conter ou não a informação de onde ela foi gerada. Um lugar pode ser uma comunidade, um processo, ou qualquer lugar existente dentro ou fora do sistema. Na criação da notificação pode ser informado ou não um lugar associado.\n\n- **Ações:** São as ações disponibilizadas por uma notificação. Confira a seguir uma documentação detalhada.\n\n- **Metadados:** São dados do tipo chave-valor que podem ser associados à notificação. Eles podem ser utilizados por aplicativos customizados de envio de notificações.\n\n### Ações de Notificações" }, { "metadata": { "title": "Criando notificações personalizadas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126715128", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas.md" }, "content": "Criando notificações personalizadas\n\n\nUma notificação pode disponibilizar uma ou mais ações. Estas ações são informadas no momento da criação da notificação. As ações são individuais por notificação, não sendo associadas ao evento relacionado à ela. As ações possuem os seguintes atributos:\n\n- **Tipo de integração:** Indica o tipo de integração que será utilizado para executar aquela ação. Atualmente a plataforma Fluig suporta três tipos de integrações: \n 1. **JMS:** Ao executar aquela ação o sistema irá disparar uma mensagem JMS com os dados da ação. A mensagem JMS disparada é do tipo \"EXECUTE\\_ALERT\\_ACTION\\_EVENT\". Cabe ao desenvolvedor implementar uma rotina que se conecte ao tópico \"TOTVSTechIntegrationListenerTopic\", ouça estas mensagens e execute efetivamente as ações.\n 2. **HTTP:** Ao executar aquela ação, o sistema fará uma chamada HTTP a uma URL cadastrada no momento da criação da notificação. Os métodos HTTP suportados atualmente são GET e POST. Cabe ao desenvolvedor disponibilizar um serviço que responda naquela URL e execute efetivamente a ação.\n 3. **NONE:** Ao executar aquela ação o sistema a marcará como executada, mas não realizará nenhuma ação.\n\n- **Tipo:** Existem atualmente dois tipos de ações: \n 1. **MAIN:** É a ação principal. O sistema exibirá na Central de Notificações esta ação como ação de destaque.\n 2. **DEFAULT:** É uma ação padrão. O sistema exibirá como ação comum, sem destaque.\n\n# Utilizando a API de Notificações para criar eventos customizados\n\n---\n\nExistem duas formas de utilização da API de Notificações do TOTVS Fluig Plataforma: através do módulo interno do Fluig \"foundation-alert-api\" e através da [API Pública](http://api.fluig.com). Este tutorial contém um exemplo utilizando o módulo \"foundation-alert-api\". Para mais informações sobre a API Pública, [clique aqui](http://api.fluig.com).\n\nPara criação de um aplicativo interno à plataforma Fluig que utilize a API de Notificações, é necessário criar um projeto Java (padrão Maven) e adicionar o seguinte trecho de código no arquivo \"pom.xml\":\n\n```\n\n com.fluig\n foundation-alert-api \n 1.2.0\n compile\n\n```" }, { "metadata": { "title": "Criando notificações personalizadas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126715128", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas.md" }, "content": "Criando notificações personalizadas\n\n### Cadastrando módulos de Notificações\n\nPara criação de um novo módulo de notificações, é necessário realizar uma chamada ao método **registerModule**, da interface **com.totvs.technology.foundation.alert.service.AlertModuleService**. Um exemplo de chamada deste método segue abaixo:\n\n```\n@Singleton(mappedName = \"MyModuleRegister\", name = \"MyModuleRegister\")\npublic class ModuleRegister {\n\n\t@EJB(lookup = AlertModuleService.JNDI_REMOTE_NAME)\n\tprivate AlertModuleService alertModuleService;\n\n\n\tpublic void registerModule() {\n\t\t\n\t\t/*\n\t\t * Cria um novo módulo de notificações. Os módulos padrão do Fluig são:\n\t\t * 1. DOCUMENT\n\t\t * 2. PROCESSES\n\t\t * 3. PORTAL\n\t\t * 4. COLABORATION\n\t\t * \n\t\t * Caso o novo evento de notificações se encaixe em um destes módulos, \n\t\t * não é necessário criar um novo.\n\t\t */\n\t\tfinal AlertModuleVO myModule = alertModuleService.registerModule(\n\t\t\t\t\"RH_MODULE\", \"Notificações do RH\", myTenantId);\n\t\t\t\t\n\t}\n}\n```\n\nOs parâmetros para execução do método são:\n\n1. moduleKey: Chave única de identificação do módulo\n2. description: É a descrição do módulo. Pode ser um texto plano ou uma chave para tradução. Para que a tradução funcione, a chave deve estar previamente cadastrada no serviço I18n, no bundle \"foundation\\_alert\".\n3. tenantId: Id do tenant para qual o módulo está sendo criado.\n\n### Cadastrando eventos de Notificações" }, { "metadata": { "title": "Criando notificações personalizadas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126715128", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas.md" }, "content": "Criando notificações personalizadas\n\n\nPara criação de um novo evento de notificações, é necessário realizar uma chamada ao método \"createEvent\", da interface \"com.totvs.technology.foundation.alert.service.AlertEventService\". Um exemplo de chamada deste método segue abaixo:\n\n```\n@Singleton(mappedName = \"MyEventRegister\", name = \"MyEventRegister\")\npublic class EventRegister {\n\t\n\t@EJB(lookup = AlertEventService.JNDI_REMOTE_NAME)\n\tprivate AlertEventService alertEventService;\n\t\n\n\tpublic void registerEvent() {\n\t\t\t\t\n\t\talertEventService.createEvent(\n\t\t\t\t\"MY_EVENT\",\n\t\t\t\tBoolean.FALSE,\n\t\t\t\t\"Meu evento customizado\",\n\t\t\t\t\"criou\",\n\t\t\t\t\"criaram\",\n\t\t\t\t\"/myapp/myimg.jpg\",\n\t\t\t\tmyModule.getId(),\n\t\t\t\tBoolean.TRUE,\n\t\t\t\tBoolean.TRUE,\n\t\t\t\tBoolean.FALSE,\n\t\t\t\tBoolean.FALSE,\n\t\t\t\ttenantId);\n\t\t\n\t}\n}\n```\n\nOs parâmetros para execução do método são:\n\n1. **eventKey -** String única que representa o evento no Fluig.\n2. **required -** Indica se o evento é requerido. Caso seja, o usuário não conseguirá configurar para não receber notificações do evento.\n3. **descriptionKey -** Descrição do evento. Pode ser um texto plano ou uma chave para obter descrição traduzida no I18n. Caso queira utilizar a tradução, a chave deve estar previamente cadastrada no I18n, no *bundle* \"foundation\\_alert\".\n4. **singleDescriptionKey -** Descrição da ação feita por um usuário. Pode ser um texto plano ou uma chave para obter descrição traduzida no I18n. Caso queira utilizar a tradução, a chave deve estar previamente cadastrada no I18n, no *bundle* \"foundation\\_alert\".\n5. **groupDescriptionKey -** Descrição da ação feita por por vários usuários. Pode ser um texto plano ou uma chave para obter a descrição traduzida no I18n. Caso queira utilizar a tradução, a chave deve estar previamente cadastrada no I18n, no *bundle* \"foundation\\_alert\".\n6. **eventIcon -** Ícone que representa o evento (opcional). Este ícone será exibido pelo sistema em notificações que não tenham um usuário que a enviou. Caso tenha um usuário \"enviador\", o sistema exibirá a foto deste usuário. Caso haja mais de um usuário \"enviador\", o sistema mostrará a foto do último usuário que enviou a notificação.\n7. **moduleId -** Módulo ao qual pertence este evento\n8. **grouped -** Indica se a notificação pode ser agrupada por ação e objeto.\n9. **canRemove -** Indica se a notificação pode ser removida.\n10. **removeAfterExecAction -** Indica se a notificação é removida após ser executada uma ação.\n11. **onlyAdmin -** Indica se o evento é válido somente para usuários administradores.\n12. **tenantId -** Empresa *(tenant*) para a qual o evento está sendo cadastrado." }, { "metadata": { "title": "Criando notificações personalizadas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126715128", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas.md" }, "content": "Criando notificações personalizadas\n\n### Enviando Notificações\n\nPara enviar uma notificação é necessário realizar uma chamada ao método \"sendNotification\", da interface \"com.totvs.technology.foundation.alert.service.AlertService\". Um exemplo de chamada deste método segue abaixo:\n\n```\n@Stateless(name = \"AlertCreator\", mappedName = \"AlertCreator\")\npublic class AlertCreator {\n\t\n\t@EJB(lookup = AlertService.JNDI_REMOTE_NAME)\n\tprivate AlertService alertService;\n\t\n\tpublic void sendHoleritAlert() {\n\t\t\n\t\talertService.sendNotification(\"MY_EVENT\", loginUserThatSendsTheNotification, loginUserThatIsGoingToReceiveTheNotification, objectAttached, placeWhereTheEventOccurs, actions, metadata);\n\t\t\t\t\n\t}\n}\n```\n\nOs parâmetros para execução do método são:\n\n1. **eventKey -** Chave do evento cadastrado para envio de notificações.\n2. **loginSender -** login do usuário que envia a notificação. (opcional)\n3. **loginReceiver -** login do usuário que irá receber a notificação.\n4. **object -** objeto associado à notificação (opcional) - implementação padrão para a interface \"AlertObject\" é a classe \"com.totvs.technology.foundation.alert.GenericAlertObject\", da API de Notificações do Fluig.\n5. **place -** lugar onde a notificação foi gerada (opcional) - objeto e lugar são tratados com a mesma estrutura de dados - implementação padrão para a interface \"AlertObject\" é a classe \"com.totvs.technology.foundation.alert.GenericAlertObject\", da API de Notificações do Fluig.\n6. **actions -** ações disponibilizadas pela notificação (opcional) -  implementação padrão para a interface \"AlertAction\" é a classe \"com.totvs.technology.foundation.alert.GenericAlertAction\", da API de Notificações do Fluig.\n7. **metadata -** metadados da notificação (opcional).\n\n### Desabilitando eventos de Notificações" }, { "metadata": { "title": "Criando notificações personalizadas", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126715128", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas.md" }, "content": "Criando notificações personalizadas\n\n\nÉ possível desabilitar qualquer evento de notificações. Atualmente este serviço está disponível na [API Pública](http://api.fluig.com) da plataforma Fluig. Uma vez desabilitado, o sistema não gerará mais nenhuma notificação para aquele tipo de evento, e também não o exibirá mais na tela de configurações.\n\nAtenção\n\nObrigatoriamente o valor informado deve ser um formulário. Outros tipos de documentos não serão tratados e ocorrerá erro na execução do evento." }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\n- 1 [Conhecendo e utilizando eventos sociais](#EventosSociais-Conhecendoeutilizandoeventossociais)\n- 2 [Eventos](#EventosSociais-Eventos)\n - 2.1 [beforeSocialShare](#EventosSociais-beforeSocialShare)\n - 2.2 [afterSocialShare](#EventosSociais-afterSocialShare)\n - 2.3 [beforeSocialComment](#EventosSociais-beforeSocialComment)\n - 2.4 [afterSocialComment](#EventosSociais-afterSocialComment)\n - 2.5 [beforeSocialPost](#EventosSociais-beforeSocialPost)\n - 2.6 [afterSocialPost](#EventosSociais-afterSocialPost)\n - 2.7 [beforeSocialPostRemove](#EventosSociais-beforeSocialPostRemove)\n - 2.8 [afterSocialPostRemove](#EventosSociais-afterSocialPostRemove)\n - 2.9 [beforeSocialDenounce](#EventosSociais-beforeSocialDenounce)\n - 2.10 [afterSocialDenounce](#EventosSociais-afterSocialDenounce)\n - 2.11 [beforeSocialLike](#EventosSociais-beforeSocialLike)\n - 2.12 [afterSocialLike](#EventosSociais-afterSocialLike)\n - 2.13 [beforeSocialUnlike](#EventosSociais-beforeSocialUnlike)\n - 2.14 [afterSocialUnlike](#EventosSociais-afterSocialUnlike)\n - 2.15 [beforeSocialCommentRemove](#EventosSociais-beforeSocialCommentRemove)\n - 2.16 [afterSocialCommentRemove](#EventosSociais-afterSocialCommentRemove)\n - 2.17 [beforeSocialCommentEdit](#EventosSociais-beforeSocialCommentEdit)\n - 2.18 [afterSocialCommentEdit](#EventosSociais-afterSocialCommentEdit)\n - 2.19 [beforeSocialPostEdit](#EventosSociais-beforeSocialPostEdit)\n - 2.20 [afterSocialPostEdit](#EventosSociais-afterSocialPostEdit)\n - 2.21 [beforeCommunityParticipation](#EventosSociais-beforeCommunityParticipation)\n - 2.22 [afterCommunityParticipation](#EventosSociais-afterCommunityParticipation)\n - 2.23 [beforeCommunityLeave](#EventosSociais-beforeCommunityLeave)\n - 2.24 [afterCommunityLeave](#EventosSociais-afterCommunityLeave)\n - 2.25 [beforeSocialFollow](#EventosSociais-beforeSocialFollow)\n - 2.26 [afterSocialFollow](#EventosSociais-afterSocialFollow)\n - 2.27 [beforeSocialUnfollow](#EventosSociais-beforeSocialUnfollow)\n - 2.28 [afterSocialUnfollow](#EventosSociais-afterSocialUnfollow)\n - 2.29 [beforeSocialPictureChange](#EventosSociais-beforeSocialPictureChange)\n - 2.30 [afterSocialPictureChange](#EventosSociais-afterSocialPictureChange)" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n## Conhecendo e utilizando eventos sociais\n\n---\n\nVeja a seguir o vídeo *How to* demonstrando a utilização de eventos sociais.\n\n## Eventos\n\n---\n\n### beforeSocialShare\n\nEste evento é disparado sempre antes da efetivação do compartilhamento de um objeto social.\n\nObservação\n\nPode-se alterar a mensagem de compartilhamento passando uma String para o método setText( ) do objeto \"share\".\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialShare(companyId, share){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| share | objeto de socialização | [SocialShareEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialShareEventVO) |\n\n****Exemplo de Implementação****\n\n```\nfunction beforeSocialShare(companyId, share){\n \n var lastUpd = share.getSociable().getLastUpdateDate().getTime();\n log.info(\"lastUpd: \" + lastUpd);\n var daysAgo = new Date();\n daysAgo.setDate(daysAgo.getDate()-3);\n log.info(\"daysAgo: \" + daysAgo);\n \n if (lastUpd < oneMonthAgo) {\n throw \"You could not share old socials (more than 3 days old)\";\n }\n}\n```\n\n### afterSocialShare\n\nEsse evento é disparado sempre após a efetivação de um compartilhamento.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialShare(companyId, share){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| share | objeto de socialização | [SocialShareEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialShareEventVO) |\n\n****Exemplo de Implementação****\n\n```\nfunction afterSocialShare(companyId, share){\n log.info(share.getUser() + \" has shared the sociable \" + share.getSociable().getId() + \" with text \" + share.getText());\n}\n```\n\n### beforeSocialComment" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nEsse evento é disparado sempre antes da efetivação de um comentário.\n\nObservação\n\nPode-se alterar a mensagem de compartilhamento passando uma String para o método setText( ) do objeto \"comment\".\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialComment(companyId, comment){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| comment | objeto de comentário | [SocialCommentEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialCommentEventVO) |\n\n****Exemplo de Implementação****\n\n```\nfunction beforeSocialComment(companyId, comment){\n if (comment.getSociable().getNumberLikes() < 1) {\n throw \"You can not comment a post that was not liked.\";\n }\n}\n```\n\n### afterSocialComment\n\nEsse evento é disparado sempre após a efetivação de um comentário.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialComment(companyId, comment){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| comment | objeto de comentário | [SocialCommentEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialCommentEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialComment(companyId, comment){\n log.info(comment.getUser() + \" has done the comment \" + comment.getText());\n}\n```\n\n### beforeSocialPost" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nEsse evento é disparado sempre antes da efetivação de um post.\n\nObservação\n\nPode-se alterar o conteúdo da publicação passando uma String para o método setText( ) do objeto \"post\".\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialPost(companyId, post){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| post | Objeto que representa a publicação | [SocialPostEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialPostEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialPost(companyId, post){\n \n if(post.getText().indexOf(\" fluid \") > -1) {\n post.setText(post.getText().replace( \" fluid \", \" fluig \"));\n }\n \n var sociables = post.getSociables();\n\tfor (var i = 0; i < sociables.size(); i++) {\n\t var sociable = sociables.get(i);\n\t\tlog.info(\"sociable id: \" + sociable.getId());\n\t}\n}\n```\n\n### afterSocialPost\n\nEsse evento é disparado sempre após a efetivação de um comentário.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialPost(companyId, post){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| post | objeto de post | [SocialPostEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialPostEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialPost(companyId, post){\n if (post.getText().toLowerCase().indexOf(\"#minhacampanha\") > -1) {\n log.info(post.getUser() + \" has published a content.\");\n }\n}\n```\n\n### beforeSocialPostRemove" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nEsse evento é disparado sempre antes da efetivação de uma remoção de um post.\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialPostRemove(companyId, post){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| post | objeto de post | [SocialPostEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialPostEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialPostRemove(companyId, post){\n if (post.getText().toLowerCase().indexOf(\"#important\") > -1) {\n throw \"You cannot remove a post marked as important.\";\n }\n}\n```\n\n### afterSocialPostRemove\n\nEsse evento é disparado sempre após a efetivação de uma remoção de um post.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialPostRemove(companyId, post){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| post | objeto de post | [SocialPostEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialPostEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialPostRemove(companyId, post){\n log.info(post.getUser() + \" has removed the post \" + post.getPostId());\n}\n```\n\n### beforeSocialDenounce" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nO evento é disparado quando um *Sociable* é denunciado porém antes que a ação seja efetivada.\n\n**Exemplo de uso:**\n\n- Em uma comunidade em que as publicações não podem ser denunciadas pode-se utilizar este evento para bloquear a ação de denúncia.\n- Pode-se limitar a quantidade de denúncias que um usuário pode efetuar por dia para evitar que alguma pessoa mal intencionada denuncie todas as publicações.\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialDenounce(companyId, denounce){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ```denounce ``` | objeto de post | [SocialDenounceEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialDenounceEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialDenounce(companyId, denounce){\n if (denounce.getSociable().getText().toLowerCase().indexOf(\"#cipa\") > -1) {\n throw \"You cannot denounce posts about CIPA.\";\n }\n}\n```\n\n### afterSocialDenounce\n\nO evento é disparado após a efetivação de uma ação de denúncia de um *sociable*.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialDenounce(companyId, denounce){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` denounce ``` | objeto de post | [SocialDenounceEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialDenounceEventVO) |\n\n**Exemplo Prático:**\n\nRegistrar em log as denúncias efetuadas para auditoria.\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialDenounce(companyId, denounce){\n log.info(denounce.getUser() + \" has denounced the sociable \" + denounce.getSociable().getId() + \" with comment \" + denounce.getText());\n}\n```\n\n### beforeSocialLike" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nO evento é disparado antes de ser efetivada uma ação de \"curtir\" de um *sociable*.\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialLike(companyId, like){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` like ``` | Objeto com dados do sociable curtido | [SocialLikeEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialLikeEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialLike(companyId, like){\n if (like.getSociable().getText().toLowerCase().indexOf(\"#greve\") > -1) {\n throw \"You can not like a post that has this type of comment.\";\n }\n}\n```\n\n### afterSocialLike\n\nO evento é disparado após a efetivação de uma ação de \"curtir\" de um *sociable*.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialLike(companyId, like){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` like ``` | Objeto com dados do sociable curtido | [SocialLikeEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialLikeEventVO) |\n\n**Exemplo Prático:**\n\nRegistrar em log para auditoria todas as publicações curtidas.\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialLike(companyId, like){\n log.info(like.getUser() + \" has liked the \" + like.getSociable().getUrl());\n}\n```\n\n### beforeSocialUnlike" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nO evento é disparado antes de ser efetivada uma ação de \"descurtir\" de um *sociable*.\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialUnlike(companyId, unlike){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` unlike ``` | Objeto com dados do sociable descurtido | [SocialLikeEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialLikeEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialUnlike(companyId, unlike){\n throw \"You can not unlike a post.\";\n}\n```\n\n### afterSocialUnlike\n\nO evento é disparado após a efetivação de uma ação de \"descurtir\" de um *sociable*.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialUnlike(companyId, unlike){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` unlike ``` | Objeto com dados do sociable descurtido | [SocialLikeEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialLikeEventVO) |\n\n**Exemplo Prático:**\n\nRegistrar em log para auditoria todas as publicações que deixaram de ser apoiadas.\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialUnlike(companyId, unlike){\n log.info(unlike.getUser() + \" has unliked the \" + unlike.getSociable().getUrl());\n}\n```\n\n### beforeSocialCommentRemove" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nO evento é disparado antes da efetivação da remoção de um comentário de um *sociable*.\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialCommentRemove(companyId, comment){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` comment ``` | Objeto que contém as informações do comentário | [SocialCommentEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialCommentEventVO) |\n\n**Exemplo Prático:**\n\nEvitar que usuários removam seus comentários em uma publicação de campanha interna da empresa.\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialCommentRemove(companyId, comment){\n if (comment.getSociable().getText().toLowerCase().indexOf(\"#bolao\") > -1) {\n throw \"You cannot change your guess.\";\n }\n}\n```\n\n### afterSocialCommentRemove\n\nO evento é disparado após a efetivação da ação de remover o comentário de um *sociable*.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialCommentRemove(companyId, comment){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` comment ``` | Objeto que contém as informações do comentário | [SocialCommentEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialCommentEventVO) |\n\n**Exemplo Prático:**\n\nRegistrar em log para auditoria todos os comentários com a hashtag \"protesto\".\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialCommentRemove(companyId, comment){\n if (comment.getText().toLowerCase().indexOf(\"#protesto\") > -1) {\n log.info(comment.getUser() + \" has removed the comment \" + comment.getText() + \" of the sociable \" + comment.getSociable().getId());\n }\n}\n```\n\n### beforeSocialCommentEdit" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nEsse evento é disparado sempre antes da edição de um comentário.\n\n**Estrutura do Evento**\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialCommentEdit(companyId, comment){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` comment ``` | Objeto que contém as informações do comentário | [SocialCommentEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialCommentEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialCommentEdit(companyId, comment){\n comment.setText(comment.getText() + \" \\n --- Conteúdo editado ---\");\n}\n```\n\n### afterSocialCommentEdit\n\nEsse evento é disparado sempre após a edição de um comentário.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialCommentEdit(companyId, comment){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` comment ``` | Objeto que contém as informações do comentário | [SocialCommentEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialCommentEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialCommentEdit(companyId, comment){\n System.out.println(comment.getUser() + \" editou o conteúdo do post: \" + comment.getCommentId());\n}\n```\n\n### beforeSocialPostEdit" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nEsse evento é disparado sempre antes da edição de um post.\n\n**Estrutura do Evento**\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialPostEdit(companyId, post){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| post | objeto de post | [SocialPostEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=271182916) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialPostEdit(companyId, post){\n post.setText(post.getText() + \" \\n --- Conteúdo editado ---\");\n}\n```\n\n### afterSocialPostEdit\n\nEsse evento é disparado sempre após a edição de um post.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialPostEdit(companyId, post){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| post | objeto de post | [SocialPostEventVO](https://tdn.totvs.com/pages/viewpage.action?pageId=271182916) |\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialPostEdit(companyId, post){\n log.info(post.getUser() + \" editou o conteúdo do post: \" + post.getPostId());\n}\n```\n\n### beforeCommunityParticipation" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nO evento é disparado antes da efetivação da participação em uma comunidade.\n\n**Estrutura do Evento**\n\n```\nfunction beforeCommunityParticipation(companyId, relation){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` relation ``` | Objeto que contém as informações de participação | [SocialCommunityRelationEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialCommunityRelationEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeCommunityParticipation(companyId, relation){\n if (relation.getCommunity().getAlias() == \"economia\") {\n throw \"Comunidade temporariamente indisponível!\";\n }\n log.info(\"beforeCommunityParticipation Social Alias: \" + relation.getSocial().getAlias() + \" Community Alias: \" + relation.getCommunity().getAlias());\n}\n```\n\n### afterCommunityParticipation\n\nO evento é disparado após a efetivação da participação em uma comunidade.\n\n**Estrutura do Evento**\n\n```\nfunction afterCommunityParticipation(companyId, relation){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` relation ``` | Objeto que contém as informações de participação | [SocialCommunityRelationEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialCommunityRelationEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction afterCommunityParticipation(companyId, relation){\n log.info(\"afterCommunityParticipation Social Alias: \" + relation.getSocial().getAlias() + \" Community Alias: \" + relation.getCommunity().getAlias());\n}\n```\n\n### beforeCommunityLeave" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nO evento é disparado antes da efetivação da exclusão de participação em uma comunidade.\n\n```\nfunction beforeCommunityLeave(companyId, relation){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` relation ``` | Objeto que contém as informações de participação | [SocialCommunityRelationEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialCommunityRelationEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeCommunityLeave(companyId, relation){\n if (relation.getCommunity().getAlias() == \"eventos\") {\n throw \"Não é permitido deixar essa comunidade\";\n }\n log.info(\"beforeCommunityLeave Social Alias: \" + relation.getSocial().getAlias() + \" Community Alias: \" + relation.getCommunity().getAlias());\n}\n```\n\n### afterCommunityLeave\n\nO evento é disparado após a efetivação da exclusão de participação em uma comunidade.\n\n**Estrutura do Evento**\n\n```\nfunction afterCommunityLeave(companyId, relation){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` relation ``` | Objeto que contém as informações de participação | [SocialCommunityRelationEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialCommunityRelationEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction afterCommunityLeave(companyId, relation){\n log.info(\"afterCommunityLeave Social Alias: \" + relation.getSocial().getAlias() + \" Community Alias: \" + relation.getCommunity().getAlias());\n}\n```\n\n### beforeSocialFollow" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nO evento é disparado antes da efetivação de seguir uma pessoa.\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialFollow(companyId, follow){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` follow ``` | Objeto que contém as informações de seguir | [SocialFollowEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialFollowEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialFollow(companyId, follow){\n log.info(\"beforeSocialFollow Social Alias: \" + follow.getSocial().getAlias() + \" Followed Alias: \" + follow.getFollowed().getAlias());\n}\n```\n\n### afterSocialFollow\n\nO evento é disparado após a efetivação de seguir uma pessoa.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialFollow(companyId, follow){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` follow ``` | Objeto que contém as informações de seguir | [SocialFollowEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialFollowEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialFollow(companyId, follow){\n log.info(\"afterSocialFollow Social Alias: \" + follow.getSocial().getAlias() + \" Followed Alias: \" + follow.getFollowed().getAlias());\n}\n```\n\n### beforeSocialUnfollow" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nO evento é disparado antes da efetivação de deixar de seguir uma pessoa.\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialUnfollow(companyId, follow){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` follow ``` | Objeto que contém as informações de seguir | [SocialFollowEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialFollowEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialUnfollow(companyId, follow){\n log.info(\"beforeSocialUnfollow Social Alias: \" + follow.getSocial().getAlias() + \" Followed Alias: \" + follow.getFollowed().getAlias());\n}\n```\n\n### afterSocialUnfollow\n\nO evento é disparado após a efetivação de deixar de seguir uma pessoa.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialUnfollow(companyId, follow){\n \n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` follow ``` | Objeto que contém as informações de seguir | [SocialFollowEventVO](http://tdn.totvs.com/display/public/fluig/Desenvolvimento%20de%20Eventos?null#DesenvolvimentodeEventos-SocialFollowEventVO) |\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialUnfollow(companyId, follow){\n log.info(\"afterSocialUnfollow Social Alias: \" + follow.getSocial().getAlias() + \" Followed Alias: \" + follow.getFollowed().getAlias());\n}\n```\n\n### beforeSocialPictureChange" }, { "metadata": { "title": "Eventos Sociais", "source": "https://tdn.totvs.com/display/fluig/Eventos+Sociais", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Eventos Sociais.md" }, "content": "Eventos Sociais\n\n\nO evento é disparado antes da imagem de um usuário/comunidade ser alterada.\n\n**Estrutura do Evento**\n\n```\nfunction beforeSocialPictureChange(companyId, vo){\n\n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` vo ``` | Objeto contendo os dados da imagem a ser alterada | [SocialPictureEventVO](../Desenvolvimento sobre a plataforma/Desenvolvimento de Eventos.md) |\n\n**Exemplo de Implementação**\n\n```\nfunction beforeSocialPictureChange(companyId, vo){\n\tlog.info(vo.getAlias());\n\tlog.info(vo.getPath());\n\tlog.info(vo.getPictureName());\n\tlog.info(vo.getWidth());\n\tlog.info(vo.getHeight());\n}\n```\n\n### afterSocialPictureChange\n\nO evento é disparado após a efetivação da troca de imagem do perfil de um usuário/comunidade.\n\n**Estrutura do Evento**\n\n```\nfunction afterSocialPictureChange(companyId, vo){\n\n}\n```\n\n**Parâmetros da função**\n\n| Propriedade | Descrição | Tipo |\n| --- | --- | --- |\n| companyId | Código da Empresa | int |\n| ``` vo ``` | Objeto contendo os dados da imagem a ser alterada | [SocialPictureEventVO](../Desenvolvimento sobre a plataforma/Desenvolvimento de Eventos.md) |\n\n**Exemplo de Implementação**\n\n```\nfunction afterSocialPictureChange(companyId, vo){\n log.info(\"afterSocialPictureChange: \" + vo.getPath()+vo.getPictureName());\n}\n```" }, { "metadata": { "title": "Timeline", "source": "https://tdn.totvs.com/display/fluig/Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline.md" }, "content": "Timeline" }, { "metadata": { "title": "Timeline", "source": "https://tdn.totvs.com/display/fluig/Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline.md" }, "content": "Timeline\n\n\n# Índice\n\n- 1 [Bind de elementos HTML a funções](#Timeline-BinddeelementosHTMLafunções)\n - 1.1 [Exemplo de um bind da função salvar em um botão](#Timeline-Exemplodeumbinddafunçãosalvaremumbotão)\n- 2 [Internacionalização de literais](#Timeline-Internacionalizaçãodeliterais)\n - 2.1 [Exemplo de internacionalização de literais da widget](#Timeline-Exemplodeinternacionalizaçãodeliteraisdawidget)\n- 3 [Métodos do componente](#Timeline-Métodosdocomponente)\n - 3.1 [showTimeline()](#Timeline-showTimeline())\n - 3.2 [listPosts()](#Timeline-listPosts())\n - 3.3 [findPost(postId, isNew)](#Timeline-findPost(postId,isNew))\n - 3.4 [showPosts(posts, isNew)](#Timeline-showPosts(posts,isNew))\n - 3.5 [showComments(data, $post, isNew)](#Timeline-showComments(data,$post,isNew))\n - 3.6 [showPostedPost(evName, data)](#Timeline-showPostedPost(evName,data))\n - 3.7 [showMorePosts(el, ev)](#Timeline-showMorePosts(el,ev))\n - 3.8 [showMoreComments(el, ev)](#Timeline-showMoreComments(el,ev))\n - 3.9 [showListPostsMessage(err)](#Timeline-showListPostsMessage(err))\n - 3.10 [showMessageError(err)](#Timeline-showMessageError(err))\n - 3.11 [showFeedbackMessage(message, type)](#Timeline-showFeedbackMessage(message,type))\n - 3.12 [showBtnShowMore()](#Timeline-showBtnShowMore())\n - 3.13 [showVideos()](#Timeline-showVideos())\n - 3.14 [showCardPopover()](#Timeline-showCardPopover())\n - 3.15 [instanceTimeInteraction()](#Timeline-instanceTimeInteraction())\n - 3.16 [controlBtnShowMore(postsLen)](#Timeline-controlBtnShowMore(postsLen))\n - 3.17 [changeStatusOrderButton($el)](#Timeline-changeStatusOrderButton($el))\n - 3.18 [toogleCommentArea($post)](#Timeline-toogleCommentArea($post))\n - 3.19 [instanceMentions()](#Timeline-instanceMentions())\n - 3.20 [resetMentions(parent)](#Timeline-resetMentions(parent))\n - 3.21 [validateFilesTypes(path, type)](#Timeline-validateFilesTypes(path,type))\n - 3.22 [textComplaintValidate(text)](#Timeline-textComplaintValidate(text))\n - 3.23 [controlInteractionActions($el, interactionType)](#Timeline-controlInteractionActions($el,interactionType))\n - 3.24 [timelineAction(el, ev)](#Timeline-timelineAction(el,ev))\n - 3.25 [openDocumentAction(el, ev)](#Timeline-openDocumentAction(el,ev))\n - 3.26 [orderAction(el, ev)](#Timeline-orderAction(el,ev))\n - 3.27 [searchAction(el, ev)](#Timeline-searchAction(el,ev))\n - 3.28 [denounceAction(el, ev, id)](#Timeline-denounceAction(el,ev,id))\n - 3.29 [supportAction(el, ev, id)](#Timeline-supportAction(el,ev,id))\n - 3.30 [watchAction(el, ev, id)](#Timeline-watchAction(el,ev,id))\n - 3.31 [listLikesAction(el, ev, id)](#Timeline-listLikesAction(el,ev,id))\n - 3.32 [listWatchersAction(el, ev, id)](#Timeline-listWatchersAction(el,ev,id))\n - 3.33 [commentAction(el, ev, id)](#Timeline-commentAction(el,ev,id))\n - 3.34 [timelineCommentAction(el, ev)](#Timeline-timelineCommentAction(el,ev))\n - 3.35 [removeAction(el, ev, id)](#Timeline-removeAction(el,ev,id))\n - 3.36 [shareAction(el, ev, id)](#Timeline-shareAction(el,ev,id))\n - 3.37 [denounce(el, ev)](#Timeline-denounce(el,ev))\n - 3.38 [generateOrderAction()](#Timeline-generateOrderAction())\n - 3.39 [generatePostHeader(data)](#Timeline-generatePostHeader(data))\n - 3.40 [generateListClass(numberActions)](#Timeline-generateListClass(numberActions))\n - 3.41 [generateTemplateVariableContent(data)](#Timeline-generateTemplateVariableContent(data))\n - 3.42 [generateContentTextFormatted(text, mentions)](#Timeline-generateContentTextFormatted(text,mentions))\n - 3.43 [formatMentions(text, mentions)](#Timeline-formatMentions(text,mentions))\n - 3.44 [formatTags(text)](#Timeline-formatTags(text))\n - 3.45 [formatLink(text)](#Timeline-formatLink(text))\n - 3.46 [formatLineBreak(text)](#Timeline-formatLineBreak(text))\n - 3.47 [serviceComment(id, comment, cb)](#Timeline-serviceComment(id,comment,cb))\n - 3.48 [serviceSupport(id, cb)](#Timeline-serviceSupport(id,cb))\n - 3.49 [serviceWatch(id, isWatched, cb)](#Timeline-serviceWatch(id,isWatched,cb))\n - 3.50 [serviceRemove(id, type, cb)](#Timeline-serviceRemove(id,type,cb))\n - 3.51 [serviceListPosts(cb)](#Timeline-serviceListPosts(cb))\n - 3.52 [serviceFindPost(postId, cb, limit)](#Timeline-serviceFindPost(postId,cb,limit))\n - 3.53 [serviceListComments(postId, offset, cb, limit)](#Timeline-serviceListComments(postId,offset,cb,limit))\n - 3.54 [baseAjax(options, cb)](#Timeline-baseAjax(options,cb))\n\nA Timeline é um feed de posts realizados por usuários que o usuário segue ou comunidades que ele participa. Através dela é possível interagir com os posts, seja comentando-os, curtindo-os ou os compartilhando. Bem como todos os componentes da camada social do Fluig, a Timeline utiliza o facilitador SuperWidget na camada de Javascript. Para saber mais sobre o funcionamento da SuperWidget consulte o manual em .\n\nAtenção\n\nA técnica de extensão da timeline não é homologada para a nova timeline de social lançada em [15 de Dezembro de 2020](https://tdn.totvs.com/x/SGHoI)." }, { "metadata": { "title": "Timeline", "source": "https://tdn.totvs.com/display/fluig/Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline.md" }, "content": "Timeline\n\n### Bind de elementos HTML a funções\n\nPara associar um evento a um elemento HTML, é preciso seguir o formato abaixo. \nO componente HTML deve possuir um atributo **data-** o qual receberá o bind de funções da widget.\n\n#### Exemplo de um bind da função salvar em um botão\n\n**No HTML**\n\n```\n\n```\n\n**No arquivo .js da widget**\n\n```\nbindings: {\n local: {\n 'salvar-dados': ['click_salvarDados']\n }\n },\n\n//implementação da função salvar\nsalvarDados: function(el, ev) {\n //escreva a ação do botão salvar-dados aqui\n}, ...\n```\n\nA função atribuida a um elemento HTML possui 2 parâmetros:\n\n- **el:** Representa o próprio botão. No caso do exemplo: \n- **ev:** representa o objeto do evento disparado\n\nNote que não é necessário adicionar o prefixo **data-**. \nO array atribuido é uma string no padrão EVENTO\\_FUNÇÃO. Várias combinações de evento x função podem ser atribuidos a um único elemento. \nOs bindings feitos no objeto local são referentes a elementos HTML dentro do div da widget. E os binds feitos no objeto global são para elementos fora do div da widget, ou retirados do div da widget por outro script, como é o caso das modais do jQueryUI.\n\n### Internacionalização de literais\n\nPara ficar padronizado, é de boa prática que todas a literais que exigem internacionalização sejam adicionadas em um objeto global para que possam ser reutilizadas posteriormente.\n\n#### Exemplo de internacionalização de literais da widget\n\n**No arquivo .js da widget**\n\n```\ni18n: {\n\t'titles': {\n\t\t'denounce': '${i18n.getTranslation(\"denounce\")}',\n\t\t'publication': '${i18n.getTranslation(\"publication\")}',\n\t\t...\n\t},\n\t'labels': {\n\t\t'version': '${i18n.getTranslation(\"version\")}',\n\t\t'revision': '${i18n.getTranslation(\"revision\")}',\n\t\t...\n\t},\n\t...\n},\n```\n\n### Métodos do componente\n\nSegue abaixo o detalhamento dos métodos da Timeline.\n\n#### showTimeline()" }, { "metadata": { "title": "Timeline", "source": "https://tdn.totvs.com/display/fluig/Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline.md" }, "content": "Timeline\n\n\nEste método é responsável por renderizar e exibir o container principal da timeline na página.\n\n#### listPosts()\n\nEste é um método de controle de listagem de publicação. Ela interage com um outro método \"**serviceListPosts**\" e com o resultado dos registros retornados (VO da publicações), delega o conteúdo retornado para outra função para ser renderizado e exibido na página (listagem de posts).\n\n#### findPost(postId, isNew)\n\nResponsável pelo controle de busca de uma publicação. Ele interage com outro método \"**serviceListFind**\" e com o resultado do registro retornado (VO da publicação), delega o conteúdo retornado para outra função para ser renderizado e exibido na página (listagem de posts).\n\n```\npostId: Number //id da publicação para ser buscada\n```\n\n```\nisNew: Boolean //se uma nova publicação ou uma publicação já existente\n```\n\n#### showPosts(posts, isNew)\n\nResponsável por formatar e exibir as publicações na página. Ele formata o objeto recebido (posts) e envia o mesmo para o Mustache renderizar as publicações e devolver o html pronto para ser exibido.\n\n```\npostId: Object/Array //array com os dados para listar os posts\n```\n\n```\nisNew: Boolean //se uma nova publicação ou não\n```\n\n#### showComments(data, $post, isNew)\n\nResponsável por formatar e exibir os comentários páginados. Ele formata o objeto recebido (data) e envia o mesmo para o Mustache renderizar os comentários e devolver o html pronto para ser exibido.\n\n```\ndata: Object/Array //array com os dados para listar os comentários\n```\n\n```\n$post: Object/Selector jQuery //selector jQuery do post em questão\n```\n\n```\nisNew: Boolean //se é um novo comentário ou não\n```\n\n#### showPostedPost(evName, data)\n\nEste método escuta (*listener*) a criação de uma nova publicação (feita pelo usuário logado) e encaminha a mesma para ser exibida na página.\n\n```\nevName: String //nome do evento disparado\n```\n\n```\ndata: Number //id do post criado\n```\n\n#### showMorePosts(el, ev)" }, { "metadata": { "title": "Timeline", "source": "https://tdn.totvs.com/display/fluig/Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline.md" }, "content": "Timeline\n\n\nResponsável por exibir novas publicações (paginação).\n\n```\nel: Object //elemento que disparou o evento\n```\n\n```\nev: Object //evento disparado\n```\n\n#### showMoreComments(el, ev)\n\nResponsável por exibir novos comentários em uma publicação (paginação).\n\n```\nel: Object //elemento que disparou o evento\n```\n\n```\nev: Object //evento disparado\n```\n\n#### showListPostsMessage(err)\n\nResponsável por exibir uma mensagem informativa ou de erro na timeline baseada no retorno do serviço de listagem de publicações.\n\n```\nerr: Object //quando for erro, envia o objeto do erro\n```\n\n#### showMessageError(err)\n\nResponsável por exibir uma mensagem (toast) com o erro ocorrido em qualquer serviço (interação com o server) disparado pela timeline.\n\n```\nerr: Object //objeto do erro\n```\n\n#### showFeedbackMessage(message, type)\n\nResponsável por exibir uma mensagem genérica (toast) na página.\n\n```\nmessage: String //mensagem para ser exibida\n```\n\n```\ntype: String //tipo de mensagem (success, danger, warning, etc)\n```\n\n#### showBtnShowMore()\n\nResponsável por exibir o botão de exibir mais publicações (show more) na timeline.\n\n#### showVideos()\n\nResponsável por instanciar o plugin de vídeo (videojs) nas publicações com vídeo. Ele faz com que um vídeo seja renderizado e disponível para visualização.\n\n#### showCardPopover()\n\nResponsável por instanciar o plugin de popover de informações de usuários e comunidades.\n\n#### instanceTimeInteraction()\n\nResponsável por instanciar o componente de interação de datas nas publicações. Ex. *há 7 horas atrás*.\n\n#### controlBtnShowMore(postsLen)\n\nResponsável por controlar a exibição do botão de **exibir mais publicações** baseada no retorno do serviço de listagem.\n\n```\npostsLen: Number //Recebe a quantidade de registros retornados\n```\n\n#### changeStatusOrderButton($el)" }, { "metadata": { "title": "Timeline", "source": "https://tdn.totvs.com/display/fluig/Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline.md" }, "content": "Timeline\n\n\nResponsável por mudar o status do botão de ordenação/filtragem da timeline baseado na opção selecionada. Renderiza novamente via Mustache o botão de ordenação trocando o botão atual.\n\n```\n$el: Object/Selector jQuery //Recebe o selector jQuery do botão de ordenação (dropdown)\n```\n\n#### toogleCommentArea($post)\n\nResponsável por fazer o toggle (exibir/ocultar) da área de comentário em uma publicação.\n\n```\n$post: Object/Selector jQuery //Recebe o selector jQuery do botão de ordenação\n```\n\n#### instanceMentions()\n\nResponsável por instanciar o plugin de menção de usuários e comunidades e auto complete de tags na área de comentário de uma publicação.\n\n#### resetMentions(parent)\n\nResponsável por remover as menções e resetar o plugin no elemento instanciado.\n\n```\nparent: Object/Selector //Recebe o selector do post para resetar o plugin de menção\n```\n\n#### validateFilesTypes(path, type)\n\nResponsável por validar se a extensão da imagem/vídeo será renderizada ou não em uma publicação.\n\n```\npath: String //Recebe a string para analisar e validar.\n```\n\n```\ntype: String //Tipo de media para analisar (image, video).\n```\n\n#### textComplaintValidate(text)\n\nEsse método é utilizado na funcionalidade de denúncia. Ela verifica se a descrição da denúncia contém no mínimo 4 palavras com  3 caracteres cada uma.\n\n```\ntext: String //String a ser analisada pela função.\n```\n\n#### controlInteractionActions($el, interactionType)\n\nEsse método controla a exibição do número de interações (apoiadores, acompanhadores, etc) em um comentário / publicação.\n\n```\n$el: Object/Selector jQuery //Elemento para controlar a interação\n```\n\n```\ninteractionType: String //add ou remove\n```\n\n#### timelineAction(el, ev)" }, { "metadata": { "title": "Timeline", "source": "https://tdn.totvs.com/display/fluig/Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline.md" }, "content": "Timeline\n\n\nPrincipal método de ação da timeline. Praticamente todas as ações chamam esse método que encapsula todas as validações necessárias para realizar uma ação e capturar o id do comentário ou publicação. A partir do elemento que houve uma interação, ela delega para o método correto da ação. Ex. (supportAction, shareAction, denounceAction, etc).\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n#### openDocumentAction(el, ev)\n\nMétodo de ação específico para visualizar documentos/imagens publicados na timeline. Responsável por abrir o referido documento em um modal, sem perder a referência à timeline (quando fechar o documento volta para onde estava).\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n#### orderAction(el, ev)\n\nEste método altera a ordenação das publicações da timeline.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n#### searchAction(el, ev)\n\nEste método faz a busca de uma tag no sistema a partir do valor da mesma.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n#### denounceAction(el, ev, id)\n\nEste método chama o modal de denúncia de um comentário / publicação.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n```\nid: Number //id do comentário / publicação\n```\n\n#### supportAction(el, ev, id)\n\nEste método executa a ação de apoiar um comentário / publicação.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n```\nid: Number //id do comentário / publicação\n```\n\n#### watchAction(el, ev, id)\n\nEste método executa a ação de acompanhar uma publicação.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n```\nid: Number //id do comentário / publicação\n```\n\n#### listLikesAction(el, ev, id)" }, { "metadata": { "title": "Timeline", "source": "https://tdn.totvs.com/display/fluig/Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline.md" }, "content": "Timeline\n\n\nEste método chama o modal de listagem de apoiadores de um comentário / publicação.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n```\nid: Number //id do comentário / publicação\n```\n\n#### listWatchersAction(el, ev, id)\n\nEste método chama o modal de listagem de apoiadores de uma publicação.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n```\nid: Number //id do comentário / publicação\n```\n\n#### commentAction(el, ev, id)\n\nEste método executa a ação de exibir a área de comentário em uma publicação.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n```\nid: Number //id do comentário / publicação\n```\n\n#### timelineCommentAction(el, ev)\n\nEste método executa a ação de comentar.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n#### removeAction(el, ev, id)\n\nEste método executa a ação de remover um comentário / publicação.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n```\nid: Number //id do comentário / publicação\n```\n\n#### shareAction(el, ev, id)\n\nEste método executa a ação de abrir o modal de compartilhamento de uma publicação.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n```\nid: Number //id do comentário / publicação\n```\n\n#### denounce(el, ev)\n\nEste método executa a ação de denunciar um comentário / publicação.\n\n```\nel: Object //Elemento onde houve a interação\n```\n\n```\nev: Object //Evento da interação\n```\n\n#### generateOrderAction()\n\nResponsável por gerar o objeto para montar o botão de ordenação de publicações.\n\n#### generatePostHeader(data)\n\nResponsável por gerar o objeto para montar o header de uma publicação.\n\n#### generateListClass(numberActions)" }, { "metadata": { "title": "Timeline", "source": "https://tdn.totvs.com/display/fluig/Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline.md" }, "content": "Timeline\n\n\nResponsável por validar se existe interação na publicação e gerar a classe que será adicionada no elemento de exibição de interações.\n\n#### generateTemplateVariableContent(data)\n\nResponsável por validar e gerar o nome do template do conteúdo variável de uma publicação. (publicação com imagem, vídeo, compartilhamento, etc).\n\n#### generateContentTextFormatted(text, mentions)\n\nResponsável por formatar o conteúdo de uma publicação.\n\n#### formatMentions(text, mentions)\n\nResponsável por adicionar o html de menção no conteúdo da publicação.\n\n#### formatTags(text)\n\nResponsável por adicionar o html de tags no conteúdo da publicação.\n\n#### formatLink(text)\n\nResponsável por adicionar o html de links no conteúdo da publicação.\n\n#### formatLineBreak(text)\n\nResponsável por adicionar o html de quebra de linhas no conteúdo da publicação.\n\n#### serviceComment(id, comment, cb)\n\nEste método é responsável por realizar a chamada no servidor para fazer a publicação de um comentário.\n\n#### serviceSupport(id, cb)\n\nEste método é responsável por realizar a chamada no servidor para adicionar ou remover apoio em um comentário ou publicação.\n\n#### serviceWatch(id, isWatched, cb)\n\nEste método é responsável por realizar a chamada no servidor para adicionar ou remover acompanhamento em um comentário ou publicação.\n\n#### serviceRemove(id, type, cb)\n\nEsse método é responsável por realizar a chamada no servidor para remover um comentário ou publicação.\n\n#### serviceListPosts(cb)\n\nEsse método é responsável por realizar a chamada no servidor para buscar várias publicações.\n\n#### serviceFindPost(postId, cb, limit)\n\nEsse método é responsável por realizar a chamada no servidor para buscar uma publicação.\n\n#### serviceListComments(postId, offset, cb, limit)\n\nEsse método é responsável por realizar a chamada no servidor para buscar comentários de uma publicação.\n\n#### baseAjax(options, cb)\n\nEsse método é responsável por encapsular todas as configurações básicas de uma chamada ajax." }, { "metadata": { "title": "Camada Visual Social Poster", "source": "https://tdn.totvs.com/display/fluig/Camada+Visual+Social+Poster", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Componentes de Publicação\\Camada Visual Social Poster.md" }, "content": "Camada Visual Social Poster\n\n\n# Índice\n\n- 1 [Arquivos básicos do widget Social Poster](#CamadaVisualSocialPoster-ArquivosbásicosdowidgetSocialPoster)\n- 2 [Ação de Publicação](#CamadaVisualSocialPoster-AçãodePublicação)\n- 3 [Ação de Publicação de Usuário](#CamadaVisualSocialPoster-AçãodePublicaçãodeUsuário)\n- 4 [Área de publicação na Comunidade](#CamadaVisualSocialPoster-ÁreadepublicaçãonaComunidade)\n- 5 [Estrutura do widget Social Poster](#CamadaVisualSocialPoster-EstruturadowidgetSocialPoster)\n\n### Arquivos básicos do widget Social Poster\n\nO *widget* Social Poster é baseado no *framework* de *templates* [FreeMarker](http://freemarker.org/) (.ftl). O FreeMarker é responsável pela camada de visualização, onde sobre ele é escrito todo HTML do componente. Bem como o(s) arquivo(s) de [FreeMarker](http://freemarker.org/), todos os componentes possuem arquivos próprios de CSS (.css) e JavaScript (.js).\n\nAlém desses componentes, o *widget* Social Poster utiliza um componente de *template* chamado [Mustache](http://mustache.github.io/), que é uma especificação de *templates* que não utiliza lógica, ou seja, não possui declarações com *if, for, while* etc.; toda sua construção é baseada em *tags*.\n\n### Ação de Publicação\n\nO Social Poster é responsável por absorver todo o conteúdo digitado pelo usuário no Campo de Publicação e enviar para a exibição de uma nova publicação na *Timeline*.\n\n### Ação de Publicação de Usuário\n\nAção de Publicação de Usuário é o campo de texto onde o usuário digita o conteúdo para publicação. Esse campo de texto está disponível na página inicial.\n\n![](..\\..\\..\\images\\Image%2032.png)\n\n**Área de publicação de usuário**\n\n### Área de publicação na Comunidade\n\nNa publicação em comunidade, além de publicar conteúdo de texto, é possível anexar imagens, um vídeo, documento ou artigo de acordo com a disponibilidade desses recursos.\n\n![](..\\..\\..\\images\\Image%2033.png)\n\n**Área de publicação de comunidade**\n\n### Estrutura do widget Social Poster" }, { "metadata": { "title": "Camada Visual Social Poster", "source": "https://tdn.totvs.com/display/fluig/Camada+Visual+Social+Poster", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Componentes de Publicação\\Camada Visual Social Poster.md" }, "content": "Camada Visual Social Poster\n\n\nVeja a seguir a estrutura que compõe o *widget* Social Poster:\n\n**No HTML**\n\n```\n
\n \n {{#socialStateBlocked}}\n \n {{#socialTypeCommunity}}\n

${i18n.getTranslation('community.disabled')}

\n {{/socialTypeCommunity}}\n \n {{#socialTypeUser}}\n

${i18n.getTranslation('user.disabled')}

\n {{/socialTypeUser}}\n {{/socialStateBlocked}}\n \n {{#socialStateActive}}\n \n {{#socialAlias}}\n \n {{#isUserOwnPageOrMember}}\n \n
\n \n
\n
\n
\n \n
\n
\n \n \n
\n \n {{#socialTypeCommunity}}\n \n {{/socialTypeCommunity}}\n
\n
\n
\n
\n \n
\n 600\n \n \n {{#socialStateBlocked}}\n \n {{/socialStateBlocked}}\n \n {{#notSocialStateBlocked}}\n \n {{/notSocialStateBlocked}}\n
\n
\n
\n
\n {{/isUserOwnPageOrMember}}\n {{/socialAlias}}\n {{/socialStateActive}}\n
\n```" }, { "metadata": { "title": "Criando um aplicativo para enviar notificações", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126714991", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas\\Criando um aplicativo para enviar notificações.md" }, "content": "Criando um aplicativo para enviar notificações" }, { "metadata": { "title": "Criando um aplicativo para enviar notificações", "source": "https://tdn.totvs.com/pages/viewpage.action?pageId=126714991", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Criando notificações personalizadas\\Criando um aplicativo para enviar notificações.md" }, "content": "Criando um aplicativo para enviar notificações\n\n\n# Índice\n\n- 1 [Objetivo](#Criandoumaplicativoparaenviarnotificações-Objetivo)\n- 2 [Projeto de exemplo](#Criandoumaplicativoparaenviarnotificações-Projetodeexemplo)\n- 3 [Cadastro de aplicativos no Fluig Plataforma através da API de Notificações](#Criandoumaplicativoparaenviarnotificações-CadastrodeaplicativosnoFluigPlataformaatravésdaAPIdeNotificações)\n- 4 [Configurações de envio de notificações por usuário](#Criandoumaplicativoparaenviarnotificações-Configuraçõesdeenviodenotificaçõesporusuário)\n- 5 [Enviando notificação através do aplicativo](#Criandoumaplicativoparaenviarnotificações-Enviandonotificaçãoatravésdoaplicativo)\n- 6 [Desabilitando aplicativos de envio de Notificações](#Criandoumaplicativoparaenviarnotificações-DesabilitandoaplicativosdeenviodeNotificações)\n\n# Objetivo\n\n---\n\nNo TOTVS Fluig Plataforma é possível criar novas formas de envio de notificações para os usuários. Isto pode ser feito através de aplicativos que podem ser instalados no Fluig Plataforma. A partir daí o sistema utilizará o aplicativo para enviar notificações. Este guia visa orientar e mostrar passo-a-passo como criar, instalar e utilizar um aplicativo de envio de notificações no Fluig Plataforma.\n\n# Projeto de exemplo\n\n---\n\nPara facilitar o entendimento e desenvolvimento de aplicativos, foi gerado um projeto de exemplo. Neste projeto, foi implementado um aplicativo que mostra no LOG a mensagem recebida. Para testá-lo, basta seguir os passos abaixo:\n\n1. Baixar o projeto: [Clique aqui](https://tdn.totvs.com/download/attachments/126714991/alert-sender-sample.zip?version=4&modificationDate=1416914490000&api=v2) (projeto \"alert-sender-sample\").\n2. Compilar o projeto (é um projeto padrão maven, para compilar, executar \"mvn clean install\" na raíz do projeto)\n3. Fazer *deploy*do arquivo \"/alert-sender-sample-server/target/alert-sender-sample-server.ear\" em um servidor com o Fluig instalado\n4. Acessar a plataforma Fluig e gerar eventos que enviem notificações (ex. apoiar um post). \n Deverá aparecer no LOG do Fluig os dados do alerta.\n\nEste projeto de exemplo pode servir de base para implementação de aplicativos reais de envio de notificações.\n\n# Cadastro de aplicativos no Fluig Plataforma através da API de Notificações\n\n---\n\nPara que um aplicativo possa ser utilizado pelo TOTVS Fluig Plataforma para enviar notificações, este deve ser cadastrado na **Central de Notificações** do sistema. Para isto, é necessário postar uma mensagem em uma fila JMS. Abaixo um exemplo de código que realiza esta chamada, que pode ser encontrado em **alert-sender-sample/impl/src/main/java/com/fluig/StartupLoader.java**:\n\n```java\npackage com.fluig;\nimport java.util.HashMap;\nimport javax.annotation.PostConstruct;\nimport javax.ejb.Singleton;\nimport javax.ejb.Startup;\nimport javax.jms.JMSException;\nimport javax.jms.ObjectMessage;\nimport javax.jms.Queue;\nimport javax.jms.QueueConnection;\nimport javax.jms.QueueConnectionFactory;\nimport javax.jms.QueueSender;\nimport javax.jms.QueueSession;\nimport javax.naming.InitialContext;\nimport javax.naming.NamingException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n/**\n * Registra o aplicatico como listener para os alertas.\n */\n@Startup\n@Singleton\npublic class StartupLoader {\n\tprivate transient Logger log = LoggerFactory.getLogger(StartupLoader.class);\n\t/*\n\t * Nome da fila que será usada para receber os alertas.\n\t */\n\tprivate static final String QUEUE = \"AlertSenderSampleQueue\";\n\t/**\n\t * ID do tenante para o qual será registrado. Quando houver mais de um\n\t * tenante, deverá fazer uma chamada para cada tenante.\n\t */\n\tprivate static final Long TENANT_ID = 10097l;\n\t@PostConstruct\n\tprivate void startup() {\n\t\tlog.info(\"Inicializando aplicativo\");\n\t\ttry {\n\t\t\tInitialContext ic = new InitialContext();\n\t\t\tQueue q = (Queue) ic\n\t\t\t\t\t.lookup(\"java:global/TOTVSTechAsyncQueue\");\n\t\t\tQueueConnectionFactory factory = (QueueConnectionFactory) ic\n\t\t\t\t\t.lookup(\"java:global/FluigRemoteXAConnectionFactory\");\n\t\t\tQueueConnection connection = factory.createQueueConnection();\n\t\t\tQueueSession session = null;\n\t\t\tQueueSender sender = null;\n\t\t\ttry {\n\t\t\t\tsession = connection.createQueueSession(false,\n\t\t\t\t\t\tjavax.jms.Session.AUTO_ACKNOWLEDGE);\n\t\t\t\tsender = session.createSender(q);\n\t\t\t\tHashMap values = new HashMap();\n\t\t\t\t// Código do aplicativo.\n\t\t\t\tvalues.put(\"applicationKey\", \"alert.app.sender.sample\");\n\t\t\t\t// Chave da descrição do aplicativo.\n\t\t\t\tvalues.put(\"descriptionKey\",\n\t\t\t\t\t\t\"alert.app.sender.sample.description\");\n\t\t\t\t// ID do tenante.\n\t\t\t\tvalues.put(\"tenantId\", TENANT_ID);\n\t\t\t\tObjectMessage msg = session.createObjectMessage();\n\t\t\t\tmsg.setObject(values);\n\t\t\t\tmsg.setStringProperty(\"action\", \"registerAlertAppSender\");\n\t\t\t\tsender.send(msg);\n\t\t\t\tlog.info(\"Inicialização do aplicativo OK\");\n\t\t\t} finally {\n\t\t\t\tif (sender != null) {\n\t\t\t\t\tsender.close();\n\t\t\t\t}\n\t\t\t\tif (session != null) {\n\t\t\t\t\tsession.close();\n\t\t\t\t}\n\t\t\t\tif (connection != null) {\n\t\t\t\t\tconnection.close();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (NamingException ex) {\n\t\t\tlog.error(\"Nao foi possivel registrar o serviço de notificação via whatsapp\");\n\t\t\tex.printStackTrace();\n\t\t} catch (JMSException ex) {\n\t\t\tlog.error(\"Nao foi possivel registrar o serviço de notificação via whatsapp\");\n\t\t\tex.printStackTrace();\n\t\t}\n\t}\n}\n```\n\nOs parâmetros necessários são:\n\n1. **applicationKey:** É uma string que será o identificador único para o aplicativo. Através desta string a Central de Notificações fará todo o gerenciamento do aplicativo.\n2. **descriptionKey:** É a descrição do aplicativo. Pode ser um texto plano ou uma chave para tradução (ex: app.my.application). Para que seja feita a tradução, a chave deve estar previamente cadastrada no módulo I18n, no bundle \"foundation\\_alert\". Caso seja inserido um texto plano, este será exibido sem tradução.\n3. **tenantId:** O id do tenant onde o aplicativo será instalado.\n\nUma boa prática é fazer o cadastro do aplicativo no momento do *deploy* no servidor ou no momento da criação de um novo tenant. O projeto de exemplo já contém código com este comportamento.\n\n# Configurações de envio de notificações por usuário\n\n---\n\nQuando um novo aplicativo for instalado na Central de Notificações, todos os usuários do tenant poderão configurar se desejam ou não receber notificações através do aplicativo. Isto pode ser feito na tela de configurações. Por padrão, ao instalar um novo aplicativo, todos os usuários do tenant passarão a receber notificações através daquele aplicativo. Abaixo o exemplo da tela de configurações depois de instalado o projeto de exemplo.\n\n![](..\\..\\..\\images\\configura%C3%A7%C3%A3o%20de%20notifica%C3%A7%C3%B5es.png)\n\n# Enviando notificação através do aplicativo\n\n---\n\nPara que a Central de Notificação do TOTVS Fluig Plataforma invoque o aplicativo para enviar notificações, o aplicativo deve obrigatoriamente criar um MDB que ouve a fila registrada. Abaixo temos um exemplo simples de MDB:\n\n```java\npackage com.fluig;\nimport java.io.Serializable;\nimport java.util.Map;\nimport javax.ejb.ActivationConfigProperty;\nimport javax.ejb.EJB;\nimport javax.ejb.MessageDriven;\nimport javax.ejb.TransactionAttribute;\nimport javax.ejb.TransactionAttributeType;\nimport javax.jms.JMSException;\nimport javax.jms.Message;\nimport javax.jms.MessageListener;\nimport javax.jms.ObjectMessage;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n/**\n * Esta é a classe que será chamada pela Central de Notificações para enviar\n * alertas por este aplicativo.\n */\n@MessageDriven(name = \"topic/FluigNotificationTopic\", mappedName = \"FluigNotificationTopic\", activationConfig = {\n\t\t@ActivationConfigProperty(propertyName = \"acknowledgeMode\", propertyValue = \"Auto-acknowledge\"),\n\t\t@ActivationConfigProperty(propertyName = \"destinationType\", propertyValue = \"javax.jms.Topic\"),\n\t\t@ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"FluigNotificationTopic\")\n})\npublic class AlertSampleMDBBean implements MessageListener {\n\tprivate static final Logger log = LoggerFactory\n\t\t\t.getLogger(AlertSampleMDBBean.class);\n\t@EJB(lookup = TxtSenderService.JNDI_REMOTE_NAME)\n\tprivate TxtSenderService service;\n\t@Override\n\t@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)\n\tpublic void onMessage(final Message message) {\n\t\tif (message instanceof ObjectMessage) {\n\t\t\tfinal ObjectMessage msg = (ObjectMessage) message;\n\t\t\ttry {\n\t\t\t\tfinal Serializable obj = msg.getObject();\n\t\t\t\tif (log.isDebugEnabled()) {\n\t\t\t\t\tlog.debug(\"AlertSenderSampleQueue.onMessage - obj: \" + obj);\n\t\t\t\t}\n\t\t\t\tservice.sendAlert((Map) obj);\n\t\t\t\tif (log.isDebugEnabled()) {\n\t\t\t\t\tlog.debug(\"AlertSenderSampleQueue.onMessage - FIM\");\n\t\t\t\t}\n\t\t\t} catch (final JMSException ex) {\n\t\t\t\tlog.error(ex.getMessage(), ex);\n\t\t\t}\n\t\t}\n\t}\n}\n```\n\nQuando o usuário receber um alerta, a Central de Notificações vai validar se aquele usuário está configurado para receber notificações por este aplicativo. Caso esteja, a Central postará uma mensagem na fila cadastrada para o aplicativo.\n\n# Desabilitando aplicativos de envio de Notificações\n\n---\n\nÉ possível desabilitar qualquer aplicativo de envio, exceto a própria Central de Notificações da plataforma Fluig. Atualmente este serviço está disponível na [API Pública](http://api.fluig.com/) da plataforma Fluig. Uma vez desabilitado, o sistema não invocará mais o aplicativo para envio de notificações, e também não o exibirá mais na tela de configurações." }, { "metadata": { "title": "Camada visual Timeline", "source": "https://tdn.totvs.com/display/fluig/Camada+visual+Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline\\Camada visual Timeline.md" }, "content": "Camada visual Timeline\n\n\n# Índice\n\n- 1 [Arquivos básicos da Timeline](#CamadavisualTimeline-ArquivosbásicosdaTimeline)\n- 2 [Ação de edição](#CamadavisualTimeline-Açãodeedição)\n- 3 [Ação de visualização](#CamadavisualTimeline-Açãodevisualização)\n - 3.1 [Estrutura básica de templates Mustache na timeline](#CamadavisualTimeline-EstruturabásicadetemplatesMustachenatimeline)\n - 3.2 [Tipos de Publicação](#CamadavisualTimeline-TiposdePublicação)\n - 3.2.1 [Novo Artigo criado](#CamadavisualTimeline-NovoArtigocriado)\n - 3.2.2 [Publicação na Comunidade](#CamadavisualTimeline-PublicaçãonaComunidade)\n - 3.2.3 [Publicação Compartilhada](#CamadavisualTimeline-PublicaçãoCompartilhada)\n - 3.2.4 [Publicação com Imagem](#CamadavisualTimeline-PublicaçãocomImagem)\n - 3.2.5 [Publicação com vídeo](#CamadavisualTimeline-Publicaçãocomvídeo)\n - 3.2.6 [Publicação com vídeo do YouTube](#CamadavisualTimeline-PublicaçãocomvídeodoYouTube)\n - 3.2.7 [Publicação com Menção e Hashtag](#CamadavisualTimeline-PublicaçãocomMençãoeHashtag)\n - 3.2.8 [Modal para Compartilhamento da Publicação](#CamadavisualTimeline-ModalparaCompartilhamentodaPublicação)\n - 3.3 [Estrutura básica de template Mustache de comentário em uma Publicação](#CamadavisualTimeline-EstruturabásicadetemplateMustachedecomentárioemumaPublicação)\n - 3.4 [Comentário](#CamadavisualTimeline-Comentário)\n - 3.4.1 [Comentário de uma Publicação](#CamadavisualTimeline-ComentáriodeumaPublicação)\n\n## Arquivos básicos da Timeline\n\nComo todos os componentes do TOTVS Fluig Plataforma, a Timeline é desenvolvida baseada no *framework* de *templates* [FreeMarker](http://freemarker.org/) (.ftl). O FreeMarker é responsável pela camada de visualização, onde sobre ele é escrito todo HTML do componente. Bem como o(s) arquivo(s) de [FreeMarker](http://freemarker.org/), todos os componentes possuem arquivos próprios de CSS (.css) e JavaScript (.js).\n\n## Ação de edição" }, { "metadata": { "title": "Camada visual Timeline", "source": "https://tdn.totvs.com/display/fluig/Camada+visual+Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline\\Camada visual Timeline.md" }, "content": "Camada visual Timeline\n\n\nNo modo de edição da *timeline* você pode configurar as opções de visualização.\n\n![](..\\..\\..\\images\\Image%2022.png)\n\n![](..\\..\\..\\images\\Image%202.png)\n\n## Ação de visualização\n\nApós gerar uma nova publicação, esse conteúdo é exibido na Timeline em diferentes tipos de visualização:\n\n### Estrutura básica de templates Mustache na timeline\n\n**No HTML**\n\n```\n\n```\n\n### Tipos de Publicação\n\nSegue abaixo os tipos de Publicação disponíveis na Timeline.\n\n#### Novo Artigo criado\n\n![](..\\..\\..\\images\\pic-new-article.png)\n\n#### Publicação na Comunidade\n\n![](..\\..\\..\\images\\pic-post-in-community.png)\n\n#### Publicação Compartilhada\n\n![](..\\..\\..\\images\\Image%2023.png)\n\n#### Publicação com Imagem\n\n![](..\\..\\..\\images\\Image%2024.png)\n\n#### Publicação com vídeo\n\n![](..\\..\\..\\images\\Image%2031.png)\n\n#### Publicação com vídeo do YouTube\n\n![](..\\..\\..\\images\\Image%2026.png)\n\n#### Publicação com Menção e Hashtag\n\n![](..\\..\\..\\images\\Image%2028.png)\n\n#### Modal para Compartilhamento da Publicação" }, { "metadata": { "title": "Camada visual Timeline", "source": "https://tdn.totvs.com/display/fluig/Camada+visual+Timeline", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline\\Camada visual Timeline.md" }, "content": "Camada visual Timeline\n\n\n![](..\\..\\..\\images\\Image%2037.png)\n\n### Estrutura básica de template Mustache de comentário em uma Publicação\n\n**No HTML**\n\n```\n\n```\n\n### Comentário\n\nSegue abaixo o tipo de Comentário de Publicação disponível na Timeline.\n\n#### Comentário de uma Publicação\n\n![](..\\..\\..\\images\\Image%2029.png)" }, { "metadata": { "title": "Timeline personalizada 1.4.x para 1.5.0", "source": "https://tdn.totvs.com/display/fluig/Timeline+personalizada+1.4.x+para+1.5.0", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline\\Timeline personalizada 1.4.x para 1.5.0.md" }, "content": "Timeline personalizada 1.4.x para 1.5.0" }, { "metadata": { "title": "Timeline personalizada 1.4.x para 1.5.0", "source": "https://tdn.totvs.com/display/fluig/Timeline+personalizada+1.4.x+para+1.5.0", "path": "\\Plataforma Documentação técnica\\Recurso de Comunidades (Social)\\Timeline\\Timeline personalizada 1.4.x para 1.5.0.md" }, "content": "Timeline personalizada 1.4.x para 1.5.0\n\n\n# Índice\n\n- 1 [Objetivo](#Timelinepersonalizada1.4.xpara1.5.0-Objetivo)\n- 2 [application.info](#Timelinepersonalizada1.4.xpara1.5.0-application.info)\n- 3 [edit.ftl](#Timelinepersonalizada1.4.xpara1.5.0-edit.ftl)\n- 4 [socialtimeline.properties](#Timelinepersonalizada1.4.xpara1.5.0-socialtimeline.properties)\n- 5 [view.ftl](#Timelinepersonalizada1.4.xpara1.5.0-view.ftl)\n- 6 [image-video-error.svg](#Timelinepersonalizada1.4.xpara1.5.0-image-video-error.svg)\n- 7 [socialtimeline.js](#Timelinepersonalizada1.4.xpara1.5.0-socialtimeline.js)\n- 8 [socialtimelineedit.js](#Timelinepersonalizada1.4.xpara1.5.0-socialtimelineedit.js)\n\n# Objetivo\n\nEste guia é destinado aos desenvolvedores internos e externos do fluig. O objetivo é identificar e mapear todas as diferenças da *Timeline* personalizada entre as versões 1.4.x e 1.5.0.\n\nDica\n\nSugerimos que ao seguir este guia seja utilizado um programa de comparação (diff), que permita visualizadas as diferenças entre as versões 1.4.x e 1.5.0.\n\n# application.info\n\nNa versão 1.5.0 foi melhorado o componente de compartilhamento, sendo necessário adicionar estas dependências para *widget*.\n\nAs linhas abaixo, da versão 1.5.0, devem ser **ADICIONADAS** para a versão 1.4.x:\n\n```\napplication.resource.component.X=social/socialshare\napplication.resource.component.X=social/socialsharelist\napplication.resource.component.X=social/socialformanswer\n```\n\nAtenção!\n\nNão esquecer de substituir o 'X' pela sequência dos componentes já configurados.\n\n# edit.ftl\n\nNa versão 1.5.0 foi adicionado mais um tipo de ordenação (mais *likes*), causando uma pequena alteração na estrutura do HTML.\n\nCopiar o bloco abaixo que se encontra a partir da linha 34 da versão 1.5.0 e **SUBSTITUIR** na versão 1.4.x:\n\n```\n
\n\t
\n\t\t\n\t\t\n\t
\n
\n```\n\n# socialtimeline.properties\n\nNa versão 1.5.0 foram adicionadas algumas chaves de tradução e devem ser **ADICIONADAS** para versão 1.4.x.\n\nNão esquecer de replicar as alterações para os arquivos: socialtimeline\\_en\\_US.properties, socialtimeline\\_es.properties, socialtimeline\\_pt\\_BR.properties.\n\nVeja abaixo:\n\n```\nthis.form=um formulário\nanwser=responder\nmessage.error.video.not.supported=Ops, esse vídeo não é suportado pelo seu navegador. Faça o download do vídeo ou utilize outro navegador.\npost.denounced= O conteúdo foi denunciado por conter palavras restritas e não está mais disponível\noptions.ordenation=Ordenação padrão\nmore.like=Mais curtidos\nmessage.video.not.supported=Esse vídeo não é suportado pelo seu navegador.\nmessage.video.not.supported.download=Faça o download do vídeo\nmessage.video.not.supported.sulfix=ou utilize outro navegador.\n```\n\n# view.ftl\n\nNa linha 40 da versão 1.5.0, copiar o código abaixo e **SUBSTITUIR** na versão 1.4.x:\n\n```\n
  • \n```\n\nNa linha 124 da versão 1.5.0, copiar o bloco abaixo e **SUBSTITUIR** na versão 1.4.x:\n\n```\n{{#shared}}\n\t\n{{/shared}}\n{{^shared}}\n\t\n{{/shared}}\n{{numberShares}}\n```\n\nNa linha 231 da versão 1.5.0, copiar o bloco abaixo e **SUBSTITUIR** na versão 1.4.x:\n\n```\n{{^removeText}}\n {{#originalText}}\n \t
    \n \t
    \n \t\t

    {{{originalText}}}

    \n \t
    \n
    \n {{/originalText}}\n{{/removeText}}\n```\n\nNa linha 257 da versão 1.5.0, copiar o código abaixo e **SUBSTITUIR** na versão 1.4.x:\n\n```\n
    \n```\n\nNa linha 268 da versão 1.5.0, copiar o código abaixo e **ADICIONAR** na versão 1.4.x:\n\n```\n
    \n```\n\nNa linha 279 da versão 1.5.0, copiar o código abaixo e **SUBSTITUIR** na versão 1.4.x:\n\n```\n
    \n```\n\nNa linha 293 da versão 1.5.0, copiar o código abaixo e **ADICIONAR** na versão 1.4.x:\n\n```\n
    \n```\n\nNa linha 308 da versão 1.5.0, copiar o bloco abaixo e **SUBSTITUIR** na versão 1.4.x:\n\n```\n

    {{linkedObject.description}}

    \n{{^isFolder}}\n\t

    {{i18n.version}}/{{i18n.revision}}: {{documentVersion}}

    \n{{/isFolder}}\n```\n\nNa linha 329 da versão 1.5.0, copiar o bloco abaixo e **SUBSTITUIR** na versão 1.4.x:\n\n```\n

    {{linkedObject.description}}

    \n{{^isFolder}}\n\t

    {{i18n.version}}/{{i18n.revision}}: {{documentVersion}}

    \n{{/isFolder}}\n```\n\nNa linha 342 da versão 1.5.0, copiar o bloco abaixo e **ADICIONAR** na versão 1.4.x:\n\n```\n\n\n```\n\nNa linha 481 da versão 1.5.0, copiar o bloco abaixo e **SUBSTITUIR** na versão 1.4.x:\n\n```\n<#--\n\tSe o navegador possuir o flash player instalado é utilizada a técnica de \"object\"\n\tpara exibir os vídeos, se não, é utilizado \"iframe\" por motivos de bugs no IE9.\n\t\n\tO IE9 não sabe se o flash está habilitado ou não, então ele exibe um thumb \"quebrado\".\n\t\n\tNão foi utilizada essa técnica em todos os navegadores pois no chrome acontece erros de requests.\n\t\n\thttp://stackoverflow.com/questions/24490323/google-chrome-cast-sender-error-if-chrome-cast-extension-is-not-installed-or-usi\n-->\n{{#hasFlash}}\n \n \n \n \n \n \n \n \n{{/hasFlash}}\n{{^hasFlash}}\n\t