sync4® verbindet die Warenwirtschaft SAP B1 mit Ihrem Shopware Shop. Produktinformationen lassen sich so komfortabel aufbereiten und mit der sync4 Schnittstelle an Ihren Shop übertragen. Bestellungen und Kundendaten werden GDPdU-konform synchronisiert. Als Middleware ist sync4® zwischen Ihrer Warenwirtschaft und Ihrem Onlineshop geschaltet, um Ihre Artikelinformationen aufzubereiten und mit dem Onlineshop zu synchronisieren.
Grundsätzliches zu Shopware
Shopware ist ein Shop System der Shopware AG. Die Shopware AG als Hersteller übernimmt für das Shopsystem die Gewährleistung.
Shopware Hosting
Als Hoster wird ein von Shopware zertifizierter Hoster wie z.B. Profihost (http://s.sync4.de/profihost) empfohlen. Nur mit einem solchem Hoster wird Shopware vollständigen Support übernehmen können. Andernfalls kann es sein, dass der Support von Shopware abgelehnt wird. Bei nicht zertifizierten Hostern sind die Systemvoraussetzungen ( https://community.shopware.com/Systemanforderungen_detail_1840.html ) zu prüfen. Der Hoster bzw. der Betreuer dessen muss die entsprechenden Anpassungen vornehmen. Dies kann hierbei zu einem erhöhtem Aufwand führen.
Shopware Plugins
Für Plugins von Drittanbieter sind die jeweiligen Hersteller verantwortlich. Die empfohlenen Plugins werden vorab nicht auf Funktion getestet. Plugins werden im Standard von sync4 nicht berücksichtigt.
sync4 Voraussetzung
Die Systemvoraussetzungen für die Installation und den Betrieb der sync4 Schnittstelle ist auf folgender Seite notiert: https://www.sync4.de/voraussetzungen/
Empfohlener Projekt Ablauf
Den aktuellen Projekt-Leitfaden zur Einführung von sync4 finden Sie bei uns auf der Homepage: https://www.sync4.de/leitfaden/
Felddefinitionen Shopware
SAP B1 an Shopware -> Artikel
Folgende Felder werden bei der Übernahme der Artikel aus SAP B1 zu Shopware 5 übernommen.
Weitere Felder wie z.B. UDF und UDTs können mit einer Sonderprogrammierung berücksichtigt werden. Dabei ist sehr genau zu definieren, welche Felder wie übertragen werden sollen.
Shopware an SAP B1 -> Adresse und Bestellung
Folgende Felder werden bei der Adresse Übergabe vom Shopware 5 Shop zu SAP verwendet.
Weitere Felder können mit einer Sonderprogrammierung berücksichtigt werden. Dabei ist sehr genau zu definieren, welche Felder wie übertragen werden sollen. Sprechen Sie dies auch mit Ihrem SAP B1 Betreuer ab, da die Felder in der weiteren Verarbeitung berücksichtigt werden müssen.
Preislisten zu Kundengruppen
Die Preislisten können zu den Shopware Kundengruppen zugewiesen werden. Dabei kann auch eine Preisliste aus SAP mehrfach verwendet werden. Mit folgendem SQL Befehl werden die Preise ausgelesene. Lassen Sie diesen von Ihrem SAP Betreuer prüfen.
SELECT b.ItemCode AS Artikelnummer, b.PriceList as Preisliste, ‚1‘ as Anzahl,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, ‚N‘) = ‚Y‘)
THEN ISNULL(d.Price*(100-c.Discount)/100,ISNULL(c.Price,ISNULL(d.Price*(100-a.Discount)/100,ISNULL(a.Price,b.Price)))) / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code = VatGourpSa)) / 100)
ELSE
ISNULL(d.Price*(100-c.Discount)/100,ISNULL(c.Price,ISNULL(d.Price*(100-a.Discount)/100,ISNULL(a.Price,b.Price))))
END
)
AS Preis,
“ as Rabatt
FROM ITM1 AS b
LEFT JOIN SPP1 AS a ON a.ItemCode = b.ItemCode and replace(a.CardCode,’*‘,“) = cast(b.PriceList as nvarchar) and a.FromDate <= GETDATE() and (a.ToDate+1 >= GETDATE() or a.ToDate IS NULL)
LEFT JOIN SPP2 AS c ON a.ItemCode = c.ItemCode and a.CardCode = c.CardCode and a.LINENUM = c.SPP1LNum and c.Amount = 1
LEFT JOIN ITM1 AS d ON a.ItemCode = d.ItemCode and a.ListNum = d.PriceList and ISNULL(d.Currency,“) != “ and ISNULL(d.Price,0) != 0
LEFT JOIN OPLN AS e ON b.PriceList = e.ListNum
LEFT JOIN OITM AS f ON b.ItemCode = f.ItemCode
WHERE b.ItemCode = ‚{0}‘ and (ISNULL(d.Price,0)!=0 or ISNULL(c.Price,0)!=0 or ISNULL(b.Price,0)!=0 or ISNULL(a.Price,0)!=0)
UNION
SELECT b.ItemCode AS Artikelnummer, b.PriceList as Preisliste, c.Amount as Anzahl,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, ‚N‘) = ‚Y‘)
THEN ISNULL(d.Price*(100-c.Discount)/100,ISNULL(c.Price,0)) / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code = VatGourpSa)) / 100)
ELSE
ISNULL(d.Price*(100-c.Discount)/100,ISNULL(c.Price,0))
END
)
AS Preis,
“ as Rabatt
FROM ITM1 AS b
LEFT JOIN SPP2 AS c ON c.ItemCode = b.ItemCode and replace(c.CardCode,’*‘,“) = cast(b.PriceList as nvarchar)
LEFT JOIN SPP1 AS a ON a.ItemCode = c.ItemCode and c.SPP1LNum = a.LINENUM and c.CardCode = a.CardCode
LEFT JOIN ITM1 AS d ON a.ItemCode = d.ItemCode and a.ListNum = d.PriceList and ISNULL(d.Currency,“) != “ and ISNULL(d.Price,0) != 0
LEFT JOIN OPLN AS e ON b.PriceList = e.ListNum
LEFT JOIN OITM AS f ON b.ItemCode = f.ItemCode
WHERE c.ItemCode = ‚{0}‘ and a.FromDate <= GETDATE() and (a.ToDate+1 >= GETDATE() or a.ToDate IS NULL) and (ISNULL(d.Price,0)!=0 or ISNULL(c.Price,0)!=0) and c.Amount > 1
SELECT ‚{customers_cid}‘ AS customers_cid, a.ItemCode AS products_model,
ISNULL(b.Discount,ISNULL(c.Discount,ISNULL(a.Discount,0))) AS rabatt,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, ‚N‘) = ‚Y‘)
THEN ISNULL(e.Price*(100-b.Discount)/100,ISNULL(b.Price,ISNULL(e.Price*(100-c.Discount)/100,ISNULL(c.Price,ISNULL(d.Price*(100-a.Discount)/100,a.Price))))) / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code IN (SELECT VatGourpSa FROM OITM WHERE ItemCode=a.ItemCode))) / 100)
ELSE
ISNULL(e.Price*(100-b.Discount)/100,ISNULL(b.Price,ISNULL(e.Price*(100-c.Discount)/100,ISNULL(c.Price,ISNULL(d.Price*(100-a.Discount)/100,a.Price)))))
END
)
AS products_price,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, ‚N‘) = ‚Y‘)
THEN ISNULL(e.Price,ISNULL(b.Price/(100-b.Discount)*100,ISNULL(b.Price,ISNULL(c.Price/(100-c.Discount)*100,ISNULL(c.Price,ISNULL(d.Price,ISNULL(a.Price/(100-a.Discount)*100,a.Price))))))) / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code IN (SELECT VatGourpSa FROM OITM WHERE ItemCode=a.ItemCode))) / 100)
ELSE
ISNULL(e.Price,ISNULL(b.Price/(100-b.Discount)*100,ISNULL(b.Price,ISNULL(c.Price/(100-c.Discount)*100,ISNULL(c.Price,ISNULL(d.Price,ISNULL(a.Price/(100-a.Discount)*100,a.Price)))))))
END
)
AS products_original_price,
‚1‘ as amount
FROM OSPP as a
LEFT JOIN ITM1 AS d ON a.ItemCode = d.ItemCode and a.ListNum = d.PriceList and ISNULL(d.Price,0) != 0 and ISNULL(d.Currency,“) != “
LEFT JOIN SPP1 AS c ON a.ItemCode = c.ItemCode and a.CardCode = c.CardCode and (c.FromDate <= GETDATE() or c.FromDate IS NULL) and (c.ToDate+1 >= GETDATE() or c.ToDate IS NULL)
LEFT JOIN SPP2 AS b ON a.ItemCode = b.ItemCode and a.CardCode = b.CardCode and b.SPP1LNum = c.LINENUM and b.Amount = 1
LEFT JOIN ITM1 AS e ON a.ItemCode = e.ItemCode and c.ListNum = e.PriceList and ISNULL(e.Price,0) != 0 and ISNULL(e.Currency,“) != “
LEFT JOIN OPLN AS f ON a.ListNum = f.ListNum
WHERE a.CardCode = ‚{customers_cid}‘
UNION
SELECT a.CardCode AS customer_cid, a.ItemCode AS products_model, b.Discount AS rabatt,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, ‚N‘) = ‚Y‘)
THEN ISNULL(e.Price*(100-b.Discount)/100,b.Price) / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code IN (SELECT VatGourpSa FROM OITM WHERE ItemCode=a.ItemCode))) / 100)
ELSE
ISNULL(e.Price*(100-b.Discount)/100,b.Price)
END
)
AS products_price,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, ‚N‘) = ‚Y‘)
THEN ISNULL(e.Price,ISNULL(b.Price/(100-b.Discount)*100,b.Price)) / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code IN (SELECT VatGourpSa FROM OITM WHERE ItemCode=a.ItemCode))) / 100)
ELSE
ISNULL(e.Price,ISNULL(b.Price/(100-b.Discount)*100,b.Price))
END
)
AS products_original_price,
b.Amount as amount
FROM OSPP as a
LEFT JOIN ITM1 AS d ON a.ItemCode = d.ItemCode and a.ListNum = d.PriceList and ISNULL(d.Price,0) != 0 and ISNULL(d.Currency,“) != “
LEFT JOIN SPP1 AS c ON a.ItemCode = c.ItemCode and a.CardCode = c.CardCode
LEFT JOIN SPP2 AS b ON a.ItemCode = b.ItemCode and a.CardCode = b.CardCode and b.SPP1LNum = c.LINENUM and b.Amount > 1
LEFT JOIN ITM1 AS e ON a.ItemCode = e.ItemCode and c.ListNum = e.PriceList and ISNULL(e.Price,0) != 0 and ISNULL(e.Currency,“) != “
LEFT JOIN OPLN AS f ON a.ListNum = f.ListNum
WHERE b.CardCode = ‚{customers_cid}‘ and (c.FromDate <= GETDATE() or c.FromDate IS NULL) and (c.ToDate+1 >= GETDATE() or c.ToDate IS NULL)
getCustomersProductsgroupDiscount
SELECT '{customer_cid}' AS customers_cid, c.ItemCode AS products_model, b.Discount AS rabatt,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, 'N') = 'Y')
THEN ISNULL(e.Price,0) * (100-ISNULL(b.Discount,0)) / 100 / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code = VatGourpSa )) / 100)
ELSE
ISNULL(e.Price,0) * (100-ISNULL(b.Discount,0)) / 100
END
)
AS products_price,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, 'N') = 'Y')
THEN ISNULL(e.Price,0) / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code = VatGourpSa)) / 100)
ELSE
ISNULL(e.Price,0)
END
)
AS products_original_price,
'1' AS amount
FROM OEDG AS a
LEFT JOIN EDG1 AS b ON a.AbsEntry = b.AbsEntry
LEFT JOIN OITM AS c ON b.ObjKey = c.ItemCode
LEFT JOIN OCRD AS d ON a.ObjCode = d.CardCode
LEFT JOIN ITM1 AS e ON c.ItemCode = e.ItemCode AND d.ListNum = e.PriceList
LEFT JOIN OPLN AS f ON d.ListNum = f.ListNum
WHERE a.ObjType = 2 AND a.ObjCode = '{customer_cid}' AND b.ObjType = 4 AND a.ValidFor = 'Y'
AND (a.ValidForm <= GETDATE() OR a.ValidForm IS NULL) AND (a.ValidTo+1 >= GETDATE() OR a.ValidTo IS NULL)
AND e.Currency IS NOT NULL
UNION
SELECT '{customer_cid}' AS customers_cid, c.ItemCode AS products_model, b.Discount AS rabatt,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, 'N') = 'Y')
THEN ISNULL(e.Price,0) * (100-ISNULL(b.Discount,0)) / 100 / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code = VatGourpSa )) / 100)
ELSE
ISNULL(e.Price,0) * (100-ISNULL(b.Discount,0)) / 100
END
)
AS products_price,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, 'N') = 'Y')
THEN ISNULL(e.Price,0) / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code = VatGourpSa)) / 100)
ELSE
ISNULL(e.Price,0)
END
)
AS products_original_price,
'1' AS amount
FROM OEDG AS a
LEFT JOIN EDG1 AS b ON a.AbsEntry = b.AbsEntry
LEFT JOIN OITM AS c ON b.ObjKey = CAST(c.ItmsGrpCod AS nvarchar)
LEFT JOIN OCRD AS d ON a.ObjCode = d.CardCode
LEFT JOIN ITM1 AS e ON c.ItemCode = e.ItemCode AND d.ListNum = e.PriceList
LEFT JOIN OPLN AS f ON d.ListNum = f.ListNum
WHERE a.ObjType = 2 AND a.ObjCode = '{customer_cid}' AND b.ObjType = 52 AND a.ValidFor = 'Y'
AND (a.ValidForm <= GETDATE() OR a.ValidForm IS NULL) AND (a.ValidTo+1 >= GETDATE() OR a.ValidTo IS NULL)
AND e.Currency IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM EDG1 WHERE ObjType = 4 AND ObjKey = c.ItemCode AND AbsEntry = a.AbsEntry)
getCustomersGroupDiscount
SELECT '{customer_cid}' AS customers_cid, c.ItemCode AS products_model, b.Discount AS rabatt,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, 'N') = 'Y')
THEN ISNULL(e.Price,0) * (100-ISNULL(b.Discount,0)) / 100 / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code = c.VatGourpSa)) / 100)
ELSE
ISNULL(e.Price,0) * (100-ISNULL(b.Discount,0)) / 100
END
)
AS products_price,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, 'N') = 'Y')
THEN ISNULL(e.Price,0) / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code = c.VatGourpSa)) / 100)
ELSE
ISNULL(e.Price,0)
END
)
AS products_original_price,
'1' AS amount
FROM OCRD AS d
LEFT JOIN OEDG AS a ON d.GroupCode = a.ObjCode
LEFT JOIN EDG1 AS b ON a.AbsEntry = b.AbsEntry
LEFT JOIN OITM AS c ON b.ObjKey = c.ItemCode
LEFT JOIN ITM1 AS e ON c.ItemCode = e.ItemCode AND d.ListNum = e.PriceList
LEFT JOIN OPLN AS f ON d.ListNum = f.Listnum
WHERE a.ObjType = 10 AND d.CardCode = '{customer_cid}' AND b.ObjType = 4 AND a.ValidFor = 'Y'
AND (a.ValidForm <= GETDATE() OR a.ValidForm IS NULL) AND (a.ValidTo+1 >= GETDATE() OR a.ValidTo IS NULL)
AND e.Currency IS NOT NULL
UNION
SELECT '{customer_cid}' AS customers_cid, c.ItemCode AS products_model, b.Discount AS rabatt,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, 'N') = 'Y')
THEN ISNULL(e.Price,0) * (100-ISNULL(b.Discount,0)) / 100 / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code = c.VatGourpSa)) / 100)
ELSE
ISNULL(e.Price,0) * (100-ISNULL(b.Discount,0)) / 100
END
)
AS products_price,
(
SELECT CASE
WHEN (ISNULL(IsGrossPrc, 'N') = 'Y')
THEN ISNULL(e.Price,0) / ((100.0 + (SELECT ISNULL(Rate,0) FROM OVTG WHERE Code = c.VatGourpSa)) / 100)
ELSE
ISNULL(e.Price,0)
END
)
AS products_original_price,
'1' AS amount
FROM OCRD AS d
LEFT JOIN OEDG AS a ON d.GroupCode = a.ObjCode
LEFT JOIN EDG1 AS b ON a.AbsEntry = b.AbsEntry
LEFT JOIN OITM AS c ON b.ObjKey = CAST(c.ItmsGrpCod AS nvarchar)
LEFT JOIN ITM1 AS e ON c.ItemCode = e.ItemCode AND d.ListNum = e.PriceList
LEFT JOIN OPLN AS f ON d.ListNum = f.Listnum
WHERE a.ObjType = 10 AND d.CardCode = '{customer_cid}' AND b.ObjType = 52 AND a.ValidFor = 'Y'
AND (a.ValidForm <= GETDATE() OR a.ValidForm IS NULL) AND (a.ValidTo+1 >= GETDATE() OR a.ValidTo IS NULL)
AND e.Currency IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM EDG1 WHERE ObjType = 4 AND ObjKey = c.ItemCode AND AbsEntry = a.AbsEntry)
Mit folgenden SQL Befehlen werden die kundenspezifischen Einzelpreise aus SAP ermittelt. Lassen Sie diese von Ihrem SAP Betreuer prüfen.
Beachten Sie bitte, das die Datensatzmenge extrem groß werden kann, wenn man die Kunden mit den Artikeln multipliziert. Dadurch kann ein Abgleich viele Stunden benötigen. Auch muss das Hosting des Shops entsprechende Lasten abfangen können.
Besonderheiten
Artikelnummer Beschränkungen bei Shopware 5
Shopware schränkt die Artikelnummern ein, welche verwendet werden können. Die Artikelnummer muss aus mindestens einer 4-stelligen Mischung aus Buchstaben und Zahlen angelegt werden, darf im System nur einmal verwendet werden und muss immer mit einem Buchstaben beginnen!
Etwaig benötigte Anpassungen für sync4 und der Warenwirtschaft sind kostenpflichtige Dienstleistungen und können in einem späteren Angebot definiert werden.