PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nettopreis in Bestätigungsmail aufnehmen (xtc / gambio 2007)



Elektrofuzzy
07.04.2011, 15:50
Hallo zusammen,

ich scheitere hier gerade kläglich an der Aufgabe, die automatisierte Mail, die unser Gambio (Version 2007) verschickt, um eine einfache Nettopreisangabe zu ergänzen.

Würde gerne via Smarty eine Variable PRODUCTS_PRICE_NETTO übergeben, auf die ich dann im Template unter order_mail.htm zugreifen kann.

Wo muss man denn das "Assign" dafür unterbringen? Habe es zunächst in der shop/print_order.php probiert, später auch in der send_order.php. In beiden taucht der Array $order_data auf, auf den per Smarty zugegriffen wird.

Habe mich dann an folgendem versucht:



$order_data[] = array ('PRODUCTS_MODEL' => $order_data_values['products_model'],
'PRODUCTS_NAME' => $order_data_values['products_name'],
'PRODUCTS_ATTRIBUTES' => $attributes_data,
'PRODUCTS_ATTRIBUTES_MODEL' => $attributes_model,
'PRODUCTS_PRICE' => $xtPrice->xtcFormat($order_data_values['final_price'], true),
'PRODUCTS_SINGLE_PRICE' => $xtPrice->xtcFormat($order_data_values['final_price']/$order_data_values['products_quantity'], true),
'PRODUCTS_PRICE_NETTO' => $order_data_values['products_price'],
'PRODUCTS_QTY' => $order_data_values['products_quantity']);


Geht aber nicht, die Variable bleibt leer. Kann jemand helfen?

Danke,
Fuzzy

jay-ar
08.04.2011, 08:02
Hallo
Ich habe keine Gambio, in XT:C gibt es genau 3 Dateien, in der die $order_data[] gefüllt wird. Müsste auch für dich zutreffen.
admin/print_order.php
admin/print_packingslip.php
includes/classes/order.php
letztere ist für die Bestellungen des Kunden.
Eine Spalte products_price (wie du es versuchtest) steht zwar mit den reichtigen Daten in der Tabelle der Datenbank, wird aber leider vorher nicht abgefragt.

Es geht auch einfacher indem man der xtcFormat Funktion 0% Steuer übergibt (das ganze habe ich bei mir nicht getestet, bitte daher um Rückmeldung)

'PRODUCTS_NETTO_PRICE' => $xtPrice->xtcFormat($order_data_values['final_price'], true, 0) ,
'PRODUCTS_NETTO_SINGLE_PRICE' => $xtPrice->xtcFormat($order_data_values['final_price']/$order_data_values['products_quantity'], true, 0),


jay-ar

Elektrofuzzy
09.04.2011, 14:44
Hallo jay-ar,

danke für die Hilfestellung, offenbar hat sich von xt:c auf Gambio an der Stelle etwas getan. Die Variable findet sich bei Gambio 2007 nicht mehr in /includes/classes/order.php. Dank Deiner Hilfe konnte ich aber herausfinden, dass ganz offensichtlich send_order.php (im Stammverzeichnis) zuständig ist.

Der Teilerfolg ist wie folgt: Habe in der send_order.php Deine Codezeile wie folgt eingesetzt:



'PRODUCTS_PRICE_NETTO' => $xtPrice->xtcFormat($order_data_values['final_price']/$order_data_values['products_quantity'], true, 0),


Und siehe, die Variable bleibt in der Bestätigungsmail nicht mehr leer! Allerdings wird nicht der Nettopreis, sondern der Bruttopreis ausgegeben. :confused:

Gruß,
Lutz

KlausK
10.04.2011, 01:06
Soweit ich mich erinnere werden zumindest im Gambio GX nur die Bruttopreise gespeichert und die Nettopreise lediglich errechnet.
Demnach müsstest du die MwSt. aus products_tax wieder abziehen, sofern allow_tax gleich "1" ist.

jay-ar
10.04.2011, 12:17
Hallo Jungs
Bruttopreise zu speichern macht nicht viel Sinn, da die Steuer abhängig von Kundengruppe einstellbar ist.
Das Errechnen übernimmt die function xtcFormat. Eher ist es so, dass die 0 als dritten Parameter (also 0% Steuer), so wie ich bei kurzer Betrachtungsweise annahm, nichts bewirkt. Bei 0 wird die eingestellte Steuer in dieser Funktion hinzu gerechnet.

Man könnte jetzt diese Funktion umschreiben, oder einfacher Weise die beiden Zeilen ohne diese zu bemühen, verwenden.
So sieht es dann aus (mit Tausenderpunkt, 2 Stellen nach dem Komma und einem € am ende)


'PRODUCTS_SINGLE_PRICE_NETTO' => number_format(round($order_data_values['final_price']/$order_data_values['products_quantity'],2), 2,',','.').' €',
'PRODUCTS_PRICE_NETTO' => number_format(round($order_data_values['final_price'],2), 2,',','.').' €',

ohne Tausenderpunkt und keinem € am ende


'PRODUCTS_SINGLE_PRICE_NETTO' => number_format(round($order_data_values['final_price']/$order_data_values['products_quantity'],2), 2,',',''),
'PRODUCTS_PRICE_NETTO' => number_format(round($order_data_values['final_price'],2), 2,',',''),


mfg
jay-ar

Elektrofuzzy
11.04.2011, 22:22
Klaus hat wohl recht: Auch der Versuch mit


'PRODUCTS_PRICE_NETTO' => number_format(round($order_data_values['final_price']/$order_data_values['products_quantity'],2), 2,',',''),

bringt erneut den Bruttopreis zutage. Zweckmäßig ist es sicherlich nicht, dass die Shop-Software auf Basis des Bruttopreises operiert. Sie tut es aber ganz offenbar, zumindest an dieser Stelle (send_order.php)....


In der Datei order.php wird hingegen (noch? oder kommt die später?) mit der Mehrwertsteuer gearbeitet:



.
.
...
$this->billing = array('firstname' => $billing_address['entry_firstname'],
'lastname' => $billing_address['entry_lastname'],
'company' => $billing_address['entry_company'],
'street_address' => $billing_address['entry_street_address'],
'suburb' => $billing_address['entry_suburb'],
'city' => $billing_address['entry_city'],
'postcode' => $billing_address['entry_postcode'],
'state' => ((xtc_not_null($billing_address['entry_state'])) ? $billing_address['entry_state'] : $billing_address['zone_name']),
'zone_id' => $billing_address['entry_zone_id'],
'country' => array('id' => $billing_address['countries_id'], 'title' => $billing_address['countries_name'], 'iso_code_2' => $billing_address['countries_iso_code_2'], 'iso_code_3' => $billing_address['countries_iso_code_3']),
'country_id' => $billing_address['entry_country_id'],
'format_id' => $billing_address['address_format_id']);

$index = 0;
$products = $_SESSION['cart']->get_products();
for ($i=0, $n=sizeof($products); $i<$n; $i++) {

$products_price=$xtPrice->xtcGetPrice($products[$i]['id'],
$format=false,
$products[$i]['quantity'],
$products[$i]['tax_class_id'],
'')+$xtPrice->xtcFormat($_SESSION['cart']->attributes_price($products[$i]['id']),false);

$this->products[$index] = array('qty' => $products[$i]['quantity'],
'name' => $products[$i]['name'],
'model' => $products[$i]['model'],
'tax_class_id'=> $products[$i]['tax_class_id'],
'tax' => xtc_get_tax_rate($products[$i]['tax_class_id'], $tax_address['entry_country_id'], $tax_address['entry_zone_id']),
'tax_description' => xtc_get_tax_description($products[$i]['tax_class_id'], $tax_address['entry_country_id'], $tax_address['entry_zone_id']),
'price' => $products_price ,
'final_price' => $products_price*$products[$i]['quantity'],
'weight' => $products[$i]['weight'],
'id' => $products[$i]['id']);

if ($products[$i]['attributes']) {
$subindex = 0;
reset($products[$i]['attributes']);
while (list($option, $value) = each($products[$i]['attributes'])) {
$attributes_query = xtc_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $products[$i]['id'] . "' and pa.options_id = '" . $option . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $value . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $_SESSION['languages_id'] . "' and poval.language_id = '" . $_SESSION['languages_id'] . "'");
$attributes = xtc_db_fetch_array($attributes_query);

$this->products[$index]['attributes'][$subindex] = array('option' => $attributes['products_options_name'],
'value' => $attributes['products_options_values_name'],
'option_id' => $option,
'value_id' => $value,
'prefix' => $attributes['price_prefix'],
'price' => $attributes['options_values_price']);

$subindex++;
}
}

$shown_price = $this->products[$index]['final_price'];

//echo '<br>debug:'.$shown_price;

$this->info['subtotal'] += $shown_price;
if ($_SESSION['customers_status']['customers_status_ot_discount_flag'] == 1){
$shown_price_tax = $shown_price-($shown_price/100 * $_SESSION['customers_status']['customers_status_ot_discount']);
}

$products_tax = $this->products[$index]['tax'];
$products_tax_description = $this->products[$index]['tax_description'];
if ($_SESSION['customers_status']['customers_status_show_price_tax'] == '1') {
if ($_SESSION['customers_status']['customers_status_ot_discount_flag'] == 1) {
$this->info['tax'] += $shown_price_tax - ($shown_price_tax / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));

$nc_test = (($shown_price_tax /(100+$products_tax)) * $products_tax);
//echo "1111:".$nc_test;
$this->info['tax_groups'][TAX_ADD_TAX."$products_tax_description"] += $nc_test;
} else {
$this->info['tax'] += $shown_price - ($shown_price / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));

$nc_test = (($shown_price /(100+$products_tax)) * $products_tax);
//echo "2222";
$this->info['tax_groups'][TAX_ADD_TAX . "$products_tax_description"] += $nc_test;
}
} else {
if ($_SESSION['customers_status']['customers_status_ot_discount_flag'] == 1) {
$this->info['tax'] += ($shown_price_tax/100) * ($products_tax);
$this->info['tax_groups'][TAX_NO_TAX . "$products_tax_description"] += ($shown_price_tax/100) * ($products_tax);
} else {
$this->info['tax'] += ($shown_price/100) * ($products_tax);
$this->info['tax_groups'][TAX_NO_TAX . "$products_tax_description"] += ($shown_price/100) * ($products_tax);
}
}
$index++;
}


Aber meine PHP-Kenntnisse reichen nicht aus, um da durchzublicken.

jay-ar
12.04.2011, 06:09
Hallo
Die order.php sollte die einzige sein, die so etwas macht, und nicht noch an anderen Stellen. Dafür gibt es ja Klassen und Funktionen, die das einheitlich per include/require allen anderen zur Verfügung stellt. Zentralisierung und das Zurückgreifen auf schon vorhandenes ist doch der große Vorteil einer solchen Programmierung. Deswegen kann ich nicht recht glauben(habe kein Gambio), dass Gambio hier in dem Fall eine Ausnahme macht. Vielleicht hat das auch ein nachträglich installiertes Modul so verändert. Ich habe bei uns geschaut, (XT:C, ECB, Commerce:SEO 1+2, XTC-Modified), dort werden in allen die entsprechenden Bestelldaten aus 2 Funktionen geholt, welche in der includes/classes/order.php enthalten sind. Der Aufruf in bsw. der send_order.php und print_order.php lautet.


$order_total = $order->getTotalData($oID);
$smarty->assign('order_data', $order->getOrderData($oID));
$smarty->assign('order_total', $order_total['data']);

in der includes/classes/order.php steht das von Dir angegebene Füllen des array $order_data[] drin, dass wiederum beim Preis auf die funktion xtcFormat zur Aufbereitung zugreift. Mehr zusätzliche Abfragen hinsichtlich der Bestellung in send_order.php oder print_order.php stehen hier nicht.

Um das Problem bei Dir zu lösen, bitte ich Dich in die orders_products Tabelle der Datenbank zu schauen, ob es sich wirklich um Bruttopreise handelt. products_price ist der Einzelpreis und final_price ist Einzelpreis x Anzahl. Wenn dem so ist, dann kann man die Steuer wieder zurückrechnen. Wir müssen aber dann etwas mathematisch denken, da auch 0% Steuer theoretisch möglich ist (Division durch 0 geht aber bekanntermaßen nicht). In der orders_products spalte products_tax ist die Steuer angegeben.
Berechnung erfolgt so: netto = brutto*100/(100+steuer)
Anhand meines obigen Beispiels


'PRODUCTS_SINGLE_PRICE_NETTO' => number_format(round($order_data_values['final_price']/$order_data_values['products_quantity']*100/(100+$order_data_values['products_tax']),2), 2,',','.').' &euro;',
'PRODUCTS_PRICE_NETTO' => number_format(round($order_data_values['final_price']*100/(100+$order_data_values['products_tax']),2), 2,',','.').' &euro;',

Wenn im Shop alles und für jeden 19% ist, geht es auch mit festem Steuerwert


'PRODUCTS_SINGLE_PRICE_NETTO' => number_format(round($order_data_values['final_price']/$order_data_values['products_quantity']/1.19,2), 2,',','.').' &euro;',
'PRODUCTS_PRICE_NETTO' => number_format(round($order_data_values['final_price']/1.19,2), 2,',','.').' &euro;',


mfg
jay-ar

KlausK
12.04.2011, 12:10
Zumindest bei meinem Gambio GX siehts so aus:

http://tinyurl.com/5sht8vs

Elektrofuzzy
12.04.2011, 22:03
Hi zusammen,
der nächste Teilerfolg hat sich eingestellt. Die Variable

'PRODUCTS_PRICE_NETTO' => number_format(round($order_data_values['products_price']*100/(100+$order_data_values['products_tax']),2), 2,',',''),

füllte sich mit Leben, nachdem ich weiter oben auch den $order_query um die Abfrage von "products_tax" erweiterte:


$order_query = xtc_db_query("SELECT
products_id,
orders_products_id,
products_model,
products_name,
products_price,
products_tax,
final_price,
products_quantity
FROM ".TABLE_ORDERS_PRODUCTS."
WHERE orders_id='".$insert_id."'");

Heureka! Jetzt wird bei mehrwertsteuerpflichtigen Bestellern 19% abgezogen.
Problem: bei den Mehrwertsteuerbefreiten Kunden (Ausland) wird leider auch 19 % abgezogen. :(

Die Lösung hatte der Klaus weiter oben schon angesprochen:

Demnach müsstest du die MwSt. aus products_tax wieder abziehen, sofern allow_tax gleich "1" ist.

Klingt einfach, aber entweder ich mache was falsch, oder ich habe in meiner send_order.php keine Variable allow_tax zur Verfügung. Gibts da ein Funktion, die mir die Info zurückliefert, ob der Kunde Mwst-pflichtig ist?

Danke für Eure Geduld,
Fuzzy

Elektrofuzzy
13.04.2011, 17:36
Habe mich jetzt an einer kurzen Abfrage in order.php orientiert, wo es an einer Stelle kurz und knackig heißt:


($_SESSION['customers_status']['customers_status_show_price_tax'] == '1'

Das hab ich jetzt in meine send_order.php eingefügt:


if ($_SESSION['customers_status']['customers_status_show_price_tax'] == '1')
{ $products_price_netto = number_format(round($order_data_values['products_price']*100/(100+$order_data_values['products_tax']),2), 2,',',''); }
else
{ $products_price_netto = $xtPrice->xtcFormat($order_data_values['final_price']/$order_data_values['products_quantity'], true);
}

$order_data[] = array (
'PRODUCTS_MODEL' => $order_data_values['products_model'],
'PRODUCTS_NAME' => $order_data_values['products_name'] . $nc_ship_info,
'PRODUCTS_ATTRIBUTES' => $attributes_data,
'PRODUCTS_ATTRIBUTES_MODEL' => $attributes_model,
'PRODUCTS_PRICE' => $xtPrice->xtcFormat($order_data_values['final_price'], true),
'PRODUCTS_SINGLE_PRICE' => $xtPrice->xtcFormat($order_data_values['final_price']/$order_data_values['products_quantity'], true),
'PRODUCTS_PRICE_NETTO' => $products_price_netto,
'PRODUCTS_QTY' => $order_data_values['products_quantity']
);

Vermutlich nicht schön, geht garantiert kürzer und eleganter... Funktioniert aber.
In meiner Order_Mail.htm frage ich dann noch ab, ob sich Nettopreis und Bruttopreis unterscheiden. Nur falls ja, wird der Nettopreis noch mit ausgegeben.

Damit ist die Sache aus meiner Sicht vom Tisch.
(Mann, was ein Act, nur für so eine popelige Zusatzangabe.)