Nachdem ich auf dieses Thema gestoßen bin: https://forum.jtl-software.de/threads/erinnerung-an-bevorstehende-lieferung.187237/ wollte ich ebenfalls eine Lösung für uns basteln.
Ich konnte leider keine Möglichkeit finden, alle noch offenen Aufträge mit zukünftigem Lieferdatum in einer bestimmten Zeitspanne zu finden, da immer ein einzelnes Auftragsobjekt geprüft wird in den Workflows.
Nach langem hin und her probieren, habe ich das ganze nun per direkter SQL Abfrage + Mailversand via Powershell und Windows Aufgabenplaner gelöst.
Es wäre aber schön, wenn es solch eine Möglichkeit auch WaWi nativ gäbe. Mir ist schon klar, dass es dann ein manueller Workflow dafür notwendig ist, der wieder von einem externen Tool gestartet werden muss, da Workflows für Aufträge überlicherweise einen Trigger brauchen.
Wenn jemand Interesse an der Lösung hat, dann teile ich sie hier gerne. Wird verwenden GMAIL als Mailprovider in dem Beispiel.
Ich konnte leider keine Möglichkeit finden, alle noch offenen Aufträge mit zukünftigem Lieferdatum in einer bestimmten Zeitspanne zu finden, da immer ein einzelnes Auftragsobjekt geprüft wird in den Workflows.
Nach langem hin und her probieren, habe ich das ganze nun per direkter SQL Abfrage + Mailversand via Powershell und Windows Aufgabenplaner gelöst.
Es wäre aber schön, wenn es solch eine Möglichkeit auch WaWi nativ gäbe. Mir ist schon klar, dass es dann ein manueller Workflow dafür notwendig ist, der wieder von einem externen Tool gestartet werden muss, da Workflows für Aufträge überlicherweise einen Trigger brauchen.
Wenn jemand Interesse an der Lösung hat, dann teile ich sie hier gerne. Wird verwenden GMAIL als Mailprovider in dem Beispiel.
# --- JTL DATENBANK KONFIGURATION ---
$SQLServer = "EUERSERVERNAME\JTLWAWI"
$Database = "eazybusiness"
$SQLUser = "sa"
$SQLPassword = "EUERDBPASSWORT"
# --- ZEITSPANNE FÜR DIE PRÜFUNG ---
$DaysAhead = 14
$MaxDaysOverdue = 60
# --- E-MAIL / SMTP KONFIGURATION ---
$SMTPServer = "smtp-relay.gmail.com"
$SMTPPort = 587
$MailFrom = "ABSENDEREMAIL"
$MailTo = "EMPFAENGERMAIL1 ", "EMPFAENGERMAIL2"
$SMTPUser = "ABSENDERBENUTZERNAME"
# --- GMAIL AUTHENTIFIZIERUNG ---
$secpasswd = ConvertTo-SecureString "APPPASSWORT" -AsPlainText -Force
# --- SQL ABFRAGE (Filter: Lieferdatum in den nächsten X-definierten Tagen, maximal Y-Tage über dem Datum drüber) ---
$SqlQuery = @"
SELECT
A.cAuftragsNr AS [Auftragsnummer],
ISNULL(Adr.cFirma, '') AS [Firma],
ISNULL(Adr.cName, '') + ', ' + ISNULL(Adr.cVorname, '') AS [Kunde],
CONVERT(VARCHAR(10), A.dVoraussichtlichesLieferdatum, 104) AS [Vorauss. Lieferdatum],
DATEDIFF(day, GETDATE(), A.dVoraussichtlichesLieferdatum) AS [TageRest]
FROM
Verkauf.tAuftrag A
LEFT JOIN
Verkauf.tAuftragAdresse Adr ON A.kAuftrag = Adr.kAuftrag AND Adr.nTyp = 1
WHERE
A.nStorno = 0
AND A.nKomplettAusgeliefert = 0
-- Filtert: Von minus $MaxDaysOverdue (Vergangenheit) bis plus $DaysAhead (Zukunft)
AND DATEDIFF(day, GETDATE(), A.dVoraussichtlichesLieferdatum) BETWEEN -$MaxDaysOverdue AND $DaysAhead
ORDER BY
A.dVoraussichtlichesLieferdatum ASC
"@
# Daten abrufen
$ConnectionString = "Server=$SQLServer;Database=$Database;User Id=$SQLUser;Password=$SQLPassword;Encrypt=False"
$Connection = New-Object System.Data.SqlClient.SqlConnection($ConnectionString)
$Command = New-Object System.Data.SqlClient.SqlCommand($SqlQuery, $Connection)
$DataAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($Command)
$DataTable = New-Object System.Data.DataTable
try {
$Connection.Open()
$null = $DataAdapter.Fill($DataTable)
$Connection.Close()
if ($DataTable.Rows.Count -gt 0) {
Write-Host "$($DataTable.Rows.Count) Aufträge gefunden. Bereite E-Mail vor..." -ForegroundColor Green
$HTMLRows = ""
foreach ($Row in $DataTable.Rows) {
$tageRest = [int]$Row['TageRest']
# Standard-Style für normale Zeilen
$rowStyle = ""
$statusErgaenzung = ""
# WENN DIE TAGE NEGATIV SIND -> ROT MARKIEREN
if ($tageRest -lt 0) {
$rowStyle = "style='background-color: #ffe6e6; color: #b30000; font-weight: bold;'"
$verspaetung = [math]::Abs($tageRest)
$statusErgaenzung = " <span style='font-size: 11px; color: #cc0000; font-weight: normal;'><br>⚠️ SEIT $verspaetung TAGEN ÜBERFÄLLIG</span>"
}
# HTML-Zeile zusammenbauen (Style wird dynamisch angewendet)
$HTMLRows += "<tr $rowStyle>
<td>$($Row['Auftragsnummer'])</td>
<td>$($Row['Firma'])</td>
<td>$($Row['Kunde'])</td>
<td>$($Row['Vorauss. Lieferdatum'])$statusErgaenzung</td>
</tr>"
}
# HTML-Mail-Inhalt
$MailBody = @"
<html>
<head>
<style>
table { border-collapse: collapse; width: 100%; font-family: Arial, sans-serif; margin-top: 15px; }
th { background-color: #1c64a3; color: white; padding: 10px; text-align: left; font-size: 14px; }
td { border: 1px solid #dddddd; padding: 8px; font-size: 13px; }
tr:nth-child(even) { background-color: #f9f9f9; }
body { font-family: Arial, sans-serif; color: #333333; line-height: 1.5; }
</style>
</head>
<body>
<p>Hallo SHOP-Team,</p>
<p>Folgende terminisierte Aufträge stehen zur Auslieferung an oder sind bereits <strong>überfällig</strong>. Bitte prüft die Rechnungserstellung und bereite den Versand vor:</p>
<table>
<tr>
<th>Auftragsnummer</th>
<th>Firma</th>
<th>Kunde</th>
<th>Vorauss. Lieferdatum</th>
</tr>
$HTMLRows
</table>
<br>
<p><i>Dies ist eine automatische Benachrichtigung aus der JTL-Datenbank.</i></p>
</body>
</html>
"@
$gmailCred = New-Object System.Management.Automation.PSCredential ($SMTPUser, $secpasswd)
$SendParams = @{
SmtpServer = $SMTPServer
Port = $SMTPPort
From = $MailFrom
To = $MailTo
Subject = "Erinnerung: Fällige JTL-Auslieferungen"
Body = $MailBody
BodyAsHtml = $true
Encoding = [System.Text.Encoding]::UTF8
UseSsl = $true
Credential = $gmailCred
}
Send-MailMessage @SendParams
Write-Host "E-Mail erfolgreich gesendet!" -ForegroundColor Green
} else {
Write-Host "Keine fälligen oder überfälligen Aufträge gefunden. Keine Mail gesendet." -ForegroundColor Yellow
}
}
catch {
Write-Error "Fehler beim Ablauf: $_"
}