Árvore de páginas

01. DADOS GERAIS


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:

TSFAFSWE-4005 - Obtendo detalhes do item... STATUS

02. ESCOPO FUNCIONAL

  • Na tela de cadastro de desconto, na aba de preço de venda, o sistema deve disponibilizar botão para abrir modal de oferta.
    • Tela cadastral de ofertas vinculadas com desconto, solicitando informações:
      • Exibir como oferta? Campo Switch Sim/Não.
      • Percentual da oferta ou valor da oferta (dependendo do modelo de faixa)
        • O campo poderá apenas ser informado com valores entre a faixa inicial e final informada no desconto
      • Quantidade da oferta: campo numérico
        • O campo poderá apenas ser informado com valores entre a faixa de quantidade inicial e de quantidade final informada no desconto, se faixas informadas
  • O sistema deverá descontinuar a tela de cadastro de ofertas via tabela de preço, visto que as ofertas devem estar de acordo com uma política de desconto vigente.
  • No pedido de venda, ao buscar ofertas, além de buscar em produtoconfigvenda sem vínculos com desconto, como atualmente (respeito ao legado), o sistema deverá buscar os registros de desconto que estão com campo iddesconto not null, desconsiderando os filtros referentes à grid de produtos, segundo os mesmos níveis de desconto (colunas deverão ser equiparadas), passando o idproduto como o produto da grid.
  • Ao selecionar uma oferta, o sistema deve inserir o valor (preçovenda - descontos), quantidade, e todos os outros registros editáveis pela grid (acho que embalagem, lote) (tem que mostrar na oferta esses campos)
    • Se o produto já estiver no pedido, e parâmetro múltiplos skus inativo, o sistema deverá confirmar alteração do produto atual do carrinho. Se sim, o sistema deverá alterar o produto do carrinho com campos da oferta.

O protótipo do cadastro de ofertas vinculado a descontos pode ser acessado pelo seguinte link: https://www.figma.com/proto/dftygcLkxSdam64Vf0SXAp/Descontos-como-ofertas?node-id=0-1&t=euV1Gec2P9tYav2e-1

03. ESCOPO TÉCNICO

03.01.01.01 Criação de campos no banco de dados

Contexto / Gatilho:

  • Pelo tools, opção 3, 

Lógica:

  • O sistema deverá adicionar os seguintes campos na tabela desconto

    idnexibiroferta: byte, default 0
    descontooferta: decimal 18,6, nullable
    quantidadeoferta: decimal 18,6, nullable

03.01.01.02 Criação de registro no banco de dados

Contexto / Gatilho:

  • Pelo tools, opção 5

Lógica:

  • O sistema deverá adicionar o seguinte registro na tabela parametro

    INSERT INTO public.parametro (idnativo,chave,descricao,observacao,valor)
    	VALUES (1,'sim3g.cadastro.tabelapreco.produto.exibeoferta','Parâmetro que define se a opção de cadastro de oferta será exibido no cadastro de itens de tabela de preço','Quando marcado como 1, exibirá coluna "Oferta" na tela de cadastro de itens de tabela de preço. Caso contário, não exibirá a coluna.','0');

03.01.02 Modal de cadastro de desconto como oferta na grid de descontos

Contexto / Gatilho:

  • No ambiente Web, na tela de cadastro de descontos (Cadastro → Venda → Desconto), exclusivamente na aba de "Preço venda".

Lógica:

  • O sistema deverá exibir nova coluna com ícone de oferta https://icons8.com.br/icon/set/discount/family-material–static


    • O botão somente deve aparecer (ou ser clicável) quando o registro se tratar de um desconto.
      • Não deve ser exibido para acréscimos.
    • Ao clicar sobre o botão, o sistema deverá exibir modal conforme o protótipo vinculado à documentação
      • A modal deverá conter os seguintes elementos visuais:
  • "Exibir o desconto como oferta?": título da modal
  • "Quando marcado, o sistema irá exibir os produtos referentes à regra de desconto na aba “Oferta” do pedido de venda.": Subtítulo da modal
  • Botão de ativar o desconto como oferta: Botão do tipo Switch (pode ser checkbox também, se complexo)
    • Quando marcado, deverá exibir os campos "${Percentual / Valor} de desconto da oferta" e "Quantidade da oferta"
    • Caso contrário, deverá ocultar os referidos campos
  • "${Percentual / Valor} de desconto da oferta": Campo de entrada (input) numérico, aceitando valores monetários
    • O campo de entrada deverá respeitar parâmetros de arredondamento / quantidade de casas para valores monetários QTD_CASAS_DECIMAIS_MONETARIO / MODO_ARREDONDAMENTO_MONETARIO)
    • A label do campo deve ser renderizada de maneira dinâmica com base no valor do campo desconto.modeloaplicacao.
      • Se 'perc', a label deverá ser: "Percentual de desconto da oferta"
      • Se 'val', a label deverá ser: "Valor de desconto da oferta"
  • "Quantidade da oferta": Campo de entrada (input) numérico, aceitando valores numéricos fracionados
    • O campo de entrada deverá respeitar parâmetros de arredondamento / quantidade de casas para valores de quantidade fracionada QTD_CASAS_DECIMAIS_QUANTIDADE_FRACIONADA / MODO_ARREDONDAMENTO_QUANTIDADE)
  • "Cancelar": Botão que, quando clicado, fecha a modal.
  • "Confirmar": Botão que, quando clicado,
    • O sistema deverá persistir os valores da tela nos seguintes campos do banco de dados:

      Botão de ativar o desconto como oferta -> desconto.idnexibiroferta
      	Se marcado, persistir 1
      	Se desmarcado, persistir 0
      "${Percentual / Valor} de desconto da oferta" -> desconto.descontooferta
      "Quantidade da oferta" -> desconto.quantidadeoferta
    • Após a persistência, o sistema deve marcar um alerta no botão gravar da grid, exigindo que o usuário faça a gravação das informações preenchidas na modal.
      • Semelhante ao processo de quanto existe uma alteração de um valor na grid, ainda não gravado

03.01.03 Descontinuação da funcionalidade de ofertas no contexto de itens de tabela de preço

Contexto / Gatilho:

  • No ambiente Web, na tela de cadastro de tabelas de preço (Cadastro → Venda → Tabelas de preço), na aba "Produtos"

Lógica:

  • O sistema deverá consultar o campo parametro.valor do parâmetro de parametro.chave = "sim3g.cadastro.tabelapreco.produto.exibeoferta"

    • Se o valor encontrado por 1,
      • O sistema deverá exibir a coluna "Oferta" na grid de produtos da tabela de preço.
    • Caso contrário,
      • O sistema não deverá exibir a coluna "Oferta" na grid de produtos da tabela de preço.


03.01.04 Exibição de produtos em oferta no pedido de venda

Contexto / Gatilho:

  • Nos ambientes Web e Mobile, na tela de pedidos de venda, no carregamento de cache de produtos

Lógica:

  • A partir do cache de descontos de preço de venda carregados somente com filtros de dados informados no cabeçalho, ou seja, filtrando somente as informações de:

    Segmento
    Filial
    Região
    Unidade federativa
    Profissional
    Grupo de clientes
    Cliente
    Local
    Tipologia
    Produto
    Tabela preço
    Condição de pagamento
    Perfil de acesso
    Grupo usuário
    Tipo de pedido (selecionado no cabeçalho)
    Cidade
    Classificação parceiro
    Tipo frete
    • O sistema deverá realizar a filtragem desses registros de desconto, filtrando apenas os que foram marcados como desconto.idnexibiroferta = 1
    • Com esses registros em memória, o sistema deverá projetar quais são os produtos que estarão em oferta
      • Para isso, o sistema deverá realizar a projeção desse desconto para os campos desconto.idproduto ou classedescontovinculo.idproduto, quando informados.
        • Se idproduto não tiver sido preenchido, projetar idproduto com base na idgrupoproduto preenchido, em desconto.idgrupoproduto ou classedescontovinculo.idgrupoproduto. A tabela de projeção será a tabela produtogrupoproduto
          • Se idproduto não tiver sido preenchido, projetar idproduto com base na idtipoproduto preenchido, em desconto.idtipoproduto ou classedescontovinculo.idtipoproduto. A tabela de projeção será a tabela produtotipoproduto
          • Se idproduto não tiver sido preenchido, projetar idproduto com base na idlinha preenchida, em desconto.idlinha ou classedescontovinculo.idlinha. A tabela de projeção será a tabela linhaproduto
          • Para casos em que nenhuma dessas informações foi definida, o sistema deverá exibir todos os produtos vendáveis (cache de produtos) como oferta. 
    • Ao fim do processo de projeção, se deseja ter as seguintes informações em memória:
      • [{
        	"idproduto": 1, -- produto projetado pelas consultas anteriores
        	"desconto.iddesconto": 12652,
        	"desconto.descricao": "Promoção mês Abril", -- Descrição do registro de desconto
        	"classedesconto.descricao": "Grupo produto Sorvetes" -- Descrição do registro de classe de desconto
        	"desconto.descontooferta": 10, -- Valor do desconto, seja ele em percentual ou valor
        	"desconto.modeloaplicacao": "perc" -- Modelo de aplicação do desconto, em percentual ou valor
        	"desconto.quantidadeoferta": 4 -- Quantidade associada ao desconto
        },{
        	"idproduto": 2,
         	"desconto.iddesconto": 12653, 
        	"desconto.descricao": "Promoção mês Abril",
        	"classedesconto.descricao": "Grupo produto Sorvetes",
        	"desconto.descontooferta": 3,
        	"desconto.modeloaplicacao": "val"
        	"desconto.quantidadeoferta: 2
        },
        ...
        ]
      • Com esse cache de ofertas vindos de desconto, o sistema poderá exibir os produtos em questão na aba ofeta
        • Caso sejam encontrados 2 registros para o mesmo produto, o sistema deverá realizar a mesma priorização que o pedido já possui, sendo:
          • Aplicar o menor desconto de modelo "val" (Valor)
          • Se não, aplicar o menor desconto de modelo "perc" (Percentual)
        • A lógica de exibição dos produtos na aba oferta ocorrerá de maneira semelhante ao que acontece atualmente com a tabela produtoconfigvenda, com o seguinte critério comparativo:

          Coluna na tabela produtoconfigvenda (idnoferta = 1)Coluna no objeto em memória
          descricaoclassedesconto.descricao + " " + desconto.descricao
          quantidadesugestaodesconto.quantidadeoferta
          valordescontoofertadesconto.descontooferta, onde desconto.modeloaplicacao = 'val'
          percentualdescontoofertadesconto.descontooferta, onde desconto.modeloaplicacao = 'perc'
      • O cache de produtos em oferta a partir de desconto será alterado toda a vez que o cache de descontos de cabeçalho também for alterado.
      • Deve ser aplicada paginação no cache de ofertas, se possível


03.01.05 Processo de adição de produtos em oferta

Contexto / Gatilho:

  • Nos ambientes Web e Mobile, quando o usuário clicar em adicionar um ou mais produtos a partir da aba de oferta

Lógica:

  • O sistema deverá verificar se irá inserir nova linha de item de pedido ou atualizar linhas existentes.

    • Se já existirem produtos no carrinho e o parâmetro HABILITAR_INCLUSAO_PRODUTO_DUPLICADO estiver inativo,
      • O sistema deverá exibir mensagem de confirmação: "Um ou mais produtos já estão adicionados no carrinho e terão suas informações atualizadas com as regras da oferta. Deseja continuar?" Opções Sim / Não.
        • Se "Sim", o sistema deverá realizar a sobrescrita dos valores específicos do contexto de item vindos da oferta, sendo: Produto, Quantidade, % Desconto (se modeloaplicacao = 'perc'), R$ Desconto (se modeloaplicacao = 'val'), Embalagem, Tipo estoque, Lote.

        • Se "Não", o sistema deverá realizar rollback da ação, não executando nada.
    • Caso contrário,
      • O sistema deverá inserir nova linha de item de pedido com as seguintes informações específicas do contexto de item vindos da oferta, sendo: Produto, Quantidade, % Desconto (se modeloaplicacao = 'perc'), R$ Desconto (se modeloaplicacao = 'val'), Embalagem, Tipo estoque, Lote.
  • As  informações atualizadas / inseridas poderão ser projetadas a partir da seguinte lógica:

    Produto: cache_oferta.idproduto
    Quantidade: cache_oferta.quantidadedesconto. Se não for informado, respeitar a quantidade padrão inserida pela aplicação (quantidadeapresentacao, fatorembalagem, idnrequerqtdmultipla ...)
    % Desconto: cache_oferta.descontooferta, caso cache_oferta.modeloaplicacao = 'perc'
    R$ Desconto: cache_oferta.descontooferta, caso cache_oferta.modeloaplicacao = 'val'
    • Para os campos "Embalagem", "Tipo estoque" e "Lote", que são campos inseridos no contexto de item, e podem servir para a busca de descontos, o sistema deve inserir, partindo do cache de produtos, a primeira combinação desses campos em que o desconto é encontrado. Por exemplo:

      Se Para o produto 300, o cache está assim:
      {
      	"EMBALAGENS": [
      		{
      			"idembalagem": 1,
      		},
      	  	{
      			"idembalagem": 2,
      		} 
      	],
      	"TIPOESTOQUES": [
      		{
      			"idtipoestoque": 4
      		},
      		{
      			"idtipoestoque": 5
      		}
      	],
      	"LOTES": [
      		{
      			"idlote": 8
      		}
      	]
      }
      
      O sistema deve tentar utilizar as combinações entre os campos do cache na busca do desconto (respeitando os níveis do pedidoengine) vinculado à oferta, sendo:
      [1,4,8]
      [1,5,8]
      [2,4,8]
      [2,5,8]
      
      Quando um registro respeitar a regra de busca, o sistema deve inserir o item com esses respectivos valores e interromper o loop da busca.
      • Se o sistema não conseguiu encontrar o desconto a partir dos campos do cache do produto, o sistema deve retornar o erro: "A oferta não pode ser aplicada pois as opções dos campos ${Embalagem , Tipo estoque ou Lote} não respeitam a regra da política de desconto" e executar rollback na ação de inserção do produto da oferta.
  • Sem rótulos