Staffelpreise auf die Gesamtabnahmemenge je Artikel

Hallo,
noch eine Kleinigkeit, wo ich Hilfe benötige:

Ich biete Staffelpreise an. Diese Staffelungen sollen aber nicht pro Variantenkombi berechnet werden, sondern auf die Gesamtabnahmemenge dieses Artikels.

Beispiel Staffel:

1-4 Stk = 5,00 EUR
5-9 Stk = 4,00 EUR
10-xx = 3,00 EUR

Der Kunde kauft nun:
3 x schwarz
5 x weiß
2 x blau

und der Preis pro Stück ist 3,00 EUR !

Wäre schön, wenn mir jemand weiterhelfen könnte. Danke.

Gruß HEPI

das geht nicht, Staffelpreis bezieht sich immer auf 1 Variante und nicht auf Gesamtmenge mehrerer Varianten

Grüße
Martina

www.bastelundhobbykiste.de www.kreative-buecher.de

In welcher Datei werden die Staffelpreise berechnet ?

Komme noch nicht so ganz mit der Strukturierung klar

Hallo HEPI,

In welcher Datei werden die Staffelpreise berechnet ?

Die Frage ist nicht nach der Datei sondern nach der Methode, die per Modul überschrieben werden kann. Wenn Du in einer core-Datei änderst, leidet die Update-Fähigkeit. D.h., Deine Änderungen würden mit dem nächsten Update ggf. überschrieben.

Die Suche nach “scale price” für “Staffelpreise” startet in den Template-Dateien und führt über die sog. view-Klassen im Ordner /views/

Gruß


Marco Steinhäuser
Community Operator
OXID eSales AG

Hallo Hepi,

ich war auch etwas enttäuscht, als ich gemerkt habe, dass Staffelpreise des Vaters nicht für die Summe der Varianten-Kinder gilt. Dabei wäre das eine der genialsten Preisfunktionen.

Wir verkaufen gleiche Artikel in vielen Farben (z.B. Stifte), da liegt es nahe, eine Staffel auf den Varianten-Vater zu legen - also so:Preis 1 für 1 -3Preis 2 für 4-6 etc.Der Kunde kauft je einen roten, gelben, grünen und blauen Stift der Varianten-Kinder und erhält die Staffel des Vaters.

Wir arbeiten jetzt mit einem “Trick”:

Rabatt mit Staffelpreis eingeben und nur den Varianten-Vater zuweisen. Das senkt zwar nicht den Preis, weißt aber sauber im Bestellvorgang den Rabatt für die Stifte aus und den kann ich ja entsprechenden benennen.

GrüsseGregor

Ps: ich habe noch nicht probiert, was passiert, wenn mehrere Artikelrabatte gültig sind - was macht Oxid daraus?

Gibt es mittlerweile eine Lösung für das Problem ? Konnte nicht’s weiter finden, und sitze vor der gleichen thematik ! Schöne Grüße

Ich habe da eine Lösung für gefunden, allerdings habe ich gerade das Problem, dass in der Testumgebung eines der beiden Module, die ich hierfür kreiert habe, nicht geladen wird.

Es scheint alles richtig zu sein (Datei- und Klassenname stimmen überein, Eintragung im Adminbereich ist aucbh korrekt, also keine Buchstabendreher o.ä.). Dennoch wird das Modul nicht geladen.

In einer zweiten Testumgebung (ich entwickle lokal und spiele die Änderungen dann auf diese zweite Testumgebung auf, auf die auch der Kunde Zugriff hat, damit er diese Änderungen anschauen kann, bevor sie live gehen) werden beide Module nicht geladen. Und ich habe nicht den blassesten Schimmer warum. Dateien sind fehlerfrei hochgeladen, die Moduleinträge sind aus dem lokalen System herauskopiert… ich stehe vor einem Rätsel, da auch die exception_log.txt keine Meldungen dazu enthält.

Wenn du Hilfe benötigst beim testen, oder das ganze öffentlich verfügbar machen willst und beim debuggen / programmieren kannst du dich gerne melden, sitze zZt vor der gleichen problematik.

Mein Lösungsansatz bis jetzt sieht einen SQL Import per Modul nach Schema “X” vor um die Rabattierung auf die Artikel umzusetzen.

Wir nutzen es wie von dir beschrieben. Allerdings arbeiten die geposteten Dateien auf Basis von Auswahllisten. Um damit Varianten abzudecken, müsste noch eine Kleinigkeit geändert werden. Mit dem Debugger sollte es eigentlich kein größeres Problem sein.

Dazu müssen 3 Klassen überladen werden.

myarticle.php


<?php

class myArticle extends oxArticle
{
	// ----------------------------------------------------------------------------
    // Stephen, 31.01.2009, $dSumAmount added
    // ----------------------------------------------------------------------------
    public function getBasePrice( $dAmount = 1, $dSumAmount = 0 )
    {
        // override this function if you want e.g. different prices
        // for diff. usergroups.

        // Performance
        $myConfig = $this->getConfig();
        if( !$myConfig->getConfigParam( 'bl_perfLoadPrice' ) || !$this->_blLoadPrice )
            return;

        // GroupPrice or DB price ajusted by AmountPrice
        if ($dSumAmount == 0)
        {
        	$dPrice = $this->_getAmountPrice( $dAmount );        	
        }
		else 
		{
			$dPrice = $this->_getAmountPrice( $dSumAmount );
		}

        return $dPrice;
    }
	
    // ------------------------------------------------------------------------------
    // Stephen, 31.01.2009
    // $dSumAmount added
    // ------------------------------------------------------------------------------
    public function getBasketPrice( $dAmount, $aSelList, $oBasket, $dSumAmount = 0 )
    {
        $oUser = $oBasket->getBasketUser();
        $this->setArticleUser($oUser);

        $oBasketPrice = oxNew( 'oxPrice' );

        // get base price
        // ------------------------------------------------------------------------------
    	// Stephen, 31.01.2009
   		// $dSumAmount added
    	// ------------------------------------------------------------------------------
        $dBasePrice = $this->getBasePrice( $dAmount, $dSumAmount );

        // applying select list price
        $this->_modifySelectListPrice( $dBasePrice, $aSelList );

        // setting price
        $oBasketPrice->setPrice( $dBasePrice );

        // apply VAT
        $this->_applyVat( $oBasketPrice, oxNew('oxVatSelector')->getBasketItemVat( $this, $oBasket ) );

        // apply currency
        $this->_applyCurrency( $oBasketPrice );

        // apply discounts
        if ( !$this->skipDiscounts() ) {
            // apply general discounts
            $this->_applyDiscounts( $oBasketPrice, oxDiscountList::getInstance()->getArticleDiscounts( $this, $oUser ) );
        }

        // returning final price object
        return $oBasketPrice;
    }
    
    // -------------------------------------------------------------------------------
    // Stephen, 31.05.2008
    // Return article number
    // -------------------------------------------------------------------------------
    public function getArticleNumber()
    {
    	if (isset($this->oxarticles__oxartnum->rawValue))
    	{
    		return $this->oxarticles__oxartnum->rawValue;
    	}
    	elseif (isset($this->oxarticles__oxartnum->value))
    	{
    		return $this->oxarticles__oxartnum->value;
    	}
    }
    // -------------------------------------------------------------------------------
}

mybasket.php


<?php 

class myBasket extends oxBasket
{
	// ---------------------------------------------------------------------
    // Stephen, 31.01.2008, calculate total amount of a basket item
    // ---------------------------------------------------------------------
    protected function _calcSumAmount($oxartnum)
    {
    	$dSumAmount = 0;
    	foreach ( $this->_aBasketContents as $oBasketItem )
    	{
    		if ($oBasketItem->getArticleNumber() == $oxartnum)
    		{
    			$dSumAmount += $oBasketItem->getAmount();
    		}
    	}
    	
    	return $dSumAmount;
    }

    /**
     * Iterates through basket items and calculates its prices and discounts
     *
     * @return null
     */
    protected function _calcItemsPrice()
    {
        // resetting
        $this->setSkipDiscounts( false );
        $this->_iProductsCnt = 0; // count different types
        $this->_dItemsCnt    = 0; // count of item units
        $this->_dWeight      = 0; // basket weight

        // resetting
        $this->_aItemDiscounts = array();

        $this->_oProductsPriceList = oxNew( 'oxpricelist' );
        $this->_oDiscountProductsPriceList = oxNew( 'oxpricelist' );
        $this->_oNotDiscountedProductsPriceList = oxNew( 'oxpricelist' );

        foreach ( $this->_aBasketContents as $oBasketItem ) {
            $this->_iProductsCnt++;
            $this->_dItemsCnt += $oBasketItem->getAmount();
            $this->_dWeight   += $oBasketItem->getWeight();
            
            if ( !$oBasketItem->isDiscountArticle() && ( $oArticle = $oBasketItem->getArticle() ) ) {
            	$dSumAmount = $this->_calcSumAmount($oBasketItem->getArticleNumber());
                $oBasketPrice = $oArticle->getBasketPrice( $oBasketItem->getAmount(), $oBasketItem->getSelList(), $this, $dSumAmount );
                $oBasketItem->setPrice( $oBasketPrice );
                //P adding product price
                $this->_oProductsPriceList->addToPriceList( $oBasketItem->getPrice() );

                $oBasketPrice->setBruttoPriceMode();
                if ( !$oArticle->skipDiscounts() ) {
                    // apply basket type discounts
                    $aItemDiscounts = $oArticle->applyBasketDiscounts( $oBasketPrice, oxDiscountList::getInstance()->getBasketItemDiscounts( $oArticle, $this, $this->getBasketUser() ), $oBasketItem->getAmount() );
                    if ( is_array($this->_aItemDiscounts) && is_array($aItemDiscounts) ) {
                        $this->_aItemDiscounts = $this->_mergeDiscounts( $this->_aItemDiscounts, $aItemDiscounts);
                    }
                } else {
                    $oBasketItem->setSkipDiscounts( true );
                    $this->setSkipDiscounts( true );
                }
                $oBasketPrice->multiply( $oBasketItem->getAmount() );

                //P collect discount values for basket items which are discountable
                if ( !$oArticle->skipDiscounts() ) {
                    $this->_oDiscountProductsPriceList->addToPriceList( $oBasketPrice );
                } else {
                    $this->_oNotDiscountedProductsPriceList->addToPriceList( $oBasketPrice );
                    $oBasketItem->setSkipDiscounts( true );
                    $this->setSkipDiscounts( true );
                }
            } elseif ( $oBasketItem->isBundle() ) {
                // if bundles price is set to zero
                $oPrice = oxNew( "oxprice");
                $oBasketItem->setPrice( $oPrice );
            }
        }
    }
	
}

mybasketitem.php


<?php

class myBasketItem extends oxBasketItem
{
	// -------------------------------------------------------------------
    // Stephen, 31.01.2009
    // Return article number
    // -------------------------------------------------------------------
    public function getArticleNumber()
    {
    	return $this->_oArticle->getArticleNumber();
    }
    // -------------------------------------------------------------------
}

Testen kannst du z.B. bei diesem Artikel: http://www.andro-shop.com/Proteine-Eiweiss/Whey/ESN-Designer-Whey-1000g-Standbeutel.html mit verschiedenen Geschmacksrichtungen.

Liebe Grüße
Carolin

Ich habe das ganze etwas quick’n’dirty gemacht (da darf natürlich gerne verbessert werden).

Für meine Lösung werden zwei Klassen, oxBasket und OxBasketItem überladen:

myBasketItem


class myBasketItem extends myBasketItem_parent {


	/* 06/08/2009 - Marc Weinreich @ Holysoft */
	public function getAmount($blExtendedAmount = false) {
	
		if($blExtendedAmount === true) {
		
			// look up parent id
			$sQuery = 'select OXPARENTID from `oxarticles` where OXID = "'.$this->_sProductId.'" limit 1';
			$rs1 = oxDb::getDb()->Execute($sQuery);
			
			if($rs1->recordCount() > 0) {
				if(!$rs1->EOF) {
					$sParent = $rs1->fields[0];
					
					// look up other variants i.e. artciles with the same parent
					$sQuery = 'select OXID from `oxarticles` where OXPARENTID = "'.$sParent.'"';
					$rs2 = oxDb::getDb()->Execute($sQuery);
					
					if($rs2->recordCount() > 0) {
					
						$aVariants = array();
						while(!$rs2->EOF) {
							// add variants to array
							$aVariants[] = $rs2->fields[0];
							$rs2->moveNext();
						}
						
						$aCartContents = oxSession::getInstance()->getBasket()->getContents();
						$dTempAmount = 0.0;
						
						// check whether any of the items in the cart are variants we are looking for..
						foreach($aCartContents as $oCartItem) {
							if(in_array($oCartItem->getProductId(), $aVariants)) {
								// .. and add their amounts
								$dTempAmount += $oCartItem->getAmount();
							}
						}
						
						// if this is not true either something went wrong or there are no other variants (in the cart)
						if($dTempAmount > $this->_dAmount) {
							$dMyAmount = $dTempAmount;
						}
					}
				}
			}
		}
	
		// always return something useful
		if(isset($dMyAmount) && is_float($dMyAmount)) {
			return $dMyAmount;
		} else {
			return $this->_dAmount;
		}
	}
	
}

myBasket (Änderung in Zeile 25, siehe Kommentar)


class myBasket extends myBasket_parent {

    protected function _calcItemsPrice() {

        // resetting
        $this->setSkipDiscounts( false );
        $this->_iProductsCnt = 0; // count different types
        $this->_dItemsCnt    = 0; // count of item units
        $this->_dWeight      = 0; // basket weight

        // resetting
        $this->_aItemDiscounts = array();

        $this->_oProductsPriceList = oxNew( 'oxpricelist' );
        $this->_oDiscountProductsPriceList = oxNew( 'oxpricelist' );
        $this->_oNotDiscountedProductsPriceList = oxNew( 'oxpricelist' );

        foreach ( $this->_aBasketContents as $oBasketItem ) {
            $this->_iProductsCnt++;
            $this->_dItemsCnt += $oBasketItem->getAmount();
            $this->_dWeight   += $oBasketItem->getWeight();

            if ( !$oBasketItem->isDiscountArticle() && ( $oArticle = $oBasketItem->getArticle() ) ) {
			
				// 06/10/2009 - Marc Weinreich @ Holysoft: call of method getAmount of oxBasketItem object changed to apply scale prices to all variants of an article
                $oBasketPrice = $oArticle->getBasketPrice( $oBasketItem->getAmount(true), $oBasketItem->getSelList(), $this );
				
                $oBasketItem->setPrice( $oBasketPrice );
                //P adding product price
                $this->_oProductsPriceList->addToPriceList( $oBasketItem->getPrice() );

                $oBasketPrice->setBruttoPriceMode();
                if ( !$oArticle->skipDiscounts() ) {
                    // apply basket type discounts
                    $aItemDiscounts = $oArticle->applyBasketDiscounts( $oBasketPrice, oxDiscountList::getInstance()->getBasketItemDiscounts( $oArticle, $this, $this->getBasketUser() ), $oBasketItem->getAmount() );
                    if ( is_array($this->_aItemDiscounts) && is_array($aItemDiscounts) ) {
                        $this->_aItemDiscounts = $this->_mergeDiscounts( $this->_aItemDiscounts, $aItemDiscounts);
                    }
                } else {
                    $oBasketItem->setSkipDiscounts( true );
                    $this->setSkipDiscounts( true );
                }
                $oBasketPrice->multiply( $oBasketItem->getAmount() );

                //P collect discount values for basket items which are discountable
                if ( !$oArticle->skipDiscounts() ) {
                    $this->_oDiscountProductsPriceList->addToPriceList( $oBasketPrice );
                } else {
                    $this->_oNotDiscountedProductsPriceList->addToPriceList( $oBasketPrice );
                    $oBasketItem->setSkipDiscounts( true );
                    $this->setSkipDiscounts( true );
                }
            } elseif ( $oBasketItem->isBundle() ) {
                // if bundles price is set to zero
                $oPrice = oxNew( "oxprice");
                $oBasketItem->setPrice( $oPrice );
            }
        }
    }
}

Wie gesagt, es sollte eigentlich funktionieren. Wenn ich diese Änderungen direkt in den core-Klassen mache, klappt es wunderbar, aber wenn ich sie als Module integriere (man will ja konform bleiben ;)), will das irgendwie nicht… und ich komme nicht dahinter, wieso…

Also das mit deiner Lösung ist wirklich merkwürdig, als Modul geladen keine Funktion, wie von dir gesagt manuell abgeändert funktioniert es wie erwartet (was momentan für mich ausreichend ist ;-)) Allerdings sehe Ich auch den Grund nicht warum er die es nicht als Modul akzeptiert ?

Willkommen in meiner Welt :wink:

Hallo Zusammen,

ich habe verzweifelt nach einer Lösung gesucht und bin auf diese hier gestoßen.
Leider funktioniert das ganze bei mir nicht.

Bei mir läuft zur Zeit der Shop mit der Version 4.7.8.

Ich habe die Lösung von Carolin und von m.weinreich ausprobiert.

In beiden Fällen habe ich die Funktionen in den ox.php Dateien mit den Funktionen mit den oben genannten Benutzern ausgetauscht.

Hoffe es kann mir einer helfe. Eventuell gibt es auch schon ein funktionierendes Modul?

Vielen Dank

Hallo,
nun stehe ich ebenfalls vor diesem Problem.
Wir haben den EE 5.2 installiert und möchten die Staffelpreise wie in diesem Beispiel von Carolin berechnen.


Evtl gibt es ja ein Modul für EE 5.x ? Habe leider noch keins gefunden.
Viele Grüße

hello i’m bi thanks all you

Hallo,
hat jemand eine Lösung für EE 5.3?