Magento Grand Total sem impostos em 1.9 com PHP7

17

Estamos trabalhando em um 1.9 & php7; detectou esse problema com suspeita de fraude no paypal (devido ao valor da diferença).

Tudo correto no frontend (aplicar impostos); mas no checkout e no cálculo, o magento usa o total geral sem impostos.

Cálculo real da ordem incorreta:

Preço do produto sem impostos + frete com impostos = valor total do pagamento

Mude para php5 e o cálculo está correto.

Alguma idéia?

Obrigado!

Joan M
fonte
Eu tenho o mesmo problema. Tudo o que encontrei até agora foi o seguinte: stackoverflow.com/questions/34281113/… Uma solução para resolver isso seria ótima.
Reinsch
Isso é independente do PHP 7 e foi relatado anteriormente, por exemplo, em 2012: Algoritmo de classificação: os totais de checkout do Magento classificados incorretamente, causando cálculo errado dos impostos de remessa , o ticket interno do Magento fornecido é [MCACE-129].
22715 hakre

Respostas:

13

Solução

Eu criei um módulo magento para resolver problemas de magento com cálculo de totais para php7. Os problemas que experimentei em particular foram que os impostos foram adicionados duas vezes ao total geral para pagamento com o módulo amazon na página de pagamento da amazonpayments.

Créditos

A resposta fornecida pelo archigrafix nesta postagem ( /magento//a/97107/35665 ) resolveu meus problemas - portanto, essa é simplesmente a correção compactada em um módulo.

Módulo:

https://github.com/hartmut-ltd/magento-php7-totals-fix

Hartmut
fonte
funciona !!! recomendar solução
jruzafa
9

Realmente não sei se isso vai ajudar de alguma forma, mas algo para investigar.

É possível que o collecttotalspedido do seu modelo esteja sendo pedido de forma diferente e esse imposto esteja sendo solicitado / aplicado após grand_total

Você pode testar se esse é o problema da seguinte maneira. (observe que isso envolve ajustar um arquivo principal para obter algumas informações de depuração, não tente isso em um site ativo!)

Edite o método localizado em:

Mage_Sales_Model_Quote_Address::collecttotals

e adicione uma linha ao método, que permitirá a saída dos modelos à medida que são processados.

public function collectTotals()
    {
        Mage::dispatchEvent($this->_eventPrefix . '_collect_totals_before', array($this->_eventObject => $this));
        foreach ($this->getTotalCollector()->getCollectors() as $model) {
            mage::log($model->getCode()); // <===== ADD THIS LINE
            $model->collect($this);
        }
        Mage::dispatchEvent($this->_eventPrefix . '_collect_totals_after', array($this->_eventObject => $this));
        return $this;
    }

verifique se o log está ativado.

Tail o arquivo de log através do console: tail -f system.log

Reproduza o problema pelo frontend.

Você obterá as entradas da seguinte maneira em seu log (isto é de um vanilla 1.9.2.2 - você pode ter outras entradas)

2015-12-21T05:54:12+00:00 DEBUG (7): nominal
2015-12-21T05:54:12+00:00 DEBUG (7): subtotal
2015-12-21T05:54:12+00:00 DEBUG (7): msrp
2015-12-21T05:54:12+00:00 DEBUG (7): freeshipping
2015-12-21T05:54:12+00:00 DEBUG (7): tax_subtotal
2015-12-21T05:54:12+00:00 DEBUG (7): weee
2015-12-21T05:54:12+00:00 DEBUG (7): shipping
2015-12-21T05:54:12+00:00 DEBUG (7): tax_shipping
2015-12-21T05:54:12+00:00 DEBUG (7): discount
2015-12-21T05:54:12+00:00 DEBUG (7): tax
2015-12-21T05:54:12+00:00 DEBUG (7): grand_total

Você o verá se repetir; portanto, apenas veja onde começa e termina; deve ser fácil ver o padrão

Observe as duas últimas entradas acima: O imposto vem antes de grand_total. Ele pode ser possível esta ordenação é fora de louco, e imposto está aparecendo depois grand_total, então grand_total não terá impostos aplicados.

EDITAR:

Ok, então eu não vi a pergunta referida realmente aponta para a classificação dos colecionáveis ​​como o problema. Suspeitei que esse seja o problema, mas ainda não testei isso no PHP7

Existe uma solução, mas não é muito agradável. Qualquer nova extensão colocada na loja, que insere modelos no coletor, precisaria ser notada e adicionada adicionalmente à classificação, caso contrário, as coisas poderiam dar ainda mais errado. Pode ser um problema de manutenção daqui para frente.

Simplesmente force a ordem de classificação colocando um específico <sort_order>na configuração de totais. Você pode fazer isso através de sua própria extensão, que teria apenas um config.xml, onde você especifica a ordem para cada coletor.

no config.xml, tenha a diretiva como tal:

<sales>
   <quote>
      <totals>
         <nominal>
           <sort_order>100</sort_order>
        </nominal>
        <subtotal>
           <sort_order>200</sort_order>
        </subtotal>
        <msrp>
           <sort_order>300</sort_order>
        </msrp>
        <freeshipping>
           <sort_order>400</sort_order>
        </freeshipping>

        ......
        insert each collector model with a sort directive
        ......

     </totals>
   </quote>

Use grandes lacunas entre cada diretiva de classificação, para permitir espaço para inserir mais adiante.

Como mencionado, não é muito elegante, mas pode resolver seu problema imediato.

Observe também que existem outras diretivas de coletor no sistema, portanto elas também podem estar erradas / precisando de ajuste

Verifique a extensão de vendas principal config.xml e procure por <totals>

Lá você encontrará:

<order_invoice>
<order_creditmemo>
<pdf>

Pode haver outros em outras extensões, seja ele principal / de terceiros

Espero que ajude.

PS: Eu não testei nada disso no PHP7. Eu sei que a colocação da diretiva sort_order funciona em php5.x

ProxiBlue
fonte
A classificação mudou no PHP7, você terá que definir explicitamente ordens de classificação únicas, pois ter várias ordens de classificação idênticas (por exemplo, nível 5 em três itens diferentes) pode ter resultados ímpares. stackoverflow.com/questions/34281113/…
Fiasco Labs
Eu adicionei uma edição à resposta.
ProxiBlue
Obrigado ProxiBlue; nós iremos conferir. Detectamos algum problema com a reindexação; em alguns casos, ele reproduz esse problema. Vá para a configuração do TAX, salve alguns "sem alteração" e o TAX retornará.
Joan M
8

No Magento 1.6.2 e PHP 7.0.2, resolvi-o desta maneira:

1 - Criou primeiro um config.xml local: Copiado /app/code/core/Mage/Sales/etc/config.xml em /app/code/local/Mage/Sales/etc/config.xml

2 - Alterou assim insira a descrição da imagem aqui

Agora calcula corretamente:

insira a descrição da imagem aqui

archigrafix
fonte
1
Você não pode substituir arquivos XML no conjunto de códigos local (apenas classes PHP carregadas automaticamente); portanto, isso deve fazer parte do config.xml de um módulo personalizado real.
Fabian Schmengler
1
Conforme explicado, isso foi feito usando um config.xml local.
Arquivrafix