Árvore de páginas

Carregando...

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Produto:

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

Linha de Produto:

Linha TOTVS CRM SFA

Módulo:Venda
Função:Pedido
Ticket:
Requisito/Story/Issue:

Jira
serverJIRA
serverId0c783de1-186e-383b-975c-a1acd7d76cb5
keyTSFAFSWE-4000

02. ESCOPO FUNCIONAL

02.01 Configuração de cota poder receber solicitações de cota passando por aprovação

...

Se houver registro de aprovação de pedido vinculada com registro de aprovação de cota, o sistema deverá replicar os status da aprovação e observações entre uma entidade e outra.

Caso a cota esteja com a flag "Solicitação exige aprovação?" desmarcada,

Um registro de movimento processado será criado para o controle de cota de destino, somando no saldo disponível da conta.

02.05 Solicitação de adição de saldo de cota por dentro do pedido

...

Ao abrir o pedido, caso não exista mais cota disponível para o item, visto que o movimento pode ter sido inativado, o sistema deverá exibir ícone de inconformidade com a validação: "Não há cota disponível para a quantidade solicitada"


03. ESCOPO TÉCNICO

Painel
borderColorlightgray

03.01.01.01 Migration estrutural referente à solicitação de cotas

Contexto / Gatilho:

  • Pelo tools, opção 3

Lógica:

  • O sistema deverá evoluir a tabela controlecotamovimento, com os seguintes campos:

    • datafimvigencia: date, nullable

  • O sistema deverá criar a tabela controlecotamovaprov, com os seguintes campos:
    • idcontrolecotamovaprov: PK
    • idpedido: FK para tabela pedido, nullable
    • idpedidoproduto: FK para tabela pedidoproduto, nullable
    • dataaprovacao: date, nullable
    • horaaprovacao: varchar(8), nullable
    • idtipoaprovacao: FK para tabela tipoaprovacao, nullable
    • idtiposituacaoaprovacao: FK para tabela tiposituacaoaprovacao, nullable
    • idusuarioaprovador: FK para tabela usuario, nullable
  • O sistema deverá criar a tabela obscontrolecotamovaprov, com os seguintes campos:
    • idobscontrolecotamovaprov: PK
    • idcontrolecotamovaprov: FK para tabela controlecotamovaprov, not null
    • observacao: varchar(4000), nullable
    • datacadastro: date, not null
    • horacadastro: varchar(8), not null
    • idusuario: FK para tabela usuario, not null
    • idtiposituacaoaprovacao: FK para tabela tiposituacaoaprovacao, not null
  • O sistema deverá criar índices, se não existem, na tabela controlecotamovaprov sobre os campos:
    • idpedido
    • idpedido e idtiposituacaoaprovacao
    • idpedido, quantidade e idtiposituacaoaprovacao
  • O sistema deverá criar índices, se não existem, na tabela obscontrolecotamovaprov sobre os campos:
    • idcontrolecotamovimento
Painel
borderColorlightgray

03.01.01.02 Migration de registros referente à solicitação de cotas

Contexto / Gatilho:

  • Pelo tools, opção 5

Lógica:

  • O sistema deverá inserir os seguintes registros na tabela tipoaprovacao:

    Sem Formato
    descricao: "Solicitação de saldo cota pelo pedido",
    sgltipoaprovacao: "SOLICITACAOSALDOCOTA"
    idnativo: 1 //Deve ser excluído da lógica da aprovação genérica da finalização do pedido, e ser somente utilizado na lógica da criação de aprovações de desconto
Painel
borderColorlightgray

03.01.01.02 Criar registros de configuração da modal de solicitação de descontos nas tabelas wsconfigentidade e wsconfigentidadecampo

Contexto / Gatilho:

  • Pelo tools, opção 18

Lógica:

  • O sistema deverá inserir os seguintes registros na tabela wsconfigentidade:

    Sem Formato
    entidade: solicitacaocota
  • O sistema deverá inserir os seguintes registros na tabela wsconfigentidadecampo, relacionados à tabela wsconfigentidade através do registro de chave solicitacaocota recém adicionado:

    Sem Formato
    campos:
    - cota: visível por padrão, editável por padrão, obrigatório por padrão
    - controlecota: visível por padrão, não editável por padrão, obrigatório por padrão
    - quantidade: visível por padrão, editável por padrão, obrigatório por padrão
    - observacao: visível por padrão, obrigatório por padrão, editável por padrão
    - datafimvigencia: visível por padrão, obrigatório por padrão, editável por padrão
Painel
borderColorlightgray

03.01.02 Criação de regras de perfil de acesso para solicitação de cotas

Contexto / Gatilho:

  • Pelo tools, opção 18

Lógica:

  • O sistema deverá inserir os seguintes registros na tabela regra:

    Sem Formato
    chave: regra.acesso.cadastro.venda.cota.movimentacao.solicitar,
    idregrasuperior: (select idregra from regra where chave = 'regra.acesso.cadastro.venda.cota.movimentacao')
Painel
borderColorlightgray

03.01.03 Adição de campos na tela de configuração de cota

Contexto / Gatilho:

  • Na aplicação Web, na tela de configuração de cota (Cadastro → Venda → Cota → Coluna "Configuração de cota")

Lógica:

  • O sistema deverá exibir os seguintes elementos visuais conforme o protótipo a seguir:

    Image Added
    • A seção deverá possuir os seguintes elementos visuais:
  • "Solicitação de saldo de cota": Título do grupo de elementos
  • "Defina o comportamento do sistema para que profissionais de operação possam solicitar adição de saldo de cota": subtítulo do grupo de elementos.
  • "Permitir solicitações de adição de saldo": Campo checkbox, desmarcado por padrão, editável
    • "Solicitação exige aprovação": Campo chechbox, marcado por padrão
      • O campo é editável somente se o campo "Permitir solicitações de adição de saldo" estiver marcado. Caso contrário, o campo não é editável.
    • "Horário limite para data entrega no mesmo dia da solicitação": Campo de input com máscara HH:mm, semelhante à tela de edição de atendimento Web.
      • O campo é editável somente se o campo "Permitir solicitações de adição de saldo" estiver marcado. Caso contrário, o campo não é editável.
  • Ao confirmar o formulário, as seguintes informações deverão ser persistidas em banco, segundo a seguinte lógica:

    Sem Formato
    "Permitir solicitações de adição de saldo": cotaconfiguracao.idnpermitesolicitacao (Valor 1 para checkbox marcada, 0 para desmarcada)
    "Solicitação exige aprovação": cotaconfiguracao.idnaprovacaosolicitacao (Valor 1 para checkbox marcada, 0 para desmarcada)
    "Horário limite para data entrega no mesmo dia da solicitação": cotaconfiguracao.horalimitesolicitacao (${HH:mm do formulário}:00)
Painel
borderColorlightgray

03.01.04 Modal de solicitação de cota no pedido

Contexto / Gatilho:

  • Na aplicação Web/Android, no pedido de venda, ao adicionar/atualizar um item de pedido de venda, refazendo a busca do cache de controles de cota.

Lógica:

  • Respeitando as validações existentes de estoque, caso o novo saldo de cota disponível buscado seja menor que a quantidade solicitada no item (pedidoproduto.quantidade)

    • Âncora
      inconformidade
      inconformidade
      O sistema deverá exibir ícone de inconformidade relacionado ao item em questão.
      • Quando clicado sobre o ícone, o sistema deverá exibir a seguinte mensagem: "A quantidade solicitada não está disponível para a cota ${cota.descricao}".
        • Caso o campo cotaconfiguracao.idnpermitesolicitacao = 1 para a cota vinculada ao controlecota vigente para o item.
          • Caso o usuário logado tenha perfil de acesso para solicitar movimentações de controles de cota

            Sem Formato
            count > 0 na tabela perfilacessoregra, onde idregra = (/* select idregra from regra where chave = 'regra.acesso.cadastro.venda.cota.movimentacao.solicitar' */)
            • O sistema deverá exibir botão de ação "Solicitar saldo".
              • Quando clicado sobre o botão, o sistema deverá exibir modal com os seguintes elementos visuais:
  • Grupo de elementos do formulário, sendo:
    • "Cota": Campo combobox, obrigatório, selecionado automaticamente com o registro vigente no item (pedidoproduto.idcontrolecota → controlecota.idcota → cota.descricao / cota.idcota)
      • Somente aparecerão como opções selecionáveis cotas cuja flag "Permite solicitações de adição de saldo?" estiver marcada (cotaconfiguracao.idnpermitesolicitacao = 1)

        • Caso o registro de cota vigente no objeto do item do pedido não esteja disponível nas opções selecionáveis, retornar a primeira opção, sem critério.
      • A visibilidade e edição deve estar condicionada aos valores do registro "cota" da tabela wsconfigentidadecampo referente à entidade "solicitacaocota"
    • "Controle de cota": campo de pesquisa, seleção única, não editável, obrigatório
      • O campo deverá ser preenchido automaticamente como opção o controlecota preenchido para o item do pedido (pedidoproduto.idcontrolecota)
        • Ao alterar o campo "Cota", o sistema deverá buscar novamente o registro de controle cota, respeitando a configuração do pedidoengine, para o cache de controles de cota, filtrando os registros por controlecota.idcota = ${opção selecionada no campo "Cota"}
      • A visibilidade deve estar condicionada aos valores do registro "controlecota" da tabela wsconfigentidadecampo referente à entidade "solicitacaocota"
    • "Quantidade solicitada": campo de input numérico, aceitando valores positivos fracionados, obrigatório preenchido automaticamente com o valor de acordo com a seguinte lógica de cálculo:

      Sem Formato
      valor preenchido automaticamente = quantidade solicitada (pedidoproduto.quantidade) - saldo disponível do controle de cota vigente (campo "Saldo cota")
      • A possibilidade de edição do campo deve estar condicionada aos valores do registro "quantidade" da tabela wsconfigentidadecampo referente à entidade "solicitacaocota"
    • "Observação": campo de área de texto, editável
      • A obrigatoriedade do campo deve estar condicionada aos valores do registro "observacao" da tabela wsconfigentidadecampo referente à entidade "solicitacaocota"
    • "Vencimento da solicitação":  campo de data.
      • A visibilidade, obrigatoriedade e possibilidade de edição do campo deve estar condicionada aos valores do registro "datafimvigencia" da tabela wsconfigentidadecampo referente à entidade "solicitacaocota"
  • Botões de ação, sendo:
    • "Cancelar": fecha a modal, rollback na aplicação da alteração de quantidade pela alteração/adição do produto ao carrinho.
    • "Confirmar": Quando clicado, dispara a seguinte lógica:
      • Persiste em memória um novo registro de controlecotamovimento (A persistência em banco de dados será feita juntamente com a gravação / finalização do pedido), com os campos:

        Sem Formato
        idnprocessado: 0
        idnativo: 1
        quantidade: Campo "Quantidade solicitada"
        datamovimento: current_date
        observacao: "Pedido ${pedido.numeropedido}: Saldo de cota adicional de ${controlecotamovimento.quantidade} solicitado de  no produto ${pedidoproduto.idproduto → produto.codigo || produto.descricao}. \n\n ${"Campo "Observacao"}"
        sglorigem: MSWEB se web / MSAND se android
        idpedido: null
        idpedidoproduto: null
        idcontrolecota: campo "Controle de cota"
        datainiciovigencia: current_date
        datafimvigencia: Campo "Vencimento da solicitação"
      • Âncora
        controlecotamovaprov
        controlecotamovaprov
        Persiste em memória um novo registro de controlecotamovaprov(A persistência em banco de dados será feita juntamente com a gravação / finalização do pedido), com os campos:

        Sem Formato
        idpedido: referencia do identificador do pedido em questão
        idpedidoproduto: referencia do identificador do item do pedido em questão
        dataaprovacao: null
        horaaprovacao: null
        idtipoaprovacao: /* select idtipoaprovacao where sgltipoaprovacao = 'SOLICITACAOSALDOCOTA' */
        idtiposituacaoaprovacao: /* select idtiposituacaoaprovacao from tiposituacaoaprovacao where sgltiposituacaoaprovacao = 'PD' */
        idusuarioaprovador: null
      • Persiste em memória um novo registro de obscontrolecotamovaprov, com os campos:

        Sem Formato
        idcontrolecotamovaprov: identificador de aprovação de movimento recém criada
        observacao: "Pedido ${pedido.numeropedido}: Saldo de cota adicional de ${controlecotamovimento.quantidade} solicitado para produto ${pedidoproduto.idproduto → produto.codigo || produto.descricao}. Quantidade: ${pedidoproduto.quantidade}. Preço original: ${pedidoproduto.precooriginal}. Preço venda: ${pedidoproduto.precovenda} \n\n ${Campo "Observacao"}"
        datacadastro: date, not null
        horacadastro: varchar(8), not null
        idusuario: FK para tabela usuario, not null
        idtiposituacaoaprovacao: FK para tabela tiposituacaoaprovacao, not null
Painel
borderColorlightgray

03.01.05 Lógicas de pedido relacionadas à solicitação de cota

Contexto / Gatilho:

  • Nos ambientes Web/Mobile, no pedido de venda

Lógica:

  • As validações existentes de saldo de cota precisam ser representadas não mais como rollback, mas conforme o modelo de ícone de inconformidade, para permitir a ação de troca da opção da coluna "Cota" no item do pedido, caso seja solicitada uma adição de saldo de cota em uma cota diferente da cota selecionada no item do pedido. Lógica descrita nesta seção 
  • Ao buscar os caches de cota,

    • O sistema deverá somar ao saldo disponível registros positivos de controlecotamovimento com sgltiposituacaoaprovacao in ("PD") e idnativo = 1 e idnprocessado = 0 e current_date <= datafimvigencia
      • O cálculo final do saldo disponível de cota será:
        • Saldo disponível = controlecota.saldodisponivel - SUM(controlecotamovimento.quantidade negativas, onde controlecotamovimento.idnativo = 1 e controlecotamovimento.idnprocessado = 0 ) + SUM(controlecotamovimento.quantidade positivas, onde sgltiposituacaoaprovacao in ("PD") e idnativo = 1 e idnprocessado = 0 e current_date <= datafimvigencia)
      • Ao identificar um item de pedido com controlecotamovaprov com status PENDENTE vinculado a um item, identificar com um ícone de alerta, para sinalizar que o pedido está indo para aprovação por causa daquele item.
  • Ao gravar o pedido, haverá a persistência do registro de controlecotamovimento, controlecotamovaprov e obscontrolecotamovaprov
  • Ao finalizar o pedido,

    • Caso o campo o campo pedidoentrega.dataentrega = current_date e o current_timestamp > cotaconfiguracao.horalimitesolicitacao
      • O sistema deverá bloquear a finalização (rollback) retornando a seguinte mensagem: "Horário limite atingido para entregas no mesmo dia que solicitações de adição de cota. Considere alterar a data de entrega."
    • Caso contrário,
      • Haverá a persistência do registro de pedidoaprovacao, caso exista algum controlecotamovaprov vinculado a algum item do pedido (controlecotamovaprov.idpedidoproduto) esteja em status pendente

        Sem Formato
        idpedido: referência do pedido em questão,
        idtipoaprovacao: SOLICITACAOSALDOCOTA,
        idtiposituacaoaprovacao: PENDENTE
        • Haverá também persistência de controlecotamovaprov, conforme regras de persistências desta seção, vinculado ao mesmo movimento de cota do registro de controlecotamovaprov pendente, com os respectivos idpedido e idpedidoproduto.
          • Para detalhar melhor a regra acima, esse é o caso de aproveitamento da mesma solicitação por outro pedido, ou para outro item do mesmo pedido, quando já existem registros de controlecotamovaprov no banco.
            • O usuário precisa acessar a tela de aprovação de movimentos, e poder identificar quais são os pedidos que estão dependendo desse movimento ser aprovado para serem aprovados por consequência
        • Haverá também persistência de observacaoaprovacao, contendo informações sobre as solicitações de desconto: "Saldo de cota adicional de ${controlecotamovimento.quantidade} solicitado para o produto ${pedidoproduto.idproduto → produto.codigo || produto.descricao}. Quantidade: ${pedidoproduto.quantidade}. Preço original: ${pedidoproduto.precooriginal}. Preço venda: ${pedidoproduto.precovenda} \n\n ${Campo "Observacao"}"

        • Caso algum registro de controlecotamovaprov esteja em status REPROVADO, o sistema deverá dar rollback na operação de finalização, exibindo mensagem: "Existem solicitações de cota reprovadas. Considere alterar a quantidade dos produtos: ${Relação de produtos vinculados à solicitações reprovadas}"
        • Caso não existam vinculações de controlecotamovaprov com pedidoproduto ou todos os registros de controlecotamovaprov estejam APROVADOS, o pedido não deverá ser encaminhado para aprovação com base nessa validação.
Painel
borderColorlightgray

03.01.06 Lógicas de aprovação relacionadas à solicitação de cota

Contexto / Gatilho:

  • Nos ambientes Web/Mobile, no contexto de aprovações de pedido de venda

Lógica:

  • Na modal de listagem de aprovações de pedido (pedidoaprovacao), na tela de observações de aprovação do tipoaprovacao SOLICITACAOSALDOCOTA
    • Deve constar botão "Visualizar movimentos"
      • Quando clicado,
        • Deverá exibir links com as descrições de quais são as cotas relacionadas às solicitações do pedido através da consulta a seguir:

          Sem Formato
          /* select c.descricao from cota c
          inner join controlecota cc on cc.idcota = c.idcota
          inner join controlecotamovimento ccm on ccm.idcontrolecota = cc.idcontrolecota
          inner join controlecotamovaprov ccma on ccma.idcontrolecotamovimento = ccm.idcontrolecotamovimento
          where ccma.idpedido = ?
          */
          • Clicando sobre o link, o sistema deverá redirecionar o usuário para listagem de movimentos de cota referente à cota selecionada, filtrando pelo pedido em questão, baseado no novo filtro de "Solicitado no pedido"
  • Ao aprovar o pedidoaprovacao vinculado ao tipoaprovacao SOLICITACAOSALDOCOTA,
    • O sistema deverá também realizar a atualização dos status de todos os controlecotamovaprov vinculados aos idcontrolecotamovimento vinculados ao idpedido do pedido em questão, adicionando uma observação: "Aprovado automaticamente pela aprovação do pedido ${Número do pedido}"
  • Ao reprovar o pedidoaprovacao vinculado ao tipoaprovacao SOLICITACAOSALDOCOTA,
    • O sistema deverá também realizar a atualização dos status de todos os controlecotamovaprov vinculados aos idcontrolecotamovimento vinculados ao idpedido em questão, adicionando uma observação: "Reprovado automaticamente pela reprovação do pedido ${Número do pedido}"
Painel
borderColorlightgray

03.01.07 Aprovação de movimento de cota

Contexto / Gatilho:

  • Na aplicação Web, nas telas de listagem de movimentos de cota (Cadastro → Venda → Cota → Botão editar → Botão Visualizar controles → Botão Visualizar movimentos)

Lógica:

  • Baseando-se de maneira semelhante ao fluxo de aprovação de pedidos, 
    • O sistema deve exibir coluna "Aprovações" exibindo os status de aprovações de descontos (controlecotamovaprov.idtiposituacaoaprovacao)
      • Ao clicar sobre o ícone, o sistema deve disponibilizar modal com a listagem de controlecotamovaprov vinculados àquele movimento, com botões para aprovar todos e reprovar todos, caso existam aprovações com status pendentes, como também ícone de visualizar observações
        • Na listagem de aprovações,
          • Deverão constar as colunas "Status" controlecotamovaprov.idtiposituacaoaprovacao → tiposituacaoaprovacao.descricao", "Pedido" ${controlecotamovaprov.idpedido → pedido.numeropedido} e "Produto" ${controlecotamovaprov.idpedidoproduto → produto.codigo || produto.descricao} 
        • No caso da aprovação / reprovação de movimentos, somente será possível fazer  a aprovação / reprovação geral de todas as controlecotamovaprov, e não individualmente, como é o pedidoaprovacao.
        • Ao clicar sobre os botões aprovar ou reprovar, o sistema deverá fazer a alteração dos status do campo controlecotamovaprov.idtiposituacaoaprovacao para AP ou RP respectivamente.
          • Adicionar observação ao registro de observacaoaprovacao do pedidoaprovacao vinculado ao pedido do controlecotamovaprov, com a mensagem: "Solicitação de saldo de cota adicional de ${controlecotamovimento.quantidade} para o produto ${pedidoproduto.idproduto → produto.codigo || produto.descricao} aprovada / reprovada" 
          • Ao aprovar todos,
            • O sistema deverá realizar o processamento do controlecotamovimento (atualizar o idnprocessado = 1) e somar o saldo processado no controlecota.saldodisponivel, como acontece quando existe um processamento manual pela aplicação, na tela de movimentos de cota.
            • O sistema deve verificar se todas as solicitações de movimentações de cota (controlecotamovaprov) relacionadas aos pedidos dos registros atualizados estão aprovadas. Caso estejam,
              • O sistema deve atualizar os registros de pedidoaprovacao vinculados aos pedidos dos registros atualizados, vinculado ao tipoaprovacao SOLICITACAOSALDOCOTA para aprovado AP.
              • Nesse caso, adicionar observação "Aprovado automaticamente devido à todas as solicitações de saldo de cota terem sido aprovadas"
            • Ao reprovar todos, 
              • O sistema deve atualizar o registro de pedidoaprovacao vinculados aos pedidos dos registros atualizados, vinculado ao tipoaprovacao SOLICITACAOSALDOCOTA para reprovado RP.
              • Nesse caso, adicionar observação "Reprovado automaticamente devido às reprovação de solicitações de saldo de cota"
        • Ao clicar sobre o botão de observações, o sistema deve exibir modal com os registros da tabela obscontrolecotamovaprov
  • Os registros criados diretamente pela tela cadastral de movimentos devem continuar sendo criados sem a necessidade de passar por aprovação.
Painel
borderColorlightgray

03.01.08
Âncora
filtropedido
filtropedido
Filtragem de movimentos pendentes de aprovação

Contexto / Gatilho:

  • Na aplicação Web, nas telas de listagem de movimentos de cota (Cadastro → Venda → Cota → Botão editar → Botão Visualizar controles → Botão Visualizar movimentos)

Lógica:

  • Deve haver filtros novos na pesquisa avançada de descontos, sendo eles:
    • "Status aprovação": campo pesquisa, múltipla seleção
      • As opções listadas no campo serão:

        /* select * from tiposituacaoaprovacao where idnativo = 1 */
      • Filtrando por movimentos relacionados à controlecotamovaprov.idtiposituacaoaprovacao in (?)
    • "Pedido": campo pesquisa, múltipla seleção,
      • listando pedidos, podendo ser pesquisados por numeropedido
      • Filtrando por movimentos cuja aprovação está vinculada aos pedidos filtrados ou movimentos relacionados aos pedidos filtrados (controlecotamovaprov.idpedido in (?) OR controlecotamovimento.idpedido in (?))