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

AMZ-FUX

Aktives Mitglied
23. September 2020
8
2
Seit wir auf die 1.5.53 gewechselt sind, bekommen Kunden auch wenn alles ab Lager lieferbar ist Mails, wo die Tabelle mit den lieferbaren und den fehlenden Artikeln dann aber komplett leer ist. Also eine unsinnige Mail "folgende Artikel sind im Moment noch nicht lieferbar: leer" usw. Nicht alle Kunden bekommen das, es sind aber auch keine Einzelfälle. Hat das noch jemand?
Ich habe die bestehende Abfrage ("Eintreffende Lieferungen gleich 0") auch mal mit dem Update aus dem Eingangspost aktualisiert. Ändert hier nichts - der Fehler tritt weiterhin auf. Wir nutzen (aus anderen, internen Gründen) kein FiFo. Workflow hatte aber zuvor dennoch passend funktioniert für uns mit einer minimalen Anpassung.
So ist es natürlich nicht mehr brauchbar. Müssen in 1.5.53.2 eventuell Variablen anders benannt werden oder ähnliches?
 

Manuel Pietzsch

JTL-Wawi
Mitarbeiter
2. Januar 2012
2.851
1.017
Hückelhoven
Seit wir auf die 1.5.53 gewechselt sind, bekommen Kunden auch wenn alles ab Lager lieferbar ist Mails, wo die Tabelle mit den lieferbaren und den fehlenden Artikeln dann aber komplett leer ist. Also eine unsinnige Mail "folgende Artikel sind im Moment noch nicht lieferbar: leer" usw. Nicht alle Kunden bekommen das, es sind aber auch keine Einzelfälle. Hat das noch jemand?
Ich habe die bestehende Abfrage ("Eintreffende Lieferungen gleich 0") auch mal mit dem Update aus dem Eingangspost aktualisiert. Ändert hier nichts - der Fehler tritt weiterhin auf. Wir nutzen (aus anderen, internen Gründen) kein FiFo. Workflow hatte aber zuvor dennoch passend funktioniert für uns mit einer minimalen Anpassung.
So ist es natürlich nicht mehr brauchbar. Müssen in 1.5.53.2 eventuell Variablen anders benannt werden oder ähnliches?

Hi,

ja genau. Bitte den Code aus dem ersten Beitrag kopieren, der hat sich geändert.

Gruß

Manuel
 

Manuel Pietzsch

JTL-Wawi
Mitarbeiter
2. Januar 2012
2.851
1.017
Hückelhoven
Hatte ich bereits gemacht - leider gab es dadurch jedoch keine Änderung am fehlerhaften Verhalten.

Hi nochmal,

"Hatte ich bereits gemacht" <- das hat sich evtl. überschnitten, ich hab parallel mit einem Kunden das gleiche Problem korrigiert. Hast du nach meiner Bitte den Code zu kopieren nochmal den aktuellen Code genommen?
Wenn du das gemacht hast und das Problem nach wie vor besteht, dann schreib mir ne PN mit Kontaktdaten (E-Mail, Telefon), dann schauen wir mal zusammen drauf.

Gruß
Manuel
 

prmsprt

Aktives Mitglied
17. Oktober 2013
16
0
Hi zusammen,


Kann mir jemand einen Tipp geben, wie ich Artikel aus bestimmten Kategorien aus der Mail ausschließen kann?


Vielen Dank
 

led-profi

Aktives Mitglied
10. März 2011
19
0
Hallo Manuel,
danke, und tolle Sache. Gerade in der aktuellen Zeit sehr hilfreich, wo es zunehmend Lieferengpässe gibt.

Wir haben es implementiert und testen gerade. Schicken uns die Mails aktuell selbst, statt an den Kunden.
Häufig kommt vor, dass KUnden die Versandmitteilungsmails mit Trackingcode nicht bekommen, somit haben wir uns gedacht, dann ergänzen wir doch die Tabelle nach
"Folgende Artikel wurden bereits geliefert oder sind auf dem Weg:" um eine Spalte TrackingID mit TrackingURL.
Ist mir gelungen und wird auch angezeigt.
<td class="{{tg-part}}"><a href="{{ Vorgang.Lieferung.Lieferscheine.ErstesObjekt.Lieferscheine.ErstesObjekt.Pakete.ErstesObjekt.Lieferschein.Lieferscheine.ErstesObjekt.PositionenAlle.ErstesObjekt.Lieferschein.Pakete.ErstesObjekt.TrackingURL }}">{{ Vorgang.Lieferung.Lieferscheine.ErstesObjekt.Lieferscheine.ErstesObjekt.Pakete.ErstesObjekt.TrackingID }}</a></td>

Funktioniert aber leider nur, so die Positionen nur einer Sendung zuordenbar ist. Da wir viel Dropshippen sollten dann die IDs aus den versch. Lieferungen stehen.

Gibt es ein Möglichkeit hier mit Angabe und abhängig der Lieferscheinnummer den zugehörigen Trackingcode jeweilig zu den Positionen anzuzeigen.

Freue mich über Vorschläge.
besten Dank in die Runde und insbesondere an Manuel.
vg Tom
 

Manuel Pietzsch

JTL-Wawi
Mitarbeiter
2. Januar 2012
2.851
1.017
Hückelhoven
Hi zusammen,


Kann mir jemand einen Tipp geben, wie ich Artikel aus bestimmten Kategorien aus der Mail ausschließen kann?


Vielen Dank
Hi,

ich hab folgendes grade eingebaut. Dazu einfach vom ersten Thread nochmal kopieren:
  • Artikel ausschließen: Mit dem eigenen Feld "LieferverzögerungKeineMail" vom Typ Checkbox können Artikel jetzt aus dem Mailing ausgeschlossen werden.
Gruß

Manuel
 
  • Gefällt mir
Reaktionen: prmsprt

Manuel Pietzsch

JTL-Wawi
Mitarbeiter
2. Januar 2012
2.851
1.017
Hückelhoven
Hallo Manuel,
danke, und tolle Sache. Gerade in der aktuellen Zeit sehr hilfreich, wo es zunehmend Lieferengpässe gibt.

Wir haben es implementiert und testen gerade. Schicken uns die Mails aktuell selbst, statt an den Kunden.
Häufig kommt vor, dass KUnden die Versandmitteilungsmails mit Trackingcode nicht bekommen, somit haben wir uns gedacht, dann ergänzen wir doch die Tabelle nach
"Folgende Artikel wurden bereits geliefert oder sind auf dem Weg:" um eine Spalte TrackingID mit TrackingURL.
Ist mir gelungen und wird auch angezeigt.
<td class="{{tg-part}}"><a href="{{ Vorgang.Lieferung.Lieferscheine.ErstesObjekt.Lieferscheine.ErstesObjekt.Pakete.ErstesObjekt.Lieferschein.Lieferscheine.ErstesObjekt.PositionenAlle.ErstesObjekt.Lieferschein.Pakete.ErstesObjekt.TrackingURL }}">{{ Vorgang.Lieferung.Lieferscheine.ErstesObjekt.Lieferscheine.ErstesObjekt.Pakete.ErstesObjekt.TrackingID }}</a></td>

Funktioniert aber leider nur, so die Positionen nur einer Sendung zuordenbar ist. Da wir viel Dropshippen sollten dann die IDs aus den versch. Lieferungen stehen.

Gibt es ein Möglichkeit hier mit Angabe und abhängig der Lieferscheinnummer den zugehörigen Trackingcode jeweilig zu den Positionen anzuzeigen.

Freue mich über Vorschläge.
besten Dank in die Runde und insbesondere an Manuel.
vg Tom

Hi,

statt auf das erste Objekt zu gehen musst du mit einer Schleife über die Objekte iterieren.
Schau mal hier: https://guide.jtl-software.de/jtl-w...-beispiele-fuer-dotliquid/#schleifen-for-loop

Gruß

Manuel
 

led-profi

Aktives Mitglied
10. März 2011
19
0
Hi,

statt auf das erste Objekt zu gehen musst du mit einer Schleife über die Objekte iterieren.
Schau mal hier: https://guide.jtl-software.de/jtl-w...-beispiele-fuer-dotliquid/#schleifen-for-loop

Gruß

Manuel
Hallo Manuel,
Danke, ich schaue es mir an. Hab nur leider wenig bis keine Programmierkenntnisse (Studium 30 Jahre zurück Turbo Pascal, thats all). Vielleicht gelingt es mir aus den Beispielen und bestehendem Code das herumzubauen. Wird sicherlich eine zeitaufwendige Herausforderung. Ich verstehe, dass es hierum geht diesem Programmabschnitt eine laufende Variable mitzugeben, die dann jeweilig den passenden Trackingcode abfragt.
Vielleicht ist das aber auch für andere interessant und du hast ein paar Minuten deiner Zeit, dann wäre schön, wenn du die Lösung gleich hier posten könntest. Herzlichen Dank, und ansonsten warte ich auf das nächste verregnete Wochenende. :)
hg Tom
 

OPUS

Gut bekanntes Mitglied
11. Juni 2019
121
13
Servus,
kann man diese Lösung auch auf Dropshipping erweitern?
Wir haben leider ab und zu das Problem dass unsere Lieferanten nicht sofort liefern können. dann wäre es hilfreich wenn auch in diesem Fall der Kunde informiert werden könnte.

ciao

Harry
 

A.l.e.x

Aktives Mitglied
5. November 2020
17
0
Hallo Manuel,

kann man auch Freipositionen ausschließen ?

Also der Kunde der die Lieferzeitinfo erhält soll nur eine Info über die angelegten Artikel aber nicht für Freipositionen bekommen.

Ist das möglich ?
 

A.l.e.x

Aktives Mitglied
5. November 2020
17
0
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ß:

Den Anhang 70062 betrachten

1. Die erweiterte Eigenschaft "EintreffendeLieferungen":

Den Anhang 63742 betrachtenDen Anhang 63745 betrachten

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

Den Anhang 63748 betrachten

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

Den Anhang 63751 betrachten
Code:
{{ Vorgang.Stammdaten.Auftragsnummer }} - Lieferung verzögert sich

4. Der Inhalt / Text der E-Mail

Den Anhang 63754 betrachten


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 -%}
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 -%}
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
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
{% 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 -%}
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
JOIN dbo.tLieferscheinpos ON tbestellpos.kBestellPos = tLieferscheinpos.kBestellPos
JOIN dbo.tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
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
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"

Den Anhang 63757 betrachten

Manueller WF "Lieferverzögerungen mitteilen"

Den Anhang 63760 betrachten

Workflow "Lieferverzögerungen mitteilen" bei Auftragserstellung

Den Anhang 63763 betrachten

Hier meine eigenen Felder:

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

Den Anhang 63766 betrachten

Kunde

Den Anhang 63769 betrachten





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

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ß:

Den Anhang 70062 betrachten

1. Die erweiterte Eigenschaft "EintreffendeLieferungen":

Den Anhang 63742 betrachtenDen Anhang 63745 betrachten

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

Den Anhang 63748 betrachten

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

Den Anhang 63751 betrachten
Code:
{{ Vorgang.Stammdaten.Auftragsnummer }} - Lieferung verzögert sich

4. Der Inhalt / Text der E-Mail

Den Anhang 63754 betrachten


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 -%}
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 -%}
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
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
{% 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 -%}
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
JOIN dbo.tLieferscheinpos ON tbestellpos.kBestellPos = tLieferscheinpos.kBestellPos
JOIN dbo.tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
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
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"

Den Anhang 63757 betrachten

Manueller WF "Lieferverzögerungen mitteilen"

Den Anhang 63760 betrachten

Workflow "Lieferverzögerungen mitteilen" bei Auftragserstellung

Den Anhang 63763 betrachten

Hier meine eigenen Felder:

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

Den Anhang 63766 betrachten

Kunde

Den Anhang 63769 betrachten





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
Hey Manuel,

es ist so das wir ein zweites Lager eines Lieferanten in unserem Artikelbestand mitanzeigen, leider erkennt der Workflow diese Artikel icht als lieferbar an.

Gibt es hier eine Möglichkeit den Workflow so einzustellen das dieser das Lager erkennt ?
 

A.l.e.x

Aktives Mitglied
5. November 2020
17
0
@Manuel Pietzsch kann man in dem Workflow einbauen das man ein weiteres Lager berücksichtigt ?

Wir haben ein Lieferantenlager welches zu unserem bestand hinzugefügt wird, diese Artikel sollen als lieferbar bzw. reserviert ausgeworfen werden, wie kann ich das in dem Workflow umsetzen ?
 

Spower

Gut bekanntes Mitglied
2. Dezember 2009
101
2
Hallo,

ich verzweifele momentan an dem Workflow, er hat eine Zeit lang funktioniert und seit 3 Monaten bekomme ich den nicht mehr auf die Kette und es fängt an in einem Chaos zu enden.
Im Anhang sind meine Einstellungen zum Workflow..ich finde einfach den Fehler nicht.

Bitte um Hilfe.
 

Anhänge

  • work1.JPG
    work1.JPG
    95,3 KB · Aufrufe: 25
  • work2.JPG
    work2.JPG
    124,4 KB · Aufrufe: 25
  • work3.JPG
    work3.JPG
    141,5 KB · Aufrufe: 20
  • work4.JPG
    work4.JPG
    162,6 KB · Aufrufe: 25

webstar

Sehr aktives Mitglied
10. Dezember 2007
573
33
Hallo Manuel,

danke für die Mühe mit diesem tollen Workflow.
Ich hätte noch zwei Erweiterungsvorschläge die eventuell auch andere interessieren könnte:
1) Bei einer Verzögerung wäre es sinnvoll, dass sich das voraussichtliche Lieferdatum des Auftrags entsprechend ändert (sinnvollerweise auf den Termin des Artikels mit der längsten Lieferzeit)
2) Die Mail könnte erweitert werden, um Artikel die gar nicht mehr lieferbar sind (Artikel ohne Lieferanten) so spart man sich eine separate Mail den Kunden hierüber zu informieren.

MfG
webstar
 

wwwSANPROde

Aktives Mitglied
26. August 2013
2
0
Hallo Zusammen,
wir sind gerade dabei den Workflow für uns etwas anzupassen. Leider stoßen wir auch Probleme bei der Anzeige der reservierten Artikel. Hier funktioniert das ausschließen der Artikel gar nicht über das Checkbox-Feld im Artikelstamm.
Unsere Kunden würden somit Informationen zu Platzhalter-Artikeln erhalten, was wir gerne vermeiden würden.

Steht oder stand jemand vor einem ähnlichen Problem und hat vielleicht einen Lösungsansatz?

Danke euch vorab.
 

Manuel Pietzsch

JTL-Wawi
Mitarbeiter
2. Januar 2012
2.851
1.017
Hückelhoven
Hallo Zusammen,
wir sind gerade dabei den Workflow für uns etwas anzupassen. Leider stoßen wir auch Probleme bei der Anzeige der reservierten Artikel. Hier funktioniert das ausschließen der Artikel gar nicht über das Checkbox-Feld im Artikelstamm.
Unsere Kunden würden somit Informationen zu Platzhalter-Artikeln erhalten, was wir gerne vermeiden würden.

Steht oder stand jemand vor einem ähnlichen Problem und hat vielleicht einen Lösungsansatz?

Danke euch vorab.
Hi,

wichtig ist die exakt gleiche Benennung des Feldes. Im SQL siehst du welches eigene Feld da abgefragt wird. Sollte genauso heißen.

Gruß

Manuel
 
Ähnliche Themen
Titel Forum Antworten Datum
Aufträge zusammenfassen - Bestellnummern des Kunden werden nicht übernommen JTL-Wawi 1.8 1
JTL Shop Kreditkartenzahlung erneut an Kunden senden Allgemeine Fragen zu JTL-Shop 0
Kunden und Artiekl ausblenden JTL-Wawi App 1
Beantwortet Keine Umstatzsteuer bei ausländischen Kunden Allgemeine Fragen zu JTL-Shop 7
Neu Kunden aus Wawi nicht auffindbar JTL-POS - Fehler und Bugs 5
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
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 1.8 - WMS Teillieferung soll nur Rechung über gelieferte Positionen enthalten Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 0
Verwiesen an Support BUG: Mahnlauf über Workflow ignoriert Zahlungsziel JTL-Workflows - Fehler und Bugs 3
Neu Autorisierte Zahlungen über mollie werden bei Rundungsdifferenz storniert. WooCommerce-Connector 0
Neu Kategorienbaum in einer Unterkategorie über der Filterung ausblenden Allgemeine Fragen zu JTL-Shop 1
Neu Auftragszahlung über Kasse, Auftrag wird nicht als "Verpackt und Versendet" markiert JTL-POS - Fehler und Bugs 1
Neu So ändern Sie den Status von amazon ASIN über die Importdatei in „Aktiv“. JTL Ameise - Eigene Exporte 0
Neu Einem bzw. mehreren Artikeln über den Import mehrere Kategorien zuordnen JTL-Wawi 1.7 1
Neu In Tabelle ein Bild über mehrere Zeilen verteilen in Katalog Vorlage Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
Neu Datenimport über Ameise in JTL für Shopware Shopware-Connector 1
Gelöst JTL-POS: Rechnung über Kasse Allgemeine Fragen zu JTL-POS 3
Neu Bestellungen importieren über SFTP Server User helfen Usern - Fragen zu JTL-Wawi 6
Neu Exportformate neu über alles Allgemeine Fragen zu JTL-Shop 2
Neu Rechner über Nacht runter fahren? User helfen Usern - Fragen zu JTL-Wawi 12
JTL Shop Gutscheine über JTL-Vouchers erstellen Allgemeine Fragen zu JTL-Vouchers 2
Neu JTL Shop Gutscheine über JTL-Vouchers erstellen Allgemeine Fragen zu JTL-Shop 2
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

Ähnliche Themen