From 99a4bc662a85c3a8522bfa4f2ef5dc84da8c9ac1 Mon Sep 17 00:00:00 2001 From: f_compcontrol Date: Wed, 29 Apr 2026 11:13:31 +0200 Subject: [PATCH] GBS working --- CompControl.SapFrameworkConnector/App.config | 22 ++- .../CompControl.SapFrameworkConnector.csproj | 87 ++++++++--- CompControl.SapFrameworkConnector/Jenkinsfile | 20 +-- .../Standard/SapStandardFunctions.cs | 142 +++++++++++++++++- .../Standard/StandardApiController.cs | 6 +- .../packages.config | 31 ++-- 6 files changed, 246 insertions(+), 62 deletions(-) diff --git a/CompControl.SapFrameworkConnector/App.config b/CompControl.SapFrameworkConnector/App.config index afb52f9..ffd6259 100644 --- a/CompControl.SapFrameworkConnector/App.config +++ b/CompControl.SapFrameworkConnector/App.config @@ -60,15 +60,15 @@ - + - + - + @@ -124,7 +124,7 @@ - + @@ -148,7 +148,7 @@ - + @@ -178,6 +178,18 @@ + + + + + + + + + + + + diff --git a/CompControl.SapFrameworkConnector/CompControl.SapFrameworkConnector.csproj b/CompControl.SapFrameworkConnector/CompControl.SapFrameworkConnector.csproj index ffdc9f5..564355f 100644 --- a/CompControl.SapFrameworkConnector/CompControl.SapFrameworkConnector.csproj +++ b/CompControl.SapFrameworkConnector/CompControl.SapFrameworkConnector.csproj @@ -37,20 +37,23 @@ 4 - - packages\CompControl.4.0.3.2\lib\net472\CompControl.dll + + packages\CompControl.4.0.3.5\lib\net472\CompControl.dll - - packages\CompControl.ErpConnector.Utility.1.0.6\lib\netstandard2.0\CompControl.ErpConnector.Utility.dll + + packages\CompControl.ErpConnector.Utility.1.0.7-beta.13\lib\netstandard2.0\CompControl.ErpConnector.Utility.dll - packages\CompControl.ProductionControl.Utility.1.0.0-beta.18\lib\netstandard2.0\CompControl.ProductionControl.Utility.dll + packages\CompControl.ProductionControl.Utility.1.0.0-beta.38\lib\netstandard2.0\CompControl.ProductionControl.Utility.dll - - packages\CompControl.StockControlWMS.1.0.2.19-beta.1\lib\netstandard2.0\CompControl.StockControlWMS.dll + + packages\CompControl.StockControlWMS.1.0.3\lib\netstandard2.0\CompControl.StockControlWMS.dll - packages\CompControl.StockControlWMS.API.Client.1.0.3-beta.1\lib\netstandard2.0\CompControl.StockControlWMS.API.Client.dll + packages\CompControl.StockControlWMS.API.Client.1.0.4\lib\netstandard2.0\CompControl.StockControlWMS.API.Client.dll + + + packages\CompControl.TraceControl.Utility.2.0.2\lib\netstandard2.0\CompControl.TraceControl.Utility.dll packages\Dapper.2.1.66\lib\net461\Dapper.dll @@ -58,8 +61,8 @@ packages\Dapper.Contrib.2.0.78\lib\net461\Dapper.Contrib.dll - - packages\FirebirdSql.Data.FirebirdClient.10.3.3\lib\net48\FirebirdSql.Data.FirebirdClient.dll + + packages\FirebirdSql.Data.FirebirdClient.10.3.4\lib\net48\FirebirdSql.Data.FirebirdClient.dll packages\Ionic.Zip.1.9.1.8\lib\Ionic.Zip.dll @@ -157,8 +160,14 @@ packages\Microsoft.AspNetCore.WebUtilities.2.3.0\lib\netstandard2.0\Microsoft.AspNetCore.WebUtilities.dll - - packages\Microsoft.Bcl.AsyncInterfaces.9.0.9\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + packages\Microsoft.Bcl.AsyncInterfaces.9.0.10\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + packages\Microsoft.Data.Edm.5.8.5\lib\net40\Microsoft.Data.Edm.dll + + + packages\Microsoft.Data.OData.5.8.5\lib\net40\Microsoft.Data.OData.dll packages\Microsoft.Extensions.Configuration.8.0.0\lib\net462\Microsoft.Extensions.Configuration.dll @@ -238,6 +247,12 @@ packages\Microsoft.Net.Http.Headers.2.3.0\lib\netstandard2.0\Microsoft.Net.Http.Headers.dll + + packages\Microsoft.OData.Core.7.9.4\lib\net45\Microsoft.OData.Core.dll + + + packages\Microsoft.OData.Edm.7.9.4\lib\net45\Microsoft.OData.Edm.dll + packages\Microsoft.Owin.4.2.3\lib\net45\Microsoft.Owin.dll @@ -247,6 +262,9 @@ packages\Microsoft.Owin.Hosting.4.2.3\lib\net45\Microsoft.Owin.Hosting.dll + + packages\Microsoft.Spatial.7.9.4\lib\net45\Microsoft.Spatial.dll + packages\Newtonsoft.Json.13.0.4\lib\net45\Newtonsoft.Json.dll @@ -289,11 +307,23 @@ packages\Serilog.Sinks.File.6.0.0\lib\net471\Serilog.Sinks.File.dll - - packages\CompControl.StockControlWMS.1.0.2.19-beta.1\lib\netstandard2.0\StockControlWMS.dll + + packages\Simple.OData.Client.6.0.1\lib\net461\Simple.OData.Client.Core.dll - - packages\CompControl.StockControlWMS.API.Client.1.0.3-beta.1\lib\netstandard2.0\StockControlWMS.API.Client.dll + + packages\Simple.OData.Client.6.0.1\lib\net461\Simple.OData.Client.Dynamic.dll + + + packages\Simple.OData.Client.6.0.1\lib\net461\Simple.OData.Client.V3.Adapter.dll + + + packages\Simple.OData.Client.6.0.1\lib\net461\Simple.OData.Client.V4.Adapter.dll + + + packages\CompControl.StockControlWMS.1.0.3\lib\netstandard2.0\StockControlWMS.dll + + + packages\CompControl.StockControlWMS.API.Client.1.0.4\lib\netstandard2.0\StockControlWMS.API.Client.dll @@ -323,8 +353,14 @@ True True - - packages\System.IO.Pipelines.9.0.9\lib\net462\System.IO.Pipelines.dll + + + packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll + True + True + + + packages\System.IO.Pipelines.9.0.10\lib\net462\System.IO.Pipelines.dll @@ -333,8 +369,8 @@ packages\Microsoft.AspNet.WebApi.Client.6.0.0\lib\net45\System.Net.Http.Formatting.dll - - packages\System.Net.Http.Json.9.0.9\lib\net462\System.Net.Http.Json.dll + + packages\System.Net.Http.Json.9.0.10\lib\net462\System.Net.Http.Json.dll @@ -372,11 +408,14 @@ packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll - - packages\System.Text.Encodings.Web.9.0.9\lib\net462\System.Text.Encodings.Web.dll + + packages\System.Spatial.5.8.5\lib\net40\System.Spatial.dll - - packages\System.Text.Json.9.0.9\lib\net462\System.Text.Json.dll + + packages\System.Text.Encodings.Web.9.0.10\lib\net462\System.Text.Encodings.Web.dll + + + packages\System.Text.Json.9.0.10\lib\net462\System.Text.Json.dll packages\System.Threading.Channels.8.0.0\lib\net462\System.Threading.Channels.dll diff --git a/CompControl.SapFrameworkConnector/Jenkinsfile b/CompControl.SapFrameworkConnector/Jenkinsfile index 59af789..ca70a7e 100644 --- a/CompControl.SapFrameworkConnector/Jenkinsfile +++ b/CompControl.SapFrameworkConnector/Jenkinsfile @@ -31,23 +31,19 @@ pipeline { } } -// stage('Info') { -// steps { -// dir("${env.PROJECT_DIR}") { -// echo "msbuild -version: " -// bat 'msbuild -version' -// echo "dotnet msbuild -version: " -// bat 'dotnet msbuild -version' -// } -// } -// } - - stage('Pack') { + stage('Build') { steps { dir("${env.PROJECT_DIR}") { bat 'dotnet clean' bat 'if exist bin\\Release rmdir /s /q bin\\Release' bat "\"${tool 'MSBuild_2022'}\\MSBuild.exe\" CompControl.csproj /p:Configuration=Release" + } + } + } + + stage('Pack') { + steps { + dir("${env.PROJECT_DIR}") { bat 'nuget pack . -Properties Configuration=Release -OutputDirectory bin\\Release' } } diff --git a/CompControl.SapFrameworkConnector/Standard/SapStandardFunctions.cs b/CompControl.SapFrameworkConnector/Standard/SapStandardFunctions.cs index 273dcd2..61529d5 100644 --- a/CompControl.SapFrameworkConnector/Standard/SapStandardFunctions.cs +++ b/CompControl.SapFrameworkConnector/Standard/SapStandardFunctions.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.Text; using static CompControl.ErpConnector.Utility.Models.SAP_CompControl_Models; using static CompControl.ErpConnector.Utility.Models.SAP_BAPI_Models; -using System.Security; using System.Threading; namespace CompControl.SapFrameworkConnector @@ -101,6 +100,34 @@ namespace CompControl.SapFrameworkConnector result.MessageTechnical = result.MessageShort = ermsg; } + // ==> MAYBE NEVER NEEDED: Lieferplan is also delivered with PO_DETAILS with sufficient rights + //if (result.GrDataItems.Count == 0) //If no Items were found take a look at SAG instead of PO + //{ + // _log.Debug($"Could not find any PO Items, will now try and search for SAG '{poNo}'"); + // try + // { + // BAPI_SAG_GETDETAIL_IMPORT sagInput = new BAPI_SAG_GETDETAIL_IMPORT(); + // sagInput.PURCHASINGDOCUMENT = poNo; + // sagInput.SHIPPING_DATA = "X"; + // sagInput.SCHEDULE_DATA = "X"; + // sagInput.ITEM_DATA = "X"; + // BAPI_SAG_GETDETAIL_EXPORT sagDetails = BAPI_SAG_GETDETAIL(sagInput); + + // //TODO: Add logic if RFC works! + // //foreach () + // //{ + + // //} + // } + // catch (Exception ex) + // { + // string ermsg = $"GetBestellung SAG: General Error, please check LOG of ErpConnector!"; + // _log.Error(ermsg + $" => {ex}"); + // result.ErrorNumber = 900; + // result.MessageTechnical = result.MessageShort = ermsg; + // } + //} + _log.Debug($"Result of GetBestellung now consists of {result.GrDataItems.Count} GrDataItems and {result.ManufacturerDataItems.Count} ManufacturerDataItems..."); return result; @@ -216,9 +243,9 @@ namespace CompControl.SapFrameworkConnector //----------------------------------------------------------------------------------------------------------------------------------------------------------------------- - public static ApiResultDefault ExecuteGoodsMovement(GoodsMovementParameters par) + public static ApiResultStringItems ExecuteGoodsMovement(GoodsMovementParameters par) { - ApiResultDefault result = new ApiResultDefault(); + ApiResultStringItems result = new ApiResultStringItems(); try { @@ -267,6 +294,19 @@ namespace CompControl.SapFrameworkConnector _log.Debug(sb.ToString()); BAPI_GOODSMVT_CREATE_EXPORT export = ZBAPI_GOODSMVT_CREATE(import); //BAPI_TRANSACTION_COMMIT(); + + bool errorOccurred = false; + string sapMessage = ""; + foreach (BAPIRET2 ret in export.RETURN) { if (ret.TYPE.Trim().Equals("E")) { errorOccurred = true; sapMessage += $"{ret.MESSAGE} "; } } + if (errorOccurred) + { + result.ErrorNumber = 900; + result.MessageTechnical = result.MessageLong = result.MessageShort = $"{sapMessage}"; + } + else //In case of success return Materialbeleg as String + { + result.StringItems.Add(export.MATERIALDOCUMENT); + } } catch (Exception ex) { @@ -578,7 +618,7 @@ namespace CompControl.SapFrameworkConnector temp.PO_PR_QNT = row.GetDecimal("PO_PR_QNT"); temp.SERIAL_NO = row.GetString("SERIAL_NO").TrimStart('0') ?? ""; temp.WITHDR_QTY = row.GetDecimal("WITHDR_QTY"); - export.PO_ITEM_HISTORY_TOTAL.Add(temp); + export.PO_ITEM_HISTORY_TOTALS.Add(temp); } IRfcTable po_item_hist = func.GetTable("PO_ITEM_HISTORY"); @@ -603,7 +643,7 @@ namespace CompControl.SapFrameworkConnector export.PO_ITEM_HISTORY.Add(temp); } - _log.Debug($"BAPI_PO_GETDETAILS: Received {poItemBuffer.Count} PO_ITEMS, {export.PO_ITEM_HISTORY_TOTAL.Count} PO_ITEM_HISTORY_TOTALS, {export.PO_ITEM_HISTORY.Count} PO_ITEM_HISTORY"); + _log.Debug($"BAPI_PO_GETDETAILS: Received {poItemBuffer.Count} PO_ITEMS, {export.PO_ITEM_HISTORY_TOTALS.Count} PO_ITEM_HISTORY_TOTALS, {export.PO_ITEM_HISTORY.Count} PO_ITEM_HISTORY"); } catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } } @@ -695,7 +735,7 @@ namespace CompControl.SapFrameworkConnector temp.PO_PR_QNT = row.GetDecimal("ORDER_QTY"); temp.SERIAL_NO = row.GetString("SERIAL_NO")?.TrimStart('0') ?? ""; temp.WITHDR_QTY = row.GetDecimal("WITHDRAWAL_QTY"); - export.PO_ITEM_HISTORY_TOTAL.Add(temp); + export.PO_ITEM_HISTORY_TOTALS.Add(temp); } // Tables: POHISTORY @@ -721,7 +761,7 @@ namespace CompControl.SapFrameworkConnector export.PO_ITEM_HISTORY.Add(temp); } - _log.Debug($"BAPI_PO_GETDETAIL1: Received {poItemBuffer.Count} POITEM, {export.PO_ITEM_HISTORY_TOTAL.Count} POHISTORY_TOTALS, {export.PO_ITEM_HISTORY.Count} POHISTORY"); + _log.Debug($"BAPI_PO_GETDETAIL1: Received {poItemBuffer.Count} POITEM, {export.PO_ITEM_HISTORY_TOTALS.Count} POHISTORY_TOTALS, {export.PO_ITEM_HISTORY.Count} POHISTORY"); } catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } } @@ -731,6 +771,94 @@ namespace CompControl.SapFrameworkConnector return export; } + private static BAPI_SAG_GETDETAIL_EXPORT BAPI_SAG_GETDETAIL(BAPI_SAG_GETDETAIL_IMPORT import) + { + string errorMsg = ""; + BAPI_SAG_GETDETAIL_EXPORT export = new BAPI_SAG_GETDETAIL_EXPORT(); + + if (import != null) + { + try + { + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction func = dest.Repository.CreateFunction("BAPI_SAG_GETDETAIL"); //Create Function with BAPI_PO_GETDETAIL1 + func.SetValue("PURCHASINGDOCUMENT", import.PURCHASINGDOCUMENT?.Trim().PadLeft(10, '0')); //Set Value to function + + // Set optional parameters + func.SetValue("SHIPPING_DATA", import.SHIPPING_DATA); + func.SetValue("ITEM_DATA", import.ITEM_DATA); + func.SetValue("SCHEDULE_DATA", import.SCHEDULE_DATA); + func.Invoke(dest); //Invoke function at Sap destination + + IRfcStructure structHead = func.GetStructure("HEADER"); + export.HEADER = new BAPIMEOUTHEADER(); + export.HEADER.COMP_CODE = structHead.GetString("COMP_CODE"); + export.HEADER.DOC_TYPE = structHead.GetString("DOC_TYPE"); + export.HEADER.NUMBER = structHead.GetString("NUMBER"); + export.HEADER.STATUS = structHead.GetString("STATUS"); + export.HEADER.VENDOR = structHead.GetString("VENDOR"); + _log.Debug($"SAG HEAD => COMP_CODE={export.HEADER.COMP_CODE}, DOC_TYPE={export.HEADER.DOC_TYPE}, NUMBER={export.HEADER.NUMBER}, STATUS={export.HEADER.STATUS}, VENDOR={export.HEADER.VENDOR}"); + + // RETURN-Tabelle prüfen + IRfcTable returnTable = func.GetTable("RETURN"); + foreach (IRfcStructure row in returnTable) + { + _log.Error($"RETURN => Type={row.GetString("TYPE")}, ID={row.GetString("ID")}, Number={row.GetString("NUMBER")}, Message={row.GetString("MESSAGE")}"); + } + + // Tables: SCHEDULE + IRfcTable schedule_table = func.GetTable("SCHEDULE"); + _log.Debug($"Schedule Rows: {schedule_table.RowCount}"); + foreach (IRfcStructure row in schedule_table) + { + BAPIMEOUTSCHEDULE sched = new BAPIMEOUTSCHEDULE(); + sched.DELETE_IND = row.GetString("DELETE_IND"); + sched.DELIVERY_DATE = row.GetString("DELIVERY_DATE"); + sched.ITEM_NO = row.GetString("ITEM_NO"); + sched.QUANTITY = row.GetDecimal("QUANTITY"); + sched.REQ_CLOSED = row.GetString("REQ_CLOSED"); + sched.SCHED_LINE = row.GetString("SCHED_LINE"); + export.SCHEDULE.Add(sched); + } + + // Tables: SHIPPING + IRfcTable shipping_table = func.GetTable("SHIPPING"); + _log.Debug($"Shipping Rows: {shipping_table.RowCount}"); + foreach (IRfcStructure row in shipping_table) + { + BAPIMEPOSHIPPEXP ship = new BAPIMEPOSHIPPEXP(); + ship.DEL_CREATE_TIME = row.GetDecimal("DEL_CREATE_TIME").ToString(); + ship.DLV_PRIO = row.GetString("DLV_PRIO"); + ship.PLND_DELRY = row.GetDecimal("PLND_DELRY"); + ship.PO_ITEM = row.GetString("PO_ITEM"); + ship.SRC_DLV_NO = row.GetString("SRC_DLV_NO"); + export.SHIPPING.Add(ship); + } + + // Tables: ITEM + IRfcTable item_table = func.GetTable("ITEM"); + _log.Debug($"Item Rows: {item_table.RowCount}"); + foreach (IRfcStructure row in item_table) + { + //BAPIMEPOSHIPPEXP ship = new BAPIMEPOSHIPPEXP(); + //ship.DEL_CREATE_TIME = row.GetDecimal("DEL_CREATE_TIME").ToString(); + //ship.DLV_PRIO = row.GetString("DLV_PRIO"); + //ship.PLND_DELRY = row.GetDecimal("PLND_DELRY"); + //ship.PO_ITEM = row.GetString("PO_ITEM"); + //ship.SRC_DLV_NO = row.GetString("SRC_DLV_NO"); + //export.ITEM.Add(ship); + } + + _log.Debug($"BAPI_SAG_GETDETAIL: Received {export.SHIPPING.Count} SHIPPING items and {export.SCHEDULE.Count} SCHEDULE items"); + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + } + else { _log.Debug("Error, IMPORT for BAPI_SAG_GETDETAIL was NULL! "); } + + if (!errorMsg.Equals("")) { _log.Debug(errorMsg); } + + return export; + } private static BAPI_OBJCL_GETCLASSES_EXPORT BAPI_OBJCL_GETCLASSES(BAPI_OBJCL_GETCLASSES_IMPORT import) { diff --git a/CompControl.SapFrameworkConnector/Standard/StandardApiController.cs b/CompControl.SapFrameworkConnector/Standard/StandardApiController.cs index 7382fc6..135effc 100644 --- a/CompControl.SapFrameworkConnector/Standard/StandardApiController.cs +++ b/CompControl.SapFrameworkConnector/Standard/StandardApiController.cs @@ -23,7 +23,7 @@ namespace CompControl.SapFrameworkConnector try { - result = SapStandardFunctions.GetBestellung(filterBestellungen.OrderNo); + result = SapStandardFunctions.GetBestellung(filterBestellungen.OrderNo); //Maybe use true? if (result.IsSuccessful) { _log.Debug(result); } //Action was successful => log for debug else { _log.Error(result); } //An error occurred @@ -135,7 +135,7 @@ namespace CompControl.SapFrameworkConnector [HttpPut] public async Task ExecuteGoodsMovement([FromBody] SAP_CompControl_Models.GoodsMovementParameters par, CancellationToken cancellationToken) { - ApiResultDefault result = new ApiResultDefault(); //New ApiResult to return via Web + ApiResultStringItems result = new ApiResultStringItems(); //New ApiResult to return via Web _log.Debug("ExecuteGoodsMovement received "); try @@ -149,7 +149,7 @@ namespace CompControl.SapFrameworkConnector { string sm = $"ExecuteGoodsMovement: An unexpected error occured => " + ex; _log.Error(sm); - result = new ApiResultDefault //Default ApiResult on error + result = new ApiResultStringItems //Default ApiResult on error { ErrorNumber = 101, MessageShort = sm, diff --git a/CompControl.SapFrameworkConnector/packages.config b/CompControl.SapFrameworkConnector/packages.config index 94bc7f7..fdf2235 100644 --- a/CompControl.SapFrameworkConnector/packages.config +++ b/CompControl.SapFrameworkConnector/packages.config @@ -1,13 +1,14 @@  - - - - - + + + + + + - + @@ -44,8 +45,10 @@ - + + + @@ -73,9 +76,12 @@ + + + @@ -89,15 +95,17 @@ + - + + - + @@ -107,8 +115,9 @@ - - + + +