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

Manuel Pietzsch

JTL-Wawi
Mitarbeiter
2. Januar 2012
2.731
931
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 -%}
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"

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:

swopper-shop

Gut bekanntes Mitglied
10. Mai 2010
201
13
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.731
931
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
122
7
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?
 

Truckstyler

Sehr aktives Mitglied
15. Oktober 2010
278
36
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

Mitglied
6. April 2021
2
2
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.
 

Truckstyler

Sehr aktives Mitglied
15. Oktober 2010
278
36
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:

Manuel Pietzsch

JTL-Wawi
Mitarbeiter
2. Januar 2012
2.731
931
Hückelhoven
Hi,

bisher hab ich hier nur gutes Feedback gelesen. Ich denke wenn die Feiertage durch sind komm ich dazu und werde die bisherige Lösung auf ein neues Level bringen mit eurem Input.

Danke und Gruß

Manuel
 

urmelimurlaub

Gut bekanntes Mitglied
14. August 2013
127
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
205
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
446
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
205
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
256
58
@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 PAN-EU deaktiviert - Amazon versendet seit 02.02. aus nicht-deutschen Standorten an Kunden Business Jungle 1
Neu Profifrage Steuereinstellungen Wawi Sonderfall ES, PL, IT: B2B mit lokaler UST-ID des Kunden User helfen Usern - Fragen zu JTL-Wawi 7
Kein Import von neu angelegten Kunden im JTL Shop5? JTL-Wawi 1.6 0
Datensatz über eine Liste von Kunden (bestimmte Kundengruppe) exportieren? JTL-Wawi 1.6 1
Neu Kunden werden doppelt angezeigt User helfen Usern - Fragen zu JTL-Wawi 1
Neu Kunden nachträglich mit Blowfish-Key entschlüsseln Installation / Updates von JTL-Shop 4
Neu Amazon - bei einem Kunden fehlt immer die Firma User helfen Usern - Fragen zu JTL-Wawi 2
Neu ehemaligen Kunden auf inaktiv setzen User helfen Usern - Fragen zu JTL-Wawi 1
Neu Aufträge importieren/ Kunden mit email finden JTL-Ameise - Fehler und Bugs 0
Neu Den Kunden direkt aus JTL anrufen User helfen Usern - Fragen zu JTL-Wawi 1
Neu Gesperrte Kunden werden nicht rot hinterlegt JTL-Wawi - Fehler und Bugs 0
Neu Gesperrte Kunden werden nicht rot hinterlegt JTL-Wawi - Fehler und Bugs 0
Neu vorausichtliches Lieferdatum wird nicht an den Shop / an die Kunden übertragen JTL-Shop - Fehler und Bugs 0
Neu FFN-Kunden Abrechnungsposition im laufenden Monat Arbeitsabläufe in JTL-Wawi 4
Neu JTL-Shop "Zugehörigkeit" von Kunden per Ameise ändern/anpassen? JTL Ameise - Eigene Exporte 2
Neu Kunden zu als FFN Kunden abrechnen User helfen Usern - Fragen zu JTL-Wawi 0
Neu Pakete in die Schweiz schicken, für deutschen Kunden Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 0
Kunden automatisch aktivieren JTL-Wawi 1.6 0
Neu Eigene Übersichten unter Kunden: externe Rechnungen Individuelle Listenansichten in der JTL-Wawi 0
Neu Featurerequest: Eigene Felder Kunden als Bedingung in Packtisch+/WMS-Ausgabe JTL-Wawi - Ideen, Lob und Kritik 0
Neu Shopware 6 - Kundendaten-Abgleich hängt in Schleife, immer gleiche Kunden werden importiert Shopware-Connector 5
Ameise Kunden Stammdatenimport - Aktualisierenden Kunden anhand von JTL-Wawi 1.6 1
Erweiterte Eigenschaften zur Kunden Bestimmung JTL-Wawi 1.6 2
Neu Kunden mit Onlineshop verknüpfen User helfen Usern - Fragen zu JTL-Wawi 1
Kunden Label setzten, Workflow JTL-Wawi 1.6 0
Neu Artikel darf nur bestimme Kunden kaufen Allgemeine Fragen zu JTL-Shop 0
Neue Funktion: Vereinfachte Stornierung für Kunden kaufland.de - Anbindung (SCX) 6
Adress-Chaos: Kunden mit vielen Lieferadressen können nie wieder REadr = LIeferAdr werden JTL-Wawi 1.6 4
Neu Bestimmte Kunden Daten download / Plattform User helfen Usern - Fragen zu JTL-Wawi 0
Neu Rabatt auf Kategorie ab Mindestbestellwert für Kunden im Ausland Allgemeine Fragen zu JTL-Shop 0
Neu fehlende Verknüpfung WaWi Kunden Woocommerce Kunden JTL-Wawi - Fehler und Bugs 0
Neu keine Ausgabe der Kunden / Käufer E-Mail Adresse Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
Neu Ameise Rechnungsdaten Export Kunden USt. ID für IGL Lieferungen JTL Ameise - Eigene Exporte 2
Neu Artikelbundle-Empfehlungen - Wenn Bundle nicht verfügbar, kommen Kunden verwirrende Einblendungen JTL-Shop - Fehler und Bugs 0
Neu im Kunden menu "nachricht senden" vorgefertigte vorlagen fehlermeldung kein email empfänger JTL-Wawi - Ideen, Lob und Kritik 0
Neu Alle Kunden aus JTL Shop 5 nach Shopware 6 exportieren Shopware-Connector 1
Was ist die beste Vorgehensweise um Kunden & Aufträge in einem Mandanten zu löschen? JTL-Wawi 1.6 2
JTL Wawi Abgleich, kein Import von Kunden und Bestellungen JTL-Wawi 1.6 0
Neu Servicedesk Suchfunktion Kunden (WaWi 1.6.43.1) Servicedesk (Beta) 3
Neu Kann ein Workflow automatisiert bestimmte Textpassagen in Artikelbeschreibungen ersetzen? User helfen Usern - Fragen zu JTL-Wawi 8
Produktetiketten automatisiert als PDF drucken und benennen JTL-Wawi 1.6 1
Offen Vesandlabel (von DHL) - Dateinamen automatisiert vergeben JTL-ShippingLabels - Ideen, Lob und Kritik 0
URL Struktur von Kategorien automatisiert anpassen Einrichtung JTL-Shop5 2
Neu Pickliste pro lager automatisiert erstellen Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 0
Neu DHL-Retourenetiketten (Ausland) automatisiert über JTL-WaWi JTL-ShippingLabels - Fehler und Bugs 1
Neu JTL Wawi Cloud über Microsoft Remote Desktop Etiketten Drucker mit Brother QL-800 User helfen Usern - Fragen zu JTL-Wawi 8
Neu Bild in Beschreibung einfügen? nur über Bild-Link? User helfen Usern - Fragen zu JTL-Wawi 0
Neu Mediendateien-URL über ameise Import nicht prüfen JTL-Ameise - Ideen, Lob und Kritik 4
Neu Amazon Pay Version 2 über API-Schnittstelle anbinden - Wozu? User helfen Usern - Fragen zu JTL-Wawi 0
Neu Statistik über alle Verkauften Artikel im letzten Jahr User helfen Usern - Fragen zu JTL-Wawi 1

Ähnliche Themen