Unsere Ausgangslage:
In einer zunehmend digitalisierten Welt ist es für Händler und Verkäufer essentiell, ihre Geschäftsprozesse zu optimieren und zu vereinfachen. Die Ausgangslage für unser Projekt war die Erkenntnis, dass die JTL-WaWi, eine weit verbreitete Warenwirtschaftssoftware, in Bezug auf die Abwicklung von Pfandartikeln Optimierungspotential bot. Viele Händler und Verkäufer möchten ihren Kunden Pfandartikel anbieten, stehen jedoch vor Herausforderungen bei der Integration dieses Prozesses in ihre bestehenden Systeme. Um dies zu erleichtern, haben wir uns das Ziel gesetzt, die JTL-WaWi mit einem Workflow für Pfandpositionen zu ergänzen und somit den Workflow für alle beteiligten Parteien zu optimieren.
Vorraussetzungen:
Die erforderlichen Voraussetzungen umfassen die JTL WaWi Version 1.6.
Einrichtung & Installation:
Zunächst ist es erforderlich, zwei Funktionsattribute anzulegen. Diese Attribute sind wesentliche Elemente, die benötigt werden, um bestimmte Funktionen oder Eigenschaften eines Artikels oder einer Dienstleistung zu definieren. Die korrekte Definition dieser Attribute ist entscheidend für die spätere Verwendung der JTL-WaWi, da sie die Grundlage für die Steuerung verschiedener Aspekte des Workflows bilden. Bitte stellen Sie sicher, dass diese Schritte sorgfältig durchgeführt werden, um die optimale Funktionalität des Systems zu gewährleisten.
Hierzu navigieren Sie zu Artikel -> Attribute und legen hier 2 Funktionsattribute an. In unserem Fall haben wir diese Pfand und Pfand_Name genannt

Hierbei sollte Pfand_Name ein Kurztext- und Pfand eine Dezimalzahl-Feld sein.
Im Anschluss öffnen Sie das SQL-Managementstudio und stellen eine Verbindung zur Datenbank her, wobei Sie sicherstellen, dass Sie im betroffenen Mandanten arbeiten. Innerhalb dieses Mandantenbereichs führen Sie dann den nachfolgenden SQL-Code aus. Es ist wichtig, dass Sie in dem spezifischen Mandanten arbeiten, für den die Änderungen vorgenommen werden sollen, um sicherzustellen, dass die Änderungen korrekt angewendet werden und keine unbeabsichtigten Auswirkungen auf andere Bereiche der Datenbank haben.
Bitte beachten Sie jedoch, dass Sie den folgenden Abschnitt anpassen müssen, bevor Sie den SQL-Befehl ausführen:
DECLARE @DBDepositName VARCHAR(155) = 'Pfand_Name';
DECLARE @DBDepositValueName VARCHAR(155) = 'Pfand';
DECLARE @DBDepositValueIsNet INT = 0;
--Copyright (c) 2023 Tobias Poeschl (Aventux)
--Jede Person, die eine Kopie der Software und der dazugehörigen Dokumente (im Folgenden "Software" genannt) bekommt, wird hierdurch gratis die Berechtigung gewährt, mit der Software in jeglicher Weise zu verfahren, das beinhaltet unter anderem das Recht zur Nutzung, Vervielfältigung, Abwandlung, Vereinigung, Veröffentlichung, Verbreitung, Unterlizensierung und/oder Verkauf von Kopien der Software, sowie das Recht, solche Handlungen anderen zu erlauben, unter den nachstehenden Konditionen:
--Der obige Hinweis zum Urheberrecht sowie der Hinweis zur Genehmigung müssen in allen Kopien oder signifikanten Anteilen der Software vorhanden sein.
IF EXISTS(SELECT 1 FROM sys.procedures WHERE Name = 'spPfandpositionenErstellen')
DROP PROCEDURE CustomWorkflows.spPfandpositionenErstellen
GO
CREATE PROCEDURE CustomWorkflows.spPfandpositionenErstellen @kAuftrag INT AS
BEGIN
DECLARE @DBDepositName VARCHAR(155) = 'Pfand_Name'; -- Mit den korrekten Attribut-Namen für den Pfandnamen ersetzen
DECLARE @DBDepositValueName VARCHAR(155) = 'Pfand'; -- Mit den korrekten Attribut-Namen für den Pfandwert ersetzen
DECLARE @DBDepositValueIsNet INT = 0; -- 0 = Falsch; 1 = Wahr - Setzen ob die Preise in dem Pfandwert Netto sind
DECLARE @CurrentID INT;
DECLARE @MaxID INT;
DECLARE @CurrentArtikelID INT;
DECLARE @HasDeposit INT;
SELECT
@CurrentID = MIN(kAuftragPosition),
@MaxID = MAX(kAuftragPosition)
FROM Verkauf.tAuftragPosition
WHERE kAuftrag = @kAuftrag;
WHILE @CurrentID <= @MaxID
BEGIN
DECLARE @DepositName VARCHAR(155);
DECLARE @MwSt DECIMAL(10, 2);
DECLARE @HasDepositPosition INT;
DECLARE @DepositPositionCount INT;
DECLARE @Quantity DECIMAL(15, 0);
DECLARE @PositionType INT;
DECLARE @HighestSort INT;
DECLARE @cArtNr VARCHAR(155);
SET @cArtNr = (SELECT cArtNr
FROM Verkauf.tAuftragPosition
WHERE kAuftragPosition = @CurrentID AND kAuftrag = @kAuftrag);
SET @CurrentArtikelID = (SELECT kArtikel
FROM Verkauf.tAuftragPosition
WHERE kAuftragPosition = @CurrentID AND kAuftrag = @kAuftrag);
SET @Quantity = (SELECT fAnzahl
FROM Verkauf.tAuftragPosition
WHERE kAuftragPosition = @CurrentID AND kAuftrag = @kAuftrag);
SET @PositionType = (SELECT nType
FROM Verkauf.tAuftragPosition
WHERE kAuftragPosition = @CurrentID AND kAuftrag = @kAuftrag);
SET @HighestSort = (SELECT MAX(nSort) + 1 as highest_nSort
FROM Verkauf.tAuftragPosition
WHERE kAuftrag = @kAuftrag)
-- Prüfen, ob ArtNr nicht leer ist
IF @cArtNr IS NOT NULL
BEGIN
-- Prüfen, ob die Position ein Produkt ist
IF @PositionType = 1
BEGIN
SET @DepositName = (SELECT cWertVarchar FROM tArtikelAttributSprache
JOIN tArtikelAttribut on tArtikelAttribut.kArtikelAttribut = tArtikelAttributSprache.kArtikelAttribut
JOIN tattribut on tattribut.kAttribut = tArtikelAttribut.kAttribut
JOIN tAttributSprache on tAttributSprache.kAttribut = tattribut.kAttribut
WHERE tArtikelAttribut.kArtikel = @CurrentArtikelID
AND tAttributSprache.cName = @DBDepositName);
-- Prüfen, ob DepositName nicht leer ist
IF @DepositName IS NOT NULL
BEGIN
DECLARE @DepositAmount DECIMAL(15, 2);
SET @DepositAmount = (SELECT fWertDecimal FROM tArtikelAttributSprache
JOIN tArtikelAttribut on tArtikelAttribut.kArtikelAttribut = tArtikelAttributSprache.kArtikelAttribut
JOIN tattribut on tattribut.kAttribut = tArtikelAttribut.kAttribut
JOIN tAttributSprache on tAttributSprache.kAttribut = tattribut.kAttribut
WHERE tArtikelAttribut.kArtikel = @CurrentArtikelID
AND tAttributSprache.cName = @DBDepositValueName);
-- Den MwSt. Satz für das aktuelle Produkte setzen
SET @MwSt = (SELECT fMwSt FROM Verkauf.tAuftragPosition
WHERE kAuftragPosition = @CurrentID AND kAuftrag = @kAuftrag)
SET @DepositPositionCount = (SELECT COUNT(kAuftragPosition) FROM Verkauf.tAuftragPosition WHERE cName = @DepositName AND kAuftrag = @kAuftrag AND fMwSt = @MwSt);
-- Prüfen ob der Pfandwert bereits in Netto hinterlegt wurde und ob ein MwSt. Satz vorhanden ist
IF @DBDepositValueIsNet = 0 AND @MwSt != 0
BEGIN
SET @DepositAmount = @DepositAmount / ((@MwSt / 100) + 1);
END;
-- Prüfen, ob bereits eine Pfandposition mit demselben Namen und demselben Betrag existiert
IF @DepositPositionCount = 1
BEGIN
UPDATE Verkauf.tAuftragPosition
SET fAnzahl = fAnzahl + @Quantity, nSort = @HighestSort
WHERE cName = @DepositName
AND kAuftrag = @kAuftrag
AND nType = 0;
END
ELSE
BEGIN
INSERT INTO Verkauf.tAuftragPosition (kArtikel, kAuftrag, fVkNetto, fAnzahl, cName, nType, fMwSt, nSort) VALUES (0, @kAuftrag, @DepositAmount, @Quantity, @DepositName, 0, @MwSt, @HighestSort)
END;
-- Stored Procedure [Verkauf].[TYPE_spAuftragEckdatenBerechnen] ausführen
DECLARE @Auftrag [Verkauf].[TYPE_spAuftragEckdatenBerechnen]
INSERT INTO @Auftrag(kAuftrag)
SELECT tAuftrag.kAuftrag
FROM Verkauf.tAuftrag
WHERE tAuftrag.kAuftrag = @kAuftrag
EXEC [Verkauf].[spAuftragEckdatenBerechnen] @Auftrag
END;
END;
END;
SET @CurrentID = @CurrentID + 1;
END;
END
GO
EXEC CustomWorkflows._CheckAction 'spPfandpositionenErstellen'
GO
EXEC CustomWorkflows._SetActionDisplayName 'spPfandpositionenErstellen', 'Pfandpositionen kalkulieren'
GO
Sie haben nun die Möglichkeit, die erstellte Aktion wie gewohnt direkt als Ereignis im Workflow auszuwählen:

Abschließend möchten wir betonen, dass wir nicht nur bei der Integration von Workflows, sondern auch bei weiteren individuellen Lösungen im Zusammenhang mit der JTL-WaWi gerne zur Verfügung stehen. Unser Expertenteam ist stets bereit, Sie bei der Optimierung Ihrer Geschäftsprozesse zu unterstützen und maßgeschneiderte Lösungen für Ihr Unternehmen zu entwickeln. Zögern Sie nicht, uns zu kontaktieren, wir freuen uns darauf, Sie bei Ihren Herausforderungen zu unterstützen.