A TOTVS tem constantemente aprimorando seus sistemas e a uma das novidades presentes desde a versão 11.0 são os Workflows ou Fórmulas Visuais.

Para que serve?

A ferramenta serve para criarmos uma série de situações no sistema como validações de campos, validação de situações cadastrais, envio de e-mail, geração de exceções, etc. Para entender, vamos a exemplos que já são aplicados em diversos clientes:

1. Envio de e-mail ao se cadastrar um novo produto: Em diversas situações as entradas do sistema não são corretas pois os campos cadastrais não foram preenchidos (campos contábeis / fiscais), então com a execução de uma fórmula visual, podemos alertar, via e-mail que um novo produto / serviço foi cadastrado.

2. Validação de campo complementar em lançamento: Em algumas situações o cliente possui, no lançamento da NF, um campo complementar que precisa estar preenchido com um valor válido, nestes casos o sistema não permite transformar um campo complementar em campo obrigatório, logo a fórmula visual resolve este problema.

3. Informar responsável sobre demanda: Neste caso específico, vou utilizar um exemplo do TOTVS Obras e Projetos (RM Solum), nesta situação, o usuário ao gerar os pedidos de compras e atingir 80% do total permitido, alertará o responsável de compras que um determinado insumo atingiu seu limite.

Como fazer?

Os sites da TOTVS estão cheios de referências de como fazer diversos tipos de fórmulas visuais, sendo esse link considerado o mais relevante por nós:

Como o repositório já demonstra a criação de diversas fórmulas, mas nenhuma delas passo-a-passo, estaremos detalhando neste post a criação de uma fórmula visual de nível médio de dificuldade.
A Fórmula
A finalidade da fórmula que estaremos criando é justamente o 3.o exemplo deste artigo. Vamos detalhar seu funcionamento:
  • No TOTVS Obras e Projetos (RM Solum), ao gerar os pedidos de compra, o sistema deverá verificar se o total consumido do insumo atingiu 80% do total planejado, caso tenha atingido, o responsável pelo setor de compras deverá receber um e-mail informando que este insumo atingiu este nível.
  • Como a ideia é criar um passo-a-passo não iremos criar uma trava básica desta fórmula que seria o pré-requisito que o responsável receba apenas 1 e-mail daquele insumo, para evitar receber N e-mails enquanto o usuário gera os pedidos de compra.
Vamos começar:
1. Acesse o TOTVS Obras e Projetos – Utilitários – Workflow
2. Clique em Adicionar e preencha os dados solicitados. Caso você não tenha nenhuma Categoria cadastrada, cadastre uma antes ou na própria tela de edição.
Cadastro da fórmula visual

Cadastro da fórmula visual

3. Após preencher os dados salve, clique em OK.
4. Vamos agora cadastrar a SQL para esta fórmula. Acesse o menu Utilitários – Consultas SQL e crie uma nova consulta.
Como a ideia aqui é fornecer um passo-a-passo de fórmula visual, não entraremos em detalhes referentes a consulta criada, mas a titulo de exemplo, ela é basicamente a mesma SQL utilizada para o quadro resumo dos pedidos do TOTVS Obras e Projetos.
 SQL: FV.001 – Formula Visual para checar nível de material
SELECT DISTINCT MPRJ.CODPRJ, MPRJ.DESCRICAO, MNECESSIDADEMAT.IDPEDIDO, MNECESSIDADEMAT.CODCOLIGADA, MNECESSIDADEMAT.IDPRJ,
 MISM.IDISM,
 MISM.CODISM,
 MISM.DESCISM,
 MISM.CODUND,
 TPRD.IDPRD,
 TPRD.DESCRICAO,
 CASE WHEN
 ((SELECT ISNULL(SUM(ISNULL(MI.QTDEPEDIDA, 0)), 0)
 FROM MPEDIDOMAT (NOLOCK),
 MNECESSIDADEMAT MN(NOLOCK),
 MITEMPEDIDOMATERIAL MI(NOLOCK)
 WHERE MN.CODCOLIGADA = :CODCOLIGADA_N
 AND MN.IDPRJ = :IDPRJ_N
 AND MN.IDISM = MNECESSIDADEMAT.IDISM
 AND MN.CODCOLIGADA = MPEDIDOMAT.CODCOLIGADA
 AND MN.IDPRJ = MPEDIDOMAT.IDPRJ
 AND MN.IDPEDIDO = MPEDIDOMAT.IDPEDIDO
 AND MPEDIDOMAT.TIPOREQUISICAO = 0
 AND MI.CODCOLIGADA = MN.CODCOLIGADA
 AND MI.IDPRJ = MN.IDPRJ
 AND MI.IDNECESSIDADE = MN.IDNECESSIDADE)
 /
 (SELECT SUM(MCURVASISM.QUANTPLANEJADO)
 FROM MCURVASISM (NOLOCK)
 WHERE CODCOLIGADA = :CODCOLIGADA_N
 AND IDPRJ = :IDPRJ_N
 AND IDISM = MNECESSIDADEMAT.IDISM
 AND VALIDO = 1)) >= 0.8 THEN '1' ELSE '0' END AS PERC,
 QTD_NECESS = (SELECT SUM(MCURVASISM.QUANTPLANEJADO)
 FROM MCURVASISM (NOLOCK)
 WHERE CODCOLIGADA = :CODCOLIGADA_N
 AND IDPRJ = :IDPRJ_N
 AND IDISM = MNECESSIDADEMAT.IDISM
 AND VALIDO = 1),
 QTD_PEDIDA = (SELECT ISNULL(SUM(ISNULL(MI.QTDEPEDIDA, 0)), 0)
 FROM MPEDIDOMAT (NOLOCK),
 MNECESSIDADEMAT MN(NOLOCK),
 MITEMPEDIDOMATERIAL MI(NOLOCK)
 WHERE MN.CODCOLIGADA = :CODCOLIGADA_N
 AND MN.IDPRJ = :IDPRJ_N
 AND MN.IDISM = MNECESSIDADEMAT.IDISM
 AND MN.CODCOLIGADA = MPEDIDOMAT.CODCOLIGADA
 AND MN.IDPRJ = MPEDIDOMAT.IDPRJ
 AND MN.IDPEDIDO = MPEDIDOMAT.IDPEDIDO
 AND MPEDIDOMAT.TIPOREQUISICAO = 0
 AND MI.CODCOLIGADA = MN.CODCOLIGADA
 AND MI.IDPRJ = MN.IDPRJ
 AND MI.IDNECESSIDADE = MN.IDNECESSIDADE),
 QTD_EXTRA = (SELECT ISNULL(SUM(ISNULL(MITEMPEDIDOMATEXTRA.QTDEPEDIDO,0)),0)
 FROM MITEMPEDIDOMATEXTRA
 WHERE MITEMPEDIDOMATEXTRA.CODCOLIGADA = :CODCOLIGADA_N
 AND MITEMPEDIDOMATEXTRA.IDPRJ = :IDPRJ_N
 AND MITEMPEDIDOMATEXTRA.IDPRD = TPRD.IDPRD),
 QTD_PENDENTE = (SELECT ISNULL(SUM(ISNULL(MCURVASISM.QUANTPLANEJADO, 0)), 0)
 FROM MCURVASISM (NOLOCK)
 WHERE CODCOLIGADA = :CODCOLIGADA_N
 AND IDPRJ = :IDPRJ_N
 AND IDISM = MNECESSIDADEMAT.IDISM) - (SELECT ISNULL(SUM(ISNULL(MI.QTDEPEDIDA, 0)), 0)
 FROM MPEDIDOMAT (NOLOCK),
 MNECESSIDADEMAT MN(NOLOCK),
 MITEMPEDIDOMATERIAL MI(NOLOCK)
 WHERE MN.CODCOLIGADA = :CODCOLIGADA_N
 AND MN.IDPRJ = :IDPRJ_N
 AND MN.IDISM = MNECESSIDADEMAT.IDISM
 AND MN.CODCOLIGADA = MPEDIDOMAT.CODCOLIGADA
 AND MN.IDPRJ = MPEDIDOMAT.IDPRJ
 AND MN.IDPEDIDO = MPEDIDOMAT.IDPEDIDO
 AND MPEDIDOMAT.TIPOREQUISICAO = 0
 AND MI.CODCOLIGADA = MN.CODCOLIGADA
 AND MI.IDPRJ = MN.IDPRJ
 AND MI.IDNECESSIDADE = MN.IDNECESSIDADE)
 FROM MNECESSIDADEMAT (NOLOCK),
 MISM (NOLOCK),
 MITEMPEDIDOMATERIAL (NOLOCK),
 TPRD (NOLOCK),
 MPRJ(NOLOCK)
 WHERE MNECESSIDADEMAT.CODCOLIGADA = :CODCOLIGADA_N
 AND MNECESSIDADEMAT.IDPRJ = :IDPRJ_N
 AND MNECESSIDADEMAT.IDPEDIDO = :IDPEDIDO_N
 AND MNECESSIDADEMAT.CODCOLIGADA = MISM.CODCOLIGADA
 AND (MNECESSIDADEMAT.IDPRJ = MISM.IDPRJ OR MISM.IDPRJ = 0)
 AND MNECESSIDADEMAT.IDISM = MISM.IDISM
 AND MITEMPEDIDOMATERIAL.CODCOLIGADA = MNECESSIDADEMAT.CODCOLIGADA
 AND MITEMPEDIDOMATERIAL.IDPRJ = MNECESSIDADEMAT.IDPRJ
 AND MITEMPEDIDOMATERIAL.IDNECESSIDADE = MNECESSIDADEMAT.IDNECESSIDADE
 AND MITEMPEDIDOMATERIAL.CODCOLIGADA = TPRD.CODCOLIGADA
 AND MITEMPEDIDOMATERIAL.IDPRD = TPRD.IDPRD
 AND MPRJ.CODCOLIGADA = MNECESSIDADEMAT.CODCOLIGADA
 AND MPRJ.IDPRJ = MNECESSIDADEMAT.IDPRJ
 GROUP BY MNECESSIDADEMAT.IDPEDIDO, MNECESSIDADEMAT.CODCOLIGADA, MNECESSIDADEMAT.IDPRJ,
 MISM.IDISM,
 MNECESSIDADEMAT.IDISM,
 MISM.CODISM,
 MISM.DESCISM,
 MISM.CODUND,
 TPRD.IDPRD,
 TPRD.DESCRICAO, MPRJ.CODPRJ, MPRJ.DESCRICAO
5. Com a SQL cadastrada, vamos voltar a tela da fórmula visual e dar um duplo clique no item cadastrado anteriormente. A tela de edição da fórmula visual deve ser exibida.
Fórmula Visual

Fórmula Visual

6. Na aba Atividades, selecione o componente Consulta SQL e arraste até o workflow.
7. Depois de arrastado, clique sobre o item e depois em Propriedades.
Consulta SQL

Consulta SQL

8. Clique com o botão direito sobre o item e depois em “Selecionar Consulta SQL” e buque pela sentença cadastrada anteriormente.
9. Nas propriedades o sistema terá carregado os parâmetros para serem preenchidos. Como vamos buscar os dados da requisição que estiver sendo feita no momento, vamos setar os parâmetros da seguinte maneira:
  • Clique no botão “…” na frente do parâmetro CODCOLIGADA_N
  • Será aberta uma tela de seleção do WorkFlow, selecione Fields, Item[0] e pressione F2, a opção ficará passível de edição, então vamos até o colchetes e iremos escrever o nome do campo que queremos puxar da visão do usuário, neste caso CODCOLIGADA e dê um ENTER.
  •  Após isto, clique em AsInteger (pois o CODCOLIGADA é do tipo inteiro).
  • A tela deverá ficar assim:
Parâmetros da SQL

Parâmetros da SQL

10. Repita o procedimento para todos os parâmetros, eles devem ficar  com o seguinte texto:
  • Activity=RMSWorkflow, Path=Fields.Item[“CODCOLIGADA”].AsInteger
  • Activity=RMSWorkflow, Path=Fields.Item[“IDPEDIDO”].AsInteger
  • Activity=RMSWorkflow, Path=Fields.Item[“IDPRJ”].AsInteger

11. Essa SQL pode gerar mais de uma linha de retorno, pois ela buscará, item a item da requisição, quem ultrapassou ou não 80% do consumo antes de enviar um e-mail, então temos que inserir um componente que seja responsável por percorrer todas as linhas da SQL.

Para tanto, selecione a aba Atividades e adicione abaixo do componente SQL o componente “Para cada Iteração”.

12. Temos que definir para este componente, quem fornecerá os registros para que ele atue, neste caso será a nossa consulta SQL. Clique no componente “Para cada Iteração”, vá em Propriedades e clique duas vezes no ícone amarelo da  “Lista de itens”.

Na tela que se abre, busque por rmsConsSQLActivity1, Tables[0] e selecione o componente Rows.

Componente "Para cada Iteração"

Componente “Para cada Iteração”

Feito isto, tudo o que for inserido dentro deste componente agora, será feito tantas vezes quanto forem os resultados da SQL.

13. Agora vamos adicionar as nossas condições ao sistema, ou seja, determinar quando será enviado o e-mail.

Vá na aba Atividades e selecione o componente “Se/Senão” dentro do componente “Para cada Iteração”, sua tela deve estar dessa maneira neste momento:

Tela antes das condições

Tela antes das condições

 

Dentro do ifElseBranchActivity1, vamos inserir as condições que desejamos.

Para tanto, selecione o lado esquerdo do ifElse, clique em “Propriedades”,  clique em Condition e depois em “Declarative Rule Condition”.

A propriedade permitirá a você abri-lá, você então poderá ver outra propriedade, chamada de “Condition Expression”, clique no botão logo a frente dela e depois em “New” e será aberta a seguinte tela:

Condition Rule

Condition Rule

 

A condição é escrita em linguagem similar ao C#, abaixo está o texto que deve ser adicionado a nossa condição:

this.rmsForEachActivity1.Fields["PERC"].AsString == "1"

Se você estudou a SQL viu que nela mesmo nós estamos retornando o valor 1 ou 0, sendo que 1 significa que o item chegou a 80% de consumo e 0 não.

Diversas vezes será mais fácil criar as verificações dentro da própria SQL do que no Condition Rule da fórmula Visual.

14. Agora vamos adicionar um componente de expressão que irá conter o texto do E-Mail. Adicione o componente Expressão dentro do ifElseBranchActivity1, clique em “Propriedades”, “Expressões” e digite um texto similar ao demonstrado abaixo:

'Prezado,' +NewLine + NewLine +
'O sistema TOTVS Gestão de Obras e Projetos constatou que um
insumo ultrapassou o limite de 80% de consumo: ' +NewLine+
'--- Projeto: '+rmsForEachActivity1.CODPRJ+' - '+rmsForEachActivity1.DESCRICAO+NewLine+NewLine+
rmsForEachActivity1.CODISM+' - '+rmsForEachActivity1.DESCISM +NewLine+
'--- Necessidade: '+rmsForEachActivity1.QTD_NECESS+NewLine+
'--- Pedido: '+rmsForEachActivity1.QTD_PEDIDA+NewLine+
'--- Extra: '+rmsForEachActivity1.QTD_EXTRA+NewLine

15. O próximo passo é enviar o e-mail.

Adicione um componente de “Envio de E-Mail” logo abaixo da expressão. Clique no mesmo e em propriedades e configure conforme desejar as propriedades:

  • Assunto –  Ex: [E-Mail Automático] Alerta de Curva ABC
  • Destinatários. O destinatário pode ser retornado via consulta SQL em um determinado usuário ou inserido manualmente, para fins de exemplo vamos inserir manualmente.  Ex: joao@silva.com.br
  • Destinatários em cópia / Destinatários em Cópia Oculta
  • Remetente (pode ser o usuário que está fazendo o pedido, a empresa (filial), a coligada e e-mail padrão do sistema).
  • Texto do E-mail: Clique no botão “…” e selecione rmsForEachActivity1, ifElseActivity1, ifElseBranchActivity1, rmsExpressionActivity1, Expression e clique em OK.
Componente de E-Mail

Componente de E-Mail

 

 

Para não termos problemas de formatação no texto de envio, vamos voltar ao componente rmsExpressionActivity1, clicar em “Valor Calculado” e apontar para o componente de envio de e-mail no campo “Body”.

Valor Calculado

Valor Calculado

16. Quase prontos! Sua fórmula Visual deve estar parecida com essa:

Fórmula Visual Finalizada

Fórmula Visual Finalizada

17. Falta agora somente adicionar o Gatilho, ou seja, o que faz a nossa fórmula funcionar!

Para tanto, salve a sua fórmula visual, clique sobre ela e depois sobre o ícone “Editar”, acesse a aba “Gatilhos” e clique em novo.

Na tela que se abre, vamos procurar o item “Antes da atualização do registro (Fim)” e a Action “Requisição de Material”.

Gatilho

Gatilho

Conclusão

Pronto! A fórmula visual está pronta, vamos testá-la. Lembre-se de que seu computador deve estar preparado para rodar fórmulas visuais, para confirmar isso, acesse o site http://totvsconnect.blogspot.com/2011/07/dicas-repositorio-de-formulas-visuais.html e verifique a configuração no final das fórmulas visuais, item 18.

Para testar a mesma, vamos fazer uma requisição de material de um determinado insumo e solicitar todo o seu quantitativo, um e-mail deverá ser enviado para o destinatário(s) cadastrado(s) na fórmula visual.

Abaixo o e-mail gerado com essa fórmula visual:

E-Mail

E-Mail

A Ethos Consultores conta com know-how para implementar diversas situações com fórmulas visuais, entre em contato conosco sempre que precisar!