From 1634e2822a68e470c160bee3a70978bfd32c1ad5 Mon Sep 17 00:00:00 2001 From: f_compcontrol Date: Tue, 9 Sep 2025 13:59:30 +0200 Subject: [PATCH] Added GetMaterialdaten und GetHerstellerdaten --- .../Standard/SapStandardFunctions.cs | 979 +++++++++++++++++- .../Standard/StandardApiController.cs | 131 ++- 2 files changed, 1034 insertions(+), 76 deletions(-) diff --git a/CompControl.SapFrameworkConnector/Standard/SapStandardFunctions.cs b/CompControl.SapFrameworkConnector/Standard/SapStandardFunctions.cs index 7e54996..e697f3a 100644 --- a/CompControl.SapFrameworkConnector/Standard/SapStandardFunctions.cs +++ b/CompControl.SapFrameworkConnector/Standard/SapStandardFunctions.cs @@ -1,7 +1,9 @@ -using log4net; +using CompControl.ErpConnector.Service.Models; +using log4net; using SAP.Middleware.Connector; using System; using System.Collections.Generic; +using System.Text; using static CompControl.ErpConnector.Service.Models.Cicor_SapModels; using static CompControl.ErpConnector.Service.Models.SapDataTypes; @@ -12,9 +14,186 @@ namespace CompControl.SapFrameworkConnector private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); //Logger + public static ApiResultBestellungen GetBestellung(string poNo) + { + ApiResultBestellungen result = new ApiResultBestellungen(); + BAPI_PO_GETDETAIL_IMPORT import = new BAPI_PO_GETDETAIL_IMPORT() { PURCHASEORDER = poNo }; + BAPI_PO_GETDETAIL_EXPORT details = BAPI_PO_GETDETAILS(import); + int cnt = 0; + + foreach (BAPIEKPO det in details.PO_ITEMS) + { + cnt++; + string inspect = ""; + string inspectInfo = ""; + string prioText = ""; + string prioChar = ""; + string ItemText1 = ""; + bool posIsClosed = false; + DateTime expDeliverDate = DateTime.MaxValue; + + if (det.QUAL_INSP.Equals("X")) + { + inspect = "Q"; + if (ConfigHelper.SapLanguage.Equals("DE")) { inspectInfo = "Qualitaetspruefung erforderlich!"; } + else { inspectInfo = "Quality check mandatory!"; } + } + + expDeliverDate = ConvertSapDateToDateTime(det.ExpectedDeliveryDate, false); + if (det.QUANTITY <= det.QUANTITYPROCESSED) { posIsClosed = true; } + + GetMAKTXfromMATNR_IMPORT getMak = new GetMAKTXfromMATNR_IMPORT(); + getMak.MATNR = det.MATERIAL.Trim(); + GetMAKTXfromMATNR_EXPORT outMak = GetMAKTXfromMATNR(getMak); + ItemText1 = outMak.MAKTX; + + GrDataItem gr = new GrDataItem(); + gr.AcceptedManufacturesLink = cnt.ToString(); + gr.Created = ConvertSapDateToDateTime(details.PO_HEADER.CREATED_ON); + gr.LastUpdate = ConvertSapDateToDateTime(det.CHANGED_ON); + gr.PosIsClosed = posIsClosed; + gr.OrderNo = det.PO_NUMBER; + gr.OrderPos = det.PO_ITEM; + gr.OrderQuantity = det.QUANTITY; + gr.ItemNo = det.MATERIAL.Trim(); + gr.ItemText1 = ItemText1; + gr.ItemNoRef = gr.CustomValue05 = det.PUR_MAT; + gr.OrderPosInfoText = det.ACCTASSCAT; + gr.QuantityProcessed = det.QUANTITYPROCESSED; + gr.QuantityUnit = det.UNIT; + gr.Plant = det.PLANT; + gr.Inspection = inspect; + gr.InspectionInfo = inspectInfo; + gr.Priority = prioChar; + gr.PriorityInfoText = prioText; + gr.CustomValue01 = det.QUAL_INSP; + gr.ExpectedDeliveryDate = expDeliverDate; + gr.MPN = det.MANU_MAT.Trim(); + gr.SupplierNo = details.PO_HEADER.VENDOR; + gr.SupplierName = details.PO_HEADER.VEND_NAME; + gr.SupplierItemNo = det.VEND_MAT; + gr.StorageLocation = det.STOR_LOC; + gr.Schedule = det.SCHEDULE.TrimStart('0'); + gr.CustomValue08 = details.PO_HEADER.DOC_TYPE; + if (!det.DELETE_IND.Equals("L")) { result.GrDataItems.Add(gr); } + } + + _log.Debug($"Result of GetBestellungen now consists of {result.GrDataItems.Count} GrDataItems and {result.ManufacturerDataItems.Count} ManufactuerDataItems..."); + + return result; + } + + public static ApiResultMaterialdaten GetMaterialdaten(string itemNo) + { + ApiResultMaterialdaten result = new ApiResultMaterialdaten(); + string cumultMsg = ""; + + BAPI_OBJCL_GETCLASSES_IMPORT input_getclasses = new BAPI_OBJCL_GETCLASSES_IMPORT(); + input_getclasses.CLASSTYPE_IMP = "Z02"; + input_getclasses.LANGUAGE = ConfigHelper.SapLanguage; + input_getclasses.OBJECTKEY_IMP = itemNo.Trim().PadLeft(18, '0'); + input_getclasses.OBJECTTABLE_IMP = "MARA"; + BAPI_OBJCL_GETCLASSES_EXPORT output_getclasses = BAPI_OBJCL_GETCLASSES(input_getclasses); + + StringBuilder sb = new StringBuilder(); + foreach (BAPI1003_ALLOC_LIST alloc in output_getclasses.ALLOCLIST) + { + sb.Append($"CLASSNUM:{alloc.CLASSNUM} "); + sb.Append($"OBJECT:{alloc.OBJECT} "); + sb.Append($"OBJTYP:{alloc.OBJTYP} "); + sb.Append($"STANDARDCLASS:{alloc.STANDARDCLASS} "); + sb.Append($"STATUS:{alloc.STATUS} \n"); + } + StringBuilder sb2 = new StringBuilder(); + foreach (BAPIRET2 ret in output_getclasses.RETURN) + { + sb2.Append($"TYPE:{ret.TYPE} "); + sb2.Append($"ROW:{ret.ROW} "); + sb2.Append($"PARAMETER:{ret.PARAMETER} "); + sb2.Append($"MESSAGE:{ret.MESSAGE} "); + sb2.Append($"ID:{ret.ID} "); + sb2.Append($"FIELD:{ret.FIELD} "); + sb2.Append($"MSGNO:{ret.LOG_MSG_NO} "); + sb2.Append($"LOGNO:{ret.LOG_NO} "); + sb2.Append($"MSG_V1:{ret.MESSAGE_V1} "); + sb2.Append($"NUMBER:{ret.NUMBER} "); + sb2.Append($"SYSTEM:{ret.SYSTEM} \n"); + + if (ret.TYPE.Equals("I") || ret.TYPE.Equals("E")) + { + cumultMsg += $"=> Fehlermeldung aus SAP ({ret.TYPE}|{ret.NUMBER}): " + ret.MESSAGE + " || "; + } + } + _log.Debug($"Output GetClasses (Found {output_getclasses.ALLOCLIST.Count} items): \n {sb.ToString()} \n\nRETURN:\n{sb2.ToString()}"); + + + if (output_getclasses.RETURN.Count > 0 && output_getclasses.ALLOCLIST.Count > 0) //Only if results were received + { + if (output_getclasses.RETURN[0].TYPE.Equals("S")) //If successful + { + GetMATNRfromBMATN_EXPORT matnr_output = GetMATNRfromBMATN(new GetMATNRfromBMATN_IMPORT() { BMATN = itemNo }); + _log.Debug($"Got MATNR for BAMTN: {matnr_output.MATNR}"); + GetMAKTXfromMATNR_EXPORT maktx_output = GetMAKTXfromMATNR(new GetMAKTXfromMATNR_IMPORT() { MATNR = itemNo }); + _log.Debug($"Got MAKTX for MATNR: {maktx_output.MAKTX}"); + + CLAF_CLASSIFICATION_OF_OBJECTS_IMPORT input_classification = new CLAF_CLASSIFICATION_OF_OBJECTS_IMPORT(); + input_classification.CLASS = output_getclasses.ALLOCLIST[0].CLASSNUM; //Get Class Number of first entry + input_classification.CLASSTYPE = "Z02"; + input_classification.OBJECT = itemNo.Trim().PadLeft(18, '0'); + input_classification.LANGUAGE = ConfigHelper.SapLanguage; + input_classification.OBJECTTABLE = "MARA"; + input_classification.INHERITED_CHAR = "X"; + CLAF_CLASSIFICATION_OF_OBJECTS_EXPORT output_classification = CLAF_CLASSIFICATION_OF_OBJECTS(input_classification); + + GetMsdMslEtcFromBMATN_IMPORT msdmsl_input = new GetMsdMslEtcFromBMATN_IMPORT(); + msdmsl_input.BMATN = itemNo; + msdmsl_input.MATDESC = maktx_output.MAKTX; + msdmsl_input.T_OBJECTDATA = output_classification.T_OBJECTDATA; + GetMsdMslEtcFromBMATN_EXPORT output_msdmsl = GetMsdMslEtcFromBMATN(msdmsl_input); + result.MaterialDataItems = output_msdmsl.ITEMS; + } + else + { return new ApiResultMaterialdaten() { ErrorNumber = 900, MessageShort = cumultMsg, MessageLong = cumultMsg, MessageTechnical = cumultMsg }; } + } + else + { + if (cumultMsg.Equals("")) { cumultMsg = "Keine Einträge im Materialstamm für diesen Artikel vorhanden"; } + return new ApiResultMaterialdaten() { ErrorNumber = 901, MessageShort = cumultMsg, MessageLong = cumultMsg, MessageTechnical = cumultMsg }; + } + + return result; + } + + public static ApiResultHerstellerdaten GetHerstellerdaten(string itemNo) + { + ApiResultHerstellerdaten result = new ApiResultHerstellerdaten(); + GET_MPN_DATA_IMPORT input = new GET_MPN_DATA_IMPORT() { BMATN = itemNo }; + GET_MPN_DATA_EXPORT sapRes = GET_MPN_DATA(input); + + _log.Debug($"GetHerstellerdaten in SAP-Connector was called, found {sapRes.MPN_DATA.Count} items when executing"); + + foreach (GET_MPN_DATA_RESULTITEM temp in sapRes.MPN_DATA) + { + ManufacturerDataItem mf = new ManufacturerDataItem(); + mf.Created = temp.CREATED; + mf.IsActive = true; + mf.ItemNo = temp.BMATN.Trim(); + mf.LastUpdate = temp.CHANGED; + mf.ManufacturerDescription = temp.NAME; + mf.ManufacturerName = temp.NAME; + mf.ManufacturerNo = mf.MPNCustom2 = temp.MFRNR; + mf.ManufacturerValue = temp.MPN.Trim(); + mf.MPNCustom1 = temp.EMATN.Trim(); + result.ManufacturerDataItems.Add(mf); + _log.Debug($"GetHerstellerdaten: Submitted entry => NAME: {mf.ManufacturerName}, NO: {mf.ManufacturerNo}, VAL: {mf.ManufacturerValue}"); + } + + return result; + } + //----------------------------------------------------------------------------------------------------------------------------------------------------------------------- - public static DateTime ConvertSapDateToDateTime(string sapDate, bool delimitersUsed = true) + private static DateTime ConvertSapDateToDateTime(string sapDate, bool delimitersUsed = true) { if (delimitersUsed) //Style: 2022-02-18, mostly gotten from SAP with GetString on DATS { @@ -31,12 +210,12 @@ namespace CompControl.SapFrameworkConnector return new DateTime(year, month, day); } } - public static string ConvertDateTimeToSapTime(DateTime date) + private static string ConvertDateTimeToSapTime(DateTime date) { if (date == null) { return "00000000"; } return date.ToString("yyyyMMdd"); } - public static string ConvertMslToSAPString(string matfeuchte) + private static string ConvertMslToSAPString(string matfeuchte) { if (matfeuchte == null || matfeuchte.Equals("")) { return "01"; } switch (matfeuchte) @@ -63,10 +242,91 @@ namespace CompControl.SapFrameworkConnector return "01"; } } + public static GetMsdMslEtcFromBMATN_EXPORT GetMsdMslEtcFromBMATN(GetMsdMslEtcFromBMATN_IMPORT import) + { + string errorMsg = ""; + GetMsdMslEtcFromBMATN_EXPORT export = new GetMsdMslEtcFromBMATN_EXPORT(); + + try + { + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction funcMara4 = dest.Repository.CreateFunction("RFC_READ_TABLE"); //Create Function + IRfcTable t4 = funcMara4.GetTable("DATA"); + t4.Clear(); + IRfcTable options = funcMara4.GetTable("OPTIONS"); + options.Clear(); + options.Append(); + options.SetValue("TEXT", "BMATN = '" + import.BMATN?.Trim().PadLeft(18, '0') + "'"); + options.Append(); + IRfcTable fields4 = funcMara4.GetTable("FIELDS"); + fields4.Append(3); + fields4.CurrentIndex = 0; fields4.SetValue(0, "MHDHB"); + fields4.CurrentIndex = 1; fields4.SetValue(0, "ERSDA"); + fields4.CurrentIndex = 2; fields4.SetValue(0, "LAEDA"); + funcMara4.SetValue("QUERY_TABLE", "MARA"); //Set Value to function + funcMara4.SetValue("DELIMITER", ";"); //Set Value to function + funcMara4.SetValue("USE_ET_DATA_4_RETURN", "0"); + funcMara4.Invoke(dest); //Invoke function at Sap destination + + IRfcTable rfcTable4 = funcMara4.GetTable("DATA"); //Process return values + int rowCount4 = rfcTable4.Count; + foreach (IRfcStructure structure in rfcTable4) + { + string[] line = structure.GetString(0).Split(';'); //Was GetString(i) before => i = rowCount4; + CLOBJDAT mslRow = new CLOBJDAT(); + foreach (CLOBJDAT cl in import.T_OBJECTDATA) + { + if (cl.SMBEZ.Equals("moisture sensitiv level") || cl.SMBEZ.Equals("Feuchteklasse")) { mslRow = cl; } + } + string mslLvl = "1"; + if (mslRow.AUSP1 != null) { if (!mslRow.AUSP1.Equals("?")) { mslLvl = mslRow.AUSP1; } }//Get MSL + + DateTime created; //Calculate Dates + DateTime lastUpdate; + if (!line[1].Equals("00000000") && !line[1].Equals("") && line[1].Length >= 8) + { + created = new DateTime( + Convert.ToInt32(line[1].Substring(0, 4)), + Convert.ToInt32(line[1].Substring(4, 2)), + Convert.ToInt32(line[1].Substring(6, 2))); + } + else { created = DateTime.Now; } + if (!line[2].Equals("00000000") && !line[2].Equals("") && line[2].Length >= 8) + { + lastUpdate = new DateTime( + Convert.ToInt32(line[2].Substring(0, 4)), + Convert.ToInt32(line[2].Substring(4, 2)), + Convert.ToInt32(line[2].Substring(6, 2))); + } + else { lastUpdate = DateTime.Now; } + + int? timeSpan = Convert.ToInt32(line[0]); + if (timeSpan == 0) { timeSpan = null; } + + export.ITEMS.Add(new ItemsItem() //Build up new ItemsItem for returning + { + Created = created, + LastUpdate = lastUpdate, + ItemNo = import.BMATN, + ItemText1 = import.MATDESC, + MSL = mslLvl, + UsableTimeSpanValue = timeSpan, + CustomValue01 = "", + IsRoHS = false, + ContainerType = "" //TODO: Take ID from DB + }); + } + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + + if (!errorMsg.Equals("")) { _log.Error(errorMsg); } + + return export; + } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------- - public static GetMATNRfromBMATN_EXPORT GetMATNRfromBMATN(GetMATNRfromBMATN_IMPORT import) + private static GetMATNRfromBMATN_EXPORT GetMATNRfromBMATN(GetMATNRfromBMATN_IMPORT import) { string errorMsg = ""; GetMATNRfromBMATN_EXPORT export = new GetMATNRfromBMATN_EXPORT(); @@ -105,7 +365,7 @@ namespace CompControl.SapFrameworkConnector return export; } - public static GetMAKTXfromMATNR_EXPORT GetMAKTXfromMATNR(GetMAKTXfromMATNR_IMPORT import) + private static GetMAKTXfromMATNR_EXPORT GetMAKTXfromMATNR(GetMAKTXfromMATNR_IMPORT import) { string errorMsg = ""; GetMAKTXfromMATNR_EXPORT export = new GetMAKTXfromMATNR_EXPORT(); @@ -148,7 +408,7 @@ namespace CompControl.SapFrameworkConnector return export; } - public static BAPI_PO_GETDETAIL_EXPORT BAPI_PO_GETDETAILS(BAPI_PO_GETDETAIL_IMPORT import) + private static BAPI_PO_GETDETAIL_EXPORT BAPI_PO_GETDETAILS(BAPI_PO_GETDETAIL_IMPORT import) { string errorMsg = ""; BAPI_PO_GETDETAIL_EXPORT export = new BAPI_PO_GETDETAIL_EXPORT(); @@ -257,5 +517,710 @@ namespace CompControl.SapFrameworkConnector return export; } + + private static BAPI_OBJCL_GETCLASSES_EXPORT BAPI_OBJCL_GETCLASSES(BAPI_OBJCL_GETCLASSES_IMPORT import) + { + string errorMsg = ""; + BAPI_OBJCL_GETCLASSES_EXPORT export = new BAPI_OBJCL_GETCLASSES_EXPORT(); + + try + { + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction func = dest.Repository.CreateFunction("BAPI_OBJCL_GETCLASSES"); + func.SetValue("OBJECTKEY_IMP", import.OBJECTKEY_IMP); + func.SetValue("OBJECTTABLE_IMP", import.OBJECTTABLE_IMP); + func.SetValue("CLASSTYPE_IMP", import.CLASSTYPE_IMP); + func.SetValue("READ_VALUATIONS", import.READ_VALUATIONS); + func.SetValue("LANGUAGE", import.LANGUAGE); + func.Invoke(dest); + + IRfcTable allocList_table = func.GetTable("ALLOCLIST"); + foreach (IRfcStructure row in allocList_table) + { + export.ALLOCLIST.Add(new BAPI1003_ALLOC_LIST() + { + CLASSNUM = row.GetString("CLASSNUM"), + CLASSTYPE = row.GetString("CLASSTYPE"), + STANDARDCLASS = row.GetString("STANDARDCLASS"), + STATUS = row.GetString("STATUS"), + OBJECT = row.GetString("OBJECT"), + OBJTYP = row.GetString("OBJTYP") + }); + } + + IRfcTable return_table = func.GetTable("RETURN"); + foreach (IRfcStructure row in return_table) + { + export.RETURN.Add(new BAPIRET2() + { + NUMBER = row.GetString("NUMBER"), + ID = row.GetString("ID"), + FIELD = row.GetString("FIELD"), + LOG_MSG_NO = row.GetString("LOG_MSG_NO"), + LOG_NO = row.GetString("LOG_NO"), + MESSAGE = row.GetString("MESSAGE"), + MESSAGE_V1 = row.GetString("MESSAGE_V1"), + MESSAGE_V2 = row.GetString("MESSAGE_V2"), + MESSAGE_V3 = row.GetString("MESSAGE_V3"), + MESSAGE_V4 = row.GetString("MESSAGE_V4"), + PARAMETER = row.GetString("PARAMETER"), + TYPE = row.GetString("TYPE"), + SYSTEM = row.GetString("SYSTEM"), + ROW = row.GetString("ROW") + }); + } + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + + if (!errorMsg.Equals("")) { _log.Error(errorMsg); } + + return export; + } + private static BAPI_OBJCL_CHANGE_EXPORT BAPI_OBJCL_CHANGE(BAPI_OBJCL_CHANGE_IMPORT import) + { + string errorMsg = ""; + BAPI_OBJCL_CHANGE_EXPORT export = new BAPI_OBJCL_CHANGE_EXPORT(); + + try + { + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction func = dest.Repository.CreateFunction("BAPI_BATCH_SAVE_REPLICA"); //BAPI_BATCH_SAVE_REPLICA + func.SetValue("BATCH", import.BATCH.Trim().PadLeft(10, '0')); + func.SetValue("MATERIAL", import.MATERIAL?.Trim().PadLeft(18, '0')); + func.SetValue("PLANT", import.PLANT.Trim().PadLeft(4, '0')); + func.SetValue("BATCHSTORAGELOCATION", import.BATCHSTORAGELOCATION.Trim().PadLeft(4, '0')); + IRfcTable classallocations = func.GetTable("CLASSALLOCATIONS"); + foreach (BAPI3060_ALLOCATION alloc in import.CLASSALLOCATIONS) + { + classallocations.Append(); + classallocations.SetValue("CLASSNUM", "CHARGE_ELEKTR"); //could also be alloc.CLASSNUM + classallocations.SetValue("CLASS_TYPE", alloc.CLASS_TYPE); + classallocations.SetValue("OBJECTKEY", alloc.OBJECTKEY); + classallocations.SetValue("OBJECTTABLE", alloc.OBJECTTABLE); + } + IRfcTable valchars = func.GetTable("CLASSVALUATIONSCHAR"); + foreach (BAPI3060_VALUATION_CHAR val in import.CLASSVALUATIONSCHAR) + { + valchars.Append(); + valchars.SetValue("CHARACT", val.CHARACT); + valchars.SetValue("VALUE_CHAR", val.VALUE_FROM); + } + IRfcTable valnums = func.GetTable("CLASSVALUATIONSNUM"); + foreach (BAPI3060_VALUATION_NUM val in import.CLASSVALUATIONSNUM) + { + valnums.Append(); + valnums.SetValue("CHARACT", val.CHARACT); + valnums.SetValue("VALUE_FROM", val.VALUE_FROM); + } + + IRfcStructure extension1 = func.GetStructure("EXTENSION1"); + extension1.SetValue("ZZMFRNR", import.EXTENSION1.ZZMFRNR); + extension1.SetValue("ZZMFRPN", import.EXTENSION1.ZZMFRPN); + extension1.SetValue("ZZEMATN", import.EXTENSION1.ZZEMATN); + + func.Invoke(dest); + + IRfcTable ret_table = func.GetTable("RETURN"); + _log.Debug($"BAPI_OBCL_CHANGE found {ret_table.Count} rows in RETURN"); + foreach (IRfcStructure row in ret_table) + { + BAPIRET2 temp = new BAPIRET2(); + temp.FIELD = ret_table.GetString("FIELD"); + temp.ID = ret_table.GetString("ID"); + temp.LOG_MSG_NO = ret_table.GetString("LOG_MSG_NO"); + temp.LOG_NO = ret_table.GetString("LOG_NO"); + temp.MESSAGE = ret_table.GetString("MESSAGE"); + temp.MESSAGE_V1 = ret_table.GetString("MESSAGE_V1"); + temp.MESSAGE_V2 = ret_table.GetString("MESSAGE_V2"); + temp.MESSAGE_V3 = ret_table.GetString("MESSAGE_V3"); + temp.MESSAGE_V4 = ret_table.GetString("MESSAGE_V4"); + temp.NUMBER = ret_table.GetString("NUMBER"); + temp.PARAMETER = ret_table.GetString("PARAMETER"); + temp.ROW = ret_table.GetString("ROW"); + temp.SYSTEM = ret_table.GetString("SYSTEM"); + temp.TYPE = ret_table.GetString("TYPE"); + export.RETURN.Add(temp); + + _log.Debug($"Return ({temp.TYPE} | {temp.ID} | NUM:{temp.NUMBER}): " + temp.MESSAGE + $" | V1:{temp.MESSAGE_V1} | V2:{temp.MESSAGE_V2} | V3:{temp.MESSAGE_V3} | V4:{temp.MESSAGE_V4}"); + } + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + + if (!errorMsg.Equals("")) { _log.Debug(errorMsg); } + + return export; + } + + private static GET_MPN_DATA_EXPORT GET_MPN_DATA(GET_MPN_DATA_IMPORT import) + { + string errorMsg = ""; + GET_MPN_DATA_EXPORT export = new GET_MPN_DATA_EXPORT(); + List step1and2data = new List(); + + try //STEP 1 ------------------------------------------------------ + { + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction func = dest.Repository.CreateFunction("RFC_READ_TABLE"); + IRfcTable t = func.GetTable("DATA"); t.Clear(); //Get once so it could be appended in result + IRfcTable options = func.GetTable("OPTIONS"); + options.Clear(); + options.Append(); + options.SetValue("TEXT", "BMATN = '" + import.BMATN?.Trim().PadLeft(18, '0') + "'"); //Set Query-text + options.Append(); + IRfcTable fields = func.GetTable("FIELDS"); + fields.Append(4); + fields.CurrentIndex = 0; fields.SetValue(0, "BMATN"); //BMATN + fields.CurrentIndex = 1; fields.SetValue(0, "EMATN"); //EMATN + fields.CurrentIndex = 2; fields.SetValue(0, "MFRNR"); //MFRNR + fields.CurrentIndex = 3; fields.SetValue(0, "AMPSP"); //AMPSP + func.SetValue("QUERY_TABLE", "AMPL"); //Set Value to function + func.SetValue("DELIMITER", ";"); //Set Value to function + func.SetValue("USE_ET_DATA_4_RETURN", "0"); + func.Invoke(dest); + + IRfcTable rfcTable = func.GetTable("DATA"); //Process return values + _log.Debug($"GET_MPN_DATA_STEP1: Found {rfcTable.Count} entries"); + foreach (IRfcStructure structure in rfcTable) + { + string[] line = structure.GetString(0).Split(';'); + if (line[3].Equals("0004") || line[3].Trim().Equals("") || line[3].Equals("blank")) + { + GET_MPN_DATA_TEMPITEM temp = new GET_MPN_DATA_TEMPITEM(); + temp.BMATN = line[0]; + temp.EMATN = line[1]; + temp.MFRNR = line[2]; + temp.AMPSP = line[3]; + temp.NAME = ""; + step1and2data.Add(temp); //Add new entry if not locked + _log.Debug("GET_MPN_DATA => READTABLE: Added entry " + structure.GetString(0)); + } + } + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + + if (!errorMsg.Equals("")) { errorMsg += "\n\n"; } + + try //STEP 2 ------------------------------------------------------ + { + foreach (GET_MPN_DATA_TEMPITEM s1 in step1and2data) + { + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction func = dest.Repository.CreateFunction("BAPI_VENDOR_GETDETAIL"); //Create Function + + func.SetValue("VENDORNO", s1.MFRNR?.TrimStart('0').PadLeft(10, '0')); //Build RFC_DB_OPT + func.SetValue("COMPANYCODE", ""); //Leave blank => not needed for queriing table + func.Invoke(dest); //Invoke function at Sap destination + + IRfcStructure rfcStruct = func.GetStructure("GENERALDETAIL"); //Process return values, only 1 should come + s1.NAME = rfcStruct.GetString("NAME"); //Set Name to it + _log.Debug($"Found Name |{s1.NAME}| for MfrNo {s1.MFRNR}"); + } + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + + if (!errorMsg.Equals("")) { errorMsg += "\n\n"; } + + try //STEP 3 ------------------------------------------------------ + { + foreach (GET_MPN_DATA_TEMPITEM s2 in step1and2data) + { + //Destination Configuration + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); //SAP Detsination Name + IRfcFunction func = dest.Repository.CreateFunction("RFC_READ_TABLE"); //Create Function + IRfcTable t = func.GetTable("DATA"); + t.Clear(); + IRfcTable options = func.GetTable("OPTIONS"); + options.Clear(); + options.Append(); + options.SetValue("TEXT", "MATNR = '" + s2.EMATN.Trim().PadLeft(18, '0') + "' "); + options.Append(); + options.SetValue("TEXT", "AND MFRNR = '" + s2.MFRNR?.Trim().PadLeft(6, '0') + "' "); + options.Append(); + IRfcTable fields = func.GetTable("FIELDS"); + fields.Append(3); + fields.CurrentIndex = 0; fields.SetValue(0, "MFRPN"); + fields.CurrentIndex = 1; fields.SetValue(0, "ERSDA"); + fields.CurrentIndex = 2; fields.SetValue(0, "LAEDA"); + func.SetValue("QUERY_TABLE", "MARA"); //Set Value to function + func.SetValue("DELIMITER", ";"); //Set Value to function + func.SetValue("USE_ET_DATA_4_RETURN", "0"); + func.Invoke(dest); //Invoke function at Sap destination + + IRfcTable rfcTable = func.GetTable("DATA"); //Process return values + int rowCount = rfcTable.Count; + _log.Debug($"GET_MPN_DATA_STEP3: Found {rfcTable.Count} entries"); + foreach (IRfcStructure structure in rfcTable) + { + string[] line = structure.GetString(0).Split(';'); + DateTime created = DateTime.Now; + DateTime lastUpdate = DateTime.Now; + + if (!line[1].Equals("00000000") && !line[1].Equals("")) //Calculate Dates + { + try { created = new DateTime(Convert.ToInt32(line[1].Substring(0, 4)), Convert.ToInt32(line[1].Substring(4, 2)), Convert.ToInt32(line[1].Substring(6, 2))); } catch (Exception e) { _log.Error($"line[1] date not convertible! => {line[1] ?? ""}\r\n {e}"); } + } + else { created = DateTime.Now; } + if (!line[2].Equals("00000000") && !line[2].Equals("")) + { + try { lastUpdate = new DateTime(Convert.ToInt32(line[2].Substring(0, 4)), Convert.ToInt32(line[2].Substring(4, 2)), Convert.ToInt32(line[2].Substring(6, 2))); } catch (Exception e) { _log.Error($"line[2] date not convertible! => {line[2] ?? ""}\r\n {e}"); } + } + else { lastUpdate = DateTime.Now; } + + GET_MPN_DATA_RESULTITEM res = new GET_MPN_DATA_RESULTITEM(); //Add Result + res.CREATED = created; + res.CHANGED = lastUpdate; + res.BMATN = s2.BMATN.TrimStart('0'); + res.EMATN = s2.EMATN.TrimStart('0'); + res.MFRNR = s2.MFRNR.TrimStart('0'); + res.NAME = s2.NAME.TrimStart('0'); + res.AMPSP = s2.AMPSP; + res.MPN = line[0]; + export.MPN_DATA.Add(res); + + _log.Debug($"GET_MPN_DATA => READTABLE Step 3: Added entry {s2.NAME.TrimStart('0')}, {s2.MFRNR.TrimStart('0')}"); + } + } + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + + if (!errorMsg.Equals("")) { _log.Error(errorMsg); } + + return export; + } + + private static BAPI_MATERIAL_GETALL_EXPORT BAPI_MATERIAL_GETALL(BAPI_MATERIAL_GETALL_IMPORT import) + { + string errorMsg = ""; + BAPI_MATERIAL_GETALL_EXPORT export = new BAPI_MATERIAL_GETALL_EXPORT(); + + try + { + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction func = dest.Repository.CreateFunction("BAPI_MATERIAL_GETALL"); //Create Function + func.SetValue("MATERIAL", import.MATERIAL?.Trim().PadLeft(18, '0')); //Set Value to function + if (!import.WAREHOUSENUMBER.Equals(string.Empty)) { func.SetValue("WAREHOUSENUMBER", import.WAREHOUSENUMBER?.Trim().PadLeft(3, '0')); } //Set Value to function + func.Invoke(dest); //Invoke function at Sap destination + + IRfcStructure clientdata_struct = func.GetStructure("CLIENTDATA"); + export.CLIENTDATA.MATERIAL = clientdata_struct.GetString("MATERIAL"); + export.CLIENTDATA.MATL_TYPE = clientdata_struct.GetString("MATL_TYPE"); + export.CLIENTDATA.CREATED_ON = clientdata_struct.GetString("CREATED_ON"); + export.CLIENTDATA.LAST_CHNGE = clientdata_struct.GetString("LAST_CHNGE"); + export.CLIENTDATA.CREATED_BY = clientdata_struct.GetString("CREATED_BY"); + export.CLIENTDATA.CHANGED_BY = clientdata_struct.GetString("CHANGED_BY"); + export.CLIENTDATA.MATL_GROUP = clientdata_struct.GetString("MATL_GROUP"); + export.CLIENTDATA.BASE_UOM = clientdata_struct.GetString("BASE_UOM"); + export.CLIENTDATA.BASE_UOM_ISO = clientdata_struct.GetString("BASE_UOM_ISO"); + export.CLIENTDATA.SHELF_LIFE = clientdata_struct.GetString("SHELF_LIFE"); + export.CLIENTDATA.PUR_STATUS = clientdata_struct.GetString("PUR_STATUS"); + export.CLIENTDATA.MANU_MAT = clientdata_struct.GetString("MANU_MAT"); + export.CLIENTDATA.MFR_NO = clientdata_struct.GetString("MFR_NO"); + _log.Debug($"CLIENTDATA: MATERIAL={export.CLIENTDATA.MATERIAL} | MFR:{export.CLIENTDATA.MFR_NO}"); + + IRfcStructure plantdata_struct = func.GetStructure("PLANTDATA"); + export.PLANTDATA.PLANT = plantdata_struct.GetString("PLANT"); + + IRfcStructure storedata_struct = func.GetStructure("STORAGELOCATIONDATA"); + export.STORAGELOCATIONDATA.STGE_LOC = storedata_struct.GetString("STGE_LOC"); + export.STORAGELOCATIONDATA.PLANT = storedata_struct.GetString("PLANT"); + + IRfcStructure warehouse_struct = func.GetStructure("WAREHOUSENUMBERDATA"); + export.WAREHOUSENUMBERDATA.WHSE_NO = warehouse_struct.GetString("WHSE_NO"); + export.WAREHOUSENUMBERDATA.LEQ_UNIT_1 = warehouse_struct.GetString("LEQ_UNIT_1"); + export.WAREHOUSENUMBERDATA.LEQ_UNIT_1_ISO = warehouse_struct.GetString("LEQ_UNIT_1_ISO"); + export.WAREHOUSENUMBERDATA.LEQ_UNIT_2 = warehouse_struct.GetString("LEQ_UNIT_2"); + export.WAREHOUSENUMBERDATA.LEQ_UNIT_2_ISO = warehouse_struct.GetString("LEQ_UNIT_2_ISO"); + export.WAREHOUSENUMBERDATA.LEQ_UNIT_3 = warehouse_struct.GetString("LEQ_UNIT_3"); + export.WAREHOUSENUMBERDATA.LEQ_UNIT_3_ISO = warehouse_struct.GetString("LEQ_UNIT_3_ISO"); + export.WAREHOUSENUMBERDATA.L_EQUIP_1 = warehouse_struct.GetString("L_EQUIP_1"); + export.WAREHOUSENUMBERDATA.L_EQUIP_2 = warehouse_struct.GetString("L_EQUIP_2"); + export.WAREHOUSENUMBERDATA.L_EQUIP_3 = warehouse_struct.GetString("L_EQUIP_3"); + export.WAREHOUSENUMBERDATA.PLACEMENT = warehouse_struct.GetString("PLACEMENT"); //Cicor: If KA1 or KA5 => reserve LeNum + _log.Debug("Placement: " + export.WAREHOUSENUMBERDATA.PLACEMENT); + export.WAREHOUSENUMBERDATA.UNITTYPE_1 = warehouse_struct.GetString("UNITTYPE_1"); + export.WAREHOUSENUMBERDATA.UNITTYPE_2 = warehouse_struct.GetString("UNITTYPE_2"); + export.WAREHOUSENUMBERDATA.UNITTYPE_3 = warehouse_struct.GetString("UNITTYPE_3"); + + IRfcStructure salesdata_struct = func.GetStructure("SALESDATA"); + export.SALESDATA.SALES_ORG = salesdata_struct.GetString("SALES_ORG"); + export.SALESDATA.DISTR_CHAN = salesdata_struct.GetString("DISTR_CHAN"); + _log.Debug($"SALESSATA: ORG={export.SALESDATA.SALES_ORG} | CHAIN:{export.SALESDATA.DISTR_CHAN}"); + + IRfcTable materialdescription_table = func.GetTable("MATERIALDESCRIPTION"); + _log.Debug($"MAT_GET_ALL: found {materialdescription_table.Count} rows in MATERIALDESCRIPTION"); + foreach (IRfcStructure row in materialdescription_table) + { + BAPI_MAKT_GA temp = new BAPI_MAKT_GA(); + temp.LANGU = row.GetString("LANGU"); + temp.LANGU_ISO = row.GetString("LANGU_ISO"); + temp.MATL_DESC = row.GetString("MATL_DESC"); + if (ConfigHelper.SapLanguage.Equals(temp.LANGU_ISO)) + { + export.MATERIALDESCRIPTION.Add(temp); + _log.Debug($"MATDESC: LANG={temp.LANGU}|{temp.LANGU_ISO} | MATL_DESC:{temp.MATL_DESC}"); + } + } + + IRfcTable materialtext_table = func.GetTable("MATERIALTEXT"); + _log.Debug($"MAT_GET_ALL: found {materialtext_table.Count} rows in MATERIALTEXT"); + foreach (IRfcStructure row in materialtext_table) + { + BAPI_MLTX_GA temp = new BAPI_MLTX_GA(); + temp.APPLOBJECT = row.GetString("APPLOBJECT"); + temp.FORMAT_COL = row.GetString("FORMAT_COL"); + temp.LANGU = row.GetString("LANGU"); + temp.LANGU_ISO = row.GetString("LANGU_ISO"); + temp.TEXT_ID = row.GetString("TEXT_ID"); + temp.TEXT_LINE = row.GetString("TEXT_LINE"); + temp.TEXT_NAME = row.GetString("TEXT_NAME"); + if (ConfigHelper.SapLanguage.Equals(temp.LANGU_ISO)) + { + export.MATERIALTEXT.Add(temp); + _log.Debug($"MAT_GET_ALL MATTXT: APPLOBJ={temp.APPLOBJECT} | FORMATCOL:{temp.FORMAT_COL} | LANG:{temp.LANGU}|{temp.LANGU_ISO} | TEXT:{temp.TEXT_ID}|{temp.TEXT_LINE}|{temp.TEXT_NAME}"); + } + } + + IRfcTable extension_table = func.GetTable("EXTENSIONOUT"); + _log.Debug($"MAT_GET_ALL: found {extension_table.Count} rows in EXTENSIONOUT"); + foreach (IRfcStructure row in extension_table) + { + BAPIPAREX temp = new BAPIPAREX(); + temp.STRUCTURE = row.GetString("STRUCTURE"); + temp.VALUEPART1 = row.GetString("VALUEPART1"); + temp.VALUEPART2 = row.GetString("VALUEPART2"); + temp.VALUEPART3 = row.GetString("VALUEPART3"); + temp.VALUEPART4 = row.GetString("VALUEPART4"); + export.EXTENSIONOUT.Add(temp); + _log.Debug($"MAT_GET_ALL EXTENSIONOUT: STRUCT={temp.STRUCTURE} | VAL1:{temp.VALUEPART1} | VAL2:{temp.VALUEPART2}"); + } + + IRfcTable return_table = func.GetTable("RETURN"); + _log.Debug($"MAT_GET_ALL: found {return_table.Count} rows in RETURN"); + foreach (IRfcStructure row in return_table) + { + BAPIRETURN temp = new BAPIRETURN(); + temp.CODE = row.GetString("CODE"); + temp.LOG_MSG_NO = row.GetString("LOG_MSG_NO"); + temp.LOG_NO = row.GetString("LOG_NO"); + temp.MESSAGE = row.GetString("MESSAGE"); + temp.MESSAGE_V1 = row.GetString("MESSAGE_V1"); + temp.MESSAGE_V2 = row.GetString("MESSAGE_V2"); + temp.MESSAGE_V3 = row.GetString("MESSAGE_V3"); + temp.MESSAGE_V4 = row.GetString("MESSAGE_V4"); + export.RETURN.Add(temp); + _log.Debug($"MAT_GET_ALL RETURN: Code={temp.CODE} | Msg:{temp.MESSAGE}"); + } + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + + if (!errorMsg.Equals("")) { _log.Debug(errorMsg); } + + return export; + } + + private static BAPI_BATCH_CREATE_EXPORT BAPI_BATCH_CREATE(BAPI_BATCH_CREATE_IMPORT import) + { + string errorMsg = ""; + BAPI_BATCH_CREATE_EXPORT export = new BAPI_BATCH_CREATE_EXPORT(); + + try + { + StringBuilder ms = new StringBuilder(); + ms.Append($"Will now generate new Batch with the following Info:\n"); + ms.Append($"BATCHSTORAGELOCATION: {import.BATCHSTORAGELOCATION}\n"); + ms.Append($"MATERIAL: {import.MATERIAL}\n"); + ms.Append($"PLANT: {import.PLANT}\n"); + ms.Append($"VENDRBATCH: {import.BATCHATTRIBUTES.VENDRBATCH}\n"); + ms.Append($"VENDOR_NO: {import.BATCHATTRIBUTES.VENDOR_NO}\n"); + ms.Append($"PROD_DATE: {import.BATCHATTRIBUTES.PROD_DATE}\n"); + ms.Append($"ZZEMATN: {import.EXTENSION1.ZZEMATN}\n"); + ms.Append($"ZZMFRNR: {import.EXTENSION1.ZZMFRNR}\n"); + ms.Append($"ZZMFRPN: {import.EXTENSION1.ZZMFRPN}"); + _log.Debug(ms.ToString()); + + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction func = dest.Repository.CreateFunction("BAPI_BATCH_CREATE"); + func.SetValue("BATCHSTORAGELOCATION", import.BATCHSTORAGELOCATION); + func.SetValue("MATERIAL", import.MATERIAL.Trim().PadLeft(18, '0')); + func.SetValue("PLANT", import.PLANT); + IRfcStructure bapibatchatt = func.GetStructure("BATCHATTRIBUTES"); + bapibatchatt.SetValue("EXPIRYDATE", import.BATCHATTRIBUTES.EXPIRYDATE); + bapibatchatt.SetValue("VENDOR_NO", import.BATCHATTRIBUTES.VENDOR_NO); + bapibatchatt.SetValue("VENDRBATCH", import.BATCHATTRIBUTES.VENDRBATCH); + bapibatchatt.SetValue("PROD_DATE", import.BATCHATTRIBUTES.PROD_DATE); + IRfcStructure batchcontrolfields = func.GetStructure("BATCHCONTROLFIELDS"); + batchcontrolfields.SetValue("CLASS_NUM", "CHARGE_ELEKTR"); + batchcontrolfields.SetValue("DOCLASSIFY", "X"); + IRfcStructure extension1 = func.GetStructure("EXTENSION1"); + extension1.SetValue("ZZMFRNR", import.EXTENSION1.ZZMFRNR); + extension1.SetValue("ZZMFRPN", import.EXTENSION1.ZZMFRPN); + extension1.SetValue("ZZEMATN", import.EXTENSION1.ZZEMATN); + func.Invoke(dest); + + export.BATCH = func.GetString("BATCH"); // Get Batch + _log.Debug("Got new Batch from SAP: " + export.BATCH); + IRfcStructure bapibatchatt_export = func.GetStructure("BATCHATTRIBUTES"); + export.BATCHATTRIBUTES.AVAILABLE = bapibatchatt_export.GetString("AVAILABLE"); + export.BATCHATTRIBUTES.EXPIRYDATE = bapibatchatt_export.GetString("EXPIRYDATE"); + export.BATCHATTRIBUTES.STATUSKEY = bapibatchatt_export.GetString("STATUSKEY"); + export.BATCHATTRIBUTES.VENDOR_NO = bapibatchatt_export.GetString("VENDOR_NO"); + export.BATCHATTRIBUTES.VENDRBATCH = bapibatchatt_export.GetString("VENDRBATCH"); + export.BATCHATTRIBUTES.VAL_TYPE = bapibatchatt_export.GetString("VAL_TYPE"); + export.BATCHATTRIBUTES.LASTGRDATE = bapibatchatt_export.GetString("LASTGRDATE"); + export.BATCHATTRIBUTES.FREE_DATE1 = bapibatchatt_export.GetString("FREE_DATE1"); + export.BATCHATTRIBUTES.FREE_DATE2 = bapibatchatt_export.GetString("FREE_DATE2"); + export.BATCHATTRIBUTES.FREE_DATE3 = bapibatchatt_export.GetString("FREE_DATE3"); + export.BATCHATTRIBUTES.FREE_DATE4 = bapibatchatt_export.GetString("FREE_DATE4"); + export.BATCHATTRIBUTES.FREE_DATE5 = bapibatchatt_export.GetString("FREE_DATE5"); + export.BATCHATTRIBUTES.FREE_DATE6 = bapibatchatt_export.GetString("FREE_DATE6"); + export.BATCHATTRIBUTES.COUNTRYORI = bapibatchatt_export.GetString("COUNTRYORI"); + export.BATCHATTRIBUTES.COUNTRYORI_ISO = bapibatchatt_export.GetString("COUNTRYORI_ISO"); + export.BATCHATTRIBUTES.REGIONORIG = bapibatchatt_export.GetString("REGIONORIG"); + export.BATCHATTRIBUTES.EXPIMPGRP = bapibatchatt_export.GetString("EXPIMPGRP"); + export.BATCHATTRIBUTES.NEXTINSPEC = bapibatchatt_export.GetString("NEXTINSPEC"); + export.BATCHATTRIBUTES.PROD_DATE = bapibatchatt_export.GetString("PROD_DATE"); + export.BATCHATTRIBUTES.DEL_FLAG = bapibatchatt_export.GetString("DEL_FLAG"); + export.BATCHATTRIBUTES.STK_SEGMENT = bapibatchatt_export.GetString("STK_SEGMENT"); + export.BATCHATTRIBUTES.CERT_DATE = bapibatchatt_export.GetString("CERT_DATE"); + export.BATCHATTRIBUTES.STK_SEG_LONG = bapibatchatt_export.GetString("STK_SEG_LONG"); + + IRfcTable ret_table = func.GetTable("RETURN"); + foreach (IRfcStructure row in ret_table) + { + BAPIRET2 temp = new BAPIRET2(); + temp.FIELD = ret_table.GetString("FIELD"); + temp.ID = ret_table.GetString("ID"); + temp.LOG_MSG_NO = ret_table.GetString("LOG_MSG_NO"); + temp.LOG_NO = ret_table.GetString("LOG_NO"); + temp.MESSAGE = ret_table.GetString("MESSAGE"); + temp.MESSAGE_V1 = ret_table.GetString("MESSAGE_V1"); + temp.MESSAGE_V2 = ret_table.GetString("MESSAGE_V2"); + temp.MESSAGE_V3 = ret_table.GetString("MESSAGE_V3"); + temp.MESSAGE_V4 = ret_table.GetString("MESSAGE_V4"); + temp.NUMBER = ret_table.GetString("NUMBER"); + temp.PARAMETER = ret_table.GetString("PARAMETER"); + temp.ROW = ret_table.GetString("ROW"); + temp.SYSTEM = ret_table.GetString("SYSTEM"); + temp.TYPE = ret_table.GetString("TYPE"); + export.RETURN.Add(temp); + + _log.Debug($"Return ({temp.TYPE} | {temp.ID} | NUM:{temp.NUMBER}): " + temp.MESSAGE + $" | V1:{temp.MESSAGE_V1} | V2:{temp.MESSAGE_V2} | V3:{temp.MESSAGE_V3} | V4:{temp.MESSAGE_V4}"); + } + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + + if (!errorMsg.Equals("")) { _log.Debug(errorMsg); } + + return export; + } + + private static BAPI_GOODSMVT_CREATE_EXPORT BAPI_GOODSMVT_CREATE(BAPI_GOODSMVT_CREATE_IMPORT import) + { + string errorMsg = ""; + BAPI_GOODSMVT_CREATE_EXPORT export = new BAPI_GOODSMVT_CREATE_EXPORT(); + + try + { + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction func = dest.Repository.CreateFunction("Z_CMP_GOODSMVT_CREATE"); + IRfcStructure goodsmvt_header = func.GetStructure("GOODSMVT_HEADER"); + goodsmvt_header.SetValue("DOC_DATE", import.GOODSMVT_HEADER.DOC_DATE); + goodsmvt_header.SetValue("PR_UNAME", import.GOODSMVT_HEADER.PR_UNAME); + goodsmvt_header.SetValue("PSTNG_DATE", import.GOODSMVT_HEADER.PSTNG_DATE); + goodsmvt_header.SetValue("REF_DOC_NO", import.GOODSMVT_HEADER.REF_DOC_NO); + goodsmvt_header.SetValue("VER_GR_GI_SLIP", "2"); + goodsmvt_header.SetValue("VER_GR_GI_SLIPX", "X"); + func.GetStructure("GOODSMVT_CODE").SetValue("GM_CODE", import.GOODSMVT_CODE.GM_CODE); + IRfcTable goodsmvt_item = func.GetTable("GOODSMVT_ITEM"); + + _log.Debug($"GOODSMVT: Will transmit {import.GOODSMVT_ITEM.Count} reels to SAP"); + foreach (BAPI2017_GM_ITEM_CREATE item in import.GOODSMVT_ITEM) + { + goodsmvt_item.Append(); + goodsmvt_item.SetValue("BATCH", item.BATCH); + goodsmvt_item.SetValue("DELIV_ITEM", item.DELIV_ITEM); + goodsmvt_item.SetValue("DELIV_NUMB", item.DELIV_NUMB); + goodsmvt_item.SetValue("ENTRY_QNT", item.ENTRY_QNT); + goodsmvt_item.SetValue("ENTRY_UOM", item.ENTRY_UOM); + goodsmvt_item.SetValue("ENTRY_UOM_ISO", item.ENTRY_UOM_ISO); + goodsmvt_item.SetValue("EXPIRYDATE", item.EXPIRYDATE); + goodsmvt_item.SetValue("ITEM_TEXT", item.ITEM_TEXT); + goodsmvt_item.SetValue("MATERIAL", item.MATERIAL); + goodsmvt_item.SetValue("MOVE_BATCH", item.MOVE_BATCH); + goodsmvt_item.SetValue("MOVE_PLANT", item.MOVE_PLANT); + goodsmvt_item.SetValue("MOVE_STLOC", item.MOVE_STLOC); + goodsmvt_item.SetValue("MOVE_TYPE", item.MOVE_TYPE); + goodsmvt_item.SetValue("MVT_IND", item.MVT_IND); + goodsmvt_item.SetValue("NO_TRANSFER_REQ", item.NO_TRANSFER_REQ); + goodsmvt_item.SetValue("PLANT", item.PLANT); + goodsmvt_item.SetValue("PO_ITEM", item.PO_ITEM); + goodsmvt_item.SetValue("PO_NUMBER", item.PO_NUMBER); + goodsmvt_item.SetValue("SPEC_STOCK", item.SPEC_STOCK); + goodsmvt_item.SetValue("STCK_TYPE", item.STCK_TYPE); + goodsmvt_item.SetValue("STGE_LOC", item.STGE_LOC); + goodsmvt_item.SetValue("VENDOR", item.VENDOR); + _log.Debug($"GOODSMVT: Will transmit reel => MATERIAL:{item.MATERIAL}, QNT:{item.ENTRY_QNT}"); + } + func.Invoke(dest); + + export.MATDOCUMENTYEAR = func.GetString("MATDOCUMENTYEAR"); + export.MATERIALDOCUMENT = func.GetString("MATERIALDOCUMENT"); + + _log.Debug($"GOODSMVT_CREATE: MATERIALDOCUMENTYEAR={export.MATDOCUMENTYEAR} MATERIALDOCUMENT={export.MATERIALDOCUMENT}"); + + IRfcTable ret_table = func.GetTable("RETURN"); + foreach (IRfcStructure row in ret_table) + { + BAPIRET2 temp = new BAPIRET2(); + temp.FIELD = ret_table.GetString("FIELD"); + temp.ID = ret_table.GetString("ID"); + temp.LOG_MSG_NO = ret_table.GetString("LOG_MSG_NO"); + temp.LOG_NO = ret_table.GetString("LOG_NO"); + temp.MESSAGE = ret_table.GetString("MESSAGE"); + temp.MESSAGE_V1 = ret_table.GetString("MESSAGE_V1"); + temp.MESSAGE_V2 = ret_table.GetString("MESSAGE_V2"); + temp.MESSAGE_V3 = ret_table.GetString("MESSAGE_V3"); + temp.MESSAGE_V4 = ret_table.GetString("MESSAGE_V4"); + temp.NUMBER = ret_table.GetString("NUMBER"); + temp.PARAMETER = ret_table.GetString("PARAMETER"); + temp.ROW = ret_table.GetString("ROW"); + temp.SYSTEM = ret_table.GetString("SYSTEM"); + temp.TYPE = ret_table.GetString("TYPE"); + export.RETURN.Add(temp); + + _log.Debug($"Return ({temp.TYPE} | {temp.ID} | NUM:{temp.NUMBER}): " + temp.MESSAGE + $" | V1:{temp.MESSAGE_V1} | V2:{temp.MESSAGE_V2} | V3:{temp.MESSAGE_V3} | V4:{temp.MESSAGE_V4}"); + } + + ret_table = func.GetTable("RETURN2"); + foreach (IRfcStructure row in ret_table) + { + BAPIRET2 temp = new BAPIRET2(); + temp.FIELD = ret_table.GetString("FIELD"); + temp.ID = ret_table.GetString("ID"); + temp.LOG_MSG_NO = ret_table.GetString("LOG_MSG_NO"); + temp.LOG_NO = ret_table.GetString("LOG_NO"); + temp.MESSAGE = ret_table.GetString("MESSAGE"); + temp.MESSAGE_V1 = ret_table.GetString("MESSAGE_V1"); + temp.MESSAGE_V2 = ret_table.GetString("MESSAGE_V2"); + temp.MESSAGE_V3 = ret_table.GetString("MESSAGE_V3"); + temp.MESSAGE_V4 = ret_table.GetString("MESSAGE_V4"); + temp.NUMBER = ret_table.GetString("NUMBER"); + temp.PARAMETER = ret_table.GetString("PARAMETER"); + temp.ROW = ret_table.GetString("ROW"); + temp.SYSTEM = ret_table.GetString("SYSTEM"); + temp.TYPE = ret_table.GetString("TYPE"); + export.RETURN.Add(temp); //Also add to same return + + _log.Debug($"Return2 ({temp.TYPE} | {temp.ID} | NUM:{temp.NUMBER}): " + temp.MESSAGE + $" | V1:{temp.MESSAGE_V1} | V2:{temp.MESSAGE_V2} | V3:{temp.MESSAGE_V3} | V4:{temp.MESSAGE_V4}"); + } + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; export.RETURN.Add(new BAPIRET2() { TYPE = "E", MESSAGE = ex.ToString() }); } + + if (!errorMsg.Equals("")) { _log.Error(errorMsg); } + + return export; + } + + private static NUMBER_GET_NEXT_EXPORT NUMBER_GET_NEXT() + { + string errorMsg = ""; + NUMBER_GET_NEXT_EXPORT export = new NUMBER_GET_NEXT_EXPORT(); + _log.Debug($"Will try to execute NUMBER_GET_NEXT: Now Z_CMP_GET_NEXT_SU\n"); + + try + { + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction func = dest.Repository.CreateFunction("Z_CMP_GET_NEXT_SU"); + func.Invoke(dest); + + export.NUMBER = func.GetString("E_NUMBER"); + export.QUANTITY = func.GetInt("E_QUANTITY"); + export.RETURNCODE = func.GetString("RETURNCODE"); + + StringBuilder ms = new StringBuilder(); + ms.Append($"Results of NUMBER_GET_NEXT:\n"); + ms.Append($"E_NUMBER: {export.NUMBER}\n"); + ms.Append($"RETURNCODE: {export.RETURNCODE}"); + _log.Debug(ms.ToString()); + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + + if (!errorMsg.Equals("")) { _log.Debug(errorMsg); } + + return export; + } + + private static CLAF_CLASSIFICATION_OF_OBJECTS_EXPORT CLAF_CLASSIFICATION_OF_OBJECTS(CLAF_CLASSIFICATION_OF_OBJECTS_IMPORT import) + { + string errorMsg = ""; + CLAF_CLASSIFICATION_OF_OBJECTS_EXPORT export = new CLAF_CLASSIFICATION_OF_OBJECTS_EXPORT(); + + try + { + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction func = dest.Repository.CreateFunction("CLAF_CLASSIFICATION_OF_OBJECTS"); + func.SetValue("CLASS", import.CLASS); + func.SetValue("CLASSTYPE", import.CLASSTYPE); + func.SetValue("INHERITED_CHAR", import.INHERITED_CHAR); + func.SetValue("LANGUAGE", import.LANGUAGE); + func.SetValue("OBJECT", import.OBJECT); + func.SetValue("OBJECTTABLE", import.OBJECTTABLE); + func.SetValue("CLASSTEXT", "X"); + func.SetValue("INITIAL_CHARACT", "X"); + func.Invoke(dest); + + IRfcTable t_objects_table = func.GetTable("T_OBJECTDATA"); + foreach (IRfcStructure row in t_objects_table) + { + export.T_OBJECTDATA.Add(new CLOBJDAT() + { + TABIX = row.GetInt("TABIX"), + POSNR = row.GetString("POSNR"), + SMBEZ = row.GetString("SMBEZ"), + ZAEHL = row.GetString("ZAEHL"), + OPER1 = row.GetString("OPER1"), + AUSP1 = row.GetString("AUSP1"), + DIME1 = row.GetString("DIME1"), + ATFLV = row.GetFloat("ATFLV"), + OPER2 = row.GetString("OPER2"), + AUSP2 = row.GetString("AUSP2"), + DIME2 = row.GetString("DIME2"), + ATNAM = row.GetString("ATNAM"), + INHER = row.GetString("INHER"), + VCLINT = row.GetString("VCLINT"), + ATVGLART = row.GetString("ATVGLART"), + ATZIS = row.GetString("ATZIS") + }); + } + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + + if (!errorMsg.Equals("")) { _log.Error(errorMsg); } + + return export; + } + private static BAPI_OBJCL_GET_KEY_OF_OBJECT_EXPORT BAPI_OBJCL_GET_KEY_OF_OBJECT(BAPI_OBJCL_GET_KEY_OF_OBJECT_IMPORT import) + { + string errorMsg = ""; + BAPI_OBJCL_GET_KEY_OF_OBJECT_EXPORT export = new BAPI_OBJCL_GET_KEY_OF_OBJECT_EXPORT(); + string OBJECTNAME = import.MATNR?.Trim().PadLeft(18, '0') + import.MATNR?.Trim().PadLeft(10, '0'); //Create Objectname based on MATNR and CHARG (with '0' in front) + + try + { + RfcDestination dest = RfcDestinationManager.GetDestination(ConfigHelper.ActiveSapDestinationName); + IRfcFunction func = dest.Repository.CreateFunction("BAPI_OBJCL_GET_KEY_OF_OBJECT"); + func.SetValue("CLASSTYPE", import.CLASSTYPE); + func.SetValue("OBJECTNAME", OBJECTNAME); + func.SetValue("OBJECTTABLE", import.OBJECTTABLE); + func.Invoke(dest); + + export.CLOBJECTKEYOUT = func.GetString("CLOBJECTKEYOUT"); + } + catch (Exception ex) { errorMsg += "CI: SAP Other Exception: " + ex; } + + if (!errorMsg.Equals("")) { _log.Debug(errorMsg); } + + return export; + } } } diff --git a/CompControl.SapFrameworkConnector/Standard/StandardApiController.cs b/CompControl.SapFrameworkConnector/Standard/StandardApiController.cs index 0944928..65e899b 100644 --- a/CompControl.SapFrameworkConnector/Standard/StandardApiController.cs +++ b/CompControl.SapFrameworkConnector/Standard/StandardApiController.cs @@ -5,13 +5,11 @@ using System.Threading; using System.Threading.Tasks; using System.Web.Http; using CompControl.ErpConnector.Service.Models; -using static CompControl.ErpConnector.Service.Models.Cicor_SapModels; -using static CompControl.ErpConnector.Service.Models.SapDataTypes; namespace CompControl.SapFrameworkConnector { - [RoutePrefix("api/we")] + [RoutePrefix("api/standard")] public class StandardApiController: ApiController { private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); @@ -21,73 +19,11 @@ namespace CompControl.SapFrameworkConnector public async Task GetBestellungen([FromBody] FilterBestellungen filterBestellungen, CancellationToken cancellationToken) { ApiResultBestellungen result = new ApiResultBestellungen(); //New ApiResult to return via Web + _log.Debug("GetBestellungen received for Filter: " + filterBestellungen.ToString()); try { - _log.Debug("GetBestellungen received for Filter: " + filterBestellungen.ToString()); - - BAPI_PO_GETDETAIL_IMPORT import = new BAPI_PO_GETDETAIL_IMPORT() { PURCHASEORDER = filterBestellungen.OrderNo }; - BAPI_PO_GETDETAIL_EXPORT details = SapStandardFunctions.BAPI_PO_GETDETAILS(import); - int cnt = 0; - - foreach (BAPIEKPO det in details.PO_ITEMS) - { - cnt++; - string inspect = ""; - string inspectInfo = ""; - string prioText = ""; - string prioChar = ""; - string ItemText1 = ""; - bool posIsClosed = false; - DateTime expDeliverDate = DateTime.MaxValue; - - if (det.QUAL_INSP.Equals("X")) - { - inspect = "Q"; - if (ConfigHelper.SapLanguage.Equals("DE")) { inspectInfo = "Qualitaetspruefung erforderlich!"; } - else { inspectInfo = "Quality check mandatory!"; } - } - - expDeliverDate = SapStandardFunctions.ConvertSapDateToDateTime(det.ExpectedDeliveryDate, false); - if (det.QUANTITY <= det.QUANTITYPROCESSED) { posIsClosed = true; } - - GetMAKTXfromMATNR_IMPORT getMak = new GetMAKTXfromMATNR_IMPORT(); - getMak.MATNR = det.MATERIAL.Trim(); - GetMAKTXfromMATNR_EXPORT outMak = SapStandardFunctions.GetMAKTXfromMATNR(getMak); - ItemText1 = outMak.MAKTX; - - GrDataItem gr = new GrDataItem(); - gr.AcceptedManufacturesLink = cnt.ToString(); - gr.Created = SapStandardFunctions.ConvertSapDateToDateTime(details.PO_HEADER.CREATED_ON); - gr.LastUpdate = SapStandardFunctions.ConvertSapDateToDateTime(det.CHANGED_ON); - gr.PosIsClosed = posIsClosed; - gr.OrderNo = det.PO_NUMBER; - gr.OrderPos = det.PO_ITEM; - gr.OrderQuantity = det.QUANTITY; - gr.ItemNo = det.MATERIAL.Trim(); - gr.ItemText1 = ItemText1; - gr.ItemNoRef = gr.CustomValue05 = det.PUR_MAT; - gr.OrderPosInfoText = det.ACCTASSCAT; - gr.QuantityProcessed = det.QUANTITYPROCESSED; - gr.QuantityUnit = det.UNIT; - gr.Plant = det.PLANT; - gr.Inspection = inspect; - gr.InspectionInfo = inspectInfo; - gr.Priority = prioChar; - gr.PriorityInfoText = prioText; - gr.CustomValue01 = det.QUAL_INSP; - gr.ExpectedDeliveryDate = expDeliverDate; - gr.MPN = det.MANU_MAT.Trim(); - gr.SupplierNo = details.PO_HEADER.VENDOR; - gr.SupplierName = details.PO_HEADER.VEND_NAME; - gr.SupplierItemNo = det.VEND_MAT; - gr.StorageLocation = det.STOR_LOC; - gr.Schedule = det.SCHEDULE.TrimStart('0'); - gr.CustomValue08 = details.PO_HEADER.DOC_TYPE; - if (!det.DELETE_IND.Equals("L")) { result.GrDataItems.Add(gr); } - } - - _log.Debug($"Result of GetBestellungen now consists of {result.GrDataItems.Count} GrDataItems and {result.ManufacturerDataItems.Count} ManufactuerDataItems..."); + SapStandardFunctions.GetBestellung(filterBestellungen.OrderNo); if (result.IsSuccessful) { _log.Debug(result); } //Action was successful => log for debug else { _log.Error(result); } //An error occurred @@ -108,7 +44,6 @@ namespace CompControl.SapFrameworkConnector return Request.CreateResponse(HttpStatusCode.OK, result); } - [Route("getherstellerdaten")] public async Task GetHerstellerdaten([FromUri] string itemNo, CancellationToken cancellationToken) { @@ -117,7 +52,7 @@ namespace CompControl.SapFrameworkConnector try { - + SapStandardFunctions.GetHerstellerdaten(itemNo); if (result.IsSuccessful) { _log.Debug(result); } //Action was successful => log for debug else { _log.Error(result); } //An error occurred @@ -137,5 +72,63 @@ namespace CompControl.SapFrameworkConnector return Request.CreateResponse(HttpStatusCode.OK, result); } + + [Route("getmaterialdaten")] + public async Task GetMaterialdaten([FromUri] string itemNo, CancellationToken cancellationToken) + { + ApiResultMaterialdaten result = new ApiResultMaterialdaten(); //New ApiResult to return via Web + _log.Debug("GetMaterialdaten received for itemNo: " + itemNo); + + try + { + result = SapStandardFunctions.GetMaterialdaten(itemNo); + + if (result.IsSuccessful) { _log.Debug(result); } //Action was successful => log for debug + else { _log.Error(result); } //An error occurred + } + catch (Exception ex) + { + string sm = $"GetMaterialdaten: An unexpected error occured for '{itemNo}' " + ex; + _log.Error(sm); + result = new ApiResultMaterialdaten //Default ApiResult on error + { + ErrorNumber = 101, + MessageShort = sm, + MessageLong = sm, + MessageTechnical = $"{sm} [{itemNo}] - {ex}" + }; + } + + return Request.CreateResponse(HttpStatusCode.OK, result); + } + + [Route("getallmaterialdaten")] + public async Task GetAllMaterialdaten(CancellationToken cancellationToken) + { + ApiResultMaterialdaten result = new ApiResultMaterialdaten(); //New ApiResult to return via Web + _log.Debug("GetAllMaterialdaten received "); + + try + { + result = SapStandardFunctions.GetMaterialdaten(""); + + if (result.IsSuccessful) { _log.Debug(result); } //Action was successful => log for debug + else { _log.Error(result); } //An error occurred + } + catch (Exception ex) + { + string sm = $"GetAllMaterialdaten: An unexpected error occured => " + ex; + _log.Error(sm); + result = new ApiResultMaterialdaten //Default ApiResult on error + { + ErrorNumber = 101, + MessageShort = sm, + MessageLong = sm, + MessageTechnical = $"{sm} [] - {ex}" + }; + } + + return Request.CreateResponse(HttpStatusCode.OK, result); + } } }