2012-08-08 11 views
5

Mam pewne problemy z zaokrąglaniem płatności z Paypal i Magento 1.7.0.2 - Wszystkie ceny na stronie zawierają podatek, a podatek jest ustalany na 20% (VAT).Problem z zaokrąglaniem podatków Magento i Paypal

pójdę do kasy i wszystko jest poprawne:

enter image description here

będę następnie kliknij na miejsce zamówienia, a Paypal będzie jak ten, który jest nieprawidłowy, ponieważ wielka Całości jest teraz 1p mniej. Wygląda na to, że podatek jest zaokrąglany.

enter image description here

W niektórych przypadkach to działa ok, ale w innych podatek zaokrągla się nieprawidłowo. Próbowałem wprowadzeniem zmian w sposobie obliczania podatku calcTaxAmount() w app/code/core/Mage/podatku/model/Calculation.php

Dodałem to metody calcTaxAmount co wydawało się to naprawić, ale powodują, że ceny na stronie produktu są nieprawidłowe (1 pensa mniej).

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

Jestem całkiem pewien, że to jest błąd, ale jestem z pomysłów. Jeśli ktokolwiek natknął się na to wcześniej i ma rozwiązanie, chętnie bym to usłyszał. Każda pomoc doceniona.

EDIT: Oto moje ustawienia podatkowe w Magento

enter image description here

+0

Jakie są Twoje ustawienia obliczania podatków w administracji? –

+0

Dodam zrzut ekranu ustawień podatków do mojego posta. –

+1

Spróbuj zmienić obliczenie podatku na podstawie ceny jednostkowej. Myślę, że będzie to bardziej zgodne z brytyjskim prawem podatkowym. Jeśli to nie pomoże, wskażę ci miejsca, w których możliwa jest zmiana. –

Odpowiedz

2

Chyba znalazłem rozwiązanie tego problemu dręczące społeczność.

Jeśli ceny zawierają podatek, obliczenie podatku jest nieprawidłowe.

Oto dylemat - W Mage_Tax_Model_Calculation :: calcTaxAmount():

zmiana warunek:

if ($priceIncludeTax)... 

do:

if (! $priceIncludeTax) ... 

Zatem warunek wygląda następująco:

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

Aby uzyskać szczegółowe informacje, sprawdź moje komentarze: http://www.magentocommerce.com/boards/viewthread/247201/P45/

Pamiętaj, aby nie modyfikować pliki core - utworzenie kopii w lokalnym

+0

Dzięki za wkład Mike, dam to wypróbować. –

+0

To nie działa. Proponuję podążać za http://www.magentocommerce.com/boards/viewthread/247201/P45/#t415016 – Jaro

+0

Może to czasami naprawiać, ale nie zawsze. Może również pokazywać błąd po powrocie z serwisu PayPal/oznaczeniu zamówienia jako oszustwo. Wyszukiwanie trwa ... – Willster

2

I „stałe” to dzisiaj dla i klienta, ale nie do końca zadowolony z roztworu. Ale działa.

Jest lepiej, jeśli skopiować ten plik do lokalnego folderu: app/code/core/Mage/Paypal/Model/Api/Nvp.php

dodałem ten kod (tylko w przypadku wyraźnej kasie) na linii 606, więc wygląda to tak.

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

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

i trzeba skręcić w pozycji transferu Koszyk linia w paypal moule w backend

Jeśli ktoś zna lepsze rozwiązanie to po prostu nadpisuje kosztów wysyłki daj mi znać

1

Ten problem dręczy mnie (i przez to wygląda na społeczność magento od wieków), dzięki ShopWorks popchnąć we właściwym kierunku (w tym jego fragment kodu, dzięki mate !, ale może to powodować, że wracając do koszyka z ekspresu czek . Na zewnątrz, dodał czek w celu zapobieżenia tego) parametrów $ żądanie wymyśliłem następującą poprawkę (/ siekać):

On line 606 Nvp.php umieścić następujące:

$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']; 
    } 
} 

Dodatkowo dodaje się musi być umieszczona w funkcji numeru (938), (linia od 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; 
    } 
} 

to Hack i traktować je jako takie. Mój kolega obecnie testuje to, ale wydaje się, że jest to w tej chwili poprawne, pomocne jest również ustawienie metody obliczania podatku według ceny jednostkowej (nasi księgowi są zadowoleni z tego rozwiązania, ale dotyczy to Wielkiej Brytanii, nie jestem pewien, czy inne kraje będą marszczyć brwi na tej konkretnej metody obliczania podatków).

Powodem, dla którego manipuluję $ request ['AMT'] jest to, że czasami obliczenie zmiennej $ finalValue dawało -0.9999 powtarzającą się liczbę całkowitą, która nie przydaje się nikomu, moja matematyka jest do bani, więc jeśli ktoś chce popraw to, proszę, zrób to!

Jak zwykle nie zastępuj nvp.php w katalogu głównym, utwórz osobny moduł przepisywania lub rób to w aplikacji/local/mag. Pierwsza opcja, najlepiej! :-)

+0

Naprawiłem moje problemy w 1.8.1.0 (elementy zamówienia na koszyk przelewu muszą być ustawione na Nie!) Testowane tylko przez kilka godzin, ale sofar to wygląda dobrze ... – loeffel

+0

Po prostu uaktualnienie do wersji 1.9.1.0 i oto i nadal jest to problem! Nie przesunęliśmy tego przesłonięcia na myśl o kodzie 1,9, bo naprawili to, chłopak był w błędzie! – evensis

+0

To działało trochę dla mnie, ale nadal istniał problem, gdy wróciliśmy na stronę potwierdzenia Magento z PayPal Express, mówiąc: "Łączne kwoty pozycji koszyka nie odpowiadają kwotom zamówień". Transakcje można również oznaczyć jako oszustwo przez PayPal. – Willster

1

Istnieje "błąd" na Paypal w module magento (przynajmniej na moim Magento 1.8.0); Znajduje się w klasie Mage_Paypal_Model_Cart.

Aby potwierdzić, że kwoty są prawidłowe, metoda _validate() on line 381 podsumowuje wszystkie przedmioty cen z rzędu, dodaje wysyłek opłaty i podatki, i porównuje wynik z ogólnej wartości zamówienia (dostał od sposobu zlecenia getBaseGrandTotal())

Ale czasami istnieje różnica między kwotami 0.009999999999999999 (musi pochodzić z różnych metod zaokrąglania, nie wiem); więc pozycje nie są poprawne, a metoda getItems() z linii 146 zwraca wartość false.

W moim przypadku spowodowało to, że klienci płacili inną kwotę i "podejrzliwość o oszustwo" na swoich zamówieniach.

Naprawiłem go zmieniając metodę porównawczą (linia 404) od:

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

do

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

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

wciąż mam nadzieję, że nie będzie diffs większej niż 0.009999999 w przyszłości. ..

Mam nadzieję, że to pomoże.

-1

Właśnie zmieniłem elementy zamówienia koszyka przelewowego na "NIE", bez zmiany powyższego kodu .. i zadziałało.

Magento 1.9.0.1

prostu FYI - test, czy to działa dla Ciebie.

Dmytro

0

Używam CE1.7.0.2 i były naklejane na ten problem przez kilka dni, próbował kilka rozwiązań, a ostatecznie wylądował na poprawki Adama Halla/Hack. Ideał wydaje mi się rozsądny, więc zastosowałem go na mojej stronie i wszystko poszło dobrze, aż do dzisiejszego ranka, zdałem sobie sprawę, że dostosowanie kwoty podatku nie działa w naszej sytuacji.

Jesteśmy w Kalifornii i sprzedajemy towary w różnych stanach, klienci w Kalifornii będą obciążani podatkiem obrotowym, a inni nie. Więc gdy kwota podatku wynosi zero i trzeba odjąć różnicę, wygeneruje ona ujemną kwotę podatku, która oczywiście zostanie odrzucona przez system PayPal. Więc kiedy odejmując różnicę kwoty podatku, dodałem warunkową deklarację

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

Jeżeli kwota podatku wynosi zero, będę dostosować wysyłki kwoty zamiast kwoty podatku. (Oczywiście, jeśli zarówno podatek, jak i dostawa są bezpłatne, to nie zadziała, ale nie sądzę, że stanie się to w prawdziwym biznesie). Mam nadzieję, że to pomoże tym, którzy mają taki sam problem jak my.