Automatischer Pfand Artikel

Ich fands ganz einfach Pfand anzulegen nachdem man sich klarmacht was Pfand ist.

Rabatte auf -(Rabattbetrag) setzen Einkaufsmenge und preis jeweils von 1 bis 9999999 und dann die Artikel zuordnen. Funktioniert bei mir prima.

Ich hab nur ein Problem ich brauche eine Kennzeichnung mit “zzgl. Pfand,” neben dem Preis bei dem Vermerk “inkl. MwSt., zzgl. Versandkosten”

Weiß jemand wo ich das eintragen kann bzw. eine andere Lösung damit der Kunde den Vermerk sofort sieht und nicht erst überrascht wird?

Danke schonmal :slight_smile:

Hallo,

ich muss das Thema noch einmal aufgreifen.

Auch wir müssen bei manchen Artikeln Pfand berechnen. Leider führen beide genannten Möglichkeiten bei uns (Version 4.4.1) nicht zum gewünschten Ergebnis.

Die erste Möglichkeit, die m.E. auch die korrekte wäre, den Pfand als “Artikel dazu” auszuwählen, führt bei uns dazu, dass das Pfand (den wir als neuen Artikel angelegt haben) im Warenkorb zwar auftaucht, jedoch nichts berechnet wird, obwohl bei dem Pfand in diesem Fall 6,00 Euro hinterlegt sind.

Bei der zweiten Möglichkeit den Pfand als -Rabatt anzulegen, wird im Warenkorb der Betrag von 6,00 Euro einfach dem Produktpreis aufgeschlagen/erhöht, so dass der Kunde eventuell vom Kauf Abstand nimmt, weil ihm nicht klar ist, dass es sich hier um Pfand handelt.

Hallo,

gibt es inzwischen eine funktionierende Lösung für das “Pfand-Problem”?

Mfg

Da ich vor dem selben Problem mit dem Pfand stand will ich hier mal meine Lösung präsentieren:

Als erstes habe ich in der Datenbank die Tabelle “oxarticles” um ein Feld “cmpawn” erweitert, welches den Artikelpfandpreis beinhalltet.
Danach habe ich mir in Multilanguage Variablen angelegt in den Language Files, die den Namen des Pfandartikels beinhalten. (In meinen Fall “Pfand” “Pawn” etc…)
Nun habe ich ein Bild für den Pfand Artikel in den “out\pictures\master\product\1” Ordner reinkopiert. (In meinem Fall “return.png”)

Dann habe ich die “oxarticle.php” erweitert um den Pfand/formatierten Pfand zurückgeben zu können:


<?php

class  cm_oxarticle extends cm_oxarticle_parent
{
    /**
     * Returns article pawn
     *
     * @return string
     */
    public function getPawn()
    {
        return $this->oxarticles__cmpawn->value;
    }

    /**
     * Returns formatted article pawn
     *
     * @return string
     */
    public function getFPawn()
    {
        if(empty($this->oxarticles__cmpawn->value)) {
            return;
        }
        $pawn = oxRegistry::getLang()->formatCurrency( $this->oxarticles__cmpawn->value );
        return $pawn;
    }

}

Danach habe ich oxbasketitem.php erweitert, damit ich den Pfand/formatierten Pfand zurück geben und den Artikel Link setzen kann.


<?php

class  cm_oxBasketItem extends cm_oxBasketItem_parent
{
    /**
     * Returns article pawn
     *
     * @return string
     */
    public function getPawn()
    {
        return $oArticle->oxarticles__cmpawn->value;
    }

    /**
     * Returns formatted article pawn
     *
     * @return string
     */
    public function getFPawn()
    {
        $oArticle = $this->getArticle( true );
        if(empty($oArticle->oxarticles__cmpawn->value)) {
            return;
        }
        $pawn = oxRegistry::getLang()->formatCurrency( $oArticle->oxarticles__cmpawn->value );
        return $pawn;
    }

    /**
     * Returns total article pawn
     *
     * @return string
     */
    public function getTotalPawn()
    {
        $oArticle = $this->getArticle( true );
        if(empty($oArticle->oxarticles__cmpawn->value)) {
            return;
        }
        return ($oArticle->oxarticles__cmpawn->value * $this->getAmount());
    }

    /**
     * Returns formatted total article pawn
     *
     * @return string
     */
    public function getFTotalPawn()
    {
        $oArticle = $this->getArticle( true );
        if(empty($oArticle->oxarticles__cmpawn->value)) {
            return;
        }
        $pawn = oxRegistry::getLang()->formatCurrency( $oArticle->oxarticles__cmpawn->value * $this->getAmount());
        return $pawn;
    }

    public function setLink($artLink)
    {
        $this->_sLink = $artLink;
        return $this->getSession()->processUrl( $this->_sLink );
    }
}

Jetzt habe ich oxbasket.php erweitert. Die Funktion _addbundles wurde erweitert so das geprüft wird ob schon ein Pfandartikel existiert bzw einer angelegt wird sofern noch kein Pfand Artikel mit entsprechenden Preis existiert.
Das eigentliche Anlegen findet in der Funktion “getPawnArticleId” statt.
Beim anlegen wird der Name des Pfandartikels aus unserer angelegten Variable aus den Multilanguage Files genommen und für alle Sprachen richtig gesetzt. Das richtige Bild wird dabei auch im Pfandartikel gesetzt.
‘oxissearch’ wird auf 0 gesetzt damit der Pfandrtikel nicht über die Suche zu finden ist. Nachdem der Artikel dem Warenkorb hinzugefügt wurde setzte ich nun den Link zum eigentlichen Artikel um, damit der Kunde auch nicht über den Link aus dem Warenkorb an den Pfandartikel heran kommt.


<?php

class  cm_oxbasket extends cm_oxbasket_parent
{
    /**
     * Iterates through basket contents and adds bundles to items + adds
     * global basket bundles
     *
     * @return null
     */
    protected function _addBundles()
    {
        $aBundles = array();
        // iterating through articles and binding bundles
        foreach ( $this->_aBasketContents as $key => $oBasketItem ) {
            try {
                // adding discount type bundles
                if ( !$oBasketItem->isDiscountArticle() && !$oBasketItem->isBundle() ) {
                    $aBundles = $this->_getItemBundles( $oBasketItem, $aBundles );
                } else {
                    continue;
                }

                    // adding item type bundles
                    $aArtBundles = $this->_getArticleBundles( $oBasketItem );

                    //Pfand Artikel als Bundle in den Warenkorb legen
                    if(!empty($oBasketItem->getArticle()->oxarticles__cmpawn->value))
                    {
                        $pAId = $this->getPawnArticleId($oBasketItem->getArticle()->oxarticles__cmpawn->value);
                        $oBundleItem = $this->addToBasket( $pAId, $oBasketItem->getAmount(), null, null, false, true );

                        //Pfandrtikel Link auf Artikellink setzen damit man nicht auf die Pfandartikel Seite kommt
                        if($oBasketItem->getLink() && $oBundleItem) {
                            $oBundleItem->setLink($oBasketItem->getLink());
                        }
                    }
                    
                    // adding bundles to basket
                    $this->_addBundlesToBasket( $aArtBundles );
            } catch ( oxNoArticleException $oEx ) {
                $this->removeItem( $key );
                oxRegistry::get("oxUtilsView")->addErrorToDisplay( $oEx );
            } catch( oxArticleInputException $oEx ) {
                $this->removeItem( $key );
                oxRegistry::get("oxUtilsView")->addErrorToDisplay( $oEx );
            }
        }

        // adding global basket bundles
        $aBundles = $this->_getBasketBundles( $aBundles );

        // adding all bundles to basket
        if ( $aBundles ) {
            $this->_addBundlesToBasket( $aBundles );
        }
    }

    /**
     * Get pawn ArticleId for the given price / create a pawn article of not existent for the given price
     */
    protected function getPawnArticleId($price)
    {
        $oxLang = oxLang::getInstance();
        $title = $oxLang->translateString( 'CM_PAWN', 0);
        $sSelect = "SELECT oxid FROM oxarticles WHERE oxtitle = '" . $title . "' AND oxprice = '" . $price . "' LIMIT 1";

        $qResult = oxDb::getDb(ADODB_FETCH_ASSOC)->getOne($sSelect);
        if($qResult==false || $qResult==null) {
            $oArticle = oxNew("oxarticle");
            $aLangs= $oxLang->getLanguageIds();
            $oArticle->assign( array( 'oxarticles__active' => 1,
                                      'oxarticles__oxprice' => $price,
                                      'oxarticles__oxissearch' => 0,
                                      'oxarticles__oxpic1' => 'return.png'
                              ));
            $oArticle->save();

            //foreach ($aLangs as $iLang){
            for($i=0; $i<count($aLangs); $i++) {
                $oArticle->setLanguage( $i );
                $oArticle->assign(array(
                    "oxarticles__oxtitle" => $oxLang->translateString( 'CM_PAWN', $i),
                ));
                $oArticle->save();
            }  
            $qResult = $oArticle->oxarticles__oxid->value;
        }

        return $qResult;
    }
}

Nun kann in den Layout Dateien an entsprechender Stelle noch der Pfand ausgegeben werden z.B. auf der Artikelseite oder in der Kategorieansicht. (Mittels der Funktionen aus der oxarticle.php. Da z.B. auf der Artikelseite ja nur der Preis des Artikels steht aber der Pfand noch nicht. Im Warenkorb z.B. ist dies nicht notwendig da hier Pfandartikel liegt.)

So wenn jemand Fehler findet oder Verbesserungsvorschläge hat darf er die gern posten. :slight_smile:

P.S.:

Falls jemand seinen Minibasket erweitert/verändert hat, so das sich Artikel entfernen lassen, hat er auch kein Problem da der Pfandartikel (dank der _addbundles Funktion) wieder in den Warenkorb gepackt wird.
Das entfernen könnte so aussehen:


                                <form name="basket[{ $basketindex }]" action="[{ $oViewConf->getParamLink() }]" method="post">
                                    [{ $oViewConf->getHiddenSid() }]
                                    <input type="hidden" name="fnc" value="changebasket">
                                    <input type="hidden" name="CustomError" value='basket'>
                                    <input type="hidden" name="aproducts[[{ $basketindex }]][aid]" value="[{ $_product->getProductId() }]">
                                    <input type="hidden" name="aproducts[[{ $basketindex }]][override]" value="1">
                                    <div style="display:block; float:left;">
                                        <button style="display:inline-block; width:20px; float:left; padding:0px; margin:0px; border-radius:0px;" type="submit" value="x Remove" name="aproducts[[{ $basketindex }]][remove]" class="submitButton largeButton">x</button>
                                        <a href="[{$_product->getLink()}]" title="[{ $minibasketItemTitle|strip_tags }]" style="display:inline-block; width:220px; float:right;">
                                            <span class="item">
                                                [{if $_product->getAmount() gt 1}]
                                                    [{$_product->getAmount()}] x
                                                [{/if}]
                                                [{ $minibasketItemTitle|strip_tags }]
                                            </span>
                                            <strong class="price">[{$_product->getFTotalPrice()}] [{ $currency->sign}]</strong>
                                        </a>
                                    </div>
                                </form>

[QUOTE=R.Nitzer;134240]…oder Verbesserungsvorschläge hat …[/QUOTE]

jupp - das ganze als Modul sauber verpackt und auf Github stellen :slight_smile:

Danke für Deine Lösung!

Wenn ich dazu Zeit am Wochenende finde setze ich mich da mal ran. Insofern ich das wirklich [B]sauber verpackt[/B] in ein Modul bekomme, so das es jeder nutzen könnte. :slight_smile:

Hallo,

das Pfand-Modul ist echt super gelungen.

Was mir aufgefallen ist das wenn man im Backend Zahlungsinformationen hinzufügt oder einen Artikel hinzufügen möchte. Egal ob es ein Artikel mit Pfand oder ohne Pfand ist.

Nach Änderungen im Backend sind danach alle Pfandartikel verschwunden von der Bestellung.

Kann man dies durch eine kleine Erweiterung des Scriptes verhindern/beheben?

Gruss
Wolfgang

Hallo Wolfgang

Habe das Modul mit obigem Code auf GitHub (Klick). Da ich das gleiche brauchte, hab ich die Lösung von R.Nitzer in ein Modul verpackt.
Schau Dir mal den Code an, dann siehst Du das die Artikel anhand des Pfandwerts angelegt werden… man kann/darf das Modul aber auch gerne erweitern…

LG Pasquale

Hallo zusammen,

bei mir macht das Modul leider Probleme, vielleicht kann mir hier ja jemand helfen.

Ich habe das Modul installiert und es funktioniert so weit auch. Das Pfandfeld im Backend wird korrekt angelegt und wenn ich dort einen Wert eintrage und im Frontend den Artikel bestelle, dann wird in der Datenbank auch der “Pseudopfandartikel” korrekt angelegt.
Aber im Frontend ist der Artikel nicht kaufbar.
Es kommt die Meldung “Artikel ist nicht kaufbar”.

Weiß hier einer vielleicht auf Anhieb woran das liegt?

Es sei noch dazu gesagt, dass wir die Shopversion CE 4.8.1 im Einsatz haben und ich die vtec_detail_pfandanzeige.tpl ändern musste. Der Rest sollte aber auch mit unserer alten Shopversion funktionieren oder nicht?

Hallo

Ich kann Dein Problem mit einer CE 4.8.1 nicht reproduzieren… Der Pseudo-Pfandartikel ist extra so angelegt das er nicht gefunden werden kann und einzeln in den Warenkorb gelegt werden kann. Sobald das Pfandfeld einen Eintrag hat wird das Pfand als Bundle in Warenkorb gelegt.
Hat evt. Deine Exeption.log ein Eintrag? Oder hast Du mal einen Link?

LG Pasquale

Die exception.log bekommt keinen Eintrag.
Link wird leider auch nicht helfen, da wir einen B2B Shop haben und somit die Benutzung eingeschränkt ist, wenn man nicht angemeldet ist.
Aber das ist auch nicht weiter schlimm. Wenn bei dir das Ganze mit der Version 4.8.1 funktioniert muss es daran liegen, dass wir bestimmte Teile des Shops relativ stark umgebaut haben und ich geh der Sache erstmal selber weiter auf den Grund.
Danke trotzdem!

Hey,

sorry, ich muss hier doch noch mal nachfragen. Nach längerem debuggen und suchen des Fehlers bin ich jetzt auf folgendes gestoßen:
Er scheint Probleme zu haben, den Pfandartikel im Warenkorb “anzulegen”. Er springt in eine Exception beim Versuch an folgender Stelle in der vtec_oxbasket.php:


} else {
     //inserting new
     $oBasketItem = oxNew( 'oxbasketitem' );
     try {
          $oBasketItem->setStockCheckStatus( $this->getStockCheckMode() );
          $oBasketItem->init( $sProductID, $dAmount, $aSel, $aPersParam, $blBundle );
     } catch( oxNoArticleException $oEx ) {
          // in this case that the article does not exist remove the item from the basket by setting its amount to 0
          //$oBasketItem->dAmount = 0;
          $blRemoveItem = true;

     } catch( oxOutOfStockException $oEx ) {
          // rethrow later
     } catch ( oxArticleInputException $oEx ) {
          // rethrow later
          $blRemoveItem = true;
     }

Die Variablen, die beim $oBasketItem->init(…) übergeben werden, sind alle befüllt ($aSel und $aPersParam mit null). Hinter der $sProductId Variablen ist die OXID des Pseudo-Pfandartikels.
Beim ersten Durchlauf legt er den Artikel zu dem der Pseudoartikel gehört noch ohne Exception in den Warenkorb.

Der Stacktrace der Exception sieht wie folgt aus:

exception ‘oxArticleInputException’ with message ‘ERROR_MESSAGE_ARTICLE_ARTICLE_NOT_BUYABLE’ in /srv/www/htdocs/web10/html/core/oxutilsobject.php:218
Stack trace:
#0 /srv/www/htdocs/web10/html/core/oxutilsobject.php(193): oxUtilsObject->_getObject(‘oxarticleinpute…’, 0, Array)
#1 [internal function]: oxUtilsObject->oxNew(‘oxArticleInputE…’)
#2 /srv/www/htdocs/web10/html/core/oxfunctions.php(383): call_user_func_array(Array, Array)
#3 /srv/www/htdocs/web10/html/application/models/oxbasketitem.php(489): oxNew(‘oxArticleInputE…’)
#4 /srv/www/htdocs/web10/html/application/models/oxbasketitem.php(696): oxBasketItem->getArticle(true, ‘6b14982b4e48e53…’)
#5 /srv/www/htdocs/web10/html/application/models/oxbasketitem.php(273): oxBasketItem->_setArticle(‘6b14982b4e48e53…’)
#6 /srv/www/htdocs/web10/html/modules/vtec_pfand/vtec_oxbasket.php(192): oxBasketItem->init(‘6b14982b4e48e53…’, 1, NULL, NULL, true)
#7 /srv/www/htdocs/web10/html/modules/vtec_pfand/vtec_oxbasket.php(38): vtec_oxbasket->addToBasket(‘6b14982b4e48e53…’, 1, NULL, NULL, false, true, NULL, ‘8a0faa716ec642e…’)
#8 /srv/www/htdocs/web10/html/application/models/oxbasket.php(1477): vtec_oxbasket->_addBundles()
#9 /srv/www/htdocs/web10/html/application/components/oxcmp_basket.php(106): oxBasket->calculateBasket(false)
#10 /srv/www/htdocs/web10/html/application/controllers/oxubase.php(2229): oxcmp_basket->render()
#11 /srv/www/htdocs/web10/html/application/controllers/details.php(295): oxUBase->render()
#12 /srv/www/htdocs/web10/html/core/oxshopcontrol.php(492): Details->render()
#13 /srv/www/htdocs/web10/html/core/oxshopcontrol.php(396): oxShopControl->_render(Object(Details))
#14 /srv/www/htdocs/web10/html/modules/_d3modcfg/modules/controllers/d3_oxshopcontrol_modcfg_extension.php(0): oxShopControl->_process(‘details’, NULL, NULL, NULL)
#15 /srv/www/htdocs/web10/html/core/oxshopcontrol.php(156): d3_oxshopcontrol_modcfg_extension->_process(‘details’, NULL, NULL, NULL)
#16 /srv/www/htdocs/web10/html/modules/_d3modcfg/modules/controllers/d3_oxshopcontrol_modcfg_extension.php(0): oxShopControl->start(NULL, NULL, NULL, NULL)
#17 /srv/www/htdocs/web10/html/core/oxid.php(40): d3_oxshopcontrol_modcfg_extension->start()
#18 /srv/www/htdocs/web10/html/index.php(28): OXID::run()
#19 {main}

Kann mir hier jemand weiterhelfen? Was kann ich noch überprüfen?

Danke schon mal!

Hast Du evt. die Lagerverwaltung aktiv und erlaubst keine Negativbestände? Oder werden in Deinem Shop alle Artikel auf den Status “Wenn ausverkauft nicht bestellbar” gesetzt?
Hier wird das geprüft:


  $oBasketItem->setStockCheckStatus( $this->getStockCheckMode() );

LG Pasquale

Ja, die Lagerverwaltung ist aktiv.
Der Artikelstatus ist “Standard” und $this->getStockCheckMode() gibt dementsprechend “1” zurück. So weit ich weiß, sollten die Artikel auf Standard ja auch mit Lagerbestand 0 noch kaufbar sein oder?
Ich habe Testweise den Pfandartikel auch auf “Fremdlager” gesetzt, dann sollte er ja eh immer verfügbar sein, richtig?

Hat das was gebracht?
Wie sieht Deine Einstellung unter Grundeinstellungen->System->Varianten-> Vaterartikel kaufbar aus? Falls deaktiviert, setz mal den Haken und schau was passiert.

LG Pasquale

Folgendes hat leider alles nichts gebracht:

  • Vaterartikel kaufbar gemacht
  • Pfandartikel Bestand gegeben
  • Lieferstatus durchgetestet (Standard, Fremdlager usw.)

Ich hab auch alle möglichen Variationen mit Bestand und Lieferstatus durchprobiert.

Nichts scheint zu helfen :frowning:

Grüße

Ich habe das Pfand-Modul von vendingtechnik in meinem Oxid eShop 4.8.6 installiert und funktioniert dankenswerter Weise auch ganz gut. Kleiner Haken im Nachgang nur: Wenn ich zu einem Artikel einen Pfandbetrag eintrage, funktioniert die Ansicht Artikeldetails nicht mehr (wird mit redirect auf Einstiegseite geleitet). Bei Artikel ohne Pfand werden die Artikeldetails weiterhin angezeigt. Hat jemand mit diesem Modul schon diese Erfahrung und wenn ja eine Lösung?

Das könnte evtl. am falschen “Currency Sign” Aufruf in einem der Blöcke für das Frontend sein. Steht evt. was in der Execption.log?
Ändere im Modulverzeichnis views/blocks/ die Datei vtec_detail_pfandanzeige.tpl wie folgt:


[{$smarty.block.parent}]


[{if $oDetailsProduct->oxarticles__vtecpfand->value}]
      <span id="productPriceUnit">[{oxmultilang ident="VTEC_PFAND_DETAIL_FIRST" suffix="COLON"}] [{$currency->sign}] [{$oDetailsProduct->getFormatPfand()}] [{oxmultilang ident="VTEC_PFAND_DETAIL_LAST"}]</span> 
[{/if}]       

tmp leeren nicht vergessen! Falls es nicht funktioniert dann poste doch mal den Inhalt der Exeption.log

LG Pasquale

Wow! Perfekt. Das hat geholfen.
Vielen Dank.