2012-08-03 11 views
8

Dodałem dodatkową opłatę do mojego kasy, ale podatek nie jest obliczany poprawnie.Magento: podatek nieprawidłowy za dodatkową opłatą w kasie

Kwota podatku nie jest doliczana prawidłowo, jeśli wykonuję $ this -> _ calculTax ($ address); w funkcji gromadzenia jest ona dodawana do sumy łącznie z podatkiem, ale moja kwota podatku jest nadal wtedy.

jeśli jest var_dump ustawiono podatki stosowane po linii $ address-> setAppliedTaxes ($ previouslyAppliedTaxes); Widzę prawidłową kwotę. Zrzuca to dwa razy, po raz pierwszy widzę prawidłową kwotę podatku tylko mojej dodatkowej opłaty, a druga właściwą kwotę całkowitego podatku. Ale w interfejsie wyświetla podatek bez podatku z mojej dodatkowej opłaty.

Każda wskazówka, co to może być?

class Company_Customer_Model_Quote_Address_Total_PrintPrepCosts extends Mage_Sales_Model_Quote_Address_Total_Abstract 
{ 
    public function __construct() { 
     $this->setCode('printPrepCosts'); 
     $this->_store = Mage::app()->getStore(); 
     return $this; 
    } 

public function collect(Mage_Sales_Model_Quote_Address $address) 
    { 
     parent::collect($address); 
     $address->setPrintPrepcosts(0); 
     $address->setTaxAmount(0); 
     $address->setBaseTaxAmount(0); 

     if(count($address->getAllItems()) == 0) 
     { 
      return $this; 
     } 

     $pricePrint = $this->calcTotalPrintPrepCosts(); 

     $address->setPrintPrepcosts($pricePrint); 
     $address->setBasePrintPrepcosts($pricePrint); 

     $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getPrintPrepcosts()); 
     $address->setGrandTotal($address->getGrandTotal() + $address->getPrintPrepcosts()); 

     $this->_calculateTax($address); 
     return $this; 
    } 

    protected function _calculateTax(Mage_Sales_Model_Quote_Address $address) 
    { 
     $calculator  = Mage::getSingleton('tax/calculation'); 
     $inclTax  = Mage::getStoreConfig('tax/calculation/printing_prep_includes_tax', $this->_store); 

     $taxRateRequest = $calculator->getRateRequest(
      $address, 
      $address->getQuote()->getBillingAddress(), 
      $address->getQuote()->getCustomerTaxClassId(), 
      $this->_store 
     ); 

     // TODO undef prop _store 
     $taxRateRequest->setProductClassId(Mage::getStoreConfig('tax/classes/printing_prep_tax_class', $this->_store)); 

     $rate = $calculator->getRate($taxRateRequest); 
     $baseTax = $tax = $calculator->calcTaxAmount($address->getPrepPrintcosts(), $rate, $inclTax, true); 

     $address->addTotalAmount('tax', max(0, $tax)); 
     $address->addBaseTotalAmount('tax', max(0, $baseTax)); 

     $this->_saveAppliedTaxes($address, 
      $calculator->getAppliedRates($taxRateRequest), 
      $tax, 
      $baseTax, 
      $rate 
     ); 

     // later on added - which fixes the total, lose tax amount still off 
     $address->setTaxAmount($tax); 
     $address->setBaseTaxAmount($baseTax); 

     if($inclTax) 
     { 
      $address->setBaseGrandTotal($address->getBaseGrandTotal() - $baseTax); 
      $address->setGrandTotal($address->getGrandTotal() - $tax); 
     } 
    } 

    protected function _saveAppliedTaxes(Mage_Sales_Model_Quote_Address $address, $applied, $amount, $baseAmount, $rate) 
    { 
     $previouslyAppliedTaxes = $address->getAppliedTaxes(); 
     $process = count($previouslyAppliedTaxes); 


     foreach ($applied as $row) { 
      if (!isset($previouslyAppliedTaxes[$row['id']])) { 
       $row['process'] = $process; 
       $row['amount'] = 0; 
       $row['base_amount'] = 0; 
       $previouslyAppliedTaxes[$row['id']] = $row; 
      } 

      if (!is_null($row['percent'])) { 
       $row['percent'] = $row['percent'] ? $row['percent'] : 1; 
       $rate = $rate ? $rate : 1; 

       $appliedAmount = $amount/$rate*$row['percent']; 
       $baseAppliedAmount = $baseAmount/$rate*$row['percent']; 
      } else { 
       $appliedAmount = 0; 
       $baseAppliedAmount = 0; 
       foreach ($row['rates'] as $rate) { 
        $appliedAmount += $rate['amount']; 
        $baseAppliedAmount += $rate['base_amount']; 
       } 
      } 


      if ($appliedAmount || $previouslyAppliedTaxes[$row['id']]['amount']) { 
       $previouslyAppliedTaxes[$row['id']]['amount'] += $appliedAmount; 
       $previouslyAppliedTaxes[$row['id']]['base_amount'] += $baseAppliedAmount; 
      } else { 
       unset($previouslyAppliedTaxes[$row['id']]); 
      } 
     } 
     $address->setAppliedTaxes($previouslyAppliedTaxes);   
    } 

    public function fetch(Mage_Sales_Model_Quote_Address $address) 
    { 
     $address->addTotal(array(
      'code' => $this->getCode(), 
      'title' => "Prep Print costs", 
      'value' => $address->getPrintPrepcosts(), 
     )); 
     return $this; 
    } 

EDIT 1 XML zawiera to:

 <sales> 
     <quote> 
      <totals> 
       <printPrepCosts> 
        <class>Company_Customer_Model_Quote_Address_Total_PrintPrepCosts</class> 
        <after>subtotal</after> 
        <before>tax</before> 
       </printPrepCosts> 
      </totals> 
     </quote> 
    </sales> 

EDIT 2 Dodałem następujące linie do mojej funkcji calcTax, to ma naprawić wielki sumie jednak kwota podatku jest wciąż wyłączony.

$address->setTaxAmount($tax); 
    $address->setBaseTaxAmount($baseTax); 

WYJŚCIE - przykład

Subtotal € 67,50 
printPrepCosts € 40,00 
Shipping € 50,00 
TAX  € 22,33 
Total € 187,43 

EDIT 3 Mój zły, tylko GoMage onepage kasa daje poprawną sumę całkowitą, wózek nie. Regularne kasowanie Magento na stronie daje także zły grandtotal.

+0

Jakie zawartość 'calcTotalPrepPrintCosts()'? – B00MER

+0

nic więcej niż pętla w koszyku kasowym i tworzenie ceny przygotowawczej. Sprawdziłem i to zwraca wartość int lub float. Nawet po usunięciu funkcji i zastąpieniu jej wartościami zakodowanymi, problem nadal występuje. – PvdL

+0

gdzie funkcje są zdefiniowane w magento "getInvoiceTaxAmount", "getBaseInvoiceFeeExcludedVat" Nie mogłem znaleźć tej funkcji w Magento, czy ktoś może wyjaśnić, czym są i jak są one używane. –

Odpowiedz

5

znalazłem obejście, to nie jest to najlepsze rozwiązanie, ale działa :)

W moim adresem Zwrócę podatku na dodatkową var nazywa podatku i użyć jej w obserwatora manipulować podatku .

class Company_Client_Model_Observer 
{ 
    public function setCorrectTax ($observer) 
    { 
     $quote = $observer->getQuote(); 
     foreach ($quote->getAllAddresses() as $address) { 
      $printPrepCosts = $address->getPrintPrepcosts(); 
      if(!empty($printPrepCosts)) { 
       $address->setTaxAmount($address->tax); 
      } 
     } 
    } 
} 

A XML

<events> 
    <sales_quote_collect_totals_after> 
     <observers> 
      <client> 
       <type>singleton</type> 
       <class>client/observer</class> 
       <method>setCorrectTax</method> 
      </client> 
     </observers> 
    </sales_quote_collect_totals_after> 
    </events> 
+0

To jest świetny pomysł. Dzięki! – nethead

2

Czy próbujesz zmodyfikować istniejący element zamówienia z pozycją podatku lub dodać nowy? Czy możesz pokazać swój wpis config.xml dla całego modelu?

Jeśli dodajesz nowy element liniowy podatek, powinno to wystarczyć, tylko przetestowane przed CE 1.7 wanilii zainstalować:

class KJ_Mymodule_Model_Sales_Quote_Address_Total_Kjtest extends Mage_Sales_Model_Quote_Address_Total_Abstract 
{ 
    public function __construct() 
    { 
     $this->setCode('kjtest'); 
    } 

    public function collect(Mage_Sales_Model_Quote_Address $address) 
    { 
     parent::collect($address); 

     $this->_setAmount(1.01); 
     $this->_setBaseAmount(1.01); 

     return $this; 
    } 

    public function processConfigArray($config, $store) { 
     return $config; 
    } 

    public function fetch(Mage_Sales_Model_Quote_Address $address) 
    { 
     $address->addTotal(array(
      'code' => $this->getCode(), 
      'title' => "Prep Print costs", 
      'value' => 1.01, 
     )); 
     return $this; 
    } 
} 

wystarczającymi, to znaczy, że powinien to być minimum trzeba aby wyświetlić ten liniowy element zamówienia.

Mając to na swojej config.xml:

<sales> 
    <quote> 
     <totals> 
      <kjtest> 
       <class>mymodule/sales_quote_address_total_kjtest</class> 
       <after>tax</after> 
      </kjtest> 
     </totals> 
    </quote>  
</sales> 
+0

Edytowałem nazwy klas, aby były bardziej podobne. Moje XML wygląda następująco: ' \t \t Company_Client_Model_Quote_Address_Total_PrintPrepCosts Suma częściowa podatku ' co daje Subtotaal \t € 65,20 printPrepCosts \t € 40,00 wysyłki \t € 50,00 podatki \t € 21,89 – PvdL

+0

Dzięki. Czy próbujesz zmodyfikować linię podatkową? Wygląda na to, że linia printPrepCosts renderuje się dobrze, prawda? Może być konieczna zmiana na podatku. – kalenjordan

+0

Powinien po prostu pobrać podatek z mojego printPrepCosts i dodać go razem z resztą. Podatek nie działa również. – PvdL

2

Przeczytaj poniżej, myślę, że to bardzo pomaga w całości do ciebie: -

See url Poniżej

http://www.excellencemagentoblog.com/magento-add-fee-discount-order-total

Magento Dodaj opłatę lub rabat o rder ogółem

W tym samouczku zobaczymy, jak dodać nowy element zamówienia do sumy zamówień magento. Co to oznacza, że, jak dodać dodatkową opłatę lub zniżkę, lub wszelkiego rodzaju opłaty, aby zamówić w sumie proces zakupu Magento. W typowej kolejności sumy zamówień zwykle składają się z sumy częściowej, kosztu dostawy, podatków, rabatu, w oparciu o te wartości obliczana jest suma całkowita zamówienia ogółem.Teraz, jeśli chcemy dodać dodatkową opłatę za Kartę Kredytową lub Convince Free lub Affiliate Discount lub jakąkolwiek inną sumę zamówienia, która wpłynie na sumę zamówienia, potrzebujemy utworzyć moduł magento. Ta dodatkowa opłata, które dodajemy do sumy będzie odzwierciedlać w

  • Zamówienie Kolejność Całkowita
  • Koszyka Kolejność Razem
  • Moje konto Zamówienie View Page
  • zamówienia E-maile
  • Zamówienie administratora Wyświetl/e-mail/PDF
  • Admin Zobacz Faktura/e-mail/PDF
  • Admin Nota kredytowa View/Email/PDF

jak widać na podstawie powyższej listy moduł ten nie będzie proste. W tym samouczku dołączam źródło takiego bardzo prostego modułu, w którym możesz użyć punktu początkowego, aby dodać dodatkową zmianę. Chciałbym również wyjaśnić podstawy tego, jak to wdrożyć. W tym samouczku dodam nową sumę zamówienia o nazwie "Opłata" o stałym koszcie 10 $.

Lub spróbuj go: -

strona Suma Zamówienie Zamówienie Razem Podstawy

Przekonamy się, jak dodać sumy tylko na stronie transakcji. Wszystkie elementy zamówienia z sumami, które pokazują stronę zamówienia, pochodzą z plików znajdujących się w folderze Mage \ Sprzedaż \ Model \ Oferta \ Adres \ Razem. W magento przed złożeniem zamówienia wszystkie dane zamówienia są przechowywane w obiekcie wyceny, a po złożeniu zamówienia zostaje on przekazany do obiektu zamówienia. Sumy kwotowań są zgodne ze wzorcem kolekcjonowania, a my możemy dodać kolekcjoner jako tyle klas kolekcjonerskich. Aby dodać kolektor do obiektu cytując naszego config.xml dodamy linie

<global> 
     <sales> 
      <quote> 
       <totals> 
        <fee> 
         <class>fee/sales_quote_address_total_fee</class> 
        </fee> 
       </totals> 
      </quote> 
     </sales> 
</global> 

Oznacza to, gdy sumy są obliczane na ofertę, będzie to również wywołać tę klasę. Wszystkie kolektory są wywoływane z funkcji collectTotals() w Modelu wyceny. W naszej klasie kolektora kładziemy w kodzie

<?php 
    class Excellence_Fee_Model_Sales_Quote_Address_Total_Fee extends Mage_Sales_Model_Quote_Address_Total_Abstract{ 
    protected $_code = 'fee'; 

    public function collect(Mage_Sales_Model_Quote_Address $address) 
    { 
     parent::collect($address); 

     $this->_setAmount(0); 
     $this->_setBaseAmount(0); 

     $items = $this->_getAddressItems($address); 
     if (!count($items)) { 
      return $this; //this makes only address type shipping to come through 
     } 


     $quote = $address->getQuote(); 

     if(Excellence_Fee_Model_Fee::canApply($address)){ //your business logic 
      $exist_amount = $quote->getFeeAmount(); 
      $fee = Excellence_Fee_Model_Fee::getFee(); 
      $balance = $fee - $exist_amount; 
      $address->setFeeAmount($balance); 
      $address->setBaseFeeAmount($balance); 

      $quote->setFeeAmount($balance); 

      $address->setGrandTotal($address->getGrandTotal() + $address->getFeeAmount()); 
      $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBaseFeeAmount()); 
     } 
    } 

    public function fetch(Mage_Sales_Model_Quote_Address $address) 
    { 
     $amt = $address->getFeeAmount(); 
     $address->addTotal(array(
       'code'=>$this->getCode(), 
       'title'=>Mage::helper('fee')->__('Fee'), 
       'value'=> $amt 
     )); 
     return $this; 
    } 
} 

Dwie główne funkcje są tu honor() i fetch(). W funkcji collect dodajesz dowolną kwotę do sumy zamówień, a fetch() służy do wyświetlania. Jeśli jest to zrobione prawidłowo, powinieneś zobaczyć całkowitą linię zamówienia na stronie kasy i koszyka. Tutaj używamy dwóch pól fee_amount i base_fee_amount, które zawierają naszą wysokość opłaty. Będziemy musieli zobaczyć zapisać te dwa pola do bazy danych, więc w naszym pliku instalacyjnego modułu dodamy ten kod

ALTER TABLE `".$this->getTable('sales/quote_address')."` ADD `fee_amount` DECIMAL(10, 2) NOT NULL; 
ALTER TABLE `".$this->getTable('sales/quote_address')."` ADD `base_fee_amount` DECIMAL(10, 2) NOT NULL; 

kolejność stron

Do tej pory cały kod napisany został dokonany tylko dla cytatem obiekt. Ale po złożeniu zamówienia musimy przekazać wszystkie informacje do obiektu zamówienia. Jak widzieliście powyżej, używamy dwóch pól fee_amount i base_fee_amount, musimy również przechowywać te dwa pola w tabeli porządkowej.Aby to zrobić, musimy zrobić dwie rzeczy. Po pierwsze w pliku config.xml dodać ten kod wewnątrz zakładce globalnym

<fieldsets> 
     <sales_convert_quote_address> 
      <fee_amount><to_order>*</to_order></fee_amount> 
      <base_fee_amount><to_order>*</to_order></base_fee_amount> 
     </sales_convert_quote_address> 
    </fieldsets> 

iw naszym module zainstalować plik

ALTER TABLE `".$this->getTable('sales/order')."` ADD `fee_amount` DECIMAL(10, 2) NOT NULL; 
ALTER TABLE `".$this->getTable('sales/order')."` ADD `base_fee_amount` DECIMAL(10, 2) NOT NULL; 

Po wykonaniu tej czynności, te dwa pola powinny zapisywane do tabeli zamówienia z tabela ofert.

To tylko podstawy dodawania elementu zamówienia do sumy zamówienia. Odpocznij, dużo kodu napisano w załączonym module, zapoznaj się z nim szczegółowo, aby zrozumieć więcej.

+1

Widziałem tę stronę i podążałem nią bez żadnego szczęścia – PvdL

Powiązane problemy