Como funciona internamente o processo de finalização de compra do PrestaShop: regras do carrinho, vouchers e lógica de cálculo de impostos.

Uma pessoa recebe US$ 10, mas são deduzidos US$ 9.87. Ninguém está agindo de forma incorreta. O carrinho está funcionando exatamente como foi projetado. O motivo está apenas alguns níveis abaixo da tela.

Como funciona o processo de finalização de compra no PrestaShop? Geralmente, todas as perguntas se relacionam à mesma resposta: o que é executado e qual a sua prioridade. Depois de entender isso, os totais que pareciam errados se tornam previsíveis. A seguir, descrevemos o fluxo do processo de finalização de compra no PrestaShop, do carrinho ao pedido, usando o código que é enviado e não o que a tela de configurações sugere.

1.0 O que acontece internamente durante o processo de finalização de compra no PrestaShop

Ao solicitar o total de um carrinho, o PrestaShop delega a tarefa a uma classe de calculadora. Não se trata de uma fórmula única. São três etapas separadas, sempre na mesma ordem, cada uma construída sobre a anterior.

O que acontece internamente durante o processo de finalização da compra no PrestaShop?

Primeiro as linhas, depois as taxas e, por fim, os descontos. Reorganizá-las não é uma opção.

Primeiro vêm as linhas de produtos. Cada linha tem seu próprio preço, com sua quantidade e alíquota de imposto individuais, o que explica a maior parte do que vem a seguir. Em seguida, vêm as taxas: frete e embalagem para presente, calculadas e mantidas separadamente dos produtos para que um cupom possa eliminar uma sem afetar a outra. Por último, os descontos.

Essa terceira posição é importante. Ela resolve a maioria dos problemas de cálculo do carrinho do PrestaShop , porque um cupom nunca altera os preços originais. Ele se aplica a qualquer que seja a aparência das linhas naquele momento, incluindo os códigos de cupom aplicados anteriormente.

2.0 Como o PrestaShop calcula o total do carrinho?

O valor total não é um número que a loja guarda em algum lugar. Ele é calculado sob demanda, e o cliente especifica quais partes deseja: somente os produtos, somente os descontos, tudo ou tudo, exceto o frete.

Vale a pena saber, porque as peças nem sempre correspondem ao que as pessoas esperam. Veja o caso do valor mínimo para frete grátis. Ele pede o total sem o frete, mas já com os descontos aplicados. Se você fizer uma pergunta diferente, receberá uma resposta diferente. Ambas estão corretas.

Portanto, um valor na tela pode divergir de um valor em um relatório. Nenhum dos dois está errado. Eles podem simplesmente estar solicitando peças diferentes do mesmo carrinho, então verifique qual deles antes de presumir que algo está quebrado.

3.0 Como funcionam as regras do carrinho no PrestaShop?

As regras do carrinho do PrestaShop consistem tanto no cupom inserido pelo cliente quanto nos descontos automáticos aplicados sem código. No painel administrativo, ambos são considerados o mesmo objeto. Por isso, compartilham a mesma tela no painel administrativo e o mesmo caminho no código.

As regras são aplicadas uma de cada vez, ordenadas por prioridade, da menor para a maior. A prioridade é um número que você define para cada regra. Ela faz mais do que apenas ordená-las: quando duas regras não podem ser combinadas, a prioridade decide qual delas prevalece.

Cada regra considera o carrinho como a regra anterior o deixou. Portanto, dois cupons de 10% em um carrinho de 100 não descontam 20. O primeiro desconta 10. O segundo desconta 10% dos 90 restantes, e o cliente economiza 19. Comportamento padrão, não um erro de arredondamento.

As condições em si são o que a maioria dos lojistas já conhece: intervalos de datas, valor mínimo, limites por cliente e exclusões por país, grupo, transportadora ou produto. A própria documentação de regras do carrinho do PrestaShop detalha cada campo, portanto, não há necessidade de escrevê-las novamente.

4.0 Como os vouchers são aplicados no PrestaShop?

É aqui que o sistema de vouchers do PrestaShop fica interessante. É também daí que vem o valor de 9.87. Descontos percentuais e descontos de valor fixo são tratados de maneiras bem diferentes, e a diferença não é apenas estética.

Como os vouchers são aplicados no PrestaShop?

A porcentagem é simples. Cada linha perde essa porcentagem, então um cupom de 10% desconta 10% do livro e 10% dos fones de ouvido. Cada item mantém sua própria alíquota de imposto sem que ninguém precise se preocupar com isso.

Um valor fixo não funciona dessa forma, porque o carrinho primeiro precisa decidir em quais linhas o desconto deve ser aplicado. O PrestaShop distribui o desconto proporcionalmente: cada linha recebe uma parte do desconto correspondente à sua participação no valor total do carrinho.

Como os vouchers são aplicados no PrestaShop?

Os 10 são divididos de acordo com a contribuição de cada linha, e não igualmente entre as linhas.

Essa é a essência do cálculo de descontos em vouchers no PrestaShop . E há uma consequência importante: cada linha do produto tem sua própria alíquota de imposto, então o imposto descontado depende de quais produtos receberam o desconto. Se você mover o mesmo desconto de 10 para um carrinho com pesos diferentes, o valor total do imposto muda, mesmo que o cliente tenha economizado exatamente o mesmo valor.

Uma segunda configuração também é importante aqui. O valor do voucher inclui ou exclui impostos? Essa configuração determina qual valor será usado para calcular a economia, então, de uma forma, o desconto de 10% é aplicado ao preço com impostos inclusos, e de outra forma, é aplicado antes dos impostos, resultando em uma pequena diferença na economia que o cliente vê.

Como os vouchers são aplicados no PrestaShop?

5.0 Como o PrestaShop calcula o imposto no momento do pagamento?

O cálculo de impostos no PrestaShop é feito por linha, e não no carrinho como um todo. Cada produto possui um grupo de regras de impostos; esse grupo resulta em uma alíquota para o endereço de entrega, e a linha é tributada com base nessa alíquota.

Como os vouchers são aplicados no PrestaShop?

Um carrinho de compras, portanto, é a soma de vários pequenos valores de impostos. Nada calcula "o imposto deste pedido" de uma só vez. É por isso que o detalhamento dos impostos em uma fatura pode se estender por várias linhas, mesmo para um pedido pequeno, e por que essas linhas raramente se dividem igualmente.

O frete é tributado separadamente. Ele usa a regra de tributação da transportadora, não dos produtos, e isso acaba pegando as pessoas desprevenidas em carrinhos de compras onde os produtos têm alíquota zero, mas a entrega não.

6.0 Por que o PrestaShop calcula um total de carrinho diferente?

Duas somas diferem por um centavo? A causa mais comum é o arredondamento, e o PrestaShop oferece três maneiras de corrigi-lo.

Por que o PrestaShop calcula um total de carrinho diferente?

Os mesmos três itens podem resultar em dois totais diferentes, dependendo de uma configuração.

Os preços são armazenados internamente com seis casas decimais. Portanto, a única questão real é onde o arredondamento ocorre. Ao arredondar cada item, o preço unitário é arredondado antes de qualquer multiplicação. Ao arredondar cada linha, a precisão total é mantida até a soma dos valores da linha. Ao arredondar o total, nada é arredondado até o final.

Nenhuma das três está errada. Elas simplesmente não coincidem. O arredondamento por linha é a recomendação usual para lojas que precisam que as faturas somem exatamente, pois mantém a consistência interna de cada linha, permitindo que a soma total seja precisa. As notas de cálculo de preços da própria PrestaShop explicam o raciocínio com mais detalhes.

Antes de culpar o arredondamento, descarte as explicações mais simples. Um total que muda quando o endereço muda se deve ao imposto, não ao arredondamento. Um total que muda quando um cupom é adicionado é o cálculo do pedido do PrestaShop funcionando normalmente. Diferenças de arredondamento são insignificantes. Qualquer diferença maior tem outra causa.

7.0 Como o PrestaShop calcula descontos e impostos em conjunto?

Juntando as duas partes: os descontos são aplicados após o cálculo do imposto por linha, e um desconto reduz proporcionalmente tanto a linha quanto o seu imposto.

Essa ordem é o que torna a lógica de finalização de compra do PrestaShop previsível. O imposto nunca é recalculado do zero após um desconto. Cada linha já conhece sua alíquota, então remover parte da linha remove a parte correspondente do imposto junto com ela.

Isso também responde a uma pergunta comum. Por que o total do imposto em um pedido com cupons não é simplesmente a taxa de imposto aplicada ao total com desconto? Porque esse valor é a soma do que cada linha reteve, e essas linhas começaram com porcentagens diferentes inicialmente.

8.0 Construindo um módulo que oferece um desconto

Cedo ou tarde, alguém pede um desconto que o PrestaShop não consegue oferecer por si só. Gaste um determinado valor e ganhe um produto grátis. Um programa de fidelidade. Algo atrelado a um valor que a loja não rastreia. A tentação é calcular o total por conta própria e subtrair em algum lugar conveniente.

Resista a essa ideia. Um desconto aplicado fora do sistema de regras do carrinho é invisível para todos os componentes que leem o carrinho. O resumo do pedido não o reconhecerá, a fatura não o exibirá e o detalhamento dos impostos estará incorreto, pois o imposto é calculado por linha e sua subtração nunca afetou as linhas.

Crie uma CartRule real. Seu módulo decide quando ela se aplica e qual o seu valor, e então repassa o desconto para o PrestaShop como uma regra adequada. Tudo o mais funciona automaticamente: o resumo, a fatura, o imposto por linha, a ordem de prioridade em relação a outros cupons.

O módulo ainda precisa responder a uma pergunta que o núcleo não consegue: essa regra ainda deve existir? Uma regra criada pelo seu módulo deve parar de ser aplicada no momento em que o módulo for desativado. Nada no PrestaShop sabe disso, porque, para ele, a regra é apenas mais uma linha na tabela.

9.0 Substituindo checkValidity de forma segura

O gancho para isso é `CartRule::checkValidity()` . O PrestaShop o chama quando um voucher é adicionado e novamente a partir de `autoRemoveFromCart()` em carrinhos que já possuem regras. Essa segunda chamada é a útil: retorne um erro e a regra será removida do carrinho automaticamente.

Portanto, a sobrescrita é curta. Verifique se a regra pertence ao seu módulo, verifique se o seu módulo está habilitado e, caso contrário, indique isso. Todo o resto vai diretamente para o módulo pai.

Três coisas são importantes na forma como você escreve.

Para todos os outros casos, chame o servidor principal. Uma configuração que responde por conta própria, em vez de adiar a decisão, ignora silenciosamente todas as verificações feitas pelo PrestaShop: datas, limites de quantidade, valores mínimos, restrições de país e transportadora. Essas informações são fáceis de esquecer e caras de perder.

Aja apenas de acordo com suas próprias regras. Identifique-as por algo duradouro, como um prefixo de código que seu módulo possui ou um registro em sua própria tabela. Uma sobreposição que se aplica a todas as regras da loja representa um risco para toda a loja, assumido em nome de um único módulo.

Respeite a flag `alreadyInCart`. O PrestaShop ignora propositalmente as verificações de atividade e data para regras já aplicadas, para que um voucher válido no momento do uso pelo cliente não desapareça durante o checkout. Sua verificação é diferente: um módulo desativado deve remover a regra mesmo de um carrinho que já a possua, e é exatamente para isso que serve o parâmetro `auto-remove`.

Certifique-se também de que o formato de retorno seja o correto. O método retorna `false` quando uma regra é válida e uma mensagem quando não é. Se retornar algo incorreto, quem chamar o método interpretará sua recusa como aprovação.

10.0 Limpeza e a ressalva da sobreposição

Desativar o módulo também deve impedir a criação de novas regras. A função de sobreposição lida com regras em andamento; o próprio módulo deve parar de gerar novas regras enquanto estiver desativado e, ao ser desinstalado, deve desativar ou excluir as regras criadas, em vez de deixá-las para que outra pessoa tenha que decifrá-las.

Uma ressalva importante: apenas uma sobrescrita de uma classe pode estar ativa por vez. Portanto, dois módulos que sobrescrevem `CartRule` entrarão em conflito, e o segundo a ser instalado geralmente perde. Se o seu desconto puder ser expresso por meio de condições que o núcleo do PrestaShop já suporta, use-as e ignore completamente a sobrescrita. Recorra a ela somente quando a regra depender de algo que o PrestaShop realmente não consegue ver.

11.0 O que mudou entre o PrestaShop 1.7 e o 9?

Vale a pena saber se você está seguindo um guia antigo ou lendo respostas em fóruns escritas há anos. Algumas informações ainda são válidas, outras não.

A calculadora descrita acima chegou na versão 1.7, e a ordem de três passagens não mudou desde então. Comparando diretamente o código nas versões 8.2 e 9, a sequência é idêntica. As regras ainda são aplicadas em ordem de prioridade. Os descontos por valor ainda são distribuídos proporcionalmente. Os três modos de arredondamento ainda se comportam como sempre se comportaram.

O que mudou foi a interface. O PrestaShop 9 continua migrando as páginas do back-office para o Symfony, então as telas foram reconstruídas e alguns campos estão em locais diferentes dos anteriores. Os caminhos do menu para descontos permanecem os mesmos. Mas uma captura de tela de um tutorial da versão 1.7 não corresponderá ao que você vê na sua tela: as instruções sobre os cálculos ainda são válidas, mas as instruções sobre onde clicar podem não ser mais.

12.0 Descobrindo por que um total parece errado

Aqui está um pequeno procedimento para verificar as informações. Cada etapa elimina as seguintes, o que evita ter que corrigir um arredondamento quando a resposta é um desconto automático que ninguém se lembrava.

Comece pelas regras do carrinho de compras. Quais delas se aplicavam e em que ordem de prioridade? A resposta mais comum para essa pergunta é que alguém se esqueceu de que uma regra era automática.

Em seguida, verifique se o voucher é um percentual ou um valor fixo. Se for um valor fixo, verifique se ele inclui ou não os impostos. Essa simples verificação explica muitas das reclamações de que "o desconto está ligeiramente incorreto".

Em seguida, observe as taxas de imposto sobre os produtos individuais, em vez do total do carrinho. Taxas mistas em um mesmo carrinho são perfeitamente normais. Elas apenas fazem com que os cálculos pareçam mais estranhos do que realmente são.

Só então considere o arredondamento. E apenas se a diferença for de um ou dois centavos, pois uma diferença maior significa que algo mais está acontecendo. Verifique o modo de arredondamento nas suas configurações em relação ao valor total esperado da fatura.

13.0 Versão resumida

O processo de finalização de compra do PrestaShop é mais previsível do que parece. Os preços e impostos são calculados primeiro. As taxas vêm em seguida, os descontos por último, e cada desconto é aplicado sobre o saldo do desconto anterior.

Os comprovantes de valor fixo são distribuídos pelas linhas de acordo com o peso, de forma que cada linha mantenha sua própria alíquota de imposto. As porcentagens são mais simples e impactam diretamente cada linha. E quando dois totais diferem por um centavo, geralmente é uma questão de arredondamento, e não um erro.

Obrigado pela leitura.

Se você tiver dúvidas ou precisar de ajuda com o desempenho ou a migração do seu site, nossos especialistas estão à disposição. Entre em contato com a equipe da Knowband pelo e-mail [email protected] hoje mesmo para obter plugins de e-commerce confiáveis ​​e personalizados para as suas necessidades.

Deixa um comentário