2010-12-12 60 views
1

Je veux calculer le prix de base de tous les produits dans une commande. Le prix pour chaque (1 quantité) devrait inclure toute réduction/bonus, mais pas d'impôt. Le total de tous les prix des produits fois leur quantité + taxe doit être exactement le même que $ order-> getGrandTotal().Calculer le prix pour chaque produit dans une commande dans Magento

J'ai réussi à obtenir les prix individuels, y compris les frais d'expédition avec seulement une petite erreur de précision. Bien sûr, ce n'est pas acceptable lorsqu'il s'agit de monnaie. Aussi, je n'ai pas pris en compte les produits groupés et autres.

Donc, je vous demande de m'aider, je dois faire exactement le même calcul que Magento, et toujours sortir les valeurs dont j'ai besoin (chaque produit/expédition avec des réductions, mais sans taxes).

Merci à l'avance

+0

Quel est le problème avec '$ order-> getSubtotal()' + '$ order-> getShippingAmount()'? 'getSubtotal()' renvoie la somme de tous les éléments dans l'ordre sans taxe. Si vous voulez inclure le prix avec la taxe, vous pouvez utiliser '$ order-> getSubtotalWithTax()' –

+0

J'ai besoin d'obtenir le prix pour chaque article individuel (calculé comme s'il n'y avait qu'une seule quantité). Prix ​​+ réduction - (moins) taxe. –

+0

Donc je suis en train de faire foreach ($ order-> getAllVisibleItems() comme $ item) {/ * calculer avec des variables sur l'objet $ item tel que getPrice() et getDiscountAmount() * /} –

Répondre

4

Je l'ai fait, et il me donne exactement les informations dont j'ai besoin. Mais je ne suis pas sûr que ce soit la bonne façon de le faire. Aussi mon $ total semble être différent de $ grand_total avec quelques décimales telles que 0.005 ou similaire parfois.

$store = Mage::app()->getStore($order->getStoreId()); 

$customer = Mage::getModel('customer/customer') 
    ->load($order->getCustomerId()); 

$tax_calc = Mage::getSingleton('tax/calculation'); 

$tax_rate_req = $tax_calc->getRateRequest(
    $order->getShippingAddress(), 
    $order->getBillingAddress(), 
    $customer->getTaxClassId(), 
    $store); 

$args = array(); 
$total = 0; 

// Calculate price of each item in the order 
foreach($order->getAllVisibleItems() as $item) 
{ 
    $product = Mage::getModel('catalog/product') 
     ->load($item->getProductId()); 

    $children = $item->getChildrenItems(); 

    if(count($children) && ($product->getData('price_type') != 1)) 
    { 
     foreach($children as $child) 
     { 
      $product = Mage::getModel('catalog/product') 
       ->load($child->getProductId()); 

      /* If tax_percent is not set? 
      Mage::getSingleton('tax/calculation')->getRate(
       $tax_rate_req->setProductClassId($product->getTaxClassId())) 
      */ 
      $tax_mod = (float)$child->getData('tax_percent'); 
      $tax_mod /= 100; 

      $qty = (float)$child->getData('qty_ordered'); 

      $price = (float)$child->getData('row_total_incl_tax'); 
      $price -= (float)$child->getData('discount_amount'); 

      $base_price = (($price/(1 + $tax_mod))/$qty); 
      $base_price = $store->roundPrice($base_price); 

      $total += (($base_price * (1 + $tax_mod)) * $qty); 

      $args[] = array 
       (
        'name'   => $product->getData('name'), 
        'sku'   => $child->getData('sku'), 
        'tax_mod'  => $tax_mod, 
        'qty'   => $qty, 
        'price'   => $price, 
        'base_price' => $base_price 
       ); 
     } 
    } 
    else 
    { 
     /* If tax_percent is not set? 
     Mage::getSingleton('tax/calculation')->getRate(
      $tax_rate_req->setProductClassId($product->getTaxClassId())) 
     */ 
     $tax_mod = (float)$item->getData('tax_percent'); 
     $tax_mod /= 100; 

     $qty = (float)$item->getData('qty_ordered'); 

     $price = (float)$item->getData('row_total_incl_tax'); 
     $price -= (float)$item->getData('discount_amount'); 

     $base_price = (($price/(1 + $tax_mod))/$qty); 
     $base_price = $store->roundPrice($base_price); 

     $total += (($base_price * (1 + $tax_mod)) * $qty); 

     $args[] = array 
      (
       'name'   => $product->getData('name'), 
       'sku'   => $item->getData('sku'), 
       'tax_mod'  => $tax_mod, 
       'qty'   => $qty, 
       'price'   => $price, 
       'base_price' => $base_price 
      ); 
    } 
} 

// Calculate price for shipping 
if(($price = (float)$order->getData('shipping_incl_tax')) > 0) 
{ 
    $tax_mod = $tax_calc->getRate($tax_rate_req->setProductClassId(
     Mage::getStoreConfig('tax/classes/shipping_tax_class'))); 
    $tax_mod /= 100; 

    $price -= (float)$order->getData('shipping_discount_amount'); 

    $base_price = ($price/(1 + $tax_mod)); 

    $base_price = $store->roundPrice($base_price); 

    $total += ($base_price * (1 + $tax_mod)); 

    $args[] = array 
     (
      'name'   => $order->getData('shipping_description'), 
      'sku'   => $order->getData('shipping_method'), 
      'tax_mod'  => $tax_mod, 
      'qty'   => 1, 
      'price'   => $price, 
      'base_price' => $base_price 
     ); 
} 

$total = $store->roundPrice($total); 

echo('<pre>'); 
print_r($args); 
//print_r($order->getData()); 
echo('</pre>'); 

$grand_total = (float)$order->getData('grand_total'); 
//$grand_total = $store->roundPrice($grand_total); 

echo('<p><strong>My total</strong>: ' . $total . '</p>'); 
echo('<p><strong>Grand total</strong>: ' . $grand_total . '</p>'); 

exit; 
+0

Cela a fonctionné pour moi avec un peu d'adaptation qui selon moi dépend de votre configuration/configuration fiscale. J'ai trouvé la section count ($ children) n'était pas nécessaire et le discount_amount a dû être multiplié par le tax_amount pour obtenir le chiffre correct. Merci "Utilisateur perturbé de Magento" – Flipmedia