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

Manuel Pietzsch

JTL-Wawi
Mitarbeiter
2. Januar 2012
2.851
1.015
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.851
1.015
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
133
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
371
61
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
371
61
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
136
8
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
210
14
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
471
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
210
14
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
65
@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 Kunden aus Wawi nicht auffindbar JTL-POS - Fehler und Bugs 4
Debitorennummern für bestehende und neue Kunden anlegen JTL-Wawi 1.8 2
Neu PayPal Checkout: Kunden verwirrt wegen Zahlungsart Name Plugins für JTL-Shop 0
In Diskussion Kunden-Sammelkarte JTL-POS - Ideen, Lob und Kritik 1
Neu Ansprechpartner mit mehreren E-Mails Adressen in den Kunden User helfen Usern - Fragen zu JTL-Wawi 1
Neu Lieferscheine digital unterschreiben und automatisch an Kunden senden Eigene Übersichten in der JTL-Wawi 1
Workflow Auftraqspositionen per Email an Kunden senden JTL-Wawi 1.7 3
Neu Ist es möglich per Ameise Kunden zu löschen? Arbeitsabläufe in JTL-Wawi 2
Neu Benutzerrechte bei Kunden einsicht User helfen Usern - Fragen zu JTL-Wawi 1
Neu Download-Arikel werden im Backend des Kunden nicht angezeigt JTL-Shop - Fehler und Bugs 1
Neu Bilder unter "Mehr dieser Waregruppe" und "Kunden, die diesen Artikel gekauft haben, kauften auch" fehlen eBay-Designvorlagen - Fehler und Bugs 0
GLN-Nummer beim Kunden hinterlegen JTL-Wawi 1.8 3
In Bearbeitung Datev-Export - Kunden oder Debitorennummer statt Sammelkonto Allgemeine Fragen zu JTL-POS 3
Neu Berechtigung auf Kunden setzen? Starten mit JTL: Projektabwicklung & Migration 5
Neu Wunschzettel von Kunden einsehen - Angebot erstellen Allgemeine Fragen zu JTL-Shop 1
Neu Alle Kunden auf einmal übertragen Onlineshop-Anbindung 1
Neu keine Zahlung vom Kunden -- Auftrag stornieren oder löschen? Gelöste Themen in diesem Bereich 3
Neu Amazon -> EU-Lieferung mit UstID vom Kunden Amazon-Anbindung - Fehler und Bugs 0
Kunden Kontakt - EBay Nachrichten. JTL-Wawi App 0
Dropshipping-Auftrag und Lieferschein geht an Kunden JTL-Wawi 1.8 6
Artikel mit verschiedenen Kunden-Artikelnummern anlegen JTL-Wawi 1.7 2
Statistik über ALLE Kunden mit Umsatz JTL-Wawi 1.6 1
Verschiedene Rabatte für einen Kunden anlegen JTL-Wawi 1.8 2
Neu Exportformate - Zeitstempel Datei automatisiert erstellen Betrieb / Pflege von JTL-Shop 1
Neu Track & Trace - Auslandssendungen automatisiert als PDF exportieren, bevor die Logs gelöscht werden. JTL-Track&Trace - Ideen, Lob und Kritik 0
Neu Bestellungen importieren über SFTP Server User helfen Usern - Fragen zu JTL-Wawi 0
Neu Exportformate neu über alles Allgemeine Fragen zu JTL-Shop 0
Neu Rechner über Nacht runter fahren? User helfen Usern - Fragen zu JTL-Wawi 11
JTL Shop Gutscheine über JTL-Vouchers erstellen Allgemeine Fragen zu JTL-Vouchers 1
Neu JTL Shop Gutscheine über JTL-Vouchers erstellen Allgemeine Fragen zu JTL-Shop 0
Neu Freitextfeld über Variation - Zeichenbeschränkung für Gravur Allgemeine Fragen zu JTL-Shop 8
In Bearbeitung Artikel über csv-Datei bearbeiten und importieren Allgemeine Fragen zu JTL-POS 3
Neu Verordnung über die allgemeine Produktsicherheit (GPSR) JTL-Wawi - Ideen, Lob und Kritik 0
Neu Kundenpreise in Artikelübersicht (über Umwege)? Arbeitsabläufe in JTL-Wawi 0
Neu Verbindungsproblem Wawi (1.8.12.0) zum JTL-Shop (5.2.4) über localhost User helfen Usern - Fragen zu JTL-Wawi 0
Auftragsimport über eBay - Bezeichnung der Versandart auf der Rechnung leer JTL-Wawi 1.8 1
Wie kann ich eine Benachrichtigung bei einem Wareneingang auslösen mit einer Mail über die Artikel die eingebucht wurden JTL-Wawi 1.8 2
Artikel wurden über Weclapp über FFN-Connect an JTL FFN übermittelt jedoch leider nicht an Wawi & WMS JTL-Wawi 1.8 0
Gutschrift über einen Set-Artikel JTL-Wawi 1.7 0
Teilrechnung Erstellen über/nach Packtisch+ JTL-Wawi 1.8 1
Neu SCSS-Datei bearbeiten über FTP Allgemeine Fragen zu JTL-Shop 6
Neu Email Versand über OAuth JTL-Wawi - Ideen, Lob und Kritik 2
Neu Informationspflicht über Sicherstellung der Echtheit von Kundenbewertungen Business Jungle 5
Neu SQL Abfrage über ODBC für Bewegunghistorie (WMS) Eigene Übersichten in der JTL-Wawi 4
Neu PayPal - Benachrichtungen über Zahlung -> EMail. Wo kann man den Betreff bearbeiten? User helfen Usern - Fragen zu JTL-Wawi 6
Neu Mails über Microsoft 365 User helfen Usern - Fragen zu JTL-Wawi 17
Neu Verkaufte Stückzahl pro Artikel über Ameise ausgeben JTL Ameise - Eigene Exporte 1
Neu Anbindung kaufland und Otto über JTL 1.7.15.4 noch möglich? User helfen Usern - Fragen zu JTL-Wawi 1
Neu Artikelname für WMS über Ameise importieren JTL-Ameise - Fehler und Bugs 6
Positionen alle auf einmal z.B über csv in einen bestehenden Auftrag einfügen JTL-Wawi 1.8 2

Ähnliche Themen