Neu Kunden automatisiert über Lieferverzögerungen informieren (Video)

Manuel Pietzsch

JTL-Wawi
Mitarbeiter
2. Januar 2012
2.861
1.038
Hückelhoven
Hi Freunde,

in meinem neuen Video zeige ich euch wie ihr eure Kunden automatisiert über Lieferverzögerungen informieren könnt.


Hier der dazu verwendete Code:

Achtung: In der JTL-Wawi muss FiFo in den globalen Einstellungen aktiviert sein, sonst macht das hier keinen Spaß:

2021-09-01 14_27_21-JTL-Wawi 1.5.50.0 - (admin) - eB-Standard.png

1. Die erweiterte Eigenschaft "EintreffendeLieferungen":

1620204150016.png1620204185379.png

Code:
{% capture query -%}
DECLARE @kBestellung AS INT = {{ Vorgang.Stammdaten.InterneAuftragsnummer }};

SELECT COUNT(*) AS Anzahl
FROM
(
    SELECT  vBestellPosLieferInfo.kBestellung,
            vBestellPosLieferInfo.kBestellPos,
            MIN(ZulaufAnDatum.dLieferdatum) AS dLieferungEingetroffen
    FROM
    (
        SELECT  tLieferantenBestellungPos.kArtikel,
                tLieferantenBestellungPos.dLieferdatum,
                SUM(tLieferantenBestellungPos.fAnzahlOffen) OVER (PARTITION BY tLieferantenBestellungPos.kArtikel ORDER BY tLieferantenBestellungPos.dLieferdatum ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS fZulaufAnDatum
        FROM tLieferantenBestellungPos
        JOIN dbo.tLieferantenBestellung ON tLieferantenBestellungPos.kLieferantenBestellung = tLieferantenBestellung.kLieferantenBestellung
        WHERE   tLieferantenBestellung.nStatus IN (20, 30) -- Lieferantenbestellung mit Zuläufen berücksichtigen
                AND tLieferantenBestellungPos.kArtikel > 0
    ) ZulaufAnDatum
    JOIN Versand.vBestellPosLieferInfo ON ZulaufAnDatum.kArtikel = vBestellPosLieferInfo.kArtikel
    LEFT JOIN
    (
        --
        -- Artikel ausschließen mit dem Eigenen Feld LieferverzögerungKeineMail = 1
        --
        SELECT DISTINCT tArtikel.kArtikel
        FROM dbo.tAttributSprache
        JOIN dbo.tArtikelAttribut ON tAttributSprache.kAttribut = tArtikelAttribut.kAttribut
        JOIN dbo.tArtikelAttributSprache ON tArtikelAttribut.kArtikelAttribut = tArtikelAttributSprache.kArtikelAttribut
        JOIN dbo.tArtikel ON tArtikelAttribut.kArtikel = tArtikel.kArtikel
        WHERE    tAttributSprache.cName = 'LieferverzögerungKeineMail'
                AND tArtikelAttributSprache.nWertInt = 1
    ) AS ausgeschlosseneArtikel ON ZulaufAnDatum.kArtikel = ausgeschlosseneArtikel.kArtikel
    WHERE   vBestellPosLieferInfo.fAnzahlFehlbestandEigen > 0.0
            AND vBestellPosLieferInfo.fAnzahlFehlbestandEigen <= ZulaufAnDatum.fZulaufAnDatum           
            AND ausgeschlosseneArtikel.kArtikel IS NULL
    GROUP BY    vBestellPosLieferInfo.kBestellung,
                vBestellPosLieferInfo.kBestellPos,
                vBestellPosLieferInfo.kArtikel
) AS BestellposLieferung
JOIN dbo.tbestellung ON BestellposLieferung.kBestellung = tbestellung.kBestellung
WHERE   BestellposLieferung.kBestellung = @kBestellung
        --AND ISNULL(tbestellung.dLieferdatum, DATEADD(dd, 2, GETDATE())) < dLieferungEingetroffen; --Einkommentieren wenn das vor. Lieferdatum von Aufträgen vor der eintreffenden Lieferung liegen soll
{% endcapture -%}
{{ query | DirectQueryScalar }}

2. Der Empfänger der E-Mail

1620204288332.png

Code:
{% if Vorgang.Lieferung.Lieferadresse.EMail != empty -%}
{{ Vorgang.Lieferung.Lieferadresse.EMail }}\
{% if Vorgang.Lieferung.Lieferadresse.EMail != Vorgang.Zahlungen.Rechnungsadresse.EMail -%}
;{{ Vorgang.Zahlungen.Rechnungsadresse.EMail }}\
{% endif -%}
{% else -%}
{{ Vorgang.Zahlungen.Rechnungsadresse.EMail }}
{% endif -%}

3. Der Betreff der E-Mail

1620204348909.png
Code:
{{ Vorgang.Stammdaten.Auftragsnummer }} - Lieferung verzögert sich

4. Der Inhalt / Text der E-Mail

1620204436706.png


Code:
<style type="text/css">
.tg {border-collapse:collapse;border-spacing:0;border-color:#aaa;}
.tg td{font-family:Verdana, sans-serif;font-size:13px;padding:10px 5px;text-align:center;border-style:solid;border-width:0px;overflow:hidden;word-break:normal;border-top-width:1px;border-bottom-width:1px;border-color:#aaa;color:#333;background-color:#fff;}
.tg th{font-family:Verdana, sans-serif;font-size:13px;font-weight:bold;text-align:center;padding:10px 5px;border-style:solid;border-width:0px;overflow:hidden;word-break:normal;border-top-width:1px;border-bottom-width:1px;border-color:#aaa;color:#fff;background-color:#f67f00;}
.tg .tg-0lax{text-align:left;vertical-align:top}
.tg .tg-dg7a{background-color:#FCFBE3;text-align:left;vertical-align:top}
.tg .tg-open{background-color:#ff8181;text-align:left;vertical-align:top}
.tg .tg-part{background-color:#fffe65;text-align:left;vertical-align:top}
</style>
<span style="font-size: 10pt">
<p /></span><span style="font-family: Verdana"><span style="font-size: 10pt; font-family: Verdana">
{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}
Hi {{ Vorgang.Stammdaten.Kunde.Adresse.Vorname }}.
{% else -%}
Hallo {{ Vorgang.Stammdaten.Kunde.Adresse.Vorname }},
{% endif -%}
<br>
<br>
{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}
With this e-mail you will receive the current status of your order.
{% else -%}
mit dieser E-Mail erhältst du den aktuellen Status zu deiner Bestellung.
{% endif -%}
<table class="tg">
{% capture query -%}
-- Artikel nicht verfügbar
DECLARE @kBestellung AS INT = {{ Vorgang.Stammdaten.InterneAuftragsnummer }};
SELECT ROW_NUMBER() OVER (ORDER BY tbestellpos.cArtNr) AS Nummer,
tbestellpos.cArtNr AS Artikelnummer,
tbestellpos.cString AS Bezeichnung,
IIF(ISNULL(BestellposLieferung.fAnzahlFehlbestandEigen, 0.0) > tbestellpos.nAnzahl, tbestellpos.nAnzahl, ISNULL(BestellposLieferung.fAnzahlFehlbestandEigen, 0.0)) AS OffeneMenge,
CONVERT(DATE, ISNULL(BestellposLieferung.dLieferungEingetroffen, CASE WHEN ISNULL(tBestellung.dLieferdatum, GETDATE()) <= GETDATE() THEN GETDATE() ELSE tBestellung.dLieferdatum END)) AS VoraussichtlichVerfügbarAm,
CASE WHEN CONVERT(DATE, ISNULL(BestellposLieferung.dLieferungEingetroffen, CASE WHEN ISNULL(tBestellung.dLieferdatum, GETDATE()) <= GETDATE() THEN GETDATE() ELSE tBestellung.dLieferdatum END)) < GETDATE() THEN 1 ELSE 0 END AS nIstVergangenheit,
ISNULL(tArtikelAttributSpracheDE.cWertVarchar, '') AS cAttributDE,
ISNULL(tArtikelAttributSpracheEN.cWertVarchar, '') AS cAttributEN
FROM dbo.tbestellpos
JOIN dbo.tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
-- Eigenes Feld 'Text Lieferzeit DE' ermitteln
LEFT JOIN dbo.tAttributSprache AS tAttributSpracheDE ON tAttributSpracheDE.cName = 'Text Lieferzeit DE'
AND tAttributSpracheDE.kSprache = 0
LEFT JOIN dbo.tArtikelAttribut AS tArtikelAttributDE ON tbestellpos.tArtikel_kArtikel = tArtikelAttributDE.kArtikel
AND tArtikelAttributDE.kAttribut = tAttributSpracheDE.kAttribut
LEFT JOIN dbo.tArtikelAttributSprache AS tArtikelAttributSpracheDE ON tArtikelAttributDE.kArtikelAttribut = tArtikelAttributSpracheDE.kArtikelAttribut
AND tArtikelAttributSpracheDE.kSprache = 0
LEFT JOIN dbo.tAttributSprache AS tAttributSpracheEN ON tAttributSpracheEN.cName = 'Text Lieferzeit ENG'
AND tAttributSpracheDE.kSprache = 0
LEFT JOIN dbo.tArtikelAttribut AS tArtikelAttributEN ON tbestellpos.tArtikel_kArtikel = tArtikelAttributEN.kArtikel
AND tArtikelAttributEN.kAttribut = tAttributSpracheEN.kAttribut
LEFT JOIN dbo.tArtikelAttributSprache AS tArtikelAttributSpracheEN ON tArtikelAttributEN.kArtikelAttribut = tArtikelAttributSpracheEN.kArtikelAttribut
AND tArtikelAttributSpracheEN.kSprache = 0
JOIN
(
SELECT vBestellPosLieferInfo.kBestellung,
vBestellPosLieferInfo.kBestellPos,
vBestellPosLieferInfo.fAnzahlOffen,
vBestellPosLieferInfo.fAnzahlFehlbestandEigen,
MIN(ZulaufAnDatum.dLieferdatum) AS dLieferungEingetroffen
FROM Versand.vBestellPosLieferInfo
LEFT JOIN
(
SELECT tLieferantenBestellungPos.kArtikel,
tLieferantenBestellungPos.dLieferdatum,
SUM(tLieferantenBestellungPos.fAnzahlOffen) OVER (PARTITION BY tLieferantenBestellungPos.kArtikel ORDER BY tLieferantenBestellungPos.dLieferdatum ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS fZulaufAnDatum
FROM tLieferantenBestellungPos
JOIN dbo.tLieferantenBestellung ON tLieferantenBestellungPos.kLieferantenBestellung = tLieferantenBestellung.kLieferantenBestellung
WHERE tLieferantenBestellung.nStatus IN (20, 30) -- Lieferantenbestellung mit Zuläufen berücksichtigen
AND tLieferantenBestellungPos.kArtikel > 0
) ZulaufAnDatum ON ZulaufAnDatum.kArtikel = vBestellPosLieferInfo.kArtikel
LEFT JOIN
(
--
-- Artikel ausschließen mit dem Eigenen Feld LieferverzögerungKeineMail = 1
--
SELECT DISTINCT tArtikel.kArtikel
FROM dbo.tAttributSprache
JOIN dbo.tArtikelAttribut ON tAttributSprache.kAttribut = tArtikelAttribut.kAttribut
JOIN dbo.tArtikelAttributSprache ON tArtikelAttribut.kArtikelAttribut = tArtikelAttributSprache.kArtikelAttribut
JOIN dbo.tArtikel ON tArtikelAttribut.kArtikel = tArtikel.kArtikel
WHERE tAttributSprache.cName = 'LieferverzögerungKeineMail'
AND tArtikelAttributSprache.nWertInt = 1
) AS ausgeschlosseneArtikel ON ZulaufAnDatum.kArtikel = ausgeschlosseneArtikel.kArtikel
WHERE vBestellPosLieferInfo.fAnzahlFehlbestandEigen <= ISNULL(ZulaufAnDatum.fZulaufAnDatum, vBestellPosLieferInfo.fAnzahlFehlbestandEigen)
AND vBestellPosLieferInfo.fAnzahlFehlbestandEigen > 0.0
AND ausgeschlosseneArtikel.kArtikel IS NULL
GROUP BY vBestellPosLieferInfo.kBestellung,
vBestellPosLieferInfo.kBestellPos,
vBestellPosLieferInfo.fAnzahlOffen,
vBestellPosLieferInfo.fAnzahlFehlbestandEigen,
vBestellPosLieferInfo.kArtikel
) AS BestellposLieferung ON BestellposLieferung.kBestellPos = tbestellpos.kBestellPos
WHERE tbestellpos.tBestellung_kBestellung = @kBestellung
AND tbestellpos.nType IN (0, 1, 11, 17, 18) -- die Typen hab ich aus spReservierungenAktualisieren kopiert + 0 für Freipositionen
--AND ISNULL(tbestellung.dLieferdatum, DATEADD(dd, 2, GETDATE())) < dLieferungEingetroffen --Einkommentieren wenn das vor. Lieferdatum von Aufträgen vor der eintreffenden Lieferung liegen soll
{% endcapture -%}
{% assign Positionen = query | DirectQuery -%}
{% for pos in Positionen.Daten -%}
{% if pos.Nummer == 1 -%}
<br>
<br>
{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}
The following items are unfortunately not yet available:
{% else -%}
Folgende Artikel sind leider noch nicht verfügbar:
{% endif -%}
<br>
<br>
<tr>
{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}
<th class="tg-0lax">Quantity</th>
<th class="tg-0lax">Item number </th>
<th class="tg-0lax">Name</th>
<th class="tg-0lax">Expected to be available from</th>
{% else -%}
<th class="tg-0lax">Anzahl</th>
<th class="tg-0lax">Artikelnummer</th>
<th class="tg-0lax">Bezeichnung</th>
<th class="tg-0lax">Voraussichtlich lieferbar ab</th>
{% endif -%}
</tr>
{% endif -%}
<tr>
<td class="{{tg-part}}">{{pos.OffeneMenge | FormatNumber: 'N0', 'de-DE'}}</td>
<td class="{{tg-part}}">{{pos.Artikelnummer}}</td>
<td class="{{tg-part}}">{{pos.Bezeichnung}}</td>
{% if pos.OffeneMenge == 0 -%}
<td class="{{tg-part}}">geliefert</td>
{% else -%}
{% if pos.nIstVergangenheit == 1 -%}
<td class="{{tg-part}}">{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}Delivery date open (will be submitted later){% else -%}Liefertermin offen (wird nachgereicht){% endif -%}</td>
{% else -%}
{% if pos.cAttributDE != "" -%}
<td class="{{tg-part}}">{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}{{pos.cAttributDEN}}{% else -%}{{pos.cAttributDE}}{% endif -%}</td>
{% else -%}
<td class="{{tg-part}}">{{pos.VoraussichtlichVerfügbarAm | FormatDate: 'dd.MM.yyyy', 'de-DE' }}</td>
{% endif -%}
{% endif -%}
{% endif -%}
</tr>
{% endfor -%}
</table>
{% capture query -%}
-- Artikel reserviert
DECLARE @kBestellung AS INT = {{ Vorgang.Stammdaten.InterneAuftragsnummer }};
SELECT ROW_NUMBER() OVER (ORDER BY tbestellpos.cArtNr) AS Nummer,
tbestellpos.cArtNr AS Artikelnummer,
tbestellpos.cString AS Bezeichnung,
ISNULL(BestellposLieferung.fAnzahlReserviertEigen, 0.0) AS fMengeReserviert
FROM dbo.tbestellpos
JOIN dbo.tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
JOIN
(
SELECT reservierteMengen.kBestellPos,
SUM(reservierteMengen.fAnzahlReserviertEigen) AS fAnzahlReserviertEigen
FROM
(
SELECT vBestellPosLieferInfo.kBestellPos,
vBestellPosLieferInfo.fAnzahlReserviertEigen
FROM Versand.vBestellPosLieferInfo
WHERE vBestellPosLieferInfo.fAnzahlReserviertEigen > 0.0
UNION ALL
SELECT tPicklistePos.kBestellPos,
tPicklistePos.fAnzahl AS fAnzahlReserviertEigen
FROM dbo.tPicklistePos
LEFT JOIN dbo.tLieferscheinPos ON tPicklistePos.kLieferscheinPos = tLieferscheinPos.kLieferscheinPos
WHERE tLieferscheinPos.kLieferscheinPos IS NULL
) AS reservierteMengen
GROUP BY reservierteMengen.kBestellPos
) AS BestellposLieferung ON BestellposLieferung.kBestellPos = tbestellpos.kBestellPos
LEFT JOIN
(
--
-- Artikel ausschließen mit dem Eigenen Feld LieferverzögerungKeineMail = 1
--
SELECT DISTINCT tArtikel.kArtikel
FROM dbo.tAttributSprache
JOIN dbo.tArtikelAttribut ON tAttributSprache.kAttribut = tArtikelAttribut.kAttribut
JOIN dbo.tArtikelAttributSprache ON tArtikelAttribut.kArtikelAttribut = tArtikelAttributSprache.kArtikelAttribut
JOIN dbo.tArtikel ON tArtikelAttribut.kArtikel = tArtikel.kArtikel
WHERE tAttributSprache.cName = 'LieferverzögerungKeineMail'
AND tArtikelAttributSprache.nWertInt = 1
) AS ausgeschlosseneArtikel ON tbestellpos.tArtikel_kArtikel = ausgeschlosseneArtikel.kArtikel
WHERE ausgeschlosseneArtikel.kArtikel IS NULL
AND tbestellpos.tBestellung_kBestellung = @kBestellung
AND tbestellpos.nType IN (0, 1, 11, 17, 18) -- die Typen hab ich aus spReservierungenAktualisieren kopiert + 0 für Freipositionen
{% endcapture -%}
{% assign Positionen = query | DirectQuery -%}
{% for pos in Positionen.Daten -%}
{% if pos.Nummer == 1 -%}
<br>
<br>
{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}
We have reserved these items for you:
{% else -%}
Folgende Artikel sind für dich reserviert:
{% endif -%}
<br>
<br>
<table class="tg">
<tr>
{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}
<th class="tg-0lax">Quantity</th>
<th class="tg-0lax">Item Number</th>
<th class="tg-0lax">Name</th>
{% else -%}
<th class="tg-0lax">Menge</th>
<th class="tg-0lax">Artikelnummer</th>
<th class="tg-0lax">Bezeichnung</th>
{% endif -%}
</tr>
{% endif -%}
<tr>
<td class="{{tg-part}}">{{pos.fMengeReserviert | FormatNumber: 'N0', 'de-DE'}}</td>
<td class="{{tg-part}}">{{pos.Artikelnummer}}</td>
<td class="{{tg-part}}">{{pos.Bezeichnung}}</td>
</tr>
{% endfor -%}
</table>
{% capture query -%}
-- Artikel unterwegs
DECLARE @kBestellung AS INT = {{ Vorgang.Stammdaten.InterneAuftragsnummer }};
SELECT ROW_NUMBER() OVER (ORDER BY tbestellpos.cArtNr) AS Nummer,
tbestellpos.cArtNr AS Artikelnummer,
tbestellpos.cString AS Bezeichnung,
SUM(tLieferscheinpos.fAnzahl) AS fGeliefert
FROM dbo.tbestellpos
LEFT JOIN
(
--
-- Artikel ausschließen mit dem Eigenen Feld LieferverzögerungKeineMail = 1
--
SELECT DISTINCT tArtikel.kArtikel
FROM dbo.tAttributSprache
JOIN dbo.tArtikelAttribut ON tAttributSprache.kAttribut = tArtikelAttribut.kAttribut
JOIN dbo.tArtikelAttributSprache ON tArtikelAttribut.kArtikelAttribut = tArtikelAttributSprache.kArtikelAttribut
JOIN dbo.tArtikel ON tArtikelAttribut.kArtikel = tArtikel.kArtikel
WHERE tAttributSprache.cName = 'LieferverzögerungKeineMail'
AND tArtikelAttributSprache.nWertInt = 1
) AS ausgeschlosseneArtikel ON tbestellpos.tArtikel_kArtikel = ausgeschlosseneArtikel.kArtikel
JOIN dbo.tLieferscheinpos ON tbestellpos.kBestellPos = tLieferscheinpos.kBestellPos
JOIN dbo.tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
WHERE ausgeschlosseneArtikel.kArtikel IS NULL
AND tbestellpos.tBestellung_kBestellung = @kBestellung
AND tbestellpos.nType IN (0, 1, 11, 17, 18) -- die Typen hab ich aus spReservierungenAktualisieren kopiert + 0 für Freipositionen
GROUP BY tbestellpos.cArtNr,
tbestellpos.cString
{% endcapture -%}
{% assign Positionen = query | DirectQuery -%}
{% for pos in Positionen.Daten -%}
{% if pos.Nummer == 1 -%}
<br>
<br>
{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}
The following items have already been delivered or are on their way:
{% else -%}
Folgende Artikel wurden bereits geliefert oder sind auf dem Weg:
{% endif -%}
<br>
<br>
<table class="tg">
<tr>
{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}
<th class="tg-0lax">Quantity</th>
<th class="tg-0lax">Item number</th>
<th class="tg-0lax">Name</th>
{% else -%}
<th class="tg-0lax">Menge</th>
<th class="tg-0lax">Artikelnummer</th>
<th class="tg-0lax">Bezeichnung</th>
{% endif -%}
</tr>
{% endif -%}
<tr>
<td class="{{tg-part}}">{{pos.fGeliefert | FormatNumber: 'N0', 'de-DE'}}</td>
<td class="{{tg-part}}">{{pos.Artikelnummer}}</td>
<td class="{{tg-part}}">{{pos.Bezeichnung}}</td>
</tr>
{% endfor -%}
</table>
<br>
<br>
{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}
The delivery times are current statements from our suppliers and manufacturers.<br>
We will keep you informed about the delivery status on a weekly basis.<br>
<br>
We apologise for the delay and thank you for your patience.<br>
If you have any questions about your order, please reply directly to this email.
{% else -%}
Bei den angegebenen Lieferzeiten handelt es sich um aktuelle Aussagen von Lieferanten und Herstellern.<br>
Wir halten dich mit Informationen zum Lieferstatus wöchentlich auf dem Laufenden.<br>
<br>
Wir entschuldigen uns für die mögliche Verzögerung der Lieferung und bedanken uns für deine Geduld.<br>
Solltest du Fragen zu deiner Bestellung haben, antworte bitte direkt auf diese E-Mail.
{% endif -%}
<br>
<br>
{% if Vorgang.Stammdaten.Kunde.Kundensprache.ISO == "eng" -%}
Best regards
{% else -%}
Viele Grüße
{% endif -%}
<br>JTL-Software-GmbH
<br>
<br>
<p style="margin: 0cm 0cm 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" /><span style="color: #3b3838"><img alt="" src="https://www.webneo.de/wp-content/uploads/2018/08/logo_jtl-software-e1562846396632-520x130.png" width="384" height="81" />
<p />
<p><span style="font-size: 8pt; font-family: Verdana; color: #767171">JTL-Software-GmbH | Rheinstra&szlig;e 7 | 41836 Hückelhoven | Germany<br /><a href="" target="_blank">info@jtl-software.de</a>&nbsp;| +49-(0)2433 8056801<br /><br />Registergericht: Amtsgericht Mönchengladbach, HRB 12450<br />Geschäftsführer: Janusch Lisson, Thomas Lisson COO: Ralph Schweiker<br />Umsatzsteuer-Identifikationsnummer: DE257864472<br /><br /></span></p></span>


Hier meine verwendeten Workflows:

Manueller WF "Lieferverzögerungen Queue"

1620204560686.png

Manueller WF "Lieferverzögerungen mitteilen"

1620204604031.png

Workflow "Lieferverzögerungen mitteilen" bei Auftragserstellung

1620204676569.png

Hier meine eigenen Felder:

Artikel (außer dem Namen sind ENG und DE gleich)

1620204785338.png

Kunde

1620204818813.png





Changelog:

11.07.2022:
  • Artikel ausschließen: Mit dem eigenen Feld "LieferverzögerungKeineMail" vom Typ Checkbox können Artikel jetzt aus dem Mailing ausgeschlossen werden.

Gruß

Euer Manuel
 
Zuletzt bearbeitet:

trendgo

Gut bekanntes Mitglied
10. Mai 2010
207
14
Es ist ganz nett, aber das ist doch keine Automatik für ein Lieferverzug.
Eigentlich sollte der Shop ja die richtigen Lieferzeiten anzeigen, erst wenn diese laut WaWi Berechnung (Voraussetzung richtige Pflege des voraussichtlichen Lieferdatums vom Hersteller) überschritten wird sollte eine Email mit einer "Verzögerung" rausgehen.

In Deinem Beispiel @Manuel Pietzsch bekommt er diese auch, obwohl die Ware auch rechtzeitig versendet werden kann.
Beispiel Kunde kauft ein Bett im Shop stehen 6-8 Wochen, nach der ersten Woche bekommt er schon eine Email das sich die Lieferung verzögert?
Ihr oder ich haben ein Gedankenfehler.

Die Vorrausetzung sollte sein, wenn das Datum vom Zulauf aller Artikel dem im Auftrag gesetzten voraussichtlichem Lieferdatum übersteigt.

Der Ansatz ist gut aber in meinen Augen nicht zu Ende gedacht. Somal dem Kunden ja nicht zu interessieren hat wie viele Stück ich beim Hersteller bestellt habe (aber das kann man ja gut anpassen)
 
  • Gefällt mir
Reaktionen: Manuel Pietzsch

Manuel Pietzsch

JTL-Wawi
Mitarbeiter
2. Januar 2012
2.861
1.038
Hückelhoven
Hi,

danke für das Feedback. Ich warte mal noch mehr ab und schau dann, dass ich den Code nochmal erweitere.
Gerne auch noch mehr Ideen dazu, das Teil kann ich ja weiter ausbauen damit es zu allen Fällen passt. Hatten das jetzt zusammen mit einem Kunden entwickelt bei dem mehr als 7 Tage immer eine Verzögerung sind, das passt nicht für alle und werde ich anpassen.

Das hier ist erstmal unabhängig von einer nativen Implementierung in Shop und Wawi, kostet nix und ist quasi sofort einsetzbar.

Gruß

Manuel
 

Sven83

Gut bekanntes Mitglied
26. Februar 2017
135
8
Erst einmal ein großes Lob. Wirklich fantastisch!

Ist das auch so anpassbar, dass man nicht über eine Bestellung beim Lieferanten das ganze abgleicht, sondern über den hinterlegten Liefertermin im Artikel?
 

ChrisTS

Sehr aktives Mitglied
15. Oktober 2010
507
145
Wir haben da bei uns einen manuellen Worflow der nach Bedarf im Einkauf auf eine offene Bestellung gesetz wird und im Verkauf die betroffenen Aufträge markiert.
Dann können wir alle Kunden die markiert sind benachrichtigen.

Ich stell das mal zur Verfügung.
@Manuel Pietzsch vielleicht auch für euch inetressant

Code:
@echo off
setlocal EnableDelayedExpansion

set server="SERVERIP\JTLWAWI"
set database="eazybusiness"

rem Query to get all Orders which are affected by late deliveries of lieferanten
set query="SET NOCOUNT ON; UPDATE tBestellung SET cStatus = 'Im Verzug' WHERE cBestellNr IN ( SELECT be.cBestellNr from tBestellung as be left join tZahlungsart as za on be.kZahlungsArt = za.kZahlungsart left join tbestellpos as bp on be.kBestellung = bp.tBestellung_kBestellung left join tArtikel as art on art.kArtikel = bp.tArtikel_kArtikel where nStorno = 0 and dLieferdatum IS NOT NULL and nKomplettAusgeliefert = 0 and dVersandt IS NULL and (dBezahlt IS NOT NULL OR nAusliefernVorZahlung = 1) and nType = 1 and art.nMidestbestand < bp.nAnzahl and art.cArtNr <> 'Prospekt' and bp.tArtikel_kArtikel IN (select kArtikel from tLieferantenBestellung as lbe right join tLieferantenBestellungPos as lbp on lbe.kLieferantenBestellung = lbp.kLieferantenBestellung where lbe.cEigeneBestellnummer = '%1' and lbp.fAnzahlOffen > 0));"  
sqlcmd -S %server% -d %database% -I -Q %query%

rem Debug output of all found Orders
rem for /f "skip=2"  %%a in ('sqlcmd -S %server% -d %database% -I -Q %query%') do echo %%a
 

Marcellus

Aktives Mitglied
6. April 2021
3
3
Erst einmal ein großes Lob. Wirklich fantastisch!

Ist das auch so anpassbar, dass man nicht über eine Bestellung beim Lieferanten das ganze abgleicht, sondern über den hinterlegten Liefertermin im Artikel?


Das wäre auch unser großer Wunsch.
Wir erhalten von unseren Lieferanten voraussichtliche Verfügbarkeitstermine auf Einzelartikelbasis und steuern das Ganze über die Möglichkeit der Vorbestellung.
Die Termine updaten wir dann jede Woche und das System sollte wöchentlich den dort hinterlegten Liefertermin an den Kunden übermitteln oder eben halt nichts wenn kein Termin eingetragen ist.

Die Möglichkeit über die Lieferantenbestellungen zu gehen ist bei uns nicht umsetzbar weil Bestellungen teilwiese hunderte Artikel enthalten die zu den unterschiedlichsten Terminen an uns ausgeliefert werden, oft auch erst wenn diese wieder verfügbar sind.
 

ChrisTS

Sehr aktives Mitglied
15. Oktober 2010
507
145
Ich bin der Meinung, man sollte auch prüfen, ob Auftrag lieferbar vor Zahlungseingang ist bzw bezahlt.
Zudem die Kontrolle, ob der Auftrag überhaupt in den Rückstand kommt (Vorrauss. Lieferdatum überschritten)
Was denkst du darüber @Manuel Pietzsch

Die erweiterte Eigenschaft für den Check der Zahlungsart wäre:

Code:
{% if Vorgang.Zahlungen.IstBezahlt or Vorgang.Zahlungen.Zahlungsart.IstAuslieferungVorZahlungMöglich %}true{% else %}false{%endif%}
 
Zuletzt bearbeitet:

urmelimurlaub

Gut bekanntes Mitglied
14. August 2013
154
12
Zwickau
Wir bestücken unsere Einkaufsliste nur per Workflow. In das Hinweisfeld trägt der Workflow die entsprechende Auftragsnummer ein.
Dadurch haben wir eine exakte Zuordnung der Lieferantenbestellung zum Auftrag.
Wenn nun das in der Auftragsbestätigung des Lieferanten rückgemeldeten und eingetragenen Lieferdatum in der Lieferantenbestellung außerhalb des Bestelldatums des Auftrag plus des Lieferstatus des jeweiligen Artikels liegt schicken wir eine Lieferverzögerungsmail raus in der wir dem Kunden über den neuen voraussichtlichen Liefertermin des jeweiligen Artikels informieren.
 
  • Gefällt mir
Reaktionen: Manuel Pietzsch

AMZ-FUX

Aktives Mitglied
23. September 2020
8
2
Super gemacht. Es wäre klasse, wenn es eine alternative Code-Version gäbe für User, die FIFO nicht nutzen, bei uns geht das prozessbedingt nicht. Da die Liefer-Termin-Prüfung per aktueller Abfrage fehlschlägt, steht dann immer "Liefertermin offen (wird nachgereicht)" als Ergebnis drin. Einfach stets das nächsteingetragene Zulieferdatum auf der Artikelnummer auszugeben wäre hier zwar kein perfektes, aber ein deutlich besseres Ergebnis als stets "offen" .
 
  • Gefällt mir
Reaktionen: Manuel Pietzsch

dotnetpower

Gut bekanntes Mitglied
22. Dezember 2006
216
23
Ich hab ein paar Problemchen mit dem Workflow. Es scheint so als werden Artikel die sich in einer Versandbox befinden nicht als "für dich reserviert" angezeigt. Es funktioniert nur dann offenbar korrekt wenn der Auftrag NICHT vorkommissioniert wurde. Kann das jemand von euch bestätigen?
 
  • Gefällt mir
Reaktionen: Manuel Pietzsch

PAO1908

Sehr aktives Mitglied
11. Oktober 2012
473
32
Schweiz
Hallo zusammen
Geniale Sache, wirklich! Herzlichen Dank Manuel.
Ein kleines Problem habe ich noch, das Mail welches der Kunde bekommt, ist irgendwie nicht HTML...

<style type="text/css">

.tg {border-collapse:collapse;border-spacing:0;border-color:#aaa;}

.tg td{font-family:Verdana, sans-serif;font-size:13px;padding:10px 5px;border-style:solid;border-width:0px;overflow:hidden;word-break:normal;border-top-width:1px;border-bottom-width:1px;border-color:#aaa;color:#333;background-color:#fff;}

.tg th{font-family:Verdana, sans-serif;font-size:13px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:0px;overflow:hidden;word-break:normal;border-top-width:1px;border-bottom-width:1px;border-color:#aaa;color:#fff;background-color:#f67f00;}
.
.
.

In der Vorschau (Browser) des Workflows, wird es richtig angezeigt.

Habe ich irgendwo eine falsche Einstellung?

Herzliche Grüsse
 
  • Gefällt mir
Reaktionen: Manuel Pietzsch

dotnetpower

Gut bekanntes Mitglied
22. Dezember 2006
216
23
Werden bei euch denn alle Positionen aufgeführt? Bei uns ist die Mail leider immer noch Fehlerhaft, es werden nämlich definitiv keine Artikel angezeigt die bereits auf Versandbox sind. Somit fragen die Kunden jedes mal nach ob die Artikel nicht lieferbar sind...

Leider hat mich der Support trotz Gold-Support abgewürgt mit der Information das die Workflows im Forum nicht supportet werden und man im Thread selbst nachfragen soll. Leider kommt hier nix mehr :(

Der Workflow ist eine super Sache nur Schade das er halt nicht richtig funktioniert und es keinen Support gibt. Ich denke wir werden es wieder abschalten.....
 
  • Gefällt mir
Reaktionen: Manuel Pietzsch

Maekaey

Sehr aktives Mitglied
11. November 2016
268
66
@Manuel Pietzsch seit 2 Jahren steht das auf der ToDo!! Und immer wieder im Backlog, aber dann war doch immer etwas anderes dringender wodurch wir es immer wieder verschoben haben.

Und da kommt ihr um die Ecke und haut des SQL Code raus! HAMMER!!! :love:

Vielen Dank!

Werde das jetzt ins backlog packen und wir werden ggf. Anpassungen für uns machen (falls die für andere sinnvoll sein könnten dann auch teilen).

Genial Echt! Bin sehr dankbar für die Arbeit die ihr euch hier gemacht und uns abgenommen habt! 👏 🥳

Gruß,
Micha
 
  • Gefällt mir
Reaktionen: Manuel Pietzsch

Kulikov Kristina

Mitglied
22. Februar 2021
7
1
Irgendwie wird keine Verknüpfung zum eigenen Feld für die Lieferzeiten hergestellt. Egal was ich im Artikel bei den Lieferzeiten eingebe die Daten werden in der Mail nicht berücksichtigt. Lediglich die Info "Liefertermin offen (wird nachgereicht)". Hab ich irgendwas übersehen?
 
  • Gefällt mir
Reaktionen: Manuel Pietzsch
Ähnliche Themen
Titel Forum Antworten Datum
Neu Bestellungen und Kunden werden nicht importiert JTL-Shop - Fehler und Bugs 10
Wertstoffe von Kunden ankaufen JTL-Wawi 1.9 5
JTL Vouchers automatisch nach Zahlungseingang an Kunden versenden Allgemeine Fragen zu JTL-Vouchers 5
Rechnungen an Ebay und Amazon Kunden immer digital zusenden JTL-Wawi 1.9 0
Rabatt für einzelnen Kunden einrichten JTL-Wawi 1.9 2
Neu Kunden in UK - was ist der sinnvollste Weg? Business Jungle 8
Neu JTL Connector - Shopify Abgleich. Bestellbestätigungsemails werden die ganze Zeit dem Kunden gemailt. Shopware-Connector 2
Neu Artikel CSV Exporte dem Kunden zur verfügung stellen. Allgemeine Fragen zu JTL-Shop 7
Neu Bestimmte Kunden/Kundengruppen von Bewertungsmail ausschließen Betrieb / Pflege von JTL-Shop 3
Neu Amazon Custom Orders mit Bildern von Kunden Amazon-Anbindung - Ideen, Lob und Kritik 0
Neu Export von Kunden, die in der Vergangenheit bereits bestimmte Artikel gekauft haben Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 10
Neu Workflow Adresse prüfen auf deutsche Kunden eingrenzen Gelöste Themen in diesem Bereich 6
Neu Rollenbasiertes Kunden-Plugin (B2B) Plugins für JTL-Shop 1
Datenschutz mit Kunden die kein Konto hinterlegt haben JTL-Wawi 1.9 0
Neu REST-API nur noch für Premium Kunden - oder wie verhindere ich Nutzung moderner Schnittstellen... Schnittstellen Import / Export 37
Neu Im Shop-Backend vorgenommene Änderungen können nicht mehr automatisiert abgeglichen werden und führen somit zu Datenverlust. Shopware-Connector 0
Telefonnummer über Klarna JTL-Wawi 1.9 0
Neu Email-Versand über MS365 geht nicht Installation von JTL-Wawi 1
In Diskussion Hinweis im WMS Ausgeben wenn ein bestimmter Artikel verpackt wird über WMS JTL-Workflows - Ideen, Lob und Kritik 5
Neu Versand über Kundenaccount Allgemeine Fragen zu JTL-Shop 5
In Diskussion Keine Auslieferung nach Zahlungsartänderung über Workflow JTL-Workflows - Fehler und Bugs 4
Neu WMS über Remote druckt langsam Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 8
Neu Artikel lässt sich im Shop 5.2.5 über die Wawi nicht löschen JTL-Shop - Fehler und Bugs 2
Neu Toplevel-Banner hinzufügen und/oder über Wawi Steuern Allgemeine Fragen zu JTL-Shop 0
Neu Einzelne Artikel über stückliste im Packtisch scannen User helfen Usern - Fragen zu JTL-Wawi 3
Maximal unzuverlaässiges ermitteln von fba Bedarf über die Umlagerungen in jtl. JTL-Wawi 1.9 0
Gelöst Artikel an der Kasse beim scannen nur über Artikelnummer, nicht über GTIN identifizieren (Gebrauchtware, GTIN mehrfach in der Wawi) Allgemeine Fragen zu JTL-POS 1
Neu Spam über Frage zum Artikel User helfen Usern - Fragen zu JTL-Wawi 10
Neu Wie kann ich über eigene Felder eine Mehrfachauswahl erstellen? User helfen Usern - Fragen zu JTL-Wawi 4
Neu jtl.evo.js über Child Template anpassen. Geht das? Technische Fragen zu Plugins und Templates 6
Amazon Angebote über JTL schließen JTL-Wawi 1.6 0
Neu Permanenten Excel-Log über Workflow führen User helfen Usern - Fragen zu JTL-Wawi 2
WaWi Bestellung über Amazon erfüllen lassen - FBA Bestände werden nicht angezeigt Amazon-Anbindung - Ideen, Lob und Kritik 2
Artikelverkauf über JTL-Shop mit Bestand 0 in der JTL WaWi JTL-Wawi 1.9 13
Neu IDeal Zahlung über Paypal und Bestellung nicht erhalten. Geld aber abgebucht.... Allgemeine Fragen zu JTL-Shop 2
Wawi unsanft täglich beenden über CMD Taskkill JTL-Wawi 1.8 1
Neu Amazon Bestellung über JTL stornieren Amazon-Anbindung - Fehler und Bugs 2

Ähnliche Themen