Árvore de páginas

Versões comparadas

Chave

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

...

Painel
borderColorlightgray

Âncora
controle_cota
controle_cota
03.03.03 Tela de controle de cotas

Contexto / Gatilho:

  • No ambiente Web,
    • OU

      • Na tela de agrupamentos de cotas
          • Ao clicar sobre o botão "Editar", mandando o registro do agrupador em questão como contexto 
        • OU
          • Ao clicar sobre o botão "Visualizar controles"

Lógica:

  • O sistema deve encaminhar o usuário para a tela de controles de cota, que deve conter elementos visuais referenciando-se com o protótipo a seguir:

  • A tela deve conter os seguintes elementos visuais:
  • `Controles de cota - ${cota.descricao} (cota.datainiciovigencia - cota.datafimvigencia)`
  • Conteúdo da página
    • Cabeçalho de pesquisa: 
      • "Pesquisa rápida": Campo de entrada textual
        • Quando pesquisado, a informação do campo é utilizada para comparar com:
          • produto.descricao referente aos produtos do campo controlecota.idproduto
          • usuario.nome referente aos usuarios do campo controlecota.idproduto
          • local.descricao referente às filiais do campo controlecota.idlocalfilial
      • "Pesquisa avançada": Texto clicável, para exibir/ocultar os seguintes campos:
        • "Unidade": Campo de pesquisa, múltipla seleção, consultando as filiais pertencentes àquela cota
          • Quando preenchido, é utilizado para comparar com o campo controlecota.idlocalfilial
        • "Profissional": Campo de pesquisa, múltipla seleção, consultando os usuários pertencentes àquela cota
          •  Quando preenchido, é utilizado para comparar com o campo controlecota.idusuario
        • "Produto":  Campo de pesquisa, múltipla seleção, consultando os produtos pertencentes àquela cota
          •  Quando preenchido, é utilizado para comparar com o campo controlecota.idproduto
        • "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
      • Botões de ação:
        • Pesquisar: Quando clicado, dispara a requisição de pesquisa de registros da entidade de controles de cota, utilizando as comparações descritas acima
          • A busca padrão de registros deve considerar os seguintes filtros:

            Sem Formato
            select * from controlecota where idnativo = 1 and idcota = (?)
          • Caso a tela tenha sido aberta a partir do botão de editar controles do agrupador de cota, o sistema deve popular os filtros dos modelos vinculados com o agrupador em questão, respeitando o filtro CONSULTA_CONTROLECOTA_VINCULADO_AGRUPADOR

            Sem Formato
            Por exemplo, se clicado no botão editar sobre um agrupamento de supervisor
            
            O sistema deverá abrir a tela de controle filtrando o campo "Profissional" com os valores selecionados dos usuários vinculados com aquele supervisor.
        • Limpar: Limpa os valores dos campos de pesquisa
    • Grid de informações de controle de cota, contendo as seguintes colunas:
      • "Profissional": Campo textual, somente leitura, exibindo o conteúdo do campo controlecota.idusuario → usuario.nome
        • Coluna somente deve ser exibida caso a entidade usuario estiver selecionada nos modelos da cota

          Sem Formato
          /* (select valor from cotaconfiguracao where idcota = ? and sglconfiguracao = 'modelo') */ = 'usuario'
      • "Produto": Campo textual, somente leitura, exibindo o conteúdo do campo controlecota.isproduto → produto.descricao
        • Coluna somente deve ser exibida caso a entidade produto estiver selecionada nos modelos da cota

          Sem Formato
          /* (select valor from cotaconfiguracao where idcota = ? and sglconfiguracao = 'modelo') */ = 'produto'	
      • "Filial": Campo textual, somente leitura, exibindo o conteúdo do campo controlecota.idlocalfilial → local.descricao
        • Coluna somente deve ser exibida caso a entidade filial estiver selecionada nos modelos da cota

          Sem Formato
          /* select valor from cotaconfiguracao where idcota = ? and sglconfiguracao = 'modelo' */
      • "Saldo inicial": Campo numérico, somente leitura, exibindo o conteúdo do campo controlecota.saldoinicio
      • "Saldo disponível": Campo numérico, somente leitura, exibindo o conteúdo do campo controlecota.saldodisponivel
      • "Saldo processado": Campo numérico, somente leitura, exibindo o somatório de todas as movimentações ativas e processadas com relação aos controles de cota que possuem vínculo com o agrupador, sendo:

        Sem Formato
        /*
        	select sum(valor) from controlecotamovimento ccm where ccm.idcontrolecota = (?) and ccm.idnativo = 1 and ccm.idnprocessado = 1 
        /*
      • "Saldo a processar": Campo numérico, somente leitura, exibindo o somatório de todas as movimentações ativas e não-processadas com relação aos controles de cota que possuem vínculo com o agrupador, sendo:

        Sem Formato
        /*
        	select sum(valor) from controlecotamovimento ccm where ccm.idcontrolecota = (?) and ccm.idnativo = 1 and ccm.idnprocessado = 0
        /*
      • "Situação": Texto, editável exibindo Ativo/Inativo quando o campo controlecota.idnativo estiver com respectivos valores 1/0. Ao editar o campo, o tipo do campo vira check-box marcada/desmarcada quando o campo controlecota.idnativo estiver com respectivos valores 1/0
      • "Transferir saldo": Ícone clicável que, quando clicado, executa a lógica referente à função de transferência de saldo, passando como contexto o identificador do registro de controle de cota em questão
      • Âncora
        visualizar_movimentos
        visualizar_movimentos
           "Visualizar movimentos": Quando clicado, deve encaminhar o usuário para a tela de movimentos de controles de cota, passando como contexto o identificador do registro de controle de cota em questão
  • Botões de ação

...

Painel
borderColorlightgray

Âncora
alterar_saldo
alterar_saldo
03.04 Função de alterar saldo

Contexto / Gatilho:

  • No ambiente Web,
    • (Gatilho 1) Na tela de controles de cota, ao clicar sobre o botão "Alterar saldos", passando como contexto os modelos filtrados pela pesquisa.
    • (Gatilho 2) Na tela de agrupamentos de cota, ao clicar sobre o botão "Alterar saldos", passando como contexto o registro da entidade agrupadora

Lógica:

  • O sistema deve abrir modal referenciando-se com o protótipo a seguir:

  • A modal deve conter os seguintes elementos visuais:
  • "Alteração de saldo de cota": título da modal
  • Campo radio button, com duas opções:
      • "Adicionar saldo"
      • "Deduzir saldo"
    • Ao lado das opções, deve ser exibido campo input numérico, editável
  • Separador horizontal
  • "Distribuição de saldo": título de grupo de elementos
    • "Modelo de distribuição": Campo de opções selecionáveis (combo-box), mostrando as opções:
        • "Distribuir igualmente"
        • "Dividir proporcionalmente ao valor de pedidos anteriores"
      • "Dias de histórico: input numérico, aceitando valores inteiros positivos, editável
        • O campo somente deve ser exibido, caso o campo "Modelo de distribuição" estiver marcado com a opção "Dividir proporcionalmente ao valor de pedidos anteriores"
        • O valor preenchido no campo deve ser persistido na sessão, de forma que ao abrir a modal novamente, o campo venha previamente preenchido.
      • "Saldo mínimo": input numérico editável
        • O campo somente deve ser exibido, caso o campo "Modelo de distribuição" estiver marcado com a opção "Dividir proporcionalmente ao valor de pedidos anteriores"
        • O valor preenchido no campo deve ser persistido na sessão, de forma que ao abrir a modal novamente, o campo venha previamente preenchido.
  • "Filtro de controles de cota de destino": título de grupo de elementos
    • "Profissional": Botão que, quando clicado, abre modal de seleção múltipla para a entidade selecionada em questão (usuario)
      • Somente devem ser exibidos usuários que pertencem à cota do contexto

        Sem Formato
        select idusuario from controlecota where idcota = ?
      • O botão somente deve ser visível quando a entidade estiver selecionada no campo Modelo de cota
      • Quando confirmadas as seleções da modal, o sistema deverá exibir texto `${contagem de registros selecionados} registros selecionados` ao lado do botão "Selecionar"
        • Caso nenhum registro estiver selecionado, exibir "Nenhum registro selecionado. Aplicável a todos"
    • "Produto": Botão que, quando clicado, abre modal de seleção múltipla para a entidade selecionada em questão (produto)
      • Somente devem ser exibidos produtos que pertencem à cota do contexto

        Sem Formato
        select idproduto from controlecota where idcota = ?
      • O botão somente deve ser visível quando a entidade estiver selecionada no campo Modelo de cota
      • Quando confirmadas as seleções da modal, o sistema deverá exibir texto `${contagem de registros selecionados} registros selecionados` ao lado do botão "Selecionar"
        • Caso nenhum registro estiver selecionado, exibir "Nenhum registro selecionado. Aplicável a todos"
    • "Filial": Botão que, quando clicado, abre modal de seleção múltipla para a entidade selecionada em questão (local, do tipo filial)
      • Somente devem ser exibidas filiais que pertencem à cota do contexto

        Sem Formato
        select idlocalfilial from controlecota where idcota = ?
      • O botão somente deve ser visível quando a entidade estiver selecionada no campo Modelo de cota
      • Quando confirmadas as seleções da modal, o sistema deverá exibir texto `${contagem de registros selecionados} registros selecionados` ao lado do botão "Selecionar"
        • Caso nenhum registro estiver selecionado, exibir "Nenhum registro selecionado. Aplicável a todos"
  • Botões de ação
    • "Cancelar": Fecha a modal
    • "Confirmar": Quando clicado, o sistema deve:
      • Verificar se o campo de input referente ao campo "Adicionar saldo" / "Deduzir saldo" selecionado está preenchido.
        • Caso não estiver, rollback + mensagem: Preencha o campo ${"Adicionar saldo" ou "Deduzir saldo" dependendo do que  estiver selecionado}
      • Verificar se os campos "Dias de histórico" e "Saldo mínimo" estiverem visíveis e não preenchidos
        • Caso verdadeiro, rollback + mensagem: Preencha o campo ${campo não preenchido em questão}
      • Validar se todos os controles de cotas ativas filtradas pelos filtros de controles de cota de destino receberão o montante definido no campo "Saldo mínimo"

        Sem Formato
        ${Saldo a ser distribuido igualmente}
        /* select ${Valor do saldo adicionado} / count(*) from controlecota 
        where (idusuario in (:filtro_usuario) or (:filtro_usuario) is null) 
        and  (idproduto in (:filtro_produto) or (:filtro_produto) is null)  
        and  (idlocalfilial in (:filtro_filial) or (:filtro_filial) is null) */
        
        Verificar se ${Saldo a ser distribuido, se igualmente} > ${Valor do saldo mínimo}
        • Se falso, rollback + mensagem: "O saldo adicionado não é suficiente para respeitar o saldo mínimo definido"
      • Se "Modelo de distribuição" = "Distribuir igualmente"
        • Se o campo radio button estiver marcado como "Adicionar saldo"
          • O sistema deverá adicionar um movimento de cota igual positivo na controlecotamovimento para todos os controles de cota filtrados pelos filtros de controles de cota de destino e somá-lo ao saldo do controle de cota, da seguinte forma:

            Sem Formato
            Por exemplo, se filtrados usuários e produtos na modal
            
            SET1: set de controlecotas a serem atualizadas
            	/* select idcontrolecota from controlecota where idproduto in (?) and idusuario in (?) and idnativo = 1
            
            Para cada registro:
            /* insert into controlecotamovimento ... values
            {
            	idprofissional: identificador da entidade do campo "Profissional"
            	idproduto: identificador da entidade do campo "Produto"
            	quantidade: ${Saldo a ser distribuido igualmente}
            	observação: "Movimento criado e processado manualmente pela aplicação",
            	sglorigem: 'WEB'
            	idnativo: 1
            	idnprocessado: 1
            	data: current_date
            	datamovimento:current_date
            }
            */
            
            /*
            update controlecota set saldodisponivel = saldodisponivel + ${controlecotamovimento.quantidade}
            */


            • O sistema deverá retornar feedback visual toast (Success): "Operação realizada com sucesso"
        • Se o campo radio button estiver marcado como "Deduzir saldo"
          • O sistema deverá adicionar um movimento de cota igual negativo na controlecotamovimento para todos os controles de cota filtrados pelos filtros de controles de cota de destino e somá-lo ao saldo do controle de cota
            • Caso o saldo disponível pelo controle de cota não for suficiente para ser deduzido integralmente, o sistema deve retornar o valor que não pôde ser deduzido, com a mensagem pop up:
              • "Dedução de ${${Valor do campo deduzir saldo } - ${Valor que não pôde ser deduzido}} foi realizada com sucesso. Não foi possível deduzir  ${Valor que não pôde ser deduzido} do saldo de cota, devido à saldos disponíveis insuficientes" Opções "OK" e  "Deduzir restante"
              • Ao clicar em ok, fechar a modal
              • Ao clicar em "Deduzir restante", aplicar  ${Valor que não pôde ser deduzido} no campo "Deduzir saldo"
          • Sem Formato
            Por exemplo, se filtrados usuários e produtos na modal
            
            SET1: set de controlecotas a serem deduzidas 
            	/* select idcontrolecota from controlecota where idproduto in (?) and idusuario in (?) and idnativo = 1 and saldodisponivel > 0
            
            Para cada registro:
            ${Saldo a ser deduzido} = controlecota.saldodisponivel >= ${Saldo a ser distribuido igualmente} ? ${Saldo a ser distribuido igualmente} : controlecota.saldodisponivel
            -- Se controlecota.saldodisponivel < ${Saldo a ser distribuido igualmente}, somar os valores que não puderam ser deduzidos
            ${Valor que não pôde ser deduzido} = ${Saldo a ser distribuido igualmente} - controlecota.saldodisponivel
            
            /* insert into controlecotamovimento ... values
            {
            	idprofissional: identificador da entidade do campo "Profissional"
            	idproduto: identificador da entidade do campo "Produto"
            	quantidade: -${Saldo a ser deduzido}
            	observação: "Movimento criado e processado manualmente pela aplicação",
            	sglorigem: 'WEB'
            	idnativo: 1
            	idnprocessado: 1
            	data: current_date
            	datamovimento:current_date
            }
            */
            
            /*
            update controlecota set saldodisponivel = saldodisponivel + ${controlecotamovimento.quantidade}
            */ -- Caso o saldo disponível não seja suficiente para ser deduzido, o campo saldodisponivel deve obrigatoriamente resultar em 0


            • Caso o saldo todo pôde ser deduzido, o sistema deverá retornar feedback visual toast (Success): "Operação realizada com sucesso"
      • Se "Modelo de distribuição" = "Dividir proporcionalmente ao valor de pedidos anteriores"
        •  Se o campo radio button estiver marcado como "Adicionar saldo"
          • A lógica de distribuição será realizada desta forma:

            Sem Formato
            Por exemplo, se filtrados usuários e produtos na modal
            
            SET1: set de controlecotas a serem deduzidas 
            	/* select idcontrolecota from controlecota where idproduto in (?) and idusuario in (?) and idnativo = 1
            
            /* select sum(pp.quantidadefaturada * pp.precofaturado) as valor from pedidoproduto pp
            inner join pedido p on pp.idpedido = p.idpedido
            inner join tiposituacaopedido tsp on tsp.idtiposituacaopedido = p.idtiposituacaopedido
            where p.idusuario in (:filtro_usuario)
            and pp.idproduto in (:filtro_produto) 
            and tsp.sgltiposituacaopedido in (:parametro_sim3g.cota.distribuicao.historico.sgltiposituacaopedido /* Deve ser criado pelo tools, opção 18 */
            group by pp.idproduto, p.idusuario
            */ CONSULTA_A
            
            /* select sum(valor) as valor_total from CONSULTA_A */
            
            O sistema deverá atribuir peso de 0 a 1 para todos os registros filtrados, com base na relação entre o valor e o valor total
            /* select idproduto,idusuario,valor/${valor_total} as peso */ CONSULTA_PESOS
            
            Com os pesos em mãos, o sistema deverá em primeiro momento contabilizar o excedente entre o saldo a adicionar e o saldo mínimo a adicionar
            ${Valor total distribuido igualmente} = SET1.size() * ${Valor do saldo mínimo}
            ${Valor restante} = ${Valor a ser adicionado} - ${Valor total distribuido igualmente} 
            
            Para cada registro:
            /* insert into controlecotamovimento ... values
            {
            	idprofissional: identificador da entidade do campo "Profissional"
            	idproduto: identificador da entidade do campo "Produto"
            	quantidade: ${Saldo a ser distribuido igualmente} + ${${Valor restante} * CONSULTA_PESOS.peso}
            	observação: "Movimento criado e processado manualmente pela aplicação",
            	sglorigem: 'WEB'
            	idnativo: 1
            	idnprocessado: 1
            	data: current_date
            	datamovimento:current_date
            }
            */
            
            /*
            update controlecota set saldodisponivel = saldodisponivel + ${controlecotamovimento.quantidade}
            */
        • Se o campo radio button estiver marcado como "Deduzir saldo"
            • O sistema deverá adicionar um movimento de cota igual negativo na controlecotamovimento para todos os controles de cota filtrados pelos filtros de controles de cota de destino e somá-lo ao saldo do controle de cota
              • Caso o saldo disponível pelo controle de cota não for suficiente para ser deduzido integralmente, o sistema deve retornar o valor que não pôde ser deduzido, com a mensagem pop up:
                • "Dedução de ${${Valor do campo deduzir saldo } - ${Valor que não pôde ser deduzido}} foi realizada com sucesso. Não foi possível deduzir  ${Valor que não pôde ser deduzido} do saldo de cota, devido à saldos disponíveis insuficientes" Opções "OK" e  "Deduzir restante"
                • Ao clicar em ok, fechar a modal
                • Ao clicar em "Deduzir restante", aplicar  ${Valor que não pôde ser deduzido} no campo "Deduzir saldo"


                  Sem Formato
                  Por exemplo, se filtrados usuários e produtos na modal
                  
                  SET1: set de controlecotas a serem deduzidas 
                  	/* select idcontrolecota from controlecota where idproduto in (?) and idusuario in (?) and idnativo = 1 and saldodisponivel > 0
                  
                  Mesma lógica para encontrar CONSULTA_PESOS da lógica de adição acima
                  
                  Para cada registro:
                  ${Saldo a ser deduzido proporcionalmente ao histórico} = ${Saldo a ser distribuido igualmente} + ${${Valor restante} * CONSULTA_PESOS.peso}
                  ${Saldo a ser deduzido} = controlecota.saldodisponivel >= ${Saldo a ser deduzido proporcionalmente ao histórico} ? ${Saldo a ser deduzido proporcionalmente ao histórico} : controlecota.saldodisponivel
                  -- Se controlecota.saldodisponivel < ${Saldo a ser deduzido proporcionalmente ao histórico}, somar os valores que não puderam ser deduzidos
                  ${Valor que não pôde ser deduzido} = ${Saldo a ser deduzido proporcionalmente ao histórico} - controlecota.saldodisponivel
                  
                  /* insert into controlecotamovimento ... values
                  {
                  	idprofissional: identificador da entidade do campo "Profissional"
                  	idproduto: identificador da entidade do campo "Produto"
                  	quantidade: -${Saldo a ser deduzido proporcionalmente ao histórico}
                  	observação: "Movimento criado e processado manualmente pela aplicação",
                  	sglorigem: 'WEB'
                  	idnativo: 1
                  	idnprocessado: 1
                  	data: current_date
                  	datamovimento:current_date
                  }
                  */
                  
                  /*
                  update controlecota set saldodisponivel = saldodisponivel + ${controlecotamovimento.quantidade}
                  */ -- Caso o saldo disponível não seja suficiente para ser deduzido, o campo saldodisponivel deve obrigatoriamente resultar em 0
Painel
borderColorlightgray

Âncora
alterar_controle
alterar_controle
03.05 Função de alterar controles

Contexto / Gatilho:

LógicaLógica:

  • O sistema deve abrir modal referenciando-se com o protótipo a seguir:

    • Image Added
  • A modal deve conter os seguintes elementos visuais:
  • "Alteração de controles de cota": título da modal
  • Campo radio button, com duas opções:
      • "Adicionar controles"
      • "Inativar controles"
  • Separador horizontal
  • "Selectione os registros de controles que deseja ${"Adicionar / Inativar" dependendo da opção do radio button selecionada}": Texto fixo
  • Modelos de controle: Combobox com os modelos podendo ser consultados através da consulta a seguir

    Sem Formato
    select valor from cotaconfiguracao where sglconfiguracao = "modelo"


    • Se o resultado for 'usuario', exibir opção "Profissional"
    • Se o resultado for 'produto', exibir opção "Produto"
    • Se o resultado for 'filial', exibir opção "Filial"
  • Botões de ação
    • "Cancelar": Fecha a modal, quando clicado
    • "Confirmar": Quando clicado, 
      • Caso o campo radio button selecionado for "Adicionar controles"
        • O sistema deverá realizar a persistência dos controles de cota
Painel
borderColorlightgray

Âncora
transferir_saldo
transferir_saldo
03.05 Função de transferência de saldo de cota

Contexto / Gatilho:

  • No ambiente Web,

Lógica:

  • O sistema deve