Mudanças entre as edições de "Funcionalidade/Limite de crédito"
(18 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 68: | Linha 68: | ||
Place holder | Place holder | ||
− | ==Cenários== | + | ==Cenários de fluxo== |
− | + | [[Arquivo:Cenarios-limite-credito.png|frame|Possíveis fluxos que o limite de crédito pode tomar]] | |
===Partes=== | ===Partes=== | ||
− | + | Os cenários foram concebidos de modo a abarcar todas os possíveis desdobramentos, de modo a atender todos os fluxos das [[#Necessidade|necessidades]]. Para isso, foram identificadas as seguintes variações de formas: | |
+ | |||
+ | # Valor mínimo aceitável | ||
+ | #* Origem da informação | ||
+ | # O valor da movimentação relativa que o pedido gera | ||
+ | # Dados e resposta do sistema esperados após as ações do usuário | ||
+ | ## Comportamento de exceção nos itens | ||
+ | ## Comortamento de exceção no pedido | ||
+ | |||
+ | Os [[#valores mínimos aceitáveis|valores mínimos aceitáveis]] constituem sempre de dados. Na descrição de cada cenário, além desses dados, também é necessário informar se o tipo de pedido movimenta limite de crédito (estados <code>F</code>, <code>G</code>, <code>H</code>) ou não (estado <code>E</code>) durante a operação, e também é necessário informar se [[#Delegação de risco|a configuração de pendência]] está ativa (estado <code>K</code> vindo de <code>H</code>) ou não (estado <code>J</code> vindo de <code>H</code>). | ||
+ | |||
+ | A [[#Movimentação relativa de saldo via pedido|movimentação relativa de saldo via pedido]] indica a operação a ser realizada, de onde podemos aferir o [[#Comportamento esperado do item|comportamento esperado do item]] posteriormente. | ||
+ | |||
+ | Também há a operação de salvar o pedido que é sempre realizada no final, de onde é possível aferir o [[#Comportamento esperado ao salvar pedido|comportamento esperado ao salvar pedido]]. | ||
+ | |||
+ | A variação que permite ter [[#Tipos de crédito|tipos de crédito dependendo do meio de pagamento]] afetam exclusivamente o resgate de informações, não afetando o resto do comportamento do sistema, podendo ser testado apenas essa informação através de um [[Classificação de tipos de teste#Teste de resgate|teste de resgate]]. | ||
====Valores mínimos aceitáveis==== | ====Valores mínimos aceitáveis==== | ||
− | + | Existem dois campos que determinam seu possível valor: | |
+ | |||
+ | * Diretamente na tabela de cliente | ||
+ | * Na configuração global | ||
+ | |||
+ | Caso não tenha esses valores, se pega um valor padrão, 0. | ||
+ | |||
+ | Então, temos 4 possibilidade: | ||
+ | |||
+ | * Campo existe, configuração existe; essa possibilidade é indicada pelo estado <code>A</code> | ||
+ | * Campo não existe, configuração existe; essa possibilidade é indicada pelo estado <code>B</code> | ||
+ | * Campo existe, configuração não existe; essa possibilidade é indicada pelo estado <code>C</code> | ||
+ | * Nem campo nem configuração existem; essa possibilidade é indicada pelo estado <code>D</code> | ||
+ | |||
+ | As possibilidades <code>A</code> e <code>C</code> são para trazer o mesmo resultado, já que o campo do cliente tem prioridade sobre a configuração, porém é importante elencar essa possibilidade para se ter certeza de que a precedência ocorrerá. | ||
====Movimentação relativa de saldo via pedido==== | ====Movimentação relativa de saldo via pedido==== | ||
− | + | Ao se movimentar o saldo do limite de crédito, há algumas possibilidades: | |
+ | # o tipo de pedido não movimenta; essa possibilidade é indicada pelo estado <code>E</code> | ||
+ | # há o movimento, porém o valor final é maior que zero (<code>S - P >= 0</code>); essa possibilidade é indicada pelo estado <code>F</code> | ||
+ | # há o movimento, o valor fica entre 0 e o limite mínimo aceitável (<code>0 > S - P >= M</code>); essa possibilidade é indicada pelo estado <code>G</code> | ||
+ | # há o movimento, o valor fica abaixo do limite mínimo aceitável (<code>M > S - P</code>); essa possibilidade é indicada pelo estado <code>H</code> | ||
====Comportamento esperado do item==== | ====Comportamento esperado do item==== | ||
− | + | Caso a modificação em um item no pedido não implique na ofensa do valor mínimo aceitável, isso deverá acontecer de modo transparente ao usuário. Esse comportamento é indicado pelo estado <code>I</code>. | |
+ | |||
+ | O sistema não bloqueia a inserção ou edição de itens, mesmo que isso signifique que o estado do pedido ofenda o valor mínimo aceitável. No entanto, o sistema avisa que o pedido não poderá ser salvo devido à essa ofensa. Esse comportamento é indicado pelo estado <code>J</code>. | ||
+ | |||
+ | No caso [[#Delegação de risco|de pendência]], o sistema deverá avisar que o pedido ficará pendente por exceder o limite de crédito disponível. Esse comportamento é indicado pelo estado <code>K</code>. | ||
====Comportamento esperado ao salvar pedido==== | ====Comportamento esperado ao salvar pedido==== | ||
− | + | Caso não haja nenhuma ofensa a limite de crédito, o pedido deverá ser salvo normalmente. Esse comportamento é indicado pelo estado <code>L</code>. | |
+ | |||
+ | Caso ocorra uma ofensa inaceitável ao limite, o sistema impedirá o sistema de ser salvo e exibe o motivo. Esse comportamento é indicado pelo estado <code>M</code>. | ||
+ | |||
+ | Caso ocorra uma ofensa inaceitável ao limite, mas esteja [[#Delegação de risco|configurado para correr esse risco]], o sistema deve permitir salvar o pedido, alertando dessa pendência. Esse comportamento é indicado pelo estado <code>N</code>. | ||
===Codificação dos cenários=== | ===Codificação dos cenários=== | ||
− | + | Resumo dos possíveis estados pertencentes aos cenários: | |
+ | * Valores mínimos aceitáveis | ||
+ | ** <code>A</code>, <code>B</code>, <code>C</code>, <code>D</code> | ||
+ | * Movimentação relativa de saldo via pedido | ||
+ | ** <code>E</code>, <code>F</code>, <code>G</code> e <code>H</code> | ||
+ | *** Como o caso <code>D</code> prevê que <code>M = 0</code>, não é possível chegar em <code>G</code> | ||
+ | * Comportamento esperado do item | ||
+ | ** <code>I</code>, <code>J</code> e <code>K</code> | ||
+ | *** Em todos os casos que <code>S - P >= M</code>, o comportamento é ficar transparente ao usuário, portanto <code>I</code> | ||
+ | *** No caso de ofensa ao valor mínimo aceitável<code>H</code>, a configuração vai determinar se irá para o <code>J</code> ou <code>K</code> | ||
+ | * Comportamento esperado ao salvar pedido | ||
+ | ** <code>L</code>, <code>M</code> e <code>N</code> | ||
+ | *** As mesmas condições que geram esses estados também afetam os itens, portanto elas são praticamente equivalentes | ||
+ | *** <code>I <=> L</code> | ||
+ | *** <code>J <=> M</code> | ||
+ | *** <code>K <=> N</code> | ||
+ | |||
+ | Os meta estados <code>G1</code> e <code>G2</code> existem para deixar a leitura mais fácil; eles são apenas agrupadores. | ||
+ | * <code>G1</code> | ||
+ | ** todas os cenários de valor mínimo aceitável que tem <code>M != 0</code> podem ir para qualquer cenário de estouro | ||
+ | * <code>G2</code> | ||
+ | ** os cenários em que a movimentação não ofende o valor mínimo aceitável <code>S - P >= M</code> são todos transparentes par ao usuário, vão todos para <code>I</code> | ||
+ | |||
+ | Todos os cenários possíveis (codificados em RegEx): | ||
+ | <pre> | ||
+ | [ABCD][EF]IL | ||
+ | [ABC]GIL | ||
+ | [ABCD]H(JM|KN) | ||
+ | </pre> | ||
+ | |||
+ | ===Conjuntos de dados=== | ||
+ | Dados gerais: | ||
+ | * O cliente '''Martins''' tem limite de crédito de 100 reais | ||
+ | * '''Martins''' não tem pedidos não exportados | ||
+ | * '''Martins''' tem um título em aberto de 90 reais | ||
+ | * O tipo de pedido '''Venda''' altera o limite de crédito | ||
+ | * O tipo de pedido '''Bonificação''' não altera o limite de crédito | ||
+ | * O vendedor é '''Isabelle''' | ||
+ | * O produto '''Pincel''' tem preço sugerido de 10 reais | ||
+ | * Só existe a Organização de Venda '''OV''' e a Tabela de Preço '''Padrão''' | ||
+ | * Exceto se especificado o contrário, a configuração <code>ID_PENDENCIA_CLIENTE_SEM_LIMITE</code> não está preenchida | ||
+ | |||
+ | ====Simulação com estado <code>A</code>==== | ||
+ | * O cliente '''Martins''' tem na coluna <code>PC_SALDO_LIMITE_EXCEDENTE</code> 10% | ||
+ | * A configuração <code>PC_SALDO_LIMITE_EXCEDENTE</code> é de 20% | ||
+ | |||
+ | ====Simulação com estado <code>B</code>==== | ||
+ | * O cliente '''Martins''' tem na coluna <code>PC_SALDO_LIMITE_EXCEDENTE</code> o valor nulo | ||
+ | * A configuração <code>PC_SALDO_LIMITE_EXCEDENTE</code> é de 10% | ||
+ | |||
+ | ====Simulação com estado <code>C</code>==== | ||
+ | * O cliente '''Martins''' tem na coluna <code>PC_SALDO_LIMITE_EXCEDENTE</code> 10% | ||
+ | * A configuração <code>PC_SALDO_LIMITE_EXCEDENTE</code> não tem valor no sistema | ||
+ | |||
+ | ====Simulação com estado <code>D</code>==== | ||
+ | * O cliente '''Martins''' tem na coluna <code>PC_SALDO_LIMITE_EXCEDENTE</code> o valor nulo | ||
+ | * A configuração <code>PC_SALDO_LIMITE_EXCEDENTE</code> não tem valor no sistema | ||
+ | |||
+ | ====Simulação com estado esperado <code>K</code>==== | ||
+ | * A configuração <code>ID_PENDENCIA_CLIENTE_SEM_LIMITE</code> tem valor <code>S</code> | ||
+ | |||
+ | ===Fluxo AEIL=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado A|Os dados do estado <code>A</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Bonificação''' para '''Martins''' <code>E</code> | ||
+ | * '''Isabelle''' coloca 2 unidades de '''Pincel''' | ||
+ | * '''Isabelle''' tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * Inserir o item foi transparente ao usuário <code>I</code> | ||
+ | * Não houve encrenca ao salvar o pedido <code>L</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 10 reais | ||
+ | |||
+ | ===Fluxo AFIL=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado A|Os dados do estado <code>A</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 1 unidade de '''Pincel''' <code>F</code> | ||
+ | * '''Isabelle''' tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * Inserir o item foi transparente ao usuário <code>I</code> | ||
+ | * Não houve encrenca ao salvar o pedido <code>L</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 0 real | ||
+ | |||
+ | ===Fluxo AGIL=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado A|Os dados do estado <code>A</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 2 unidades de '''Pincel''' <code>G</code> | ||
+ | * '''Isabelle''' tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * Inserir o item foi transparente ao usuário <code>I</code> | ||
+ | * Não houve encrenca ao salvar o pedido <code>L</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é -10 reais | ||
+ | |||
+ | ===Fluxo AHJM=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado A|Os dados do estado <code>A</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 3 unidades de '''Pincel''' <code>H</code> | ||
+ | * '''Isabelle''' tenta tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * O sistema informou que não será possível salvar o pedido <code>J</code> | ||
+ | * O sistema não permitiu salvar o pedido <code>M</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 10 reais | ||
+ | |||
+ | ===Fluxo AHKN=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado A|Os dados do estado <code>A</code>]] | ||
+ | * [[#Simulação com estado esperado K|Os dados do estado <code>K</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 3 unidades de '''Pincel''' <code>H</code> | ||
+ | * '''Isabelle''' tenta tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * O sistema informou que será possível salvar o pedido, mas ele ficará pendente <code>K</code> | ||
+ | * O sistema permitiu salvar o pedido, ficando com a pendência de cliente sem limite de crédito <code>N</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é -20 reais | ||
+ | |||
+ | ===Fluxo BEIL=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado B|Os dados do estado <code>B</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Bonificação''' para '''Martins''' <code>E</code> | ||
+ | * '''Isabelle''' coloca 2 unidades de '''Pincel''' | ||
+ | * '''Isabelle''' tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * Inserir o item foi transparente ao usuário <code>I</code> | ||
+ | * Não houve encrenca ao salvar o pedido <code>L</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 10 reais | ||
+ | |||
+ | ===Fluxo BFIL=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado B|Os dados do estado <code>B</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 1 unidade de '''Pincel''' <code>F</code> | ||
+ | * '''Isabelle''' tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * Inserir o item foi transparente ao usuário <code>I</code> | ||
+ | * Não houve encrenca ao salvar o pedido <code>L</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 0 real | ||
+ | |||
+ | ===Fluxo BGIL=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado B|Os dados do estado <code>B</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 2 unidades de '''Pincel''' <code>G</code> | ||
+ | * '''Isabelle''' tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * Inserir o item foi transparente ao usuário <code>I</code> | ||
+ | * Não houve encrenca ao salvar o pedido <code>L</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é -10 reais | ||
+ | |||
+ | ===Fluxo BHJM=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado B|Os dados do estado <code>B</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 3 unidades de '''Pincel''' <code>H</code> | ||
+ | * '''Isabelle''' tenta tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * O sistema informou que não será possível salvar o pedido <code>J</code> | ||
+ | * O sistema não permitiu salvar o pedido <code>M</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 10 reais | ||
+ | |||
+ | ===Fluxo BHKN=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado B|Os dados do estado <code>B</code>]] | ||
+ | * [[#Simulação com estado esperado K|Os dados do estado <code>K</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 3 unidades de '''Pincel''' <code>H</code> | ||
+ | * '''Isabelle''' tenta tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * O sistema informou que será possível salvar o pedido, mas ele ficará pendente <code>K</code> | ||
+ | * O sistema permitiu salvar o pedido, ficando com a pendência de cliente sem limite de crédito <code>N</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é -20 reais | ||
+ | |||
+ | ===Fluxo CEIL=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado C|Os dados do estado <code>C</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Bonificação''' para '''Martins''' <code>E</code> | ||
+ | * '''Isabelle''' coloca 2 unidades de '''Pincel''' | ||
+ | * '''Isabelle''' tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * Inserir o item foi transparente ao usuário <code>I</code> | ||
+ | * Não houve encrenca ao salvar o pedido <code>L</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 10 reais | ||
+ | |||
+ | ===Fluxo CFIL=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado C|Os dados do estado <code>C</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 1 unidade de '''Pincel''' <code>F</code> | ||
+ | * '''Isabelle''' tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * Inserir o item foi transparente ao usuário <code>I</code> | ||
+ | * Não houve encrenca ao salvar o pedido <code>L</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 0 real | ||
+ | |||
+ | ===Fluxo CGIL=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado C|Os dados do estado <code>C</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 2 unidades de '''Pincel''' <code>G</code> | ||
+ | * '''Isabelle''' tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * Inserir o item foi transparente ao usuário <code>I</code> | ||
+ | * Não houve encrenca ao salvar o pedido <code>L</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é -10 reais | ||
+ | |||
+ | ===Fluxo CHJM=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado C|Os dados do estado <code>C</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 3 unidades de '''Pincel''' <code>H</code> | ||
+ | * '''Isabelle''' tenta tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * O sistema informou que não será possível salvar o pedido <code>J</code> | ||
+ | * O sistema não permitiu salvar o pedido <code>M</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 10 reais | ||
+ | |||
+ | ===Fluxo CHKN=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado C|Os dados do estado <code>C</code>]] | ||
+ | * [[#Simulação com estado esperado K|Os dados do estado <code>K</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 3 unidades de '''Pincel''' <code>H</code> | ||
+ | * '''Isabelle''' tenta tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * O sistema informou que será possível salvar o pedido, mas ele ficará pendente <code>K</code> | ||
+ | * O sistema permitiu salvar o pedido, ficando com a pendência de cliente sem limite de crédito <code>N</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é -20 reais | ||
+ | |||
+ | ===Fluxo DEIL=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado D|Os dados do estado <code>D</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Bonificação''' para '''Martins''' <code>E</code> | ||
+ | * '''Isabelle''' coloca 2 unidades de '''Pincel''' | ||
+ | * '''Isabelle''' tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * Inserir o item foi transparente ao usuário <code>I</code> | ||
+ | * Não houve encrenca ao salvar o pedido <code>L</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 10 reais | ||
+ | |||
+ | ===Fluxo DFIL=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado D|Os dados do estado <code>D</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 1 unidade de '''Pincel''' <code>F</code> | ||
+ | * '''Isabelle''' tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * Inserir o item foi transparente ao usuário <code>I</code> | ||
+ | * Não houve encrenca ao salvar o pedido <code>L</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 0 real | ||
+ | |||
+ | ===Fluxo DHJM=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado D|Os dados do estado <code>D</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 2 unidades de '''Pincel''' <code>H</code> | ||
+ | * '''Isabelle''' tenta tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * O sistema informou que não será possível salvar o pedido <code>J</code> | ||
+ | * O sistema não permitiu salvar o pedido <code>M</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é 10 reais | ||
+ | |||
+ | ===Fluxo DHKN=== | ||
+ | ====Dado==== | ||
+ | * [[#Simulação com estado D|Os dados do estado <code>D</code>]] | ||
+ | * [[#Simulação com estado esperado K|Os dados do estado <code>K</code>]] | ||
+ | |||
+ | ====Operação==== | ||
+ | * '''Isabelle''' começa um pedido de '''Venda''' para '''Martins''' <code>[FGH]</code> | ||
+ | * '''Isabelle''' coloca 2 unidades de '''Pincel''' <code>H</code> | ||
+ | * '''Isabelle''' tenta tenta salvar o pedido | ||
+ | |||
+ | ====Assertivas==== | ||
+ | * O sistema informou que será possível salvar o pedido, mas ele ficará pendente <code>K</code> | ||
+ | * O sistema permitiu salvar o pedido, ficando com a pendência de cliente sem limite de crédito <code>N</code> | ||
+ | * O saldo do limite de crédito para '''Martins''' é -10 reais | ||
[[Category:Funcionalidade]] | [[Category:Funcionalidade]] |
Edição atual tal como às 15h59min de 6 de dezembro de 2016
Necessidade
Dependendo do tipo de venda, é necessário colocar um limite do quanto o cliente pode ficar com títulos em aberto.
Tipos de crédito
Alguns clientes possuem créditos distintos dependendo do Meio de Pagamento. Por exemplo, o cliente Martins possui 3000 reais de limite de crédito quando usa Cartão de crédito e 200 reais de Cheque Especial.
Também conhecido como limite de crédito por meio de pagamento.
Excedente
As vezes, é possível assumir alguns riscos. Esses riscos são assumidos quando o cliente ultrapassa o valor do limite de crédito, indo até um valor excedente máximo. Existem duas fontes da informação do quanto o cliente pode exceder o seu limite de crédito:
- diretamente na tabela cliente
- valor excedente global, na configuração de limite excedente
Caso o cliente possua um valor de excedente explícito, esse valor será usado (incluindo 0). Caso ele não possua esse valor, usa-se o global.
Por questões de nomenclatura de cálculo, o excedente modifica o valor mínimo aceitável
do saldo do cliente. Caso não se use o excedente, o valor mínimo aceitável
é 0.
A vista NALS
Apesar do nome, o a vista NALS é bem intuitivo: caso o pagamento seja a vista, Não Altera Limite Saldo.
Isso indica que, caso o cliente pague no momento da compra, essa compra não alterará o saldo do limite de crédito do cliente.
Delegação de risco
Existe uma configuração para tratar o risco de maneira manual. Diferente do valor excedente, que permite uma aceitação de risco automática, o pedido fica pendente para aprovação de um supervisor.
Essa configuração entre em jogo caso o pedido faça com que o limite de crédito fique abaixo do valor mínimo aceitável.
Solução declarativa
Durante a tirada do pedido, interessa-se pelo limite de crédito caso essa venda faça com que o saldo fique abaixo do valor mínimo aceitável. Para saber se isso vai acontecer, precisa-se levar em consideração o limite do cliente L
, o quanto desse limite o cliente já consumiu (desconsiderando o pedido atual) C
, o valor do pedido atual P
e calcular o valor mínimo aceitável M
.
Dessa forma, o pedido estará válido para o limite de crédito se e somente se:
(L - C) - P >= M
Onde L - C
é o saldo disponível para consumo S
.
Cálculo do saldo disponível
Conforme explicitado na solução, o saldo S
depende de dois valores:
- O limite de crédito global
- O quanto já foi consumido
O limite de crédito global é definido pelo cliente e pelo meio de pagamento usado no pedido (ver limite de crédito por meio de pagamento). A parte consumida depende dos pedidos que ainda não foram exportados e dos títulos em aberto. Assim, para a soma dos pedidos não exportados SPne
e para a soma dos títulos em aberto STa
, temos que:
C = SPne + STa
Assim como o limite de crédito é definido pelo meio de pagamento, os pedidos e títulos também são filtrados por essa condição (caso exista). Dependente da configuração, mesmo que os pedidos a vista sejam válidos para esse filtro de meio de pagamento, eles não são levados em consideração para o somatório.
Pedidos, títulos e exportação
Todo pedido de venda se torna títulos. Essa conversão é feita no ERP. Portanto, ao ser exportado um pedido, o GeoSales recebe de volta uma coleção de títulos em aberto. Portanto, na fórmula do quanto foi consumido, levar em consideração um pedido exportado como fator de consumo de saldo C
fica redundante com a parte de títulos em aberto STa
.
Em compensação, até o pedido ser exportado, ele não virou título, portanto esse pedido não faz parte de STa
mesmo tendo consumido do saldo. Por isso, os valores dos pedidos não exportados SPne
devem ser parte da composição de C
.
Valor mínimo aceitável
O valor mínimo aceitável M
é dado na forma de um percentual excedente E
. Esse E
é aplicado sobre o limite de crédito L
:
abs(M) = abs(L*E)
Como foi informado na solução, debitar do saldo S
o valor do pedido P
não pode ultrapassar M
:
S - P >= M
Portando, o valor de M
é negativo ou zero; como L
é estritamente positivo e E
é um porcentual, temos:
M = - L*E
Como é sabido que M
é 0 exceto se especificado um excedente e M
é um valor derivado, o valor padrão para E
, nesses casos, é 0.
Implementação
Place holder
Cenários de fluxo
Partes
Os cenários foram concebidos de modo a abarcar todas os possíveis desdobramentos, de modo a atender todos os fluxos das necessidades. Para isso, foram identificadas as seguintes variações de formas:
- Valor mínimo aceitável
- Origem da informação
- O valor da movimentação relativa que o pedido gera
- Dados e resposta do sistema esperados após as ações do usuário
- Comportamento de exceção nos itens
- Comortamento de exceção no pedido
Os valores mínimos aceitáveis constituem sempre de dados. Na descrição de cada cenário, além desses dados, também é necessário informar se o tipo de pedido movimenta limite de crédito (estados F
, G
, H
) ou não (estado E
) durante a operação, e também é necessário informar se a configuração de pendência está ativa (estado K
vindo de H
) ou não (estado J
vindo de H
).
A movimentação relativa de saldo via pedido indica a operação a ser realizada, de onde podemos aferir o comportamento esperado do item posteriormente.
Também há a operação de salvar o pedido que é sempre realizada no final, de onde é possível aferir o comportamento esperado ao salvar pedido.
A variação que permite ter tipos de crédito dependendo do meio de pagamento afetam exclusivamente o resgate de informações, não afetando o resto do comportamento do sistema, podendo ser testado apenas essa informação através de um teste de resgate.
Valores mínimos aceitáveis
Existem dois campos que determinam seu possível valor:
- Diretamente na tabela de cliente
- Na configuração global
Caso não tenha esses valores, se pega um valor padrão, 0.
Então, temos 4 possibilidade:
- Campo existe, configuração existe; essa possibilidade é indicada pelo estado
A
- Campo não existe, configuração existe; essa possibilidade é indicada pelo estado
B
- Campo existe, configuração não existe; essa possibilidade é indicada pelo estado
C
- Nem campo nem configuração existem; essa possibilidade é indicada pelo estado
D
As possibilidades A
e C
são para trazer o mesmo resultado, já que o campo do cliente tem prioridade sobre a configuração, porém é importante elencar essa possibilidade para se ter certeza de que a precedência ocorrerá.
Movimentação relativa de saldo via pedido
Ao se movimentar o saldo do limite de crédito, há algumas possibilidades:
- o tipo de pedido não movimenta; essa possibilidade é indicada pelo estado
E
- há o movimento, porém o valor final é maior que zero (
S - P >= 0
); essa possibilidade é indicada pelo estadoF
- há o movimento, o valor fica entre 0 e o limite mínimo aceitável (
0 > S - P >= M
); essa possibilidade é indicada pelo estadoG
- há o movimento, o valor fica abaixo do limite mínimo aceitável (
M > S - P
); essa possibilidade é indicada pelo estadoH
Comportamento esperado do item
Caso a modificação em um item no pedido não implique na ofensa do valor mínimo aceitável, isso deverá acontecer de modo transparente ao usuário. Esse comportamento é indicado pelo estado I
.
O sistema não bloqueia a inserção ou edição de itens, mesmo que isso signifique que o estado do pedido ofenda o valor mínimo aceitável. No entanto, o sistema avisa que o pedido não poderá ser salvo devido à essa ofensa. Esse comportamento é indicado pelo estado J
.
No caso de pendência, o sistema deverá avisar que o pedido ficará pendente por exceder o limite de crédito disponível. Esse comportamento é indicado pelo estado K
.
Comportamento esperado ao salvar pedido
Caso não haja nenhuma ofensa a limite de crédito, o pedido deverá ser salvo normalmente. Esse comportamento é indicado pelo estado L
.
Caso ocorra uma ofensa inaceitável ao limite, o sistema impedirá o sistema de ser salvo e exibe o motivo. Esse comportamento é indicado pelo estado M
.
Caso ocorra uma ofensa inaceitável ao limite, mas esteja configurado para correr esse risco, o sistema deve permitir salvar o pedido, alertando dessa pendência. Esse comportamento é indicado pelo estado N
.
Codificação dos cenários
Resumo dos possíveis estados pertencentes aos cenários:
- Valores mínimos aceitáveis
A
,B
,C
,D
- Movimentação relativa de saldo via pedido
E
,F
,G
eH
- Como o caso
D
prevê queM = 0
, não é possível chegar emG
- Como o caso
- Comportamento esperado do item
I
,J
eK
- Em todos os casos que
S - P >= M
, o comportamento é ficar transparente ao usuário, portantoI
- No caso de ofensa ao valor mínimo aceitável
H
, a configuração vai determinar se irá para oJ
ouK
- Em todos os casos que
- Comportamento esperado ao salvar pedido
L
,M
eN
- As mesmas condições que geram esses estados também afetam os itens, portanto elas são praticamente equivalentes
I <=> L
J <=> M
K <=> N
Os meta estados G1
e G2
existem para deixar a leitura mais fácil; eles são apenas agrupadores.
G1
- todas os cenários de valor mínimo aceitável que tem
M != 0
podem ir para qualquer cenário de estouro
- todas os cenários de valor mínimo aceitável que tem
G2
- os cenários em que a movimentação não ofende o valor mínimo aceitável
S - P >= M
são todos transparentes par ao usuário, vão todos paraI
- os cenários em que a movimentação não ofende o valor mínimo aceitável
Todos os cenários possíveis (codificados em RegEx):
[ABCD][EF]IL [ABC]GIL [ABCD]H(JM|KN)
Conjuntos de dados
Dados gerais:
- O cliente Martins tem limite de crédito de 100 reais
- Martins não tem pedidos não exportados
- Martins tem um título em aberto de 90 reais
- O tipo de pedido Venda altera o limite de crédito
- O tipo de pedido Bonificação não altera o limite de crédito
- O vendedor é Isabelle
- O produto Pincel tem preço sugerido de 10 reais
- Só existe a Organização de Venda OV e a Tabela de Preço Padrão
- Exceto se especificado o contrário, a configuração
ID_PENDENCIA_CLIENTE_SEM_LIMITE
não está preenchida
Simulação com estado A
- O cliente Martins tem na coluna
PC_SALDO_LIMITE_EXCEDENTE
10% - A configuração
PC_SALDO_LIMITE_EXCEDENTE
é de 20%
Simulação com estado B
- O cliente Martins tem na coluna
PC_SALDO_LIMITE_EXCEDENTE
o valor nulo - A configuração
PC_SALDO_LIMITE_EXCEDENTE
é de 10%
Simulação com estado C
- O cliente Martins tem na coluna
PC_SALDO_LIMITE_EXCEDENTE
10% - A configuração
PC_SALDO_LIMITE_EXCEDENTE
não tem valor no sistema
Simulação com estado D
- O cliente Martins tem na coluna
PC_SALDO_LIMITE_EXCEDENTE
o valor nulo - A configuração
PC_SALDO_LIMITE_EXCEDENTE
não tem valor no sistema
Simulação com estado esperado K
- A configuração
ID_PENDENCIA_CLIENTE_SEM_LIMITE
tem valorS
Fluxo AEIL
Dado
Operação
- Isabelle começa um pedido de Bonificação para Martins
E
- Isabelle coloca 2 unidades de Pincel
- Isabelle tenta salvar o pedido
Assertivas
- Inserir o item foi transparente ao usuário
I
- Não houve encrenca ao salvar o pedido
L
- O saldo do limite de crédito para Martins é 10 reais
Fluxo AFIL
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 1 unidade de Pincel
F
- Isabelle tenta salvar o pedido
Assertivas
- Inserir o item foi transparente ao usuário
I
- Não houve encrenca ao salvar o pedido
L
- O saldo do limite de crédito para Martins é 0 real
Fluxo AGIL
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 2 unidades de Pincel
G
- Isabelle tenta salvar o pedido
Assertivas
- Inserir o item foi transparente ao usuário
I
- Não houve encrenca ao salvar o pedido
L
- O saldo do limite de crédito para Martins é -10 reais
Fluxo AHJM
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 3 unidades de Pincel
H
- Isabelle tenta tenta salvar o pedido
Assertivas
- O sistema informou que não será possível salvar o pedido
J
- O sistema não permitiu salvar o pedido
M
- O saldo do limite de crédito para Martins é 10 reais
Fluxo AHKN
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 3 unidades de Pincel
H
- Isabelle tenta tenta salvar o pedido
Assertivas
- O sistema informou que será possível salvar o pedido, mas ele ficará pendente
K
- O sistema permitiu salvar o pedido, ficando com a pendência de cliente sem limite de crédito
N
- O saldo do limite de crédito para Martins é -20 reais
Fluxo BEIL
Dado
Operação
- Isabelle começa um pedido de Bonificação para Martins
E
- Isabelle coloca 2 unidades de Pincel
- Isabelle tenta salvar o pedido
Assertivas
- Inserir o item foi transparente ao usuário
I
- Não houve encrenca ao salvar o pedido
L
- O saldo do limite de crédito para Martins é 10 reais
Fluxo BFIL
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 1 unidade de Pincel
F
- Isabelle tenta salvar o pedido
Assertivas
- Inserir o item foi transparente ao usuário
I
- Não houve encrenca ao salvar o pedido
L
- O saldo do limite de crédito para Martins é 0 real
Fluxo BGIL
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 2 unidades de Pincel
G
- Isabelle tenta salvar o pedido
Assertivas
- Inserir o item foi transparente ao usuário
I
- Não houve encrenca ao salvar o pedido
L
- O saldo do limite de crédito para Martins é -10 reais
Fluxo BHJM
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 3 unidades de Pincel
H
- Isabelle tenta tenta salvar o pedido
Assertivas
- O sistema informou que não será possível salvar o pedido
J
- O sistema não permitiu salvar o pedido
M
- O saldo do limite de crédito para Martins é 10 reais
Fluxo BHKN
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 3 unidades de Pincel
H
- Isabelle tenta tenta salvar o pedido
Assertivas
- O sistema informou que será possível salvar o pedido, mas ele ficará pendente
K
- O sistema permitiu salvar o pedido, ficando com a pendência de cliente sem limite de crédito
N
- O saldo do limite de crédito para Martins é -20 reais
Fluxo CEIL
Dado
Operação
- Isabelle começa um pedido de Bonificação para Martins
E
- Isabelle coloca 2 unidades de Pincel
- Isabelle tenta salvar o pedido
Assertivas
- Inserir o item foi transparente ao usuário
I
- Não houve encrenca ao salvar o pedido
L
- O saldo do limite de crédito para Martins é 10 reais
Fluxo CFIL
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 1 unidade de Pincel
F
- Isabelle tenta salvar o pedido
Assertivas
- Inserir o item foi transparente ao usuário
I
- Não houve encrenca ao salvar o pedido
L
- O saldo do limite de crédito para Martins é 0 real
Fluxo CGIL
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 2 unidades de Pincel
G
- Isabelle tenta salvar o pedido
Assertivas
- Inserir o item foi transparente ao usuário
I
- Não houve encrenca ao salvar o pedido
L
- O saldo do limite de crédito para Martins é -10 reais
Fluxo CHJM
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 3 unidades de Pincel
H
- Isabelle tenta tenta salvar o pedido
Assertivas
- O sistema informou que não será possível salvar o pedido
J
- O sistema não permitiu salvar o pedido
M
- O saldo do limite de crédito para Martins é 10 reais
Fluxo CHKN
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 3 unidades de Pincel
H
- Isabelle tenta tenta salvar o pedido
Assertivas
- O sistema informou que será possível salvar o pedido, mas ele ficará pendente
K
- O sistema permitiu salvar o pedido, ficando com a pendência de cliente sem limite de crédito
N
- O saldo do limite de crédito para Martins é -20 reais
Fluxo DEIL
Dado
Operação
- Isabelle começa um pedido de Bonificação para Martins
E
- Isabelle coloca 2 unidades de Pincel
- Isabelle tenta salvar o pedido
Assertivas
- Inserir o item foi transparente ao usuário
I
- Não houve encrenca ao salvar o pedido
L
- O saldo do limite de crédito para Martins é 10 reais
Fluxo DFIL
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 1 unidade de Pincel
F
- Isabelle tenta salvar o pedido
Assertivas
- Inserir o item foi transparente ao usuário
I
- Não houve encrenca ao salvar o pedido
L
- O saldo do limite de crédito para Martins é 0 real
Fluxo DHJM
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 2 unidades de Pincel
H
- Isabelle tenta tenta salvar o pedido
Assertivas
- O sistema informou que não será possível salvar o pedido
J
- O sistema não permitiu salvar o pedido
M
- O saldo do limite de crédito para Martins é 10 reais
Fluxo DHKN
Dado
Operação
- Isabelle começa um pedido de Venda para Martins
[FGH]
- Isabelle coloca 2 unidades de Pincel
H
- Isabelle tenta tenta salvar o pedido
Assertivas
- O sistema informou que será possível salvar o pedido, mas ele ficará pendente
K
- O sistema permitiu salvar o pedido, ficando com a pendência de cliente sem limite de crédito
N
- O saldo do limite de crédito para Martins é -10 reais