Alpine SwiftAlpine Swift MemberComments: 733 Received thanks: 33 Member since: October 2010 edited June 2013
N'Abend!

Wir überlegen, für die Zahlungsart Vorkasse einen prozentualen Abschlag zu gewähren. Allerdings kommen da natürlich teils sehr unrunde Beträge raus. Ein Artikel mit einem Preis von 27,65 EUR führt z. B. zu einem Abschlag von 0,83 EUR.

Gibt es die Möglichkeit, diesen Abschlag immer auf die nächsten 5 oder 10 Cent aufzurunden?

Allerdings dürfte das nicht nur so ausgegeben werden, sondern müsste dann natürlich auch bei der Bestellung in die DB so geschrieben werden. Die Frage ist also wo / wie der Abschlag tatsächlich berechnet wird.

Kann da jemand was zu sagen ... ?

AS

Comments

  • Stefan HamannStefan Hamann AdministratorsComments: 2473 Received thanks: 443 Member since: June 2010
    Schau mal in die sAdmin.php - ca. Zeile 3379.
    Da könntest du eingreifen - das wird dann auch direkt in die Datenbank übernommen etc.

    Konkret ist es die Zeile:

    $percent = round($amount / 100 * $payment, 2);
    if(!empty($payment['debit_percent'])&&(empty($dispatch)||$dispatch['surcharge_calculation']!=2))
    		{
    			$sql = 'SELECT SUM(quantity*price) as amount FROM s_order_basket WHERE sessionID=? GROUP BY sessionID';
    			$amount = $this->sSYSTEM->sDB_CONNECTION->GetOne($sql, array($this->sSYSTEM->sSESSION_ID));
    			
    			$percent = round($amount / 100 * $payment['debit_percent'], 2);
    						
    			if ($percent>0) {
    				$percent_name = $this->sSYSTEM->sCONFIG["sPAYMENTSURCHARGEADD"];
    			} else {
    				$percent_name = $this->sSYSTEM->sCONFIG["sPAYMENTSURCHARGEDEV"];
    			}
    				
    			if (empty($this->sSYSTEM->sUSERGROUPDATA["tax"]) && !empty($this->sSYSTEM->sUSERGROUPDATA["id"])){
    				$percent_net = $percent;
    			} else {
    				$percent_net = round($percent/(100+$discount_tax)*100,2);
    			}
    			
    			$sql = '
    				INSERT INTO s_order_basket
    					(sessionID, articlename, articleID, ordernumber, quantity, price, netprice, datum, modus, currencyFactor)
    				VALUES
    					(?, ?, 0, ?, 1, ?, ?, NOW(), 4, ?)
    			';
    			$this->sSYSTEM->sDB_CONNECTION->Execute($sql,array(
    				$this->sSYSTEM->sSESSION_ID,
    				$percent_name,
    				$percent_ordernumber,
    				$percent,
    				$percent_net,
    				$currencyFactor
    			));
    		}
    
  • Alpine SwiftAlpine Swift MemberComments: 733 Received thanks: 33 Member since: October 2010
    Anschlussfrage:

    Gibt's da auch was ... für die MwSt.?

    Hintergrund:

    Ich habe gesehen, dass Ihr Euch schon sehr viel Mühe gegeben habt bei der Abbildung von Länderspezifika. Konkret für die Schweiz verwendet Ihr z. B. bereits als Tausender-Trennzeichen " ' " statt " . " und als Dezimal-Trennzeichen " . " statt " , ". Das ist soweit super.

    Es gibt aber für die Schweiz noch ein Spezifikum, das nicht ganz so bekannt ist. Die kleinste Geld-Münze in der Schweiz sind 5 Rappen. Aus diesem Grunde lauten alle Preise in der Schweiz hinten auf 0 oder 5, da niemand einen Betrag von z. B. 2.99 CHF in Bar bezahlen kann. Es gibt dafür schlicht keine Münzen. :sunglasses: Das wirkt sich auf den bargeldlosen Bereich insofern aus, als auch dort alles, aber auch wirklich alles hinten auf 0 oder 5 gerundet wird.

    Bei den Preisen kann ich ja selbst dafür sorgen, dass die entsprechend aussehen. Aber bei Zuschlägen, Abschlägen und MwSt. ist das eben nicht so einfach. Eben alles, was dann irgendwie prozentual aus den Preisen resultiert.

    Wenn Ihr da für die MwSt.-Berechnung einen HotFix für die Schweiz hättet, könntet Ihr bei Schweizern richtig punkten. ;) Und ich habe schon gesehen, dass davon auch hier im Forum welche unterwegs sind ...

    [ tax_neu = round(tax_alt/0.05;0)*0.05 ]

    AS
  • Alpine SwiftAlpine Swift MemberComments: 733 Received thanks: 33 Member since: October 2010
    Also, ich habe mal versucht zumindest das mit dem Vorkasse-Rabatt umzusetzen. Habe also in der sAdmin.php die Zeile ...
    $percent = round($amount / 100 * $payment['debit_percent'], 2);
    
    ... durch ...
    $percent = round(($amount / 100 * $payment['debit_percent']) / 0.05, 0) * 0.05;
    
    ... ersetzt. Leider ohne Erfolg. :( Habe immer noch "Abschlag für Zahlungsart 10,19 EUR".

    ???

    AS
  • Alpine SwiftAlpine Swift MemberComments: 733 Received thanks: 33 Member since: October 2010
    ... so funktioniert es:
    $percent = round($amount / 100 * $payment['debit_percent'] / 0.05, 0) * 0.05;
    
    Er mochte, warum auch immer, die Klammer nicht.

    Jetzt bräuchte ich das nur noch für die MwSt.

    Und noch die Frage: updatesicher geht das so wohl nicht, oder? Denn die sAdmin.php wird wohl ziemlich oft bei Updates betroffen sein, oder?

    AS
  • Alpine SwiftAlpine Swift MemberComments: 733 Received thanks: 33 Member since: October 2010
    N'Abend!

    Habe heute mal einen Gutschein-Code angelegt. Damit gibt es im Warenkorb 5% Rabatt. Allerdings habe ich jetzt wieder das Problem mit den "krummen" Zahlen. Denn auch der Gutschein-Rabatt sollte, wie oben bereits der Abschlag bei Vorkasse-Zahlung, auf 5 Rappen gerundet werden.

    Ich finde aber den Code nicht, wo das berechnet wird und anzupassen wäre. Bin die sAdmin.php jetzt schon rauf und runter ...

    Hat mir da jemand einen Ansatzpunkt, wie ich das finde?

    AS
  • Alpine SwiftAlpine Swift MemberComments: 733 Received thanks: 33 Member since: October 2010
    Moin!

    Also, ich habe da was gefunden in \engine\core\class\sBasket.php ab Zeile 325. Dort ist die public function sAddVoucher. Ab Zeile 500 ist dann der relevante Code:
    if ($ticketResult["percental"]){
      $value = $ticketResult["value"];
      $vouchername .= " ".$value." %";
      $ticketResult["value"] = ($amount["totalAmount"] / 100) * floatval($value);
    }
    
    Habe den mal ersetzt durch:
    if ($ticketResult["percental"]){
      $value = $ticketResult["value"];
      $vouchername .= " ".$value." %";
      $ticketResult["value"] = ($amount["totalAmount"] / 100) * floatval($value);
      $ticketResult["value"] = round($ticketResult["value"] / 0.05, 0) * 0.05 - 0.05;
    }
    
    Also, die letzte Zeile kam hinzu. Scheint zu funktionieren. Könnte sich das mal jemand noch anschaun, ob ich da auch keinen Mist baue? :wtf:

    Wäre super ... :)

    AS
  • Stefan HamannStefan Hamann AdministratorsComments: 2473 Received thanks: 443 Member since: June 2010
    Moin,

    sieht okay aus ;)
  • Alpine SwiftAlpine Swift MemberComments: 733 Received thanks: 33 Member since: October 2010
    Moin!

    Danke. So ganz, ganz langsam arbeite ich mich rein ... :)

    Wünsch Euch einen guten Start in die Woche!

    AS
  • webundcowebundco MemberComments: 5 Received thanks: 0 Member since: October 2012
    Gibt es mittlerweilen eine updatesichere Lösung für die Schweiz-spezifische Rundungsproblematik (kleinste Geldeinheit 5 Rappen) für Preise, Rabatte und MWST?
  • Alpine SwiftAlpine Swift MemberComments: 733 Received thanks: 33 Member since: October 2010
    Moin!

    Für uns ergibt sich diese Frage auch erneut beim anstehenden Wechsel auf die SW4. Es hat sich ja betreffend SubShops, Währungen, Steuersätze usw. einiges getan ... aber an dem Punkt gibt es scheinbar noch keine wirkliche Lösung, oder?

    LG, AS
  • star7591star7591 MemberComments: 8 Received thanks: 0 Member since: December 2012
    Eigentlich benötigen wir nur eine Rundung auf die Totalsumme (inkl. MwSt, inkl. Rabatte, etc.) und nicht für jede einzelnde Summe. Das führt sonst auf die berühmte Rundungsdifferenz.
  • Alpine SwiftAlpine Swift MemberComments: 733 Received thanks: 33 Member since: October 2010
    Schau mal in die sAdmin.php - ca. Zeile 3379.
    Da könntest du eingreifen - das wird dann auch direkt in die Datenbank übernommen etc.

    Konkret ist es die Zeile:

    $percent = round($amount / 100 * $payment, 2);
    Moin!

    Hat sich hier etwas verändert? Irgendwie funktioniert das nicht mehr in der SW 4. Wird in der 4.0.8 der ABschlag für Zahulngsart woanders berechnet?

    LG, AS
  • Alpine SwiftAlpine Swift MemberComments: 733 Received thanks: 33 Member since: October 2010
    Weil es schon ein Weilchen her ist ...

    FALL 1: Um die Rappenrundung bei prozentualen Gutscheinen zu gewährleisten haben wir in der sBasket.php die Zeile ...
    $ticketResult["value"] = ($amount["totalAmount"] / 100) * floatval($value);
    
    ... ergänzt durch ...
    $ticketResult["value"] = ($amount["totalAmount"] / 100) * floatval($value);
    $ticketResult["value"] = round($ticketResult["value"] / 0.05, 0) * 0.05;
    
    ... und das funktioniert in der 4.0.8 genau wie in der 3.5 ganz prima.

    FALL 2: Um die Rappenrundung bei prozentualen Abschlägen auf eine Zahlungsart zu gewährleisten haben wir in der sAdmin.php die Zeile ...
    $percent = round($amount / 100 * $payment['debit_percent'], 2);
    
    ... ergänzt durch ...
    $percent = round($amount / 100 * $payment['debit_percent'], 2);
    $percent = round($percent / 0.05, 0) * 0.05;
    
    ... und das funktioniert in der 4.0.8 leider nicht. Es greift einfach nicht, hat in der 3.5 aber so funktioniert.

    Irgendwie scheint Shopware das hier komplett zu ignorieren ... :(

    Hat jemand eine Idee?

    LG, AS
  • weaterweater MemberComments: 192 Received thanks: 11 Member since: July 2016

    Liebe Shopware JüngerWink

    Habe genau das Problem jedoch ist das Thema sehr alt.

    Finde die sAdmin.php Zeile gar nicht mehr in der Version 5.0.20.

    Gilt das auch noch für die aktuelle Version? Oder wo kann man das verankern damit er bei uns in der Schweiz auf 5 Rappen aufrechnet?

    image

Sign In or Register to comment.