Eigene Bedingung bei Versandart

Hallo zusammen

Ich möchte eine eigene Bedingung machen, scheitere aber daran.

  • Bedingung Versandart: Diese Versandart soll nur aktiv sein, wenn einer der beiden folgenden Artikelnummern im Warenkorb ist: SS10230, SS10229.

Wie bringe ich das hin?

Nach Artikel kann man die Versandart nicht so einfach einschränken, aber nach Kategorien - Wie wäre es wenn du diese speziellen Artikel in einer Kategorie zusammenfasst und dann diese bei der Versandart hinterlegst?

Wäre eine Idee, danke.

Doch wie bringe ich es hin, dass dann diese letzte (pseudo) Kategorie nicht im Shop angezeigt wird?

Für die Anzeige in der Topnavi gibt es eine Checkbox… die Sidenavi wäre dann natürlich ein Problem…

Aber es gibt bei den Versandarten auch noch einen Reiter „Erweiterte Einstellungen“ für „Eigene Bedingungen/Berechnungen“, evtl. kann man es darüber lösen.
Muss ich aber ehrlich zugeben die Felder noch nie benutzt zu haben, ggf. findest du aber Beispiele im Forum oder in der Funktionsbeschreibung wie man diese Bedingungen formuliert :slight_smile:

PStadtfeld: Genau so wollte ich es lösen, doch ohne Erfolg. Siehe Fehlermeldungen auf dem Backend-Log am Schluss. Im Warenkorb bekomme ich lediglich einen Fehler.

Mein Code für "Eigene Bedingungen"

IF(d.ordernumber LIKE ‚%SS10230%‘ OR ‚%SS10229%‘,1,0)

Gemäss: https://docs.shopware.com/de/shopware-5-de/versand-und-zahlungsarten/individuelle-versandkosten#artikelnummern

Hast du noch eine andere Idee?

Erste Fehlermeldung

PDOException: SQLSTATE(42S22): Column not found: 1054 Unknown column ‚d.ordernumber‘ in ‚where clause‘ in /vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:907 Stack trace:
#0 /vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(907): PDOStatement->execute()
#1 /vendor/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php(206): Doctrine\DBAL\Connection->executeQuery(‚SELECT d.id as …‘, Array, Array)
#2 /engine/Shopware/Core/sAdmin.php(2797): Doctrine\DBAL\Query\QueryBuilder->execute()
#3 /engine/Shopware/Controllers/Frontend/Checkout.php(1572): sAdmin->sGetPremiumDispatches(26, NULL, NULL)
#4 /engine/Shopware/Controllers/Frontend/Checkout.php(151): Shopware_Controllers_Frontend_Checkout->getSelectedDispatch()
#5 /engine/Library/Enlight/Controller/Action.php(192): Shopware_Controllers_Frontend_Checkout->cartAction()
#6 /engine/Library/Enlight/Controller/Dispatcher/Default.php(478): Enlight_Controller_Action->dispatch(‚cartAction‘)
#7 /engine/Library/Enlight/Controller/Front.php(228): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp))
#8 /engine/Shopware/Kernel.php(188): Enlight_Controller_Front->dispatch()
#9 /vendor/symfony/http-kernel/HttpCache/SubRequestHandler.php(102): Shopware\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#10 /vendor/symfony/http-kernel/HttpCache/HttpCache.php(453): Symfony\Component\HttpKernel\HttpCache\SubRequestHandler::handle(Object(Shopware\Kernel), Object(Symfony\Component\HttpFoundation\Request), 1, true)
#11 /engine/Shopware/Components/HttpCache/AppCache.php(261): Symfony\Component\HttpKernel\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL)
#12 /vendor/symfony/http-kernel/HttpCache/HttpCache.php(426): Shopware\Components\HttpCache\AppCache->forward(Object(Symfony\Component\HttpFoundation\Request), true)
#13 /vendor/symfony/http-kernel/HttpCache/HttpCache.php(317): Symfony\Component\HttpKernel\HttpCache\HttpCache->fetch(Object(Symfony\Component\HttpFoundation\Request), true)
#14 /engine/Shopware/Components/HttpCache/AppCache.php(188): Symfony\Component\HttpKernel\HttpCache\HttpCache->lookup(Object(Symfony\Component\HttpFoundation\Request), true)
#15 /vendor/symfony/http-kernel/HttpCache/HttpCache.php(192): Shopware\Components\HttpCache\AppCache->lookup(Object(Symfony\Component\HttpFoundation\Request), true)
#16 /engine/Shopware/Components/HttpCache/AppCache.php(113): Symfony\Component\HttpKernel\HttpCache\HttpCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#17 /home/hebinesi/www/domain.ch/shopware.php(122): Shopware\Components\HttpCache\AppCache->handle(Object(Symfony\Component\HttpFoundation\Request))
#18

Zweite Fehlermeldung

An exception occurred while executing ‚SELECT d.id as key, d.id, d.name, d.description, d.calculation, d.status_link, b.* FROM s_premium_dispatch d INNER JOIN (SELECT ‚1‘ as instock,‚1‘ as stockmin,‚0‘ as laststock,‚0.000‘ as weight,‚1‘ as count_article,‚0‘ as shippingfree,‚62‘ as amount,‚62‘ as amount_net,‚62.00‘ as amount_display,‘’ as length,’’ as height,’’ as width,’’ as userID,‚0‘ as has_topseller,’’ as has_comment,‚0‘ as has_esd,‚0‘ as max_tax,‚0‘ as basketStateId,‚26‘ as countryID,‚4‘ as paymentID,‚1‘ as customergroupID,‚1‘ as multishopID,‚ba5bafc79c5d280a2f028f3af42d59001642b2559f5148a8ef846b39459acf2d‘ as sessionID) b ON 1=1 INNER JOIN s_premium_dispatch_countries dc ON d.id = dc.dispatchID AND dc.countryID=b.countryID INNER JOIN s_premium_dispatch_paymentmeans dp ON d.id = dp.dispatchID AND dp.paymentID=b.paymentID LEFT JOIN s_premium_holidays h ON h.date = CURDATE() LEFT JOIN s_premium_dispatch_holidays dh ON d.id=dh.dispatchID AND h.id=dh.holidayID LEFT JOIN (SELECT dc.dispatchID FROM s_order_basket b INNER JOIN s_articles_categories_ro ac ON ac.articleID = b.articleID INNER JOIN s_premium_dispatch_categories dc ON dc.categoryID = ac.categoryID WHERE (b.modus = 0) AND (b.sessionID = ?) GROUP BY dc.dispatchID) dk ON dk.dispatchID=d.id LEFT JOIN s_user u ON  u.id=b.userID AND u.active=1 LEFT JOIN s_user_addresses ub ON ub.user_id = u.id AND ub.id = ? LEFT JOIN s_user_addresses us ON us.user_id = u.id AND us.id = ? WHERE (d.active = 1) AND ((                 (bind_time_from IS NULL AND bind_time_to IS NULL)                 OR                 (IFNULL(bind_time_from,0) <= IFNULL(bind_time_to,86400) AND TIME_TO_SEC(DATE_FORMAT(NOW(),"%H:%i:00")) BETWEEN IFNULL(bind_time_from,0) AND IFNULL(bind_time_to,86400))                 OR                 (bind_time_from > bind_time_to AND TIME_TO_SEC(DATE_FORMAT(NOW(),"%H:%i:00")) NOT BETWEEN bind_time_to AND bind_time_from)             )) AND ((                 (bind_weekday_from IS NULL AND bind_weekday_to IS NULL)                 OR                 (IFNULL(bind_weekday_from,1) <= IFNULL(bind_weekday_to,7) AND WEEKDAY(NOW())+1 BETWEEN IFNULL(bind_weekday_from,1) AND IFNULL(bind_weekday_to,7))                 OR                 (bind_weekday_from > bind_weekday_to AND WEEKDAY(NOW())+1 NOT BETWEEN bind_weekday_to AND bind_weekday_from)             )) AND ((bind_weight_from IS NULL OR bind_weight_from <= b.weight)) AND ((bind_weight_to IS NULL OR bind_weight_to >= b.weight)) AND ((bind_price_from IS NULL OR bind_price_from <= b.amount)) AND ((bind_price_to IS NULL OR bind_price_to >= b.amount)) AND ((bind_instock=0 OR bind_instock IS NULL OR (bind_instock=1 AND b.instock) OR (bind_instock=2 AND b.stockmin))) AND ((bind_laststock=0 OR (bind_laststock=1 AND b.laststock))) AND ((bind_shippingfree!=1 OR NOT b.shippingfree)) AND (dh.holidayID IS NULL) AND ((d.multishopID IS NULL OR d.multishopID=b.multishopID)) AND ((d.customergroupID IS NULL OR d.customergroupID=b.customergroupID)) AND (dk.dispatchID IS NULL) AND (d.type IN (0)) AND ((d.id != 14 OR (IF(d.ordernumber LIKE ‚%SS10230%‘ OR ‚%SS10229%‘,1,0)))) AND ((d.id != 15 OR (IFNULL(us.zipcode,ub.zipcode) = ‚9113‘))) GROUP BY d.id ORDER BY d.position, d.name ASC’ with params („ba5bafc79c5d280a2f028f3af42d59001642b2559f5148a8ef846b39459acf2d“, 0, 0):  SQLSTATE(42S22): Column not found: 1054 Unknown column ‚d.ordernumber‘ in ‚where clause‘

Ja okay, es scheint als hätte sich die Funktion grundlegend geändert seit der letzten Überarbeitung der Dokumentationen und Hilfen seitens Shopware…
Die Artikelnummer erscheint im entsprechenden Statement überhaupt nicht mehr und kann demanch auch nicht abgefragt werden (ist alles in Subqueries kaputtverschachtelt).

Probier es mal hiermit, das sollte eigentlich funktionieren…

(SELECT max(IF(sob.ordernumber LIKE '%SS10230%' OR sob.ordernumber LIKE '%SS10229%',0,1)) 
	 FROM s_order_basket sob 
	 WHERE sob.sessionID = b.sessionID) = 0

Zum Statement: Die Versandart ist nur dann Verfügbar, wenn im Warenkorb außer den zwei genannten Artikeln nichts drin liegt.
Der IF-Bereich könnte noch um den Modus erweitert werden um nur nach regulären Artikeln zu filtern (also Aktionen und Rabatte nicht berücksichtigen - wäre sinnvoll).
(Also z.B. die Abfrage der Artikelnummern in Klammern und ein AND sob.modus = 0 dahinter)

Wenn die Versandart bei dir schon erscheinen soll wenn nur einer der Artikel vorliegt (unabhängig von anderen Artikeln im Warenkorb) dann ändere einfach 0 und 1 im IF und in der Abfrage am Ende.

Hi, stehe vor dem Selben Problem, in was sollte man denn 0 und 1 ändern?

@Marcel3802

So z.B. ?
Jetzt würde er schauen ob zumindest ein Artikel den gesuchten Artikelnummern entspricht und sofern ein Artikel dies tut liefert er mit max 1 zurück, was dann 1=1 also true ergibt.

das klappt!! Danke

hast du noch eine idee wie ich diese regel am besten für eine individuelle anzahl an skus anpassen kann?

@Marcel3802
Bin mir nicht sicher, ob ich das richtig verstehe… Individuelle Anzahl von Artikeln?
Du könntest aus dem Max() ein Sum() machen und dann am Ende statt = 1 ein >= DeineZahl.
Dann würde er jeden treffenden Artikel zählen und nachher schauen, ob die Summe an Artikeln ausreicht um die Anforderung zu erfüllen.
Bei genauer Zahl > entfernen, also sum(…) = DeineZahl statt >=

so wars nicht gemeint, sondern wie kann ich z.B. 5 verschiedene Skus einfügen, der Filter ist ja nur für 1 SKU

@Marcel3802
Was meinst du mit SKU, die Artikelnummer ?
Kannst das Beispiel beliebig erweitern indem du zusätzliche Bereiche wie diesen hinzufügst:

OR sob.ordernumber LIKE '%[DeineNummerHier]%'