Gelöst Kupons

gm_alex

Aktives Mitglied
12. Dezember 2007
271
0
Da die lieben Kupons doch gerne Probleme machen und ich am Wochenende 3 Stunden Zeit hatte habe ich mich mal dran gesetzt und folgende Probleme gelöst:
  1. Kupons werden nun nur auf Produkte der gewählten Kategorie gerechnet.
  2. Kupons können nun auch von Kunden wieder gelöscht werden.
  3. Kupons werden korrekt berechnet nach Mengenänderungen im Warenkorb.
  4. Neukunden Kupons werden bei einem Neukunden automatisch eingelöst wenn diese im Admin-Panel aktiv sind.
    1. Sind zwei Neukunden Kupons aktiv dann wird der genommen für den die Mindestbestellmenge erfüllt ist. Bsp.: 1. Kupon 5€ bei 20€ MBW, 2. Kupon 10€ bei 40€MBW, 3. Kupon 15€ bei 60€. Bestellungswert 50€ -> 2.Kupon

Folgende Schritte sind nötig:

1. includes/bestellvorgang_inc.php

1. Schritt (Zeile 806)
PHP:
elseif ($Kupon->cWertTyp=="prozent")
{
       $maxPreisKupon = ($_SESSION["Warenkorb"]->gibGesamtsummeWarenExt(array(C_WARENKORBPOS_TYP_ARTIKEL),true)/100.0)*$Kupon->fWert;
}
ersetzen durch
PHP:
elseif ($Kupon->cWertTyp=="prozent")
{
	if($Kupon->cKategorien!='-1')
	{
		$PositionenArr = $_SESSION['Warenkorb']->PositionenArr;
		if (is_array($PositionenArr))
		{
			foreach ($PositionenArr as $Pos)
			{
				$categorys =$GLOBALS["DB"]->executeQuery("	SELECT *
										FROM tkategorieartikel 
										WHERE kArtikel = ".$Pos->kArtikel, 2);
				$onematch = false;
				foreach ($categorys as $cur_cat)
				{
					
					if (eregi($cur_cat->kKategorie.";",$Kupon->cKategorien) AND !$onematch)
					{
						$maxPreisKupon+=((berechneBrutto($Pos->fPreis*$Pos->nAnzahl,gibUst($Pos->kSteuerklasse)))/100)*$Kupon->fWert;				
						$onematch = true;
					}
				}	
			}
		}
	}
	else
	{
		$maxPreisKupon = ($_SESSION["Warenkorb"]->gibGesamtsummeWarenExt(array(C_WARENKORBPOS_TYP_ARTIKEL),true)/100.0)*$Kupon->fWert;
	}
}

2. Schritt (Zeile 839)
PHP:
foreach ($_SESSION["Sprachen"] as $Sprache)
{
	$name_spr = $GLOBALS["DB"]->executeQuery("select cName from tkuponsprache where kKupon=$Kupon->kKupon and cISOSprache=\"".$Sprache->cISO."\"",1);
	$Spezialpos->cName[$Sprache->cISO] = $name_spr->cName;
	if ($Kupon->cWertTyp=="prozent")
		$Spezialpos->cName[$Sprache->cISO].=" ".$Kupon->fWert."%";
}
ersetzen durch
PHP:
foreach ($_SESSION["Sprachen"] as $Sprache)
{
	$name_spr = $GLOBALS["DB"]->executeQuery("select cName from tkuponsprache where kKupon=$Kupon->kKupon and cISOSprache=\"".$Sprache->cISO."\"",1);
	$Spezialpos->cName[$Sprache->cISO] = $name_spr->cName;
	$Spezialpos->kArtikel = $Kupon->cCode;
	if ($Kupon->cWertTyp=="prozent")
		$Spezialpos->cName[$Sprache->cISO].=" ".$Kupon->fWert."%";
}

3. Schritt (Zeile 869)
PHP:
$_SESSION['Warenkorb']->erstelleSpezialPos($Spezialpos->cName, 1, $maxPreisKupon*-1, $Kupon->kSteuerklasse,$postyp);
ersetzen durch
PHP:
$_SESSION['Warenkorb']->erstelleSpezialPos($Spezialpos->cName, 1, $maxPreisKupon*-1, $Kupon->kSteuerklasse,$postyp, true, $Spezialpos->kArtikel);

2. classes/class.JTL-Shop.Warenkorb.php (Zeile 195)

1. Schritt
PHP:
function erstelleSpezialPos($name, $anzahl, $preis, $kSteuerklasse, $typ, $brutto=true)
{
	$this->loescheSpezialPos($typ);
		
	$NeuePosition = new WarenkorbPos();
	$NeuePosition->nAnzahl = $anzahl;
	$NeuePosition->kArtikel = 0;
	$NeuePosition->kSteuerklasse = $kSteuerklasse;		
	$NeuePosition->fPreis = $preis;
	if ($brutto)
		$NeuePosition->fPreis = ($preis/(100+gibUst($kSteuerklasse))*100.0);

	$NeuePosition->fPreisEinzelNetto = $NeuePosition->fPreis;
	if (is_array($_SESSION['Waehrungen']))
	{
		foreach ($_SESSION['Waehrungen'] as $Waehrung)
		{
			$NeuePosition->cGesamtpreisLocalized[0][$Waehrung->cName] = gibPreisStringLocalized(berechneBrutto($NeuePosition->fPreis*$anzahl,gibUst($kSteuerklasse)), $Waehrung);
			$NeuePosition->cGesamtpreisLocalized[1][$Waehrung->cName] = gibPreisStringLocalized($NeuePosition->fPreis*$anzahl, $Waehrung);
		}
	}
		
	$NeuePosition->cName = $name;
	$NeuePosition->nPosTyp = $typ;
		
	array_push($this->PositionenArr, $NeuePosition);
}
ersetzen durch
PHP:
function erstelleSpezialPos($name, $anzahl, $preis, $kSteuerklasse, $typ, $brutto=true, $extravar=null)
{
	$this->loescheSpezialPos($typ);
		
	$NeuePosition = new WarenkorbPos();
	$NeuePosition->nAnzahl = $anzahl;
	if(isset($extravar))
		$NeuePosition->kArtikel = $extravar;
	else
		$NeuePosition->kArtikel = 0;
	$NeuePosition->kSteuerklasse = $kSteuerklasse;		
	$NeuePosition->fPreis = $preis;
	if ($brutto)
		$NeuePosition->fPreis = ($preis/(100+gibUst($kSteuerklasse))*100.0);

	$NeuePosition->fPreisEinzelNetto = $NeuePosition->fPreis;
	if (is_array($_SESSION['Waehrungen']))
	{
		foreach ($_SESSION['Waehrungen'] as $Waehrung)
		{
			$NeuePosition->cGesamtpreisLocalized[0][$Waehrung->cName] = gibPreisStringLocalized(berechneBrutto($NeuePosition->fPreis*$anzahl,gibUst($kSteuerklasse)), $Waehrung);
			$NeuePosition->cGesamtpreisLocalized[1][$Waehrung->cName] = gibPreisStringLocalized($NeuePosition->fPreis*$anzahl, $Waehrung);
		}
	}
		
	$NeuePosition->cName = $name;
	$NeuePosition->nPosTyp = $typ;
		
	array_push($this->PositionenArr, $NeuePosition);
}

3. warenkorb.php (Zeile 42)

1. Schritt
PHP:
//Kupons bearbeiten
if ($_POST['Kuponcode'] && !$_SESSION['Warenkorb']->posTypEnthalten(C_WARENKORBPOS_TYP_KUPON))
{
	$Kupon = $GLOBALS["DB"]->executeQuery("select * from tkupon where cCode='".$GLOBALS["DB"]->escape($_POST['Kuponcode'])."'",1);
	if ($Kupon->kKupon>0 && $Kupon->cKuponTyp=="standard")
	{
		$Kuponfehler = checkeKupon($Kupon);
		if (angabenKorrekt($Kuponfehler))
		{
			kuponAnnehmen($Kupon);				
		}
	}
	else $smarty->assign('KuponcodeUngueltig',1);
}
ersetzen druch
PHP:
//Kupons bearbeiten
$customer_order = $GLOBALS["DB"]->executeQuery("select * from tbestellung where kKunde='".$_SESSION['Kunde']->kKunde."'",1);
if(!$customer_order)
{
	$_SESSION['Warenkorb']->loescheSpezialPos(C_WARENKORBPOS_TYP_NEUKUNDENKUPON);
	$Kupon = $GLOBALS["DB"]->executeQuery("	SELECT * 
											FROM tkupon 
											WHERE cKuponTyp='neukundenkupon' 
												AND cAktiv='Y'
												AND fMindestbestellwert <= ".$_SESSION["Warenkorb"]->gibGesamtsummeWarenExt(array(C_WARENKORBPOS_TYP_ARTIKEL), true)."
											ORDER BY fMindestbestellwert DESC
											LIMIT 1",1);
	$Kuponfehler = checkeKupon($Kupon);
	if (angabenKorrekt($Kuponfehler))
	{
		kuponAnnehmen($Kupon);				
	}
}
if ($_POST['Kuponcode'] && !$_SESSION['Warenkorb']->posTypEnthalten(C_WARENKORBPOS_TYP_KUPON))
{
	$Kupon = $GLOBALS["DB"]->executeQuery("select * from tkupon where cCode='".$GLOBALS["DB"]->escape($_POST['Kuponcode'])."'",1);
	if ($Kupon->kKupon>0 && $Kupon->cKuponTyp=="standard")
	{
		$Kuponfehler = checkeKupon($Kupon);
		if (angabenKorrekt($Kuponfehler))
		{
			kuponAnnehmen($Kupon);				
		}
	}
	else $smarty->assign('KuponcodeUngueltig',1);
}
else
{
	foreach ($_SESSION['Warenkorb']->PositionenArr as $i => $Position)
	{
		if ($Position->nPosTyp==C_WARENKORBPOS_TYP_KUPON)
		{
			$Kupon = $GLOBALS["DB"]->executeQuery("select * from tkupon where cCode='".$Position->kArtikel."'",1);
	
			$_SESSION['Warenkorb']->loescheSpezialPos(C_WARENKORBPOS_TYP_KUPON);
			
			if(!$_GET['dropKupon'])
			{
				if ($Kupon->kKupon>0 && $Kupon->cKuponTyp=="standard")
				{
					$Kuponfehler = checkeKupon($Kupon);
					if (angabenKorrekt($Kuponfehler))
					{
						kuponAnnehmen($Kupon);				
					}
				}
				else $smarty->assign('KuponcodeUngueltig',1);
			}
		}
	}
}

4. templates/JTL-Shop2/warenkorb.tpl (Zeile 53)
1. Schritt
Code:
{if $Position->nPosTyp==1}	
	<a href="warenkorb.php?dropPos={$smarty.foreach.positionen.index}&{$SID}"><img alt="" src="{$currentTemplateDir}gfx/button_PosEntfernen.gif"></a>
{/if}
ersetzen durch
Code:
{if $Position->nPosTyp==1}
	<a href="warenkorb.php?dropPos={$smarty.foreach.positionen.index}&{$SID}">
		<img alt="" src="{$currentTemplateDir}gfx/button_PosEntfernen.gif" />
	</a>
{/if}
{if $Position->nPosTyp==3}	
	<a href="warenkorb.php?dropKupon=1&{$SID}">
	  	<img alt="" src="{$currentTemplateDir}gfx/button_PosEntfernen.gif" />
	</a>
{/if}

Feedback ist erwünscht. Man weiß ja nie vielleicht hab ich ja doch noch was übersehen.

Gruß,
Alex
 

NikoBellic

Gut bekanntes Mitglied
15. September 2008
183
1
AW: Kupons

Hi gm_alex,

als ich die Überschrift deines Threads gelesen hatte, dachte ich: ENDLICH hat sich jemand dem Problem angenommen.

Habe auch gleich alle Dateien erfolgreich geändert und einen neuen Testaccount angelegt und wollte dann eine Bestellung tätigen.

Leider ist es bei mir immer noch so, dass ein Neukundenkupon noch nicht einmal angezeigt bzw. abgezogen wird.

Ich bin ja bei weitem nicht der Einzige, bei dem dieses "Feature" nicht funktioniert.

Schade :(
 

gm_alex

Aktives Mitglied
12. Dezember 2007
271
0
AW: Kupons

Komisch er müsste eigentlich automatisch funktionieren. Das heißt du muss nur den Mindestbestellwert überschreiten. Ach ja bei max Verwendungen muss 0 rein. Welche Version hast du?
 

NikoBellic

Gut bekanntes Mitglied
15. September 2008
183
1
AW: Kupons

Also ich benutze JTL-Shop2 Version 2.17

Ich habe nach der Änderung einen neuen Neukundenkupon angelegt mit folgenden Werten:

Wert: 10 Euro
Steuerklasse: normaler Steuersatz
Mindestbestellwert: 49 Euro
max. Verwendungen: 0
beschränken auf Artikelnummer: Feld freigelassen
Gilt nur für: Alle Kundengruppen
Gültig vom: 04.11.2008 11:00 - 31.12.2008 23:59
Aktiv: Haken gesetzt
Beschränken auf Kategorien: ALLE

Danach habe ich mir erneut ein Testkonto eingerichtet und eine Bestellung in Höhe von 171 Euro getätigt. Im gesamten Bestellvorgang werden nirgendwo die 10 Euro Bonus abgezogen, geschweige denn angezeigt.

Ich kämpfe mit diesem Problem schon seit ich den Shop am einrichten bin. Habe hier im Forum ja auch schön öfter nach einer Lösung gesucht und auch gefragt. Leider ist dies bis heute nicht der Fall.

Ich habe keine Ahnung, warum es bei mir nicht funktioniert. Ich habe schon so unendlich viele Möglichkeiten ausprobiert (max. Verwendungen 1: kein Mindestbestellwert usw.), es funktioniert einfach nicht.

Ich meine mich erinnern zu können, dass hier mal was von davon erzählt wurde, dass es vom Provider zu Problemen kommen kann. Ich bin jedenfalls bei all-inkl.com... falls dies hilfreich zur Aufklärung des Problems sein sollte.
 

gm_alex

Aktives Mitglied
12. Dezember 2007
271
0
AW: Kupons

Oh sorry mein Fehler, es fehlt noch eine Änderung dann geht es. Ich ändere es oben schnell. Sorry.^^ Hm oben kann ich nicht mehr editieren (@mod: bitte noch den Code oben hinzufügen), also doch noch hier:

5. admin/kupons.php

1. Schritt (Zeile 137)

folgendes hinzufügen:
PHP:
if($Kupon->cKuponTyp=="neukundenkupon")
	$Kupon->cKunden="-1";

Ach ja, dann den Kupon nochmal editieren oder neu anlegen.
 

NikoBellic

Gut bekanntes Mitglied
15. September 2008
183
1
AW: Kupons

Ok, jetzt habe ich das Problem, dass ein Code generiert wird, wenn ich einen Neukunden/Begrüßungskupon anlege.

Ich kann selbst gar keinen Code eingeben und am Ende kommt dann folgende Meldung:

Dieser Kuponcode wird bereits von einem anderen Kupon verwendet. Bitte wählen Sie einen anderen Code

Wie gesagt, ich habe Neukunden/Begrüßungskupon angewählt und kann dort selber überhaupt keinen Code eingeben bzw. ist das Feld auch nicht vorhanden. Nach dem Klicken auf "Neuen Kupon erstellen" erhalte ich obige Fehlermeldung.
 

gm_alex

Aktives Mitglied
12. Dezember 2007
271
0
AW: Kupons

Sehr komisch Moment ich schau es mir nochmal bei mir an. Also bei mir geht alles tadellos. Lösche mal den alten Kupon und leg einen neuen Neukunden Kupon an.

Hast du es auch erst nach Zeile 137 hinzugefügt? Ein Code wird gar nicht generiert, da nicht benötigt...
 

gm_alex

Aktives Mitglied
12. Dezember 2007
271
0
AW: Kupons

Ok alles klar, das ist total falsch. NICHT ERSETZEN sondern hinzufügen. Es muss so aussehen:

PHP:
if($Kupon->cKuponTyp=="neukundenkupon")
		$Kupon->cKunden="-1";

if ($Kupon->cKuponTyp!="neukundenkupon")
{
	if (!$Kupon->cCode)
	{
		$Kupon->cCode = generateCode();
	}
	...
}

Sorry, wenn ich mich missverständlich ausgedrückt habe. Das das überhaupt lief wunder mich...
 

gm_alex

Aktives Mitglied
12. Dezember 2007
271
0
AW: Kupons

Hier ist sie. Aber ich denke ich kenne deinen Fehler. Du musst die zwei Zeilen

PHP:
if($Kupon->cKuponTyp=="neukundenkupon")
        $Kupon->cKunden="-1";

vor

PHP:
if ($Kupon->cKuponTyp!="neukundenkupon")
{
    if (!$Kupon->cCode)
    {
        $Kupon->cCode = generateCode();
    }
    ...
}

einfügen.
 

NikoBellic

Gut bekanntes Mitglied
15. September 2008
183
1
AW: Kupons

Man... du bist mein Held! Es funktioniert und die 10 Euro werden auch abgezogen
Ich weiss gar nicht was ich sagen soll! SENSATIONELL!

Tausend Dank!
 

gm_alex

Aktives Mitglied
12. Dezember 2007
271
0
AW: Kupons

Kleiner Nachtrag:

NikoBellic hat mit drauf hingewiesen das der Neukunden- Kupon auch bein nicht registrierten Usern abgezogen wird.

Somit ändert sich folgendes:

3. warenkorb.php (Zeile 42)

1. Schritt

PHP:
//Kupons bearbeiten 
if ($_POST['Kuponcode'] && !$_SESSION['Warenkorb']->posTypEnthalten(C_WARENKORBPOS_TYP_KUPON)) 
{ 
    $Kupon = $GLOBALS["DB"]->executeQuery("select * from tkupon where cCode='".$GLOBALS["DB"]->escape($_POST['Kuponcode'])."'",1); 
    if ($Kupon->kKupon>0 && $Kupon->cKuponTyp=="standard") 
    { 
        $Kuponfehler = checkeKupon($Kupon); 
        if (angabenKorrekt($Kuponfehler)) 
        { 
            kuponAnnehmen($Kupon);                 
        } 
    } 
    else $smarty->assign('KuponcodeUngueltig',1); 
}
ersetzen durch

PHP:
//Kupons bearbeiten
$_SESSION['Warenkorb']->loescheSpezialPos(C_WARENKORBPOS_TYP_NEUKUNDENKUPON);
$customer_order = $GLOBALS["DB"]->executeQuery("select * from tbestellung where kKunde='".$_SESSION['Kunde']->kKunde."'",1);
if(!$customer_order AND $_SESSION['Kunde']->kKunde)
{
    $Kupon = $GLOBALS["DB"]->executeQuery("    SELECT * 
                                            FROM tkupon 
                                            WHERE cKuponTyp='neukundenkupon' 
                                                AND cAktiv='Y'
                                                AND fMindestbestellwert <= ".$_SESSION["Warenkorb"]->gibGesamtsummeWarenExt(array(C_WARENKORBPOS_TYP_ARTIKEL), true)."
                                            ORDER BY fMindestbestellwert DESC
                                            LIMIT 1",1);
    $Kuponfehler = checkeKupon($Kupon);
    if (angabenKorrekt($Kuponfehler))
    {
        kuponAnnehmen($Kupon);                
    }
}
if ($_POST['Kuponcode'] && !$_SESSION['Warenkorb']->posTypEnthalten(C_WARENKORBPOS_TYP_KUPON))
{
    $Kupon = $GLOBALS["DB"]->executeQuery("select * from tkupon where cCode='".$GLOBALS["DB"]->escape($_POST['Kuponcode'])."'",1);
    if ($Kupon->kKupon>0 && $Kupon->cKuponTyp=="standard")
    {
        $Kuponfehler = checkeKupon($Kupon);
        if (angabenKorrekt($Kuponfehler))
        {
            kuponAnnehmen($Kupon);                
        }
    }
    else $smarty->assign('KuponcodeUngueltig',1);
}
else
{
    foreach ($_SESSION['Warenkorb']->PositionenArr as $i => $Position)
    {
        if ($Position->nPosTyp==C_WARENKORBPOS_TYP_KUPON)
        {
            $Kupon = $GLOBALS["DB"]->executeQuery("select * from tkupon where cCode='".$Position->kArtikel."'",1);
    
            $_SESSION['Warenkorb']->loescheSpezialPos(C_WARENKORBPOS_TYP_KUPON);
            
            if(!$_GET['dropKupon'])
            {
                if ($Kupon->kKupon>0 && $Kupon->cKuponTyp=="standard")
                {
                    $Kuponfehler = checkeKupon($Kupon);
                    if (angabenKorrekt($Kuponfehler))
                    {
                        kuponAnnehmen($Kupon);                
                    }
                }
                else $smarty->assign('KuponcodeUngueltig',1);
            }
        }
    }
}


Ich hoffe jetzt funktioniert alles.

Gruß,
Alex

 

NikoBellic

Gut bekanntes Mitglied
15. September 2008
183
1
AW: Kupons

Hallo

Habe etwas neues bei den Kupons entdeckt, was zu Ärger mit dem Kunden führen könnte.

Beispiel

Es wurde ein Neukunden Kupon von 10 Euro mit einem Mindestbestellwert von 50 Euro angelegt

Kunde A legt sich Waren im Wert von 51 Euro in den Warenkorb, um in den Genuss eines Kupons zu kommen. Jetzt wird ihm der Kupon allerdings nicht abgezogen, da er abzüglich der 10 Euro nicht mehr auf den Mindestbestellwert kommt

Legt er Waren im Wert von 60,01 Euro in den Korb, so wird der Kupon abgezogen, da der Kunde ja dann eine Endsumme von 50,01 Euro im Endeffekt hat.

Wie soll ich dem Kunden das klar machen? :)

@gm alex
Ich hoffe, dass du erneut auch dafür eine Lösung hast. Finde es spitzenklasse wie du dich hier einbringst und immer schnelle eine Lösung hast.

DANKE
 

gm_alex

Aktives Mitglied
12. Dezember 2007
271
0
AW: Kupons

Hm, bei mir tritt der Fehler nicht auf. Ich habe einen Kupon der ab 50 MBW 5€ Rabatt gibt und folgende Waren:

Produkt 1: 1x 29.90€ - 29.90€
Produkt 2: 3x 6.90€ - 20.70€
Kupon: 1x -5.00€ - -5.00€

Gesammt: 45,60 €

Wenn ich das Problem richtig verstanden habe sollte das ja jetzt nicht funktionieren oder? Tut es bei mir aber...
 

NikoBellic

Gut bekanntes Mitglied
15. September 2008
183
1
AW: Kupons

@gm_alex

Du hast das absolut richtig verstanden! Ich habe es jetzt auch mit dem Wert 42 EUR Mindestbestellwert gelöst. Damit geht es temporär auch, da die Software bein einem Warenwert von 50,21 EUR (anders habe ich keine Waren zusammengestellt bekommen) den Gutschein einlöst. Bei genau 40 EUR Mindestbestellwert wurde der Gutschein merkwürdigerweise auch schon bei 48 EUR Warenwert abgezogen.

Ist irgendwie nicht die elegante Art, aber was will man machen.

Ich bin auch sehr dafür, dass sich JTL im Bereich Kupons eindeutig mehr einfallen lässt. Gerade jetzt zur Weihnachtszeit freuen sich die Kunden doch über jeden Boni und sowas lockt auch Kunden an.
 

gm_alex

Aktives Mitglied
12. Dezember 2007
271
0
AW: Kupons

Das hört sich irgendwie mysteriös an. Kannst mir mal nen Test-Account machen und mir die Waren sagen die du zum testen genommen hast + Gutschein der "fehlerhaft" ist, also der mit 50 MBW.
Weil theoretisch dürfte das nicht passieren, und irgendwie interessiert mich der Fehler auch.^^