"Für dieses Land wurde keine Versandart eingerichtet..." aktiv verwenden

Hallo allerseits,

ich weiß nicht ob schon einer von euch hiermit konfrontiert war (Shopversion 4.4.8 PE):

Ein Shopbettreiber hat in seinem Artikelsortiment Artikel, die als Sperrgut definiert sind und Artikel bei denen das nicht der Fall ist. Definiert ist das über die Größe des Artikels. Gibt es eine Größenangabe, dann gilt der Artikel als Sperrgut, ansonsten handelt es sich um einen normalen Artikel.

Für Deutschland war die Definition von Sperrgut und kein Sperrgut auch ohne weiteres Möglich, da hierfür eine Versandart mit zugehöriger Versandkostenregel (Größe >= 0.0001) hinterlegt ist. Kein Problem, alle Kosten sind hier bekannt und können daher definiert werden.

Anders sieht das für das Ausland aus. Hier hat der Shopbetreiber Versandarten und Versandkostenregeln für normale Artikel hinterlegt, möchte aber für Sperrgüter keine Kosten für das Ausland selber definieren. Stattdessen möchte er aber die Meldung “Es wurde keine Versandart für dieses Land definiert…” dafür verwenden.

Die Meldung erscheint zwar, jedoch kann man Sie nicht verwenden, beim Klick auf “Weiter” wird Fehlercode -3 ausgegeben, man möge doch eine andere Zahlungsart wählen.

Bisher konnte ich hier folgendes Ermitteln:

In payment.tpl wird der Text PAYMENT_EMPTY_TEXT quasi als Fallback für allerlei Fälle verwendet, denn sobald es eine Zahlart Empty gibt wird er verwendet.

Der Text entspricht aber nicht dem was tatsächlich ermittelt wurde, denn tatsächlich gibt es eine Versandart, die für den Auslandskunden greift, nämlich die Versandart für normale Artikel. Jedoch greift die zugeordnete Versandkostenregel nicht, da der Artikel ja mit einer eingetragenen Größe als Sperrgut definiert ist.

Die Methode isValidPayment in oxpayment erklärt aus meiner Sicht auch das Problem:


    /**
     * Function checks if loaded payment is valid to current basket
     *
     * @param array  $aDynvalue    dynamical value (in this case oxidcreditcard and oxiddebitnote are checked only)
     * @param string $sShopId      id of current shop
     * @param oxuser $oUser        the current user
     * @param double $dBasketPrice the current basket price (oBasket->dprice)
     * @param string $sShipSetId   the current ship set
     *
     * @return bool true if payment is valid
     */
    public function isValidPayment( $aDynvalue, $sShopId, $oUser, $dBasketPrice, $sShipSetId )
    {
        $myConfig = $this->getConfig();
        if ( $this->oxpayments__oxid->value == 'oxempty' ) {
            // inactive or blOtherCountryOrder is off
            if ( !$this->oxpayments__oxactive->value || !$myConfig->getConfigParam( "blOtherCountryOrder" ) ) {
                $this->_iPaymentError = -2;
                return false;
            }
            if (count(oxDeliverySetList::getInstance()
                            ->getDeliverySetList(
                                        $oUser,
                                        $oUser->getActiveCountry()
                                )
                    )) {
                $this->_iPaymentError = -3;
                return false;
            }
            return true;
        }

        $oValidator = oxNew( 'oxinputvalidator' );
        if ( !$oValidator->validatePaymentInputData( $this->oxpayments__oxid->value, $aDynvalue ) ) {
            $this->_iPaymentError = 1;
            return false;
        }

        $oCur = $myConfig->getActShopCurrencyObject();
        $dBasketPrice = $dBasketPrice / $oCur->rate;

        if ( $sShipSetId ) {
            $aPaymentList = oxPaymentList::getInstance()->getPaymentList( $sShipSetId, $dBasketPrice, $oUser );

            if ( !array_key_exists( $this->getId(), $aPaymentList ) ) {
                $this->_iPaymentError = -3;
                return false;
            }
        } else {
            $this->_iPaymentError = -2;
            return false;
        }

        return true;
    }

Im gegebenen Fall hängt das ganze hier dran:


            if (count(oxDeliverySetList::getInstance()
                            ->getDeliverySetList(
                                        $oUser,
                                        $oUser->getActiveCountry()
                                )
                    )) {
                $this->_iPaymentError = -3;
                return false;
            }

Dieser Codeteil wird nämlich immer etwas zählen sobald eine Versandart für ein Land definiert ist, unabhängig davon ob eine zugeorndete Versandkostenregel greift oder nicht.

Das ist wirklich schade, denn im gegebenen Fall möchte der Shopbetreiber sicherstellen, dass der Kunde mit der PAYMENT_EMPTY_TEXT-Meldung seine Bestellung abschließen kann und er sich in dem Fall “Versand von Sperrgut ins Ausland” mit dem Kunden direkt auseinandersetzen will und eben nicht für jedes mögliche Land und jede mögliche Sperrgutgröße komplexe Versandkostensets entwerfen.

Vielleicht habe ich das auch alles falsch Verstanden und das was der Shopbetreiber will ist doch möglich, dann klärt mich bitte auf.

Andernfalls würde ich schon meinen, dass man das Feature tatsächlich konsequent umsetzen sollte und eine Bestellung mittels oxempty auch dann durchgezogen werden kann, wenn das Land zwar bei den Versandarten greift, aber keine passende Versandkostenregel vorhanden ist. Im Prinzip betrachte ich den derzeitigen Stand als Bug.

Was meint Ihr oder habt Ihr noch Lösungsvorschläge für einen sochen Fall?

Schöne Grüße

André

Für mich ergibt der Code aus der 2. Box auch keinen Sinn. Du kannst dir ja ein Modul schreiben ohne diesen Code und einen Bugeintrag erstellen.

Kann man denn die Bestellung nicht trotz fehlender gültiger Versandkostenregel abschließen, wenn im Backend unter Stammdaten -> Grundeinstellungen -> System -> Bestellungen -> [I]“Bestellungen aus dem Ausland auch dann erlauben, wenn keine Versandkosten für das Land vorhanden sind”[/I] angehakt ist?

Das ist doch genau das was gebraucht wird, die Bestellung wird abgeschlossen und die Versandkosten werden erstmal umgangen. Ein entsprechender Hinweis erscheint und dieser steht ebenfalls in den Mails drin.

Das ist da schon aktiviert, aber wenn für das Land eine Versandart existiert, geht die Bestellung trotzdem nicht durch sondern es erscheint “bitte wählen Sie eine andere Zahlungsart”.

… Ich nehm alles zurück - geht ja nur darum die Sperrgut-Artikel auszunehmen, die anderen haben ja gültige Versandregeln…

jetzt hab ichs geschnallt, manchmal sollte man eben doch zweimal lesen… :rolleyes: