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: |
Atualmente,
Pela tela de Cadastro → Venda → Desconto,
O sistema permite que todo o tipo de desconto seja cadastrado na mesma tela, e por consequência, armazenado na mesma tabela em banco de dados.
Essa característica produz algumas dificuldades de usabilidade, sendo elas:
- Não é usual identificar e filtrar todos os descontos com o mesmo perfil de variação, visto que todos os registros são exibidos de uma só vez
- Ao cadastrar um conjunto de registros de descontos que necessitem receber o mesmo filtro por alguma entidade, é necessário cadastrar em todos os registros o filtro em questão, não é possível cadastrar de uma só vez, de maneira múltipla.
- Não é possível atualmente cadastrar somente um desconto que será vinculado com múltiplos registros de outra entidade, devido à estrutura de ligação entre desconto e outras entidades é 1x1. Dessa forma, caso seja necessário criar uma política de desconto com 3 tabelas de preço específicas, é necessário realizar a criação de três registros de desconto idênticos, variando apenas as tabelas de preço vinculadas.
Agora,
No ambiente Web, abaixo do menu Cadastro → Venda,
O sistema deve possuir uma tela de cadastros para Classes de desconto/acréscimo, de forma a agrupar registros de desconto de determinado perfil.
A criação desta nova entidade tem como pretensão resolver as dificuldades citadas, das seguintes formas
- A nova entidade poderá servir de filtro para abertura da tela de descontos da mesma classe, com a intenção de facilitar a organização da manutenção de registros de desconto
- O usuário poderá informar filtros vinculados à classe de descontos, que poderão ser herdados por todos os registros de desconto, se devidamente configurados em Configuração → Configuração pedido → Busca Produto → DESCONTO.
- A nova entidade poderá servir de maneira para vinculação do desconto com múltiplos registros de outra entidade, com estrutura de ligação NxN, ou seja, aproveitando o exemplo anterior, haverá a possibilidade de que o mesmo registro de descontos seja vinculado com as 3 tabelas de preço específicas, uma vez que elas podem ser vinculadas com a classe de descontos vinculado ao desconto
Ainda, a nova entidade poderá receber cadastro de valor numérico inteiro para determinar a ordem de cálculo dos descontos, caso exista um modelo de múltiplos descontos em que a ordem de cálculo de descontos influencie no preço final calculado. O épico referente à associação de múltiplos descontos pode ser acessada por este link
03. ESCOPO TÉCNICO
Contexto / Gatilho:
Lógica:
Criação de tabela classedesconto, com os seguintes campos
idclassedesconto: pk idnativo: byte, default 1, not-null descricao: string(200), not-null codigo: string(20), not-null ordemaplicacao: integer, not-null codigoerp wsversao
Contexto / Gatilho:
Lógica:
Criação de registro na tabela classedesconto, sendo:
idclassedesconto: nextval('seqpkclassedesconto') idnativo: 1 descricao: Padrão codigo: PAD ordemaplicacao: 1 codigoerp: null
Contexto / Gatilho:
Lógica:
Criação de coluna idclassedesconto na tabela desconto, sendo:
idclassedesconto: integer, nullable, fk para tabela
Contexto / Gatilho:
Lógica:
Realização do seguinte script de atualização:
/* update desconto set idclassedesconto = (select idclassedesconto from classedesconto where codigo = 'PAD') where idclassedesconto is null */
Contexto / Gatilho:
Lógica:
Criação da tabela classedescontovinculo, com os seguintes campos
idclassedescontovinculo: pk idsegmento: fk para tabela segmento idfilial: fk para tabela filial idregiao: fk para tabela regiao idUnidadefederativa: fk para tabela Unidadefederativa idusuario: fk para tabela usuario idGrupoparceiro: fk para tabela Grupoparceiro idparceiro: fk para tabela parceiro idlocal: fk para tabela local idTipologia: fk para tabela Tipologia idGrupoproduto: fk para tabela Grupoproduto idProduto: fk para tabela Produto idTabelapreco: fk para tabela Tabelapreco idCondicaopagamento: fk para tabela Condicaopagamento idPerfilacesso: fk para tabela Perfilacesso idGrupousuario: fk para tabela Grupousuario idTipopedido: fk para tabela Tipopedido idEmbalagem: fk para tabela Embalagem idTipoproduto: fk para tabela Tipoproduto idCidade: fk para tabela Cidade idClassificacaoparceiro: fk para tabela Classificacaoparceiro idLinha: fk para tabela Linha idTipofrete: fk para tabela Tipofrete idTipoestoque: fk para tabela Tipoestoque idFaixavidautil: fk para tabela Faixavidautil idLote: fk para tabela Lote
Contexto / Gatilho:
Lógica:
O sistema deverá realizar a criação de uma opção de menu de nome "Classe de desconto".
- SlickGrid contendo as seguintes colunas:
- "Classes de desconto": Título da página
- "Descrição": Campo texto, editável, representando o valor da coluna classedesconto.descricao
- "Código": Campo texto, editável representando o valor da coluna classedesconto.codigo
- "Situação": Texto, editável exibindo Ativo/Inativo quando o campo classedesconto.idnativo estiver com respectivos valores 1/0. Ao editar o campo, o tipo do campo vira check-box marcada/desmarcada quando o campo classedesconto.idnativo estiver com respectivos valores 1/0
- : botão "Vínculos" que, quando clicado, enviará o usuário para a tela de vínculos de classe de desconto.
: ícone "Ordem de aplicação" que ao clicado e arrastado (drag), possibilita a alteração de ordenação entre os registros de classe de desconto, ordenação essa administrada pelo campo classedesconto.ordemaplicacao- A grid deverá ter recurso de adicionar novo registro, disponibilizando botão "Adicionar" que, quando clicado, adicionará nova linha na grid, para que os campos sejam preenchidos e o registro preenchido ao clicar em "Gravar".
- Caso o usuário deseje cancelar a alteração do registro adicionado, ou a alteração de um registro não gravado, poderá clicar em botão "Cancelar alteração"
- A pesquisa rápida deve considerar os campos classedesconto.descricao e classedesconto.codigo
- A pesquisa avançada deverá disponibilizar os seguintes campos:
- "Descrição": campo texto.
- Quando preenchido buscará pelo campo classedesconto.descricao
- "Código": campo texto
- Quando preenchido buscará pelo campo classedesconto.codigo
- "Situação": campos check-box com opções:
- "Ativo": Marcado por padrão. Quando marcado, filtra registros de credencial onde o campo credencial.idnativo = 1
- "Inativo": Desmarcado por padrão. Quando marcado, filtra registros de credencial onde o campo credencial.idnativo = 0
Contexto / Gatilho:
Lógica:
- "Vinculos da classe de desconto": Título da página
- ${Descrição da classe de desconto}: Sub-título da página
- SlickGrid contendo as seguintes colunas:
- Check-box para seleção, para que se possa realizar a deleção massiva de registros através do botão "Remover selecionados"
- "Segmento": Campo de pesquisa, editável, pesquisando registros ativos da entidade segmento, possibilitando a seleção de múltiplos registros
- O valor do campo ser exibido a partir do campo classedescontovinculo.idsegmento
- "Filial": Campo de pesquisa, editável, pesquisando registros ativos da entidade local, filtrados como tipolocal UEM, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idtipolocal
- "Região": Campo de pesquisa, editável, pesquisando registros ativos da entidade regiao, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idregiao
- "Unidade federativa": Campo de pesquisa, editável, pesquisando registros ativos da entidade unidadefederativa, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idunidadefederativa
- "Profissional": Campo de pesquisa, editável, pesquisando registros ativos da entidade usuario, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idusuario
- "Grupo de clientes": Campo de pesquisa, editável, pesquisando registros ativos da entidade grupoparceiro, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idgrupoparceiro
- "Cliente": Campo de pesquisa, editável, pesquisando registros ativos da entidade parceiro, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idparceiro
- "Local": Campo de pesquisa, editável, pesquisando registros ativos da entidade local, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idlocal
- "Tipologia": Campo de pesquisa, editável, pesquisando registros ativos da entidade tipologia, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idtipologia
- "Grupo de produtos": Campo de pesquisa, editável, pesquisando registros ativos da entidade grupoproduto, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idgrupoproduto
- "Produto": Campo de pesquisa, editável, pesquisando registros ativos da entidade produto, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idproduto
- "Tabela preço": Campo de pesquisa, editável, pesquisando registros ativos da entidade tabelapreco, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idtabelapreco
- "Condição de pagamento": Campo de pesquisa, editável, pesquisando registros ativos da entidade condicaopagamento, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idcondicaopagamento
- "Perfil de acesso": Campo de pesquisa, editável, pesquisando registros ativos da entidade perfilacesso, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idperfilacesso
- "Grupo usuário": Campo de pesquisa, editável, pesquisando registros ativos da entidade grupousuario, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idgrupousuario
- "Tipo de pedido": Campo de pesquisa, editável, pesquisando registros ativos da entidade tipopedido, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idtipopedido
- "Embalagem": Campo de pesquisa, editável, pesquisando registros ativos da entidade embalagem, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idembalagem
- "Tipo de produto": Campo de pesquisa, editável, pesquisando registros ativos da entidade tipoproduto, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idtipoproduto
- "Cidade": Campo de pesquisa, editável, pesquisando registros ativos da entidade cidade, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idcidade
- "Classificação parceiro": Campo de pesquisa, editável, pesquisando registros ativos da entidade classificacaoparceiro, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idclassificacaoparceiro
- "Linha": Campo de pesquisa, editável, pesquisando registros ativos da entidade linha, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idlinha
- "Tipo frete": Campo de pesquisa, editável, pesquisando registros ativos da entidade tipofrete, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idtipofrete
- "Tipo estoque": Campo de pesquisa, editável, pesquisando registros ativos da entidade tipoestoque, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idtipoestoque
- "Faixa vida útil": Campo de pesquisa, editável, pesquisando registros ativos da entidade faixavidautil, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idfaixavidautil
- "Lote": Campo de pesquisa, editável, pesquisando registros ativos da entidade lote, possibilitando a seleção de único registro
- O valor do campo ser exibido a partir do campo classedescontovinculo.idlote
- : botão "Remover" que, quando clicado, marca o registro para deleção .
- Ao clicar em gravar, o registro deve ser devidamente excluído do banco de dados
Contexto / Gatilho:
Lógica:
- "Adição massiva de vínculos": Título da página
- ${Descrição da classe de desconto}: Sub-título da página
- Botão "Gerar vínculos" no canto superior direito da tela
- Quando clicado, o sistema deverá realizar um insert de todas as combinações das entidades selecionadas no corpo da tela (CROSS JOIN)
- Para evitar falhas de falta de exigência demasiada do servidor, o sistema deverá múltiplicar a quantidade registros selecionados de cada entidade, e o botão "Gerar vínculos" deve ser desabilitado caso o valor multiplicado ultrapasse 10000
- Nesse cenário, no hover no mouse sobre o botão, exibir tooltip: "Limite de 10000 combinações atingido. Diminua a quantidade de registros selecionados"
- Como o sistema pode levar um tempo considerável para realizar a operação, é necessário que o sistema exiba a mensagem: "Por favor aguarde. Esse processo pode levar alguns minutos"
- No corpo da tela, o sistema deve exibir os campos de pesquisa referenciados anteriormente na grid, porém aceitando múltipla seleção.
Contexto / Gatilho:
Lógica:
- "Classe desconto": campo pesquisa, exibindo como opções selecionáveis registros ativos da entidade classedesconto, obrigatório, editável.
- O valor selecionado na coluna deve ser persistido no campo desconto.idclassedesconto
Contexto / Gatilho:
Lógica:
Ao selecionar respectivamente os registros acima, o sistema deve fazer a vinculação em banco pelos critérios a seguir:
inner join classedesconto on desconto.idclassedesconto = classedesconto.idclassedesconto inner join classedescontovinculo on desconto.idclassedesconto = classedescontovinculo.idclassedesconto
Contexto / Gatilho:
Lógica:
- IDUSUARIOLOGADO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idusuario = :usuario_logado
- IDUSUARIOPROFISSIONAL: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.usuario = :usuario_selecionado_cabecalho
- LOCALFILIAL_IDLOCAL: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idfilial = :filial_selecionada_cabecalho
- PARCEIRO_IDPARCEIRO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idparceiro = :parceiro_selecionado_cabecalho
- CLASSIFICACAOPARCEIRO_IDCLASSIFICACAOPARCEIRO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idclassificacaoparceiro = (select idclassificacaoparceiro from parceiro where idparceiro = :parceiro_selecionado_cabecalho)
- GRUPOPARCEIRO_IDGRUPOPARCEIRO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idgrupoparceiro in (select idgrupoparceiro from parceirogrupoparceiro where idparceiro = :parceiro_selecionado_cabecalho)
- LOCAL_IDLOCAL: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idlocal = :local_selecionado_cabecalho
- LOCAL_IDREGIAO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idregiao in (select idregiao from localregiao where idlocal = :local_selecionado_cabecalho)
- LOCALFILIAL_IDREGIAO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idregiao in (select idregiao from localregiao where idlocal = :filial_selecionada_cabecalho)
- LOCAL_IDTIPOLOGIA: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idtipologia in (select idtipologia from localtipologia where idlocal = :local_selecionado_cabecalho)
- LOCALFILIAL_IDTIPOLOGIA: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idtipologia in (select idtipologia from localtipologia where idlocal = :filial_selecionada_cabecalho)
- LOCAL_IDUNIDADEFEDERATIVA: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idunidadefederativa in (select idunidadefederativa from cidade where idcidade in (select idcidade from local where idlocal = :local_selecionado_cabecalho))
- LOCALFILIAL_IDUNIDADEFEDERATIVA: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idunidadefederativa in (select idunidadefederativa from cidade where idcidade in (select idcidade from local where idlocal = :filial))
- CONDICAOPAGAMENTO_IDCONDICAOPAGAMENTO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idcondicaopagamento = :condicaopagamento_selecionada_cabecalho
- TABELAPRECO_IDTABELAPRECO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idtabelapreco = :tabelapreco_selecionada_cabecalho
- IDTIPOPRODUTO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idtipoproduto = :tipoproduto_selecionada_cabecalho
- PRODUTO_IDTIPOPRODUTO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idtipoproduto in (select idtipoproduto from produtotipoproduto where idproduto = :pedidoproduto_idproduto)
- IDGRUPOPRODUTO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idgrupoproduto = :grupoproduto_selecionado_cabecalho
- IDTIPOLOGIA: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idtipologia = :tipologia_selecionada_cabecalho
- PRODUTO_IDTIPOLOGIA : Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idproduto = :pedidoproduto_idproduto
- PRODUTO_IDGRUPOPRODUTO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idgrupo in (select idgrupo from produtogrupoproduto where idproduto = :pedidoproduto_idproduto)
- PRODUTO_IDEMBALAGEM: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idembalagem in (select idembalagem from produtoembalagem where idproduto = :pedidoproduto_idproduto)
- PRODUTO_IDLINHA: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idlinha in (select idlinha from linhaproduto where idproduto = :pedidoproduto_idproduto)
- IDCIDADE: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idcidade = (select idcidade from local where idlocal = :local_selecionado_cabecalho)
- IDTIPOFRETE: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idtipofrete = :tipofrete_selecionado
- IDGRUPOUSUARIO_LOGADO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idgrupousuario in (select idgrupousuario from usuariogrupousuario where idusuario = :usuario_logado)
- IDGRUPOUSUARIO_PROFISSIONAL: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idgrupousuario in (select idgrupousuario from usuariogrupousuario where idusuario = :usuario_selecionado_cabecalho)
- IDPERFIL_USUARIOLOGADO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idperfilacesso = (select idperfilacesso from usuario where idusuario = :usuario_logado)
- IDPERFIL_USUARIOPROFISSIONAL: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idperfilacesso = (select idperfilacesso from usuario where idusuario = :usuario_selecionado_cabecalho)
- IDTIPOPEDIDO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idtipopedido = :tipopedido_selecionado_cabecalho
- SEGMENTO_IDSEGMENTO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idsegmento = :segmento_selecionado_cabecalho
- PRODUTO_IDPRODUTO: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idproduto = :pedidoproduto_idproduto
- PRODUTO_IDTIPOESTOQUE: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idtipoestque = :tipoestque_selecionado_cabecalho
- PRODUTO_IDFAIXAVIDAUTIL: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idfaixavidautil = :pedidoproduto_idfaixavidautil
- PRODUTO_IDLOTE: Quando selecionado, o sistema deverá adicionar a seguinte cláusula where à consulta SQL
- where classedescontovinculo.idlote = :pedidoproduto_idlote_selecionado
- IDNATIVO: referente ao campo classedesconto.idnativo
- Exibir operações referentes a valores byte
- DESCRICAO: referente ao campo classedesconto.descricao
- Exibir operações referentes a valores textuais
- CODIGO: referente ao campo classedesconto.codigo
- Exibir operações referentes a valores textuais
- ORDEMAPLICACAO: referente ao campo classedesconto.ordemaplicacao
- Exibir operações referentes a valores numéricos
Contexto / Gatilho:
Lógica:
O sistema deve levar em consideração as novas entidades adicionadas na seção 03.04, filtrando as tabelas vinculáveis "CLASSEDESCONTO" e "CLASSEDESCONTOVINCULO", com seus respectivos filtros, se cadastrados em Configuração → Configuração pedido → Busca Produto → DESCONTO