2012-08-08 13 views
5

Ho alcuni problemi di arrotondamento con Paypal e Magento 1.7.0.2 - Tutti i prezzi sul sito includono le tasse e la tassa è calcolata al 20% (IVA).Problema di arrotondamento IVA Magento & Paypal

andrò alla cassa e tutto sia corretto:

enter image description here

Io poi clicco su ordine del posto, e Paypal sarà come questo, che non è corretto perché il totale è ora 1p meno. Questo sembra essere causato da come la tassa è arrotondata.

enter image description here

In alcuni casi, funziona bene, ma in altri l'imposta è arrotondato in modo non corretto. Ho provato a fare modifiche al metodo di calcolo delle imposte calcTaxAmount() in app/code/core/Mage/Tasse/Modello/Calculation.php

ho aggiunto questo al metodo calcTaxAmount che sembrava per risolvere il problema, ma è perché i prezzi sulla pagina del prodotto non sono corretti (1p in meno).

$amount = $this->roundUp($amount);

Sono abbastanza certo questo è un bug, ma sono a corto di idee. Se qualcuno si è imbattuto in questo prima e ha una soluzione sarei felice di sentirlo. Qualsiasi aiuto molto apprezzato.

EDIT: Qui ci sono le mie impostazioni fiscali in Magento

enter image description here

+0

Quali sono le impostazioni del calcolo delle imposte nell'amministratore? –

+0

Aggiungerò uno screenshot delle impostazioni fiscali al mio post. –

+1

Provare a modificare il calcolo delle imposte in base al Prezzo unitario. Penso che sarà più compatibile con la legge fiscale del Regno Unito. Se non ti sarà d'aiuto, ti indicherò i luoghi in cui è possibile cambiare. –

risposta

2

Credo di aver trovato la soluzione a questo problema che affligge la comunità.

Se i prezzi includono le tasse, il calcolo delle imposte è errato.

Ecco la correzione - In Mage_Tax_Model_Calculation :: calcTaxAmount():

cambiamento della condizione:

if ($priceIncludeTax)... 

a:

if (! $priceIncludeTax) ... 

Quindi la condizione si presenta come:

if (! $priceIncludeTax) { 
    $amount = $price*(1-1/(1+$taxRate)); 
} else { 
    $amount = $price*$taxRate; 
} 

Per ulteriori informazioni, controllare i miei commenti: http://www.magentocommerce.com/boards/viewthread/247201/P45/

Ricordati di non modificare i file principali - creare una copia in locale

+0

Grazie per il contributo Mike, darò una prova. –

+0

Questo non funziona. Suggerisco di seguire http://www.magentocommerce.com/boards/viewthread/247201/P45/#t415016 – Jaro

+0

Questo può risolverlo a volte, ma non sempre. Inoltre può mostrare un errore una volta che torni da PayPal/contrassegna l'ordine come una frode. La ricerca continua .. – Willster

2

I "fisso" questo oggi per i clienti, ma non veramente felice con la soluzione. Ma funziona.

E 'meglio se si copia il file nella cartella locale: app/code/core/Mage/Paypal/Modello/Api/Nvp.php

ho aggiunto questo codice (solo per il check-out rapido) sulla linea 606 quindi sembra così.

$request['SHIPPINGAMT'] = ($request['AMT'] - ($request['TAXAMT'] + $request['ITEMAMT'])); 

$response = $this->call(self::SET_EXPRESS_CHECKOUT, $request); 
$this->_importFromResponse($this->_setExpressCheckoutResponse, $response); 

E che serve per trasformare di elementi Transfer Carrello linea nel moule paypal nel backend

Se qualcuno conosce una soluzione migliore poi basta sovrascrivere il shippingcost fatemi sapere

1

Questo problema mi ha afflitto (e da anni guardo la comunità di Magento per anni), grazie a ShopWorks che spinge nella giusta direzione (incluso il suo frammento di codice, grazie amico! Comunque sarebbe un errore se tornasse al carrello da espresso dai un'occhiata . Out, ha aggiunto un check-in per evitare che questo) dei parametri $ richiesta mi si avvicinò con la seguente correzione (/ hack):

on line 606 del Nvp.php inserire il seguente:

$totalValue = $request['TAXAMT'] + $request['ITEMAMT']; 
$finalValue = $totalValue - $request['AMT']; 

if($request['SHIPPINGAMT'] > 0) { 
    $request['SHIPPINGAMT'] = ($request['AMT'] - ($request['TAXAMT'] + $request['ITEMAMT'])); 
    $totalValue = $request['TAXAMT'] + $request['ITEMAMT'] + $request['SHIPPINGAMT']; 
    $finalValue = $totalValue - $request['AMT']; 
} 

if($request['AMT'] != $totalValue) { 
    if($totalValue > $request['AMT']) { 
     $request['TAXAMT'] = $request['TAXAMT'] - $finalValue; 
    } elseif($totalValue < $request['AMT']) { 
     $request['TAXAMT'] = $request['TAXAMT'] + $finalValue; 
    } else { 
     $request['AMT'] = $request['TAXAMT'] + $request['ITEMAMT']; 
    } 
} 

inoltre, il seguente deve essere posizionato anche all'interno della chiamata di funzione() (linea 938 di Nvp.php):

$totalValue = $request['TAXAMT'] + $request['ITEMAMT'] + $request['SHIPPINGAMT']; 
$finalValue = $totalValue - $request['AMT']; 

if($request['AMT'] != $totalValue) { 
    if($totalValue > $request['AMT']) { 
     if($finalValue > 0) { 
      // its preferable that we change the tax amount over the grand total amount 
      $request['TAXAMT'] = $request['TAXAMT'] - $finalValue; 
     } else { 
      $request['AMT'] = $totalValue; 
     } 
    } elseif($totalValue < $request['AMT']) { 
     if($finalValue > 0) { 
      // its preferable that we change the tax amount over the grand total amount 
      $request['TAXAMT'] = $request['TAXAMT'] + $finalValue; 
     } else { 
      $request['AMT'] = $totalValue; 
     } 
    } else { 
     $request['AMT'] = $totalValue; 
    } 
} 

Questo è un hack, e trattarlo come tale. Al momento il mio collega lo sta testando ma al momento sembra essere OK, è anche utile impostare il metodo di calcolo delle imposte in base al prezzo unitario (i nostri commercialisti sono soddisfatti di questo accordo, ma questo è per il Regno Unito, non sono sicuro se altri paesi aggrottano le sopracciglia su quel particolare metodo di calcolo delle tasse).

Il motivo per cui sto manipolando la richiesta $ ['AMT'] è perché occasionalmente il calcolo della variabile $ finalValue produrrebbe un numero intero -0.9999 che non è utile a nessuno, la mia matematica fa schifo quindi se qualcuno vuole migliorare su questo, per favore fallo!

Come sempre non sovrascrivere il nvp.php nella directory principale, creare un modulo di riscrittura separato o farlo in app/local/mage. Prima opzione preferibilmente! :-)

+0

Questo ha risolto i miei problemi in 1.8.1.0 (gli elementi pubblicitari del carrello di trasferimento devono essere impostati su No!) Testati solo per un paio d'ore ma questo è bello ... – loeffel

+0

Solo aggiornamento a 1.9.1.0 ed ecco che questo è ancora un problema! Non ho spostato questo override sulla base del codice 1.9 pensando che l'avrebbero riparato, ragazzo mi sbagliavo! – evensis

+0

Questo ha funzionato un po 'per me, ma c'era ancora un problema quando siamo tornati alla pagina di conferma di Magento da PayPal Express, dicendo "I totali degli importi degli articoli del carrello non corrispondono agli importi degli ordini". Le transazioni possono anche essere contrassegnate come frode da PayPal. – Willster

1

C'è un "bug" su Paypal nel modulo magento (almeno sul mio Magento 1.8.0); Si trova nella classe Mage_Paypal_Model_Cart.

per verificare che gli importi siano corretti, il metodo _validate() on line 381 riassume tutti i prezzi prodotti da l'ordine, aggiunge spese di spedizione e le tasse, e confronta il risultato con il valore totale dell'ordine (ottenuto dal metodo di ordine getBaseGrandTotal())

Ma a volte, c'è una differenza di 0,00999999999999999999 tra gli importi (deve provenire da diversi metodi di arrotondamento, non lo so); quindi gli articoli non sono validi e il metodo getItems() dalla riga 146 restituisce false.

Nel mio caso, ciò ha comportato che i clienti pagassero un importo diverso e un flag "sospetto di frode" sui loro ordini.

ho riparato cambiando il metodo di confronto (linea 404) da:

if (sprintf('%.4F', $sum) == sprintf('%.4F', $referenceAmount)) { 
    $this->_areItemsValid = true; 
} 

a

$diff = abs(sprintf('%.4F', $sum) - sprintf('%.4F', $referenceAmount)); 

if ($diff < 0.01) { 
    $this->_areItemsValid = true; 
} 

spero ancora che non ci saranno diff di oltre ,009,999999 millions in futuro. ..

Spero che questo aiuti.

-1

ho appena modificato gli elementi pubblicitari del carrello di trasferimento su "NO", senza la modifica del codice sopra .. e ha funzionato.

Magento 1.9.0.1

appena cronaca - prova se funziona per voi.

Dmytro

0

sto usando CE1.7.0.2 e sono stato attaccato su questo problema per giorni, ha provato diverse soluzioni, e, infine, è atterrato sulla correzione di Adam Hall/hack. L'ideale mi sembra ragionevole, quindi l'ho applicato sul mio sito e tutto è andato bene fino a questa mattina, mi sono reso conto che l'adeguamento sull'importo delle tasse non funziona per la nostra situazione.

Siamo in California e vendiamo cose in tutti gli stati, ai clienti in California verrà addebitata l'imposta sulle vendite mentre altri non lo faranno. Quindi, quando l'importo delle tasse è pari a zero e devi sottrarre la differenza, genererà un importo fiscale negativo che, ovviamente, verrà rifiutato da PayPal. Così, quando sottraendo differenza rispetto ammontare d'imposta, ho aggiunto un'istruzione condizionale

if ($request['TAXAMT'] > 0) { 
    $request['TAXAMT'] = $request['TAXAMT'] - $finalValue; 
} else { 
    $request['SHIPPINGAMT'] = $request['SHIPPINGAMT'] - $finalValue; 
} 

Se ammontare d'imposta è pari a zero, mi modificare lo shipping, invece di ammontare d'imposta. (Certo se sia la tassa che la spedizione sono gratuite, questo non funzionerà, ma non credo che accadrà negli affari reali.) Spero che questo possa aiutare coloro che hanno lo stesso problema di noi.

Problemi correlati