Rateio de desconto adicional
Necessidade
O vendedor precisa informar que as outras partes envolvidas na negociação vão dar desconto e qual valor será esse. Esse desconto é um desconto adicional e ficará pendente de aprovação da parte envolvida.
Exemplo
Fábio está vendendo Moto X Play para o Jefferson. Fábio dá 10% de desconto retirando de sua comissão, em seguida dá mais 10% de desconto, sendo que 5% será custeado pela Totvs e 5% pela SoftSite.
Solução declarativa
O vendedor colocará um desconto relativo à sua comissão e outro relativo às outras partes envolvidas. As outras partes envolvidas são papéis atrelados a elas (Parceiro, Coordenador e Gerente Comercial). Cada papel está associado a um supervisor para que ele possa aprovar o desconto.
Implementação
O item tem dois descontos a priori:
- descondo padrão
- desconto adicional
Caso seja de desejo do vendedor, é possível dividir o desconto adicional para as outras partes. As outras partes serão definidas pela estrutura de supervisor e papéis. Cada supervisor é associado a uma alçada que representa seu papel. O padrão da distribuição do desconto adicional é colocar todo no papel referente ao seu supervisor imediato. Quanto mais próximo um supervisor está do vendedor mais alto aparecerá na listagem de divisão de valores.
O valor do desconto adicional total é modificado exclusivamente no campo textual, sendo que a distribuição é colocado via sliders. Por exemplo:
Desconto adicional: 20% Parceiro #-----*-----# (10%) Coordenador #---*-------# (6%) Gerente Comercial #--*--------# (4%)
Base de dados
Essas informações são salvas na tabela ITEM_PEDIDO_DESCONTO
.
+----------------+----------------+----------------+----------+-------------------+----------------------+ | CD_PEDIDO_PALM | NR_ITEM_PEDIDO | DS_DESCONTO | DS_MODIF | PR_DESCONTO | VR_DESCONTO | +----------------+----------------+----------------+----------+-------------------+----------------------+ | Colunas para diferenciar o item | desc_adicional | O papel | A porcentagem | Nulo (reservado para | | onde se aplica o desconto | (literal) | | relativa ao papel | valores absolutos) | +---------------------------------+----------------+----------+-------------------+----------------------+
No exemplo anterior, os descontos seriam salvos assim (para o pedido de código 112, item número 1):
+----------------+----------------+----------------+-------------+-------------+-------------+ | CD_PEDIDO_PALM | NR_ITEM_PEDIDO | DS_DESCONTO | DS_MODIF | PR_DESCONTO | VR_DESCONTO | +----------------+----------------+----------------+-------------+-------------+-------------+ | 112 | 1 | desc_adicional | Parceiro | 10 | null | +----------------+----------------+----------------+-------------+-------------+-------------+ | 112 | 1 | desc_adicional | Coordenador | 6 | null | +----------------+----------------+----------------+-------------+-------------+-------------+ | 112 | 1 | desc_adicional | Gerente | 4 | null | | | | | Comercial | | | +----------------+----------------+----------------+-------------+-------------+-------------+
Para efeitos de cálculos de desconto, considera-se o valor da totalidade: 20%.
Equilibração dos sliders
OBS: tem mais a ver com o componente do que com o caso de uso em si.
Ao se alterar o valor de um dos sliders, os outros valores se equilibrarão proporcionalmente.
Tome novamente o exemplo anterior:
Desconto adicional: 20% Parceiro #-----*-----# (10%) Coordenador #---*-------# (6%) Gerente Comercial #--*--------# (4%)
Caso se remova todo o desconto relativo ao Parceiro, o novo equilíbrio do sistema será:
Desconto adicional: 20% Parceiro #*----------# (0%) Coordenador #------*----# (12%) Gerente Comercial #----*------# (8%)
Fórmula de equilibração
Sejam Z
o valor que será alterado no slider e Xi
(i
de 1 a n
) os valores dos outros n
sliders. Sejam Z'
o valor alterado de Z
e X'i
o valor equilibrado de Xi
. Esses valores são todos não negativos.
Se a soma de todos os Xi
for não nula, então temos:
S = Soma Xi, i de 1 a n Z' = Z - d X'i = Xi (1 + d/S)
Caso contrário, a soma de todos os Xi
for nula, então temos:
S = Soma Xi, i de 1 a n Z' = Z - d X'i = d/n
Demonstração matemática
Sejam Z
o valor que será alterado no slider e Xi
(i
de 1 a n
) os valores dos outros n
sliders. Sejam Z'
o valor alterado de Z
e X'i
o valor equilibrado de Xi
. Esses valores são todos não negativos.
Se a soma de todos os Xi
for não nula, como o valor após equilibração é proporcional ao valor anterior, temos:
S = Soma Xi, i de 1 a n Z' = Z - d X'i = Xi (1 + D)
Como é sabido que a soma de todos os valores dos sliders é idêntico em todos os momentos, daí:
Z + Soma(Xi) = Z' + Soma(X'i) Z + Soma(Xi) = Z - d + (1 + D) Soma(Xi) Z + S = Z - d + (1 + D) S S + d = S + D S D = d/S logo: X'i = Xi (1 + D) = Xi (1 + d/S)
Caso contrário, a soma de todos os Xi
for nula, então temos:
Z' = Z - d X'i = D
Como é sabido que a soma de todos os valores dos sliders é idêntico em todos os momentos, daí:
Z + Soma(Xi) = Z' + Soma(X'i) Z + 0 = Z - d + n D D = d/n logo: X'i = D = d/n