Erweiterte Versandkostenberechnung - gesammeltes Wissen

Hallo Community! Das ist ja ein bissle schwieriges Thema. Jedenfalls fuer mich und ich glaube fuer einige andere auch. Da die Wiki zu dem Thema, - lesbar hier - wirklich nicht fuer Laien (wobei ich mich nicht als SQL-Laie zähle, aber anscheinend weiss ich dann doch zuwenig) geschrieben ist, dachte ich mir, wir User könnten doch unsere gesammelten Erfahrungen und Wissen preisgeben. Bitte hier keine Fragen zu den Versandkosten stellen, sondern einfach mal posten, was habt ihr rausgefunden, am besten mit einer kleinen Beschreibung, was das Problem war und wie es gelöst wurde. Wäre schön wenn sich hier einige melden. Ich fange auch schonmal an: :shopware: Erweiterte Berechnung Es gibt im Backend 2 Stellen, an den man eine erweiterte Berechnung eintragen kann. Einmal unter „Einstellungen“ -> „Grundeinstellungen“ -> „Storefront“ -> „Versandkosten-Modul“ Ich schätze diese Grundeinstellung ist die eigentliche Abfrage, die so nicht (grossartig) verändert werden sollte. Diese Abfragen sind mit Komma hintereinander gereiht. Bei „Einstellungen“ -> „Versandkosten“ kann man dann mit den individuellen Berechnungen arbeiten. Hier beim Bearbeiten einer Versandkostenart, muss man in den Reiter „Erweiterte Einstellungen“ und dann „Eigene Berechnung“ eine weitere Berechnung eintragen. Diese wird dann technisch gesehen im Hintergrund an die „grosse“ Erweiterte Berechnung aus den Grundeinstellungen drangehängt (? korrekt so ?) :shopware: Namen der Tabellen Hier zitiere ich einen Beitrag vom User vulcano, ist vielleicht dem einen oder anderen Hilfreich: [quote]Ich habe die Stelle im Code gefunden, an der die Query ausgeführt wird, die die Versandkosten berechnet (sie befindet sich in engine/core/class/sAdmin.php::sGetDispatchBasket). Daraus wird ersichtlich, welche Tabellen unter welchem Namen gejoint werden: s_order_basket -> b s_articles -> a s_articles_details -> d s_articles_attributes -> at s_core_tax -> t s_user -> u s_user_billingaddress -> ub s_user_shippingaddress -> us [/quote] :shopware: Mehrere Bedingungen bei den Versandkosten In Bezugnahme auf folgenden Post, ist es möglich, mehrere Bedingungen („Versandkosten“->„Erweiterte Einstellungen“->„Eigene Bedingungen“) bei den Versandkosten einzutragen. Hier ein Beispiel vom User display-haus [quote]xsversand AND !xlversand AND sperrgut[/quote] :shopware: Versandkosten nach Länge des Artikels Dies ist ein schwierigeres Thema, da die Berechnung der Versandkosten nicht nach dem Feld „Länge“ in den Artikeln nicht greifen kann, wenn ich das richtig verstanden habe, werden die Werte „Länge“ „Höhe“ und „Breite“ nicht vom System ausgegeben. In diesem Beispiel habe ich die Werte aus der Länge des Artikels einfach in das Feld „Gewicht“ uebernommen. Wir haben normale Artikel mit Standard Paketversand, sowie Stangenmaterial das bis zu 6m lang sein kann. Es muss ein extra Attributsfeld angelegt werden, eine Checkbox fuer das Stangenmaterial. (Erklärung hierzu in der Wiki - „Artikel Attribut anlegen“, aber als Checkbox anstatt Textfeld) Dies wird bei allen Stangen aktiviert. Dann in die SQL-Abfrage bei den Grundeinstellungen hinten angefuegt: , MAX(at.attr5="true") AS Stangenmaterial Dann wurden 2 Versandarten angelegt (dies nur fuer Deutschland, fuer die anderen Länder muessen diese extra angelegt werden), einmal „Paketversand“ und „Spedition“. „Paketversand“ - Standardversandart - Berechnung nach: „Artikelanzahl“ (hier ist es egal ob man Gewicht, Preis, oder Artikelanzahl nimmt, da hier kein Staffelung genutzt wird) - 0 bis beliebig und dann die Versandkosten - Bei „erweiterte Einstellung“ als Bedingung: !Stangenmaterial „Spedition“ - Standardversandart - Berechnung nach: „Eigene Berechnung“ - Staffelung: Hier trägt man die Staffelung ein, z.B. 0 bis 1000 4,50 1001 bis 2000 6,50 2001 bis beliebig 10,50 - Bei „erweiterte Einstellung“: – Bedingung: Stangenmaterial – Eigene Berechnung: SUM(IF(at.attr5=„true“, d.weight, 0)) (Anmerkung: dies ist eigentlich doppelt gemoppelt von der Bedingung her, aber ohne das konnte der Kunde in unserer Aufstellung machmal den Versand zwischen den beiden wählen, obwohl er das nicht sollte) Mit dieser eigenen Berechnung werden nun die Versandkosten einmalig angerechnet, egal wieviele Stangen der Kunde bestellt. Sollten sich die Versandkosten verdoppeln, muss aus d.weight -> d.weight*b.quantity ----------------------------------------------------- Wuerde mich sehr freuen wenn weitere User hier einfach mal Erfahrungen bezueglich der Versandkosten preisgeben, vielleicht hilft es ja dem einen oder anderen. (Und falls ich etwas falsches gesagt habe, bitte korrigieren)

Ich mach mal hier einen Platzhalter, falls mir noch was einfällt, und ich wuerde mich sehr freuen wenn andere User hier auch einfach mal berichten, was sie so bei den Versandkosten eingestellt haben, ich denke es wäre wirklich vielen nuetzlich!

:shopware:Versandkostenfrei ab festgelegtem Preis innerhalb eines festgelegten PLZ-Bereich: 2 Versandarten angelegen: 1. DHL Händler 2. DHL Händler Berlin Beide Versandarten als Standard-Versandart angelegen und wie gewohnt mit Versandpreisen, Zahlarten, Ländern etc. füllen. Alle Eingaben sind bei beiden Versandarten identisch! Bis auf „Versandkosten frei ab“ und die „Eigenen Bedingungen“ Bei 1. DHL Händler ist bei „Versandkosten frei ab“ „Nie“ hinterlegt und die „Eigenen Bedingungen“ sind ebenfalls leer, also auf Standard. Bei 2. DHL Händler Berlin ist bei „Versandkosten frei ab“ „100“ hinterlegt und bei „Eigenen Bedingungen“ habe ich folgendes eingetragen: IFNULL(us.zipcode,ub.zipcode) > ‚10115‘ AND IFNULL(us.zipcode,ub.zipcode) < ‚14199‘ eingetragen. Damit ist die 2. Versandart nur für Händler/Kunden in Berlin (Den angegebenem PLZ-Bereich) verfügbar.

3 „Gefällt mir“

Versandkosten je nach Versandkosten-Kategorie auf Artikel-Ebene regeln Jedes Produkt erhält auf Attribut-Ebene (hier attr5) eine Zeichenkette, die festlegt, welche Versandkosten anfallen (hier eine Klassifikation in die Größe). [quote]versandkostenklasse=maxibrief versandkostenklasse=paket[/quote] In den Grundeinstellungen bei den Versandkosten folgendes setzen: [quote]MAX(IF(at.attr1=‘versandkostenklasse=paket’, 1, 0)) AS mussVersichertVerschicktWerden[/quote] Und dann in den Versandkosten-Regeln selbst einfach auf mussVersichertVerschicktWerden=0 oder mussVersichertVerschicktWerden=1 prüfen! Gruß, Michael

2 „Gefällt mir“

Hallo! Könnt Ihr mir im Bezug auf die Versandkostenberechnung helfen? Ich möchte gerne einen Aufschlag bei Artikeln, die eine Länge von 120cm überschreiten. Wie würde die Formel aussehen?

Hallo Eröffne doch bitte hierzu ein neues Thema, und schreibe dazu was du schon versucht hast. Dieser Thread sollte zur reinen Informationssammlung dienen. Kannst dann hier in deinem Post deine Lösung reineditieren, wenn du sie hast. vielen dank

Hallo, die hier veröffentlichten Tipps sind klasse und haben mir geholfen vier unterschiedliche Versandarten je nach Artikelart anzulegen (Standard, klein, mittel groß). Die Artikel werden Standardmäßig als Standard erkannt, sofern ich nicht einen entsprechenden Haken in den Artikelattributen gesetzt habe. Das Feld „Gewicht“ habe ich unberührt gelassen. Das klappt wunderbar. Es werden auch immer die jeweils höchsten Versandkosten berechnet. Befindet sich also ein Artikel „klein“ und ein Artikel „groß“ im Warenkorb, so werden durch die „Eigenen Bedingungen“ nur jeweils die höchsten VSK, also in diesem Falle „groß“ berechnet. [list] - standard: 6 - klein: 15 - mittel: 65 - groß: 95 [/list] So weit so gut. Jetzt habe ich folgende Anforderung: Für die Artikel mit den Attributen „mittel“ und „groß“ sollen die Versandkosten je Stück berechnet werden - und zwar je Stück des entsprechenden Artikels. Also 3*groß und 2*klein soll die VSK-groß mit 3 multiplizieren (also 95*3) und die kleinen Artikel unbeachtet lassen. Ich habe verschiedene Wege ausprobiert. Was kurioser Weise passiert ist folgendes: Entweder werden ALLE Artikel im Warenkorb mit „groß“ multipliziert (also im obigen Beispiel mit 5 statt mit 3), oder es wird die Anzahl an allen Artikeln im Warenkorb zu den höchsten Versandkosten addiert, also 95 plus 5. Seht ihr eine Möglichkeit das Problem zu lösen? Getestet habe ich die Wege über die Staffelung (äußerst undynamisch und es wird die Anzahl Multipliziert) und den Weg über „Versandkostenberechnung nach: Artikelanzahl“ (nimmt alle Artikel im Warenkorb in die Berechnung). Beste Grüße! ********************************** UPDATE Ich habe einen Workaround gefunden. Meine „Eigene Berechnung“ sieht nun z.B. so aus: SUM(IF(at.attr5="true", 95\*b.quantity, 0)) Die 95 EUR werden also dann mit der Anzahl an Artikeln multipliziert, wenn diese das Attribut 5 (in meinem Fall „groß“) tragen. Das scheint wunderbar zu klappen, auch für die „mittleren“. Wichtig: Im Reiter „Versandkosten“ darf in der Spalte „Versandkosten“ kein Wert eingetragen sein. Für mich ok. Beste Grüße!

1 „Gefällt mir“

Hallo zusammen, auch von mir erst mal ein dickes Dankeschön! Die Tipps haben mir sehr geholfen. :shopware: Zugriff auf weitere Datenbank-Tabellen: In meinem konkreten Fall brauchte ich Zugriff auf eine Spalte in der Datenbank s_order_basket_attributes, die ja standardmäßig nicht gejoint ist. Nach stundenlangem Herumprobieren habe ich es nun endlich geschafft. In der Datei /engine/Shopware/Core/sAdmin.php muss zunächst die Funktion sGetDispatchBasket erweitert werden. Etwa ab Zeile 3420 beginnt der interessante Bereich, dort werden die einzelnen Tabellen gejoint. Will man nun eine weitere Tabelle einbinden, kann man dies nach folgendem Schema tun: LEFT JOIN s\_order\_basket\_attributes yx ON b.id = yx.basketID yx: Da könnt ihr selbstverständlich auch andere Buchstabenkombinationen verwenden. Wichtig ist nur, dass diese nicht doppelt vergeben werden (b, at, d, etc. sind ja bereits vergeben). ON b.id = yx.basketID: Bedeutet in diesem Fall, dass die Zeile ausgelesen werden soll, in der die “id” aus der Tabelle “s_order_basket” (b) mit der “basketID” aus “s_order_basket_attributes” (yx) übereinstimmt. Je nachdem welche Tabelle ihr einbinden wollt, müsst ihr einen Blick in die Datenbank werfen und schauen, wie die einzelnen Tabellen über IDs miteinander verknüpft sind. Die beiden Zeilen einfach zwischen den anderen JOINs einfügen, z.B. zwischen s_articles_attributes und s_core_tax. Anschließend die erweiterte SQL-Abfrage in den Grundeinstellungen um Folgendes ergänzen: , MAX(yx.attribute6) as InhaltVonAttribute6 Nun vorsichtshalber den Shop Cache leeren. Das war’s! Jetzt steht euch in der Versandkostenberechnung die Variable InhaltVonAttribute6 zur Verfügung, mit der ihr dann weiterarbeiten könnt.

In Kategorie 11, 12 und 40 soll eine seperate Versandkostentabelle (1-Stück-Versand) laufen - aber nur wenn es nur ein Artikel im Warenkorb ist, in allen anderen Kategorien soll das nicht passieren und der standard Versand greifen.

Ich teile das hier mal ein bisschen auf

Einrichten des Zusätzlichen Versands

  • Versandkosten Berechnen nach: Artikelanzahl
  • Im unteren Bereich den Versand von einem Stück erstellen
  • Zahlart, Länder, so wie benötigt
  • Kategorien Sperren - könnte man einstellen, da wir aber später ausschließen in den Bedingungen ausschließen wollen, ist es besser, hier nichts zu tun

 

Kategorien: Versandkosten Modul / Erweitere SQL Abfrage

(SELECT categoryID FROM s_articles_categories WHERE articleID=a.id) as kategorie

Kategorien: Bedingung für 1-Stück-Versand

kategorie = 11 OR kategorie = 12 OR kategorie = 40

 

Artikelanzahl:  Versandkosten Modul / Erweitere SQL Abfrage

(SELECT COUNT(sessionID) FROM s_order_basket WHERE sessionID = b.sessionID) as artikelanzahl

Artikelanzahl: Bedingung für 1-Stück-Versand

artikelanzahl = 1

 

BasketItem quantity: Versandkosten Modul / Erweitere SQL Abfrage

MIN(b.quantity) as anzahl

BasketItem quantity: Bedingung für 1-Stück-Versand

anzahl = 1 

 

Gesamt: Bedingung für 1-Stück-Versand

artikelanzahl = 1 AND anzahl = 1 AND (kategorie = 11 OR kategorie = 12 OR kategorie = 40)

 

Jetzt wird bei den gewünschten Kategorien, und bei einer Gesamtartikelanzahl von 1 die bedingung mit ausgegeben. Es wird aber auch der andere Versand mit ausgegeben, aus Kundenfreundlichkeit, möchte ich aber immer den geringst möglichen Versand berechnen, und aus usability sicht, möchte ich nur eine der beiden Versandarten im Frontend anzeigen. Deshalb muss in der Standard Versandmethode auch noch ein kleiner Schnipsel in die Bedingung

 

Gesamt: Bedingung für Standard Versand

anzahl > 1 OR artikelanzahl > 1 AND (kategorie != 11 OR kategorie != 12 OR kategorie != 40)

 

Notiz am Rande

Nach dem ändern der Einstellungen im Versandkostenmodul sollte der Cache gelöscht werden!

Ich habe das mit meinen geringen SQL kenntnissen zusammengeschraubt dehalb habe ich eine kleine Frage, SUM() scheint ja in bedingungen nicht zu gehen, gibt es eine möglichkeit (anzahl + artikelanzahl - 1) zu rechnen?