Antwort #6 am: 25. Oktober 2012, 07:53:17
Guten Morgen,
vielen Dank für das Schnipsel.
So ähnlich hatte ich es vorher. Von der Brutto-Zwischensumme die Steuer abziehen.
Das Problem hier war, dass bei der Zwischensumme bereits auch je nach Fall ein Rabatt abgezogen sein kann. Bei Brutto-Kunden ist die Zwischensumme brutto, bei Netto-Kunden ist die Zwischensumme netto.
Ich hätte also 2x eine If-Abfrage gebraucht, 1x Kunden-Typ, 1x ob mit Rabatt (dann Rabatt abziehen) oder ohne.
Discount steht mit
$discount
zur Verfügung.
Da ich nicht wusste, welche Sonderfälle es noch gibt, hatte ich mir diese Funktion in includes\classes\shopping_cart.php gebastelt.
Damit habe ich immer den reinen Netto-Warenwert ohne weitere Berechnungen zur Bestimmung ob versandfrei oder nicht:
// BOF - Netto-Warenwert berechnen function calculate_netto
() { global $xtPrice; $this->total_netto = 0; $this->weight = 0; $this->tax = array (); if (!is_array($this->contents)) { return 0; } reset($this->contents); while (list ($products_id,) = each($this->contents)) { $qty = $this->contents[$products_id]['qty']; // products price $product_query = xtc_db_query
("select products_id, products_price, products_discount_allowed, products_tax_class_id, products_weight from ".TABLE_PRODUCTS
." where products_id='".xtc_get_prid
($products_id)."'"); if ($product = xtc_db_fetch_array
($product_query)) { $products_price = $xtPrice->xtcGetPrice($product['products_id'], $format = false, $qty, 0, $product['products_price']); $this->total_netto += $products_price * $qty; $this->weight += ($qty * $product['products_weight']); // attributes price $attribute_price = 0; if (isset ($this->contents[$products_id]['attributes'])) { reset($this->contents[$products_id]['attributes']); while (list ($option, $value) = each($this->contents[$products_id]['attributes'])) { $values = $xtPrice->xtcGetOptionPrice($product['products_id'], $option, $value); $this->weight += $values['weight'] * $qty; $this->total += $values['price'] * $qty; $attribute_price += $values['price']; } } } } } // EOF - Netto-Warenwert berechnen Das Brutto-Limit für die Anzeige bei Bruttokunden, ab dem es versandfrei gibt, habe ich dann so errechnet. (Modul ot_shipping)
$tax_standard = xtc_get_tax_rate(1, -1, -1); // Standard-Steuersatz (19%)
$free_shipping_limit = $xtPrice->xtcFormat(MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING_OVER, true) * (1 + ($tax_standard / 100));
Die reinen Logikprüfungen ob versandfrei erreicht ist, oder nicht mache ich mit dem Netto-Warenwert.
Insgesamt (abgesehen von Language-Files) sieht das momentan so in der order_details_cart.php aus. Ganz glücklich bin ich damit aber noch nicht. Funktionieren würde es, aber ob gut gelöst, bin ich noch unsicher. Basis ist dieses
Modul.
Der Code kann noch unaufgeräumt sein, ist aus meiner Baustelle.
foreach ($quotes AS $quote) { if ($quote['id'] != 'freeamount') { $total_netto = $_SESSION['cart']->show_total_netto(); // Nettokunden if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0) { $print_tax = $xtPrice->xtcFormat(xtc_add_tax
($quote['methods'][0]['cost'], isset ($quote[$i]['tax']) ?
$quote[$i]['tax'] : 0), true, 0, true); $print_tax2 = TAX_NO_TAX
. TAX_SHORT_DISPLAY
; $free_shipping_limit = $xtPrice->xtcFormat(MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING_OVER
, true); $free_shipping_needed = $free_shipping_limit - $total_netto; } else { // Bruttokunden $print_tax = $xtPrice->xtcFormat(((isset ($quote['tax']) && $quote['tax']> 0) ?
$xtPrice->xtcAddTax($quote['methods'][0]['cost'],$quote['tax']) :(!empty ($quote['methods'][0]['cost']) ?
$quote['methods'][0]['cost'] : '0')), true); $print_tax2 = TAX_ADD_TAX
. TAX_SHORT_DISPLAY
; $tax_standard = xtc_get_tax_rate
(1, -1, -1); // Standard-Steuersatz (19%) $free_shipping_limit = $xtPrice->xtcFormat(MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING_OVER
, true) * (1 + ($tax_standard / 100)); $free_shipping_needed = $free_shipping_limit - $total - $discount; } $shipping_content[$i] = array('NAME' => $quote['module'] . '(' . $quote['methods'][0]['title'] . ')', 'VALUE' => $print_tax, 'TAX' => $print_tax2 ); $i++; $free_shipping_note = '<strong>' . FREE_SHIPPING_DESCRIPTION
. '</strong>'; if ($total_netto < $free_shipping_limit) { $module_smarty->assign('FREE_SHIPPING_INFO', sprintf($free_shipping_note, $xtPrice->xtcFormat($free_shipping_limit, true, 0, true) . ' ' . $print_tax2) . '<br />' . FREE_SHIPPING_NEEDED_1
. $xtPrice->xtcFormat($free_shipping_needed, true, 0, true) . ' ' . $print_tax2 . FREE_SHIPPING_NEEDED_2
); } else { $module_smarty->assign('FREE_SHIPPING_INFO', FREE_SHIPPING_NOTE
); } } } P.s.
War übrigens keine Absicht, dass mehrere Themen mit teilweise Überschneidungen daraus wurden. War nur auf der Suche nach einzelnen Bausteinen, alles andere hat sich entwickelt.