Hallo zusammen,
ich habe die letzten zwölf Stunden damit verbracht, die Verfügbarkeitsanzeige zu erweitern, als Grundlage habe ich diesen Knowledgebase-Artikel benutzt:
http://community.shopware.com/Lagerbest ... _1061.html
Folgende Anforderungen sollten erfüllt werden:
1. Neues Attributfeld Checkbox attr4 in der Artikel-Freitextfelder-Verwaltung anlegen. Bezeichnung im Backend: Lagerbestand anzeigen.
2. Textbaustein DetailDataInfoInstock wie folgt anpassen:
Nächster Schritt: Anzeige eines Liefertermins (gelbe Ampel)
Dieser Teil war kniffelig. Die naheliegendste Idee war, einfach ein weiteres Attributfeld vom Typ Datum anzulegen und damit zu arbeiten. Das funktioniert aber nicht, da dieser Wert nicht an den Warenkorb übergeben wird, was für eine korrekte Funktion später noch notwendig ist. Im Forum haben Leute mit Core-Hacks und zusätzlichen Datenbankabfragen hantiert, das kam für mich schon deshalb nicht infrage, weil ich davon keine Ahnung habe und ich nicht nachvollziehen konnte, wie die Updatefähigkeit des Systems erhalten bleiben soll. Man kann sicher irgendwelche Hooks bemühen und/oder extra ein Plugin schreiben, wer sich auskennt, gerne.
Meine Lösung: Wir benutzen das Feld Lieferzeit (in Tagen) im Backend, denn das wird an den Warenkorb übergeben. Das Datum muss im Format JJJJ-MM-TT in das Feld eingegeben werden, damit wir damit später rechnen können. Daher passen wir den Textbaustein detail/settings/delivery_time wie folgt an:
Als nächstes kopieren wir die Templatedatei /frontend/plugins/index/delivery_informations.tpl in unser Theme und passen sie an einer einzigen Stelle an.
Im Bereich
1. Textbaustein:
Stehen diese beiden Optionen auf Nein, dann bekommt der Besteller überhaupt nicht mit, dass er mit seiner Bestellung gerade den Lagerbestand unterschritten hat. Diese Einstellung kann sinnvoll sein, wenn man alle Produkte immer als lieferbar anzeigen lassen will, z.B. weil man starke Schwankungen im Lagerbestand hat, sich Bestände stündlich ändern oder was auch immer.
Der Normalzustand sollte allerdings sein, dass ich den Kunden so genau wie möglich darüber informieren will, was Sache ist. Wenn ein Produkt eine Lieferzeit von 5 Werktagen hat und ich habe nicht genug an Lager, dann kann ich den Kunden nicht im Glauben lassen, dass die komplette Menge sofort versandbereit ist. Der Standard ist also, dass ich beide Optionen auf ja stelle. Deshalb muss die Anzeige im Warenkorb analog der Anzeige auf der Artikeldetailseite angepasst werden.
Wenn die Einstellung Lagerbestandsunterschreitung im Warenkorb anzeigen auf ja steht und man versucht, mehr in den Warenkorb zu legen als vorrätig ist, öffnet sich ein JavaScript-Popup mit einem Hinweis, dass die Bestellmenge den Lagerbestand übersteigt. Um die Plausibilität zu erhöhen, fand ich es naheliegend, den Hinweistext im blauen Feld (Textbaustein: CheckoutArticleLessStock) anzupassen. Da in diesem Feld kein Smarty möglich ist (!), habe ich den Textbaustein wie folgt angepasst:
Sinnvolle Zusatzfunktionalität mit dem Feld "Erscheinungsdatum":
Der geneigte Leser fragt sich vielleicht schon die ganze Zeit, wieso der ganze Heckmeck, warum nimmt man nicht einfach das Feld Erscheinungsdatum, um eine ähnliche Funktion zu realisieren? Ganz einfach, das Erscheinungsdatum ist das was es ist: Mit diesem Datum kündigt man die erstmalige Verfügbarkeit eines neuen Produktes an. Das ist sogar unabhängig vom Lagerbestand, es kann durchaus ein positiver Lagerbestand vorhanden sein und es wird trotzdem bis zum Erscheinungsdatum stur die gelbe Ampel mit dem Hinweis angezeigt. Das ist auch gut so: Wenn ich Filme oder Bücher verkaufe, dann werde ich bereits vor dem Erscheinungsdatum vom Lieferanten beliefert und kann trotz positivem Lagerbestand und gelber Ampel schon Bestellungen entgegen nehmen, ja sogar den Versand vorbereiten und zum angegebenen Datum springt die Ampel automatisch auf grün um. Tolle Funktionalität und die sollte man nicht ohne Not verbiegen, gut wenn man sie hat!
Wenn man keine Bücher oder Filme verkauft, kann man das Erscheinungsdatum gut für neue Produkte benutzen, die erst in einiger Zeit geliefert werden. Hierzu habe ich den Textbaustein DetailDataInfoShipping wie folgt angepasst:
Letzter Schritt: Die rote Ampel
Die rote Ampel besteht eigentlich nur aus einem Eintrag, der bestenfalls so gut wie nie angezeigt werden sollte, nämlich dann, wenn das Produkt nicht lieferbar ist und auch keine Informationen darüber vorliegen, wann es wieder herein kommt. Daher ist der Textbaustein DetailDataNotAvailable mit folgendem naheliegenden Text zu versehen:
Dieser Text wird nun auch bei Abverkaufsartikeln angezeigt, die den Lagerbestand Null erreicht haben, sofern man in den Grundeinstellungen die Option Abverkaufsartikel ohne Lagerbestand nicht anzeigen auf Nein eingestellt hat. Diese Option sollte eigentlich immer auf Nein stehen, sofern man noch Verkaufsunterlagen, etwa Kataloge, im Umlauf hat, in denen die Abverkaufsartikel verzeichnet sind. Anderenfalls fragt sich der Kunde, wo das Produkt geblieben ist und ob es sich vielleicht um ein technisches Problem handelt, dass es nicht angezeigt wird. Hier sind telefonische Anfragen vorprogrammiert.
Um mitzuteilen, dass dieses Produkt nicht mehr da ist und auch niemals wieder herein kommen wird, passt man in einem letzten Schritt den Textbaustein DetailBuyInfoNotAvailable wie folgt an:
Fertig!
Grüße
Pierre
P.S.: Die im System vorhandenen Inplausibilitäten (z.B. Abverkauf aktiviert, Bestand Null, Lieferzeit vergessen rauszulöschen, Ergebnis: gelbe Ampel) sind auch weiterhin vorhanden. Man kann nicht alles kreuz und quer aktivieren, aber wenn man die Einstellungen im Backend grob auf Plausibilität prüft, kann man eigentlich nichts verkehrt machen.
P.P.S.: Alle Einstellungen lassen sich natürlich auch ganz hervorragend über einen Import vornehmen.
ich habe die letzten zwölf Stunden damit verbracht, die Verfügbarkeitsanzeige zu erweitern, als Grundlage habe ich diesen Knowledgebase-Artikel benutzt:
http://community.shopware.com/Lagerbest ... _1061.html
Folgende Anforderungen sollten erfüllt werden:
- Anzeige des Lagerbestands im Frontend
- Angepasste Anzeige für Abverkaufsartikel
- Anzeige eines Liefertermins anstatt der starren Anzeige Lieferzeit in Tagen
- Alles mit Bordmitteln, machbar für Nicht-Programmierer, kein Verbiegen des Systems, keine Core-Hacks oder Plugins
- Abdecken von möglichst vielen Zuständen, zumutbare Usability im Backend
- Standardfunktionalität soll erhalten bleiben
- Mehrsprachigkeit soll erhalten bleiben
- Rechtssicherheit
1. Neues Attributfeld Checkbox attr4 in der Artikel-Freitextfelder-Verwaltung anlegen. Bezeichnung im Backend: Lagerbestand anzeigen.
2. Textbaustein DetailDataInfoInstock wie folgt anpassen:
Sofort versandfertig, Lieferzeit ca. 1-3 Werktage{if $sArticle.attr4 == "true" && !$sArticle.laststock}<br />Aktueller Lagerbestand: {$sArticle.instock} Stück.{/if}{if $sArticle.laststock}<br /><strong>{if $sArticle.instock && $sArticle.attr4 == "true"}Nur noch {$sArticle.instock} Stück verfügbar{else}Lieferung solange der Vorrat reicht.{/if}</strong>{/if}
Damit ist die grüne Ampel fertig.Erklärung: Wenn die Checkbox Lagerbestand anzeigen aktiviert ist, steht bei einem normalen Artikel zusätzlich Aktueller Lagerbestand X Stück, bei einem Abverkaufsartikel steht Nur noch X Stück verfügbar und ohne aktivierte Checkbox steht bei einem Abverkaufsartikel Lieferung solange der Vorrat reicht.
Nächster Schritt: Anzeige eines Liefertermins (gelbe Ampel)
Dieser Teil war kniffelig. Die naheliegendste Idee war, einfach ein weiteres Attributfeld vom Typ Datum anzulegen und damit zu arbeiten. Das funktioniert aber nicht, da dieser Wert nicht an den Warenkorb übergeben wird, was für eine korrekte Funktion später noch notwendig ist. Im Forum haben Leute mit Core-Hacks und zusätzlichen Datenbankabfragen hantiert, das kam für mich schon deshalb nicht infrage, weil ich davon keine Ahnung habe und ich nicht nachvollziehen konnte, wie die Updatefähigkeit des Systems erhalten bleiben soll. Man kann sicher irgendwelche Hooks bemühen und/oder extra ein Plugin schreiben, wer sich auskennt, gerne.
Meine Lösung: Wir benutzen das Feld Lieferzeit (in Tagen) im Backend, denn das wird an den Warenkorb übergeben. Das Datum muss im Format JJJJ-MM-TT in das Feld eingegeben werden, damit wir damit später rechnen können. Daher passen wir den Textbaustein detail/settings/delivery_time wie folgt an:
Lieferzeit (in Tagen) oder Lieferdatum (JJJJ-MM-TT)Hinweis: Wer auf die Idee kommt, dieses Feld für einen längeren Text verwenden zu wollen (z. B. Lieferbar ab September), dem sei gesagt: es geht nicht. In der Datenbank hat das Feld eine Länge von 11 Zeichen varchar(11), eine Änderung dieses Wertes ist nutzlos, die Formularfeld-Validierung im Backend kürzt alles über 11 Zeichen weg.
Als nächstes kopieren wir die Templatedatei /frontend/plugins/index/delivery_informations.tpl in unser Theme und passen sie an einer einzigen Stelle an.
Im Bereich
{elseif $sArticle.shippingtime}steht standardmäßig:
{s name="DetailDataShippingtime"}{/s} {$sArticle.shippingtime} {s name="DetailDataShippingDays"}{/s}Das bedeutet: {Lieferzeit} {X} {Werktage}. Wir machen daraus:
{if is_numeric($sArticle.shippingtime)}{s name="DetailDataShippingtime"}{/s} {$sArticle.shippingtime} {s name="DetailDataShippingDays"}{/s}{elseif $sArticle.shippingtime|date_format:"%Y%m%d" > $smarty.now|date_format:"%Y%m%d"}{s name="DetailDataInfoShippingScheduled"}{/s}{else}{s name="DetailDataInfoShippingDelayed"}{/s}{/if}Danach legen wir zwei neue Textbausteine an.
1. Textbaustein:
Namespace: frontend/plugins/index/delivery_informations Name: DetailDataInfoShippingScheduled Inhalt: Voraussichtlich wieder lieferbar ab {$sArticle.shippingtime|date_format:"%d.%m.%Y"}2. Textbaustein
Namespace: frontend/plugins/index/delivery_informations Name: DetailDataInfoShippingDelayed Inhalt: Ware verspätet, Lieferung war angekündigt für {$sArticle.shippingtime|date_format:"%d.%m.%Y"}
Die gelbe Ampel ist noch nicht fertig, denn es gibt noch ein weiteres, gravierendes Problem. Wenn wir einen Lagerbestand über Null haben, wird ja die grüne Ampel mit dem Text aus DetailDataInfoInstock angezeigt. Sofern es sich bei dem Artikel nicht um einen Abverkaufsartikel handelt, können wir eine beliebig hohe Anzahl in den Warenkorb legen, auch wenn diese Anzahl den Lagerbestand übersteigt. In den Grundeinstellungen (Storefront, Warenkorb/Artikeldetails) kann mit zwei Einstellungen festgelegt werden, was in diesem Fall passieren soll. Zum einen kann man festlegen, ob die Lieferzeit (genauer: der Verfügbarkeitshinweis) überhaupt im Warenkorb beim Produkt angezeigt werden soll. Die zweite Einstellung legt fest, ob eine Lagerbestandsunterschreitung im Warenkorb angezeigt werden soll.Erklärung: Da es sich hier um die gelbe Ampel handelt, werden diese Texte im Frontend nur angezeigt, wenn der Bestand kleiner oder gleich Null ist. Daran hat sich nichts geändert. Man kann auch weiterhin in das Lieferzeitfeld eine Zahl eintragen, diese wird wie gehabt als {Lieferzeit} {X} {Werktage} ausgegeben. Ich habe zusätzlich den Textbaustein DetailDataShippingtime auf Lieferzeit ca. geändert, aber das ist Geschmacksache.
Geben wir nun in unser Backendfeld ein Datum im Format JJJJ-MM-TT ein, dann wird, sofern das Datum in der Zukunft liegt, ausgegeben: Voraussichtlich wieder lieferbar ab TT.MM.JJJJ, die Datumsausgabe erfolgt also im korrekten Format. Liegt das Datum in der Vergangenheit, wird ausgegeben: Ware verspätet, Lieferung war angekündigt für TT.MM.JJJJ. Diese Erweiterung erschien mir notwendig, weil es gerade bei größeren Sortimenten schwierig werden könnte, die Daten nachzupflegen, auf diese Weise haben wir vollautomatisch immer eine plausible Anzeige im Frontend. Leider kann man den Monat nicht ausgeschrieben anzeigen (man könnte ja %B statt %m benutzen), der Monatsname wird aber leider nur auf Englisch ausgegeben.
Stehen diese beiden Optionen auf Nein, dann bekommt der Besteller überhaupt nicht mit, dass er mit seiner Bestellung gerade den Lagerbestand unterschritten hat. Diese Einstellung kann sinnvoll sein, wenn man alle Produkte immer als lieferbar anzeigen lassen will, z.B. weil man starke Schwankungen im Lagerbestand hat, sich Bestände stündlich ändern oder was auch immer.
Der Normalzustand sollte allerdings sein, dass ich den Kunden so genau wie möglich darüber informieren will, was Sache ist. Wenn ein Produkt eine Lieferzeit von 5 Werktagen hat und ich habe nicht genug an Lager, dann kann ich den Kunden nicht im Glauben lassen, dass die komplette Menge sofort versandbereit ist. Der Standard ist also, dass ich beide Optionen auf ja stelle. Deshalb muss die Anzeige im Warenkorb analog der Anzeige auf der Artikeldetailseite angepasst werden.
Wenn die Einstellung Lagerbestandsunterschreitung im Warenkorb anzeigen auf ja steht und man versucht, mehr in den Warenkorb zu legen als vorrätig ist, öffnet sich ein JavaScript-Popup mit einem Hinweis, dass die Bestellmenge den Lagerbestand übersteigt. Um die Plausibilität zu erhöhen, fand ich es naheliegend, den Hinweistext im blauen Feld (Textbaustein: CheckoutArticleLessStock) anzupassen. Da in diesem Feld kein Smarty möglich ist (!), habe ich den Textbaustein wie folgt angepasst:
Von diesem Artikel haben wir aktuell #0 Stück an Lager. Für weitere Informationen beachten Sie bitte die Anzeige im Warenkorb.
Jetzt kommt der kniffeligste Teil der ganzen Aktion, denn jetzt müssen alle Informationen aus der gelben Ampel in den Warenkorb rein. Es hat Stunden gedauert, bis ich es raus hatte. Wir aktivieren also Lieferzeit im Warenkorb anzeigen und passen den Textbaustein DetailDataInfoPartialStock wie folgt an:Erklärung: Die Variable #0 gibt den aktuellen Lagerbestand aus. Es gibt noch #1, das ist die Menge, die in den Warenkorb gelegt wurde. Diesen Wert habe ich rausgelöscht, ich fand diese Information entbehrlich, der Kunde hat die Bestellmenge ja erst vor zwei Sekunden selbst ausgewählt.
{$sArticle.instock} Stück ab Lager lieferbar{if $sArticle.shippingtime}{if is_numeric($sArticle.shippingtime)}, Lieferzeit für nicht vorrätige Menge ca. {$sArticle.shippingtime} Werktage.{elseif $sArticle.shippingtime|date_format:"%Y%m%d" > $smarty.now|date_format:"%Y%m%d"}, nicht vorrätige Menge verfügbar ab ca. {$sArticle.shippingtime|date_format:"%d.%m.%Y"}{else}, nicht vorrätige Menge überfällig, Lieferung war angekündigt für {$sArticle.shippingtime|date_format:"%d.%m.%Y"}{/if}{else}, Lieferzeit für nicht vorrätige Menge unbekannt.{/if}
Man kann darüber streiten, ob man das überhaupt so machen muss. Für einen Onlinehändler ist es ja eigentlich eine unangenehme Situation, ein Produkt im Programm zu haben, von dem nicht klar ist, wann es wieder hereinkommt. Es hängt vom Einzelfall und vom Produkt ab, ob man in so einem Fall lieber Bestellungen entgegennimmt (mit dem Risiko alle Bestellungen und ggf. Zahlungen wieder rückabwickeln zu müssen, falls das Produkt doch nicht mehr hereinkommt) oder nicht. Wem das Risiko zu hoch ist, hat natürlich jederzeit die Möglichkeit, die Checkbox E-Mail-Benachrichtigung im Backend zu aktivieren und dem Kunden damit die Bestellmöglichkeit wegzunehmen. Hierzu ist in den Grundeinstellungen die Option Warenkorb bei eMail-Benachrichtigung ausblenden auf ja zu stellen.Erklärung: Ähnlich wie auf der Detailseite, wird entweder eine Anzeige der Liefertage oder des Lieferdatums ausgegeben, abhängig davon, was im Backendfeld eingetragen ist. Zusätzlich haben wir hier noch einen weiteren Fall, der greift, wenn in das Feld überhaupt nichts eingetragen wurde. Der Kunde erhält in diesem Fall die Mitteilung Lieferzeit für nicht vorrätige Menge unbekannt, das ist zwar nicht optimal, aber so kann er wenigstens entscheiden, ob er warten will oder seine Bestellmenge anpasst. Auf der Detailseite gibt es diesen Zustand nicht, hier wird ja bei Bestand 0 und keinem Eintrag bei der Lieferzeit standardmäßig die rote Ampel angezeigt.
Sinnvolle Zusatzfunktionalität mit dem Feld "Erscheinungsdatum":
Der geneigte Leser fragt sich vielleicht schon die ganze Zeit, wieso der ganze Heckmeck, warum nimmt man nicht einfach das Feld Erscheinungsdatum, um eine ähnliche Funktion zu realisieren? Ganz einfach, das Erscheinungsdatum ist das was es ist: Mit diesem Datum kündigt man die erstmalige Verfügbarkeit eines neuen Produktes an. Das ist sogar unabhängig vom Lagerbestand, es kann durchaus ein positiver Lagerbestand vorhanden sein und es wird trotzdem bis zum Erscheinungsdatum stur die gelbe Ampel mit dem Hinweis angezeigt. Das ist auch gut so: Wenn ich Filme oder Bücher verkaufe, dann werde ich bereits vor dem Erscheinungsdatum vom Lieferanten beliefert und kann trotz positivem Lagerbestand und gelber Ampel schon Bestellungen entgegen nehmen, ja sogar den Versand vorbereiten und zum angegebenen Datum springt die Ampel automatisch auf grün um. Tolle Funktionalität und die sollte man nicht ohne Not verbiegen, gut wenn man sie hat!
Wenn man keine Bücher oder Filme verkauft, kann man das Erscheinungsdatum gut für neue Produkte benutzen, die erst in einiger Zeit geliefert werden. Hierzu habe ich den Textbaustein DetailDataInfoShipping wie folgt angepasst:
Voraussichtlich verfügbar abWenn die Ware früher geliefert wird, kann beim Eintragen des Lagerbestandes das Erscheinungsdatum entfernt werden, damit die Ampel sofort grün wird. Man sollte dieses Datum in jedem Fall im Auge behalten, weil die Ampel auf rot umspringt, sofern bis zum Erscheinungsdatum entweder kein Lagerbestand oder keine Lieferzeit bzw. kein Lieferdatum hinterlegt wurde.
Letzter Schritt: Die rote Ampel
Die rote Ampel besteht eigentlich nur aus einem Eintrag, der bestenfalls so gut wie nie angezeigt werden sollte, nämlich dann, wenn das Produkt nicht lieferbar ist und auch keine Informationen darüber vorliegen, wann es wieder herein kommt. Daher ist der Textbaustein DetailDataNotAvailable mit folgendem naheliegenden Text zu versehen:
Zur Zeit nicht lieferbar, Liefertermin unbekannt.In den Grundeinstellungen gibt es noch das Feld Text für nicht verfügbare Artikel, dort habe ich das Gleiche eingetragen. Es scheint so, als würde dieses Feld nicht beachtet und ich frage mich, warum der Text an zwei Stellen im System gepflegt werden kann, möglicherweise aus Kompatibilitätsgründen mit älteren Themes, das ist aber geraten.
Dieser Text wird nun auch bei Abverkaufsartikeln angezeigt, die den Lagerbestand Null erreicht haben, sofern man in den Grundeinstellungen die Option Abverkaufsartikel ohne Lagerbestand nicht anzeigen auf Nein eingestellt hat. Diese Option sollte eigentlich immer auf Nein stehen, sofern man noch Verkaufsunterlagen, etwa Kataloge, im Umlauf hat, in denen die Abverkaufsartikel verzeichnet sind. Anderenfalls fragt sich der Kunde, wo das Produkt geblieben ist und ob es sich vielleicht um ein technisches Problem handelt, dass es nicht angezeigt wird. Hier sind telefonische Anfragen vorprogrammiert.
Um mitzuteilen, dass dieses Produkt nicht mehr da ist und auch niemals wieder herein kommen wird, passt man in einem letzten Schritt den Textbaustein DetailBuyInfoNotAvailable wie folgt an:
AusverkauftOder als Alternative, wenn man die Felder Abverkauf und Erscheinungsdatum gleichzeitig benutzen will (hä?):
{if $sArticle.sReleasedate}Dieser Artikel ist nicht vorbestellbar.{else}Ausverkauft{/if}
Fertig!
Grüße
Pierre
P.S.: Die im System vorhandenen Inplausibilitäten (z.B. Abverkauf aktiviert, Bestand Null, Lieferzeit vergessen rauszulöschen, Ergebnis: gelbe Ampel) sind auch weiterhin vorhanden. Man kann nicht alles kreuz und quer aktivieren, aber wenn man die Einstellungen im Backend grob auf Plausibilität prüft, kann man eigentlich nichts verkehrt machen.
P.P.S.: Alle Einstellungen lassen sich natürlich auch ganz hervorragend über einen Import vornehmen.