Árvore de páginas

01. DADOS GERAIS

Produto:

TOTVS CRM Automação da Força de Vendas

Linha de Produto:

Linha TOTVS CRM

ERPs impactados:Protheus, Datasul e ERPs terceiros
Módulo:Venda
Função:Pedido
Ambiente:Web/Android
Ticket:16271428
Requisito/Story/Issue:

DTSFAPD-1875 - Obtendo detalhes do item... STATUS

02. ESCOPO FUNCIONAL

Cadastro de validações lógicas

Na versão atual do TOTVS SFA, no módulo de "Venda", não existe a possibilidade de criar uma validação lógica customizada, de acordo com os capos disponíveis no pedido.

Para isso será disponibilizado uma nova configuração chamada "Validações lógicas" dentro de: Configuração → Configuração pedido.
Esta nova opção, irá permitir criar uma lógica customizada, onde terá o seguinte fluxo:

  1. Gatilho: Será a ação que o usuário irá realizar em tela que fara com que a lógica construida seja executada.
    1. Exemplos de gatilhos: Alteração de campo do cabeçalho; Alteração de item no carrinho; Finalização do pedido...
  2. Lógica: Conjundo de operações lógicas (AND, OR, EQUALS, NOT EQUALS...) que será construida para se obter um resultado verdadeiro/falso.
    1. Exemplos de lógicas: Valor total pedido <= 100 AND Condição de Pagamento = "30/60/90" → Retorno verdadeiro/falso
  3. Retorno: A lógica construída sempre terá um retorno verdadeiro ou falso, com poderá ser expecificado qual tipo de retorno o usuário reberá, tanto para resultado verdadeiro quanto para resultado falso
    1. Exemplo de retorno Verdadeiro: Mensagem para o usuário; Mensagem para usuário/Impedir Finalização do pedido...
    2. Exemplo de retorno Falso: Mensagem para o usuário; Mensagem para usuário/Impedir Finalização do pedido...

Segue um exemplo de cadastro de uma validação lógica na "Imagem 01":

Imagem 01

Com isso, será possível customizar validações durante a confecção do pedido, permitindo ter mais autonomia em regras de negócio específicas.

03. ESCOPO TÉCNICO

Para a construção das lógicas, está sendo sugerido o plugin: https://querybuilder.js.org/index.html

Nova tabela
validacaoLogica {
     idValidacaoLogica: type="long", value="seqPkValidacaoLogica",
     descricao: type="String", length="80" not-null="true",
     idnAtivo: type="byte", not-null="true",
     sglGatilho: type="String", length="80" not-null="true",
     sglGatilhoCampo: type="String", length="80" not-null="false",
     logica: type="byte[]", not-null="true",
     sglRetornoVerdadeiro: type="String", length="80" not-null="true",
     retornoVerdadeiro: type="byte[]", not-null="false",
     sglRetornoFalso: type="String", length="80" not-null="true",
     retornoFalso: type="byte[]", not-null="false",
     codigoERP: type="String", length="80" not-null="true",
     wsVersao: type="long", update="false" insert="false"
}
Valores de sglGatilho / sglGatilhoCampo

ALT_CAB {
     label= "Alteração do cabeçalho";
     campo= {
          TODOS("Todos"),
          PARCEIRO("Parceiro"),
          LOCAL("Local"),
          PROFISSIONAL("Profissional"),
          ...
     }     
},

ALT_ITEM {
     label= "Alteração do item";
     campo= {
          TODOS("Todos"),
          PRODUTO("Produto"),
          QUANTIDADE("Quantidade"),
          PRECO_VENDA("Preço de venda"),
          ...
     }
},

GRAVAR {
     label= "Gravar";
     campo= {}
},

FINALIZAR {
     label= "Finalizar";
     campo= {}
},

Campos que serão utilizados para construção da lógica
CAB_PARCEIRO(
     label="Cabeçalho parceiro",
     tipo="ENTIDADE"
),
CAB_LOCAL(
     label="Cabeçalho local",
     tipo="ENTIDADE"
),
CAB_LOCAL_FILIAL(
     label="Cabeçalho filial",
     tipo="ENTIDADE"
),
CAB_PROFISSIONAL(
     label="Cabeçalho profissional"
     tipo="ENTIDADE"
),
CAB_TIPO_PEDIDO(
     label="Cabeçalho tipo pedido"
     tipo="ENTIDADE"
),
CAB_COND_PGTO(
     label="Cabeçalho condição de pagamento"
     tipo="ENTIDADE"
),
CAB_TAB_PRECO(
     label="Cabeçalho tabela de preço"
     tipo="ENTIDADE"
),
CAB_TIPO_ESTOQUE(
     label="Cabeçalho tipo estoque"
     tipo="ENTIDADE"
),
ITEM_DESCRICAO(
     label="Produto descricao",
     tipo="STRING"
),
ITEM_QUANTIDADE(
     label="Produto quantidade",
     tipo="DECIMAL"
),
ITEM_QUANTIDADE_EMB(
     label="Produto quantidade embalagem",
     tipo="DECIMAL"
),
ITEM_ESTOQUE(
     label="Produto estoque",
     tipo="DECIMAL"
),
ITEM_PRECO_TABELA(
     label="Produto preço tabela",
     tipo="DECIMAL"
),
ITEM_PRECO_VENDA(
     label="Produto preço venda",
     tipo="DECIMAL"
),
ITEM_PERC_DESCONTO(
     label="Produto percentual desconto",
     tipo="DECIMAL"
),
ITEM_VAL_DESCONTO(
     label="Produto valor desconto",
     tipo="DECIMAL"
),


RSM_TOT_BRU(
     label="Resumo valor total bruto",
     tipo="DECIMAL"
),
RSM_TOT_LIQ(
     label="Resumo valor total líquido",
     tipo="DECIMAL"
),
RSM_TOT_IMP(
     label="Resumo valor total com impostos",
     tipo="DECIMAL"
),
RSM_PERC_DESC(
     label="Resumo percentual total desconto",
     tipo="DECIMAL"
),
RSM_VAL_DESC(
     label="Resumo valor total desconto",
     tipo="DECIMAL"
),
RSM_QTDE_PROD(
     label="Resumo quantidade de produtos",
     tipo="DECIMAL"
),
RSM_QTDE_EMB(
     label="Resumo quantidade de embalagens",
     tipo="DECIMAL"
),


Exemplo de JSON gerado pelo plugin (validacaoLogica.logica)
{
  "condition": "AND",
  "rules": [
    {
      "id": "name",
      "field": "name",
      "type": "string",
      "input": "text",
      "operator": "equal",
      "value": "Mistic"
    },
    {
      "condition": "OR",
      "rules": [
        {
          "id": "category",
          "field": "category",
          "type": "integer",
          "input": "checkbox",
          "operator": "in",
          "value": [
            1,
            2
          ]
        },
        {
          "id": "in_stock",
          "field": "in_stock",
          "type": "integer",
          "input": "radio",
          "operator": "equal",
          "value": 0
        }
      ],
      "not": false
    }
  ],
  "not": false,
  "valid": true
}
Valores de sglRetornoVerdadeiro / sglRetornoFalso

NONE ("Nenhuma ação"),

MSG_TEMP ("Mensagem temporária"),

MSG_CONF ("Mensagem confirmação"),

MSG_BLQ_GRA ("Mensagem de bloqueio ao Gravar"),

MSG_BLQ_FIN ("Mensagem de bloqueio ao Finalizar"),

MSG_APROV ("Mensagem de envio para aprovação"),

Exemplo de retornoVerdadeiro / retornoFalso (TextArea)

Este campo será preenchido de forma semelhante ao "Envio de email" que temos hoje,
onde em um campo do tipo TextArea será possível colocar texto fixo e "chaves"
que serão substituídas por valores do pedido.

Exemplos de chaves:
[CAB_PARCEIRO], [CAB_LOCAL], [ITEM_PRODUTO], [ITEM_QUANTIDADE]...
Exemplos de retorno:
Não é possivel finalizar o pedido para o local: [CAB_LOCAL]
 Produto com quantidade menor que o minimo esperado: [ITEM_QUANTIDADE]
  • Sem rótulos