public void LogGoodsReceiptTransaction(oGoodsReceipt obj, bool isPosted, string action, string origin, ErrorLog errLog = null)
        {
            try
            {
                log.TransactionNo = obj.DocNo.ToString();
                log.Origin        = origin;
                log.Type          = TransactionLog.SBOType.GR;
                log.LogDate       = DateTime.Now;
                log.IsPosted      = isPosted;

                TransactionData rawData = new TransactionData();
                rawData.PostedOn = obj.DocDate;
                rawData.RawData  = JsonConvert.SerializeObject(obj);

                log.RawData   = rawData;
                log.Action    = action;
                log.CreatedBy = obj.CreatedBy;
                log.CreatedOn = obj.CreateDate;
                repo.AddOrUpdate(log);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        public async Task <object> AddGR(oGoodsReceipt goodsReceipt)
        {
            try
            {
                if (goodsReceipt == null)
                {
                    return new { SAPGRDocumentNumber = -1, ReturnMessage = $"Object cannot be null!!" }
                }
                ;;

                oGoodsReceipt _grpo = null;

                string isOldItem = goodsReceipt.GoodsReceiptLines.Select(x => x.IsOldItem).First();
                if (isOldItem == null)
                {
                    errMsg = string.Format("Item classification cannot be null. (Is Old Item)", goodsReceipt.BatchNumber);

                    var resp = new HttpResponseMessage(HttpStatusCode.Conflict);
                    resp.Content      = new StringContent(errMsg);
                    resp.ReasonPhrase = "Field cannot be null";
                    ErrorLog _err = new ErrorLog();
                    _err.ErrorCode  = (int)HttpStatusCode.Conflict;
                    _err.Message    = errMsg;
                    _err.StackTrace = Environment.StackTrace;

                    var err = ErrorLogger.Log(_err);

                    transactionLogger.LogGoodsReceiptTransaction(goodsReceipt, false, "A", HttpContext.Current.Request.UserHostAddress, _err);
                    throw new HttpResponseException(resp);
                }


                goodsReceipt.BatchNumber = isOldItem.ToUpper() == "Y" ? $"R-{goodsReceipt.BatchNumber}" : $"N-{goodsReceipt.BatchNumber}";

                if (goodsReceipt.GoodsReceiptLines.Count > 0)
                {
                    foreach (var l in goodsReceipt.GoodsReceiptLines)
                    {
                        if (l.IsOldItem.ToLower() == "y")
                        {
                            if (l.WarehouseCode == "" || string.IsNullOrEmpty(l.WarehouseCode))
                            {
                                l.WarehouseCode = ConfigurationManager.AppSettings["DefaultRemaWarehouse"];
                                l.BinCode       = Int32.Parse(ConfigurationManager.AppSettings["DefaultRemaBin"]);
                            }
                        }
                    }
                }

                if (!GlobalInstance.Instance.IsConnected)
                {
                    GlobalInstance.Instance.InitializeSboComObject();
                }
                if (goodsReceipt.BatchNumber != null)
                {
                    _grpo = await repo.GetByBatchNo(goodsReceipt.BatchNumber);
                }

                string validationStr = ModelValidator.ValidateModel(goodsReceipt);

                if (!string.IsNullOrEmpty(validationStr))
                {
                    errMsg = string.Format(validationStr);
                    var resp = new HttpResponseMessage(HttpStatusCode.Conflict);
                    resp.Content      = new StringContent(errMsg);
                    resp.ReasonPhrase = "Object property validation error";
                    ErrorLog _err = new ErrorLog();
                    _err.ErrorCode  = (int)HttpStatusCode.Conflict;
                    _err.Message    = errMsg;
                    _err.StackTrace = Environment.StackTrace;

                    var err = ErrorLogger.Log(_err);

                    transactionLogger.LogGoodsReceiptTransaction(goodsReceipt, false, "A", HttpContext.Current.Request.UserHostAddress, _err);
                    throw new HttpResponseException(resp);
                }

                if (_grpo != null)
                {
                    errMsg = string.Format("Goods Receipt {0} already exist.", goodsReceipt.BatchNumber);
                    var resp = new HttpResponseMessage(HttpStatusCode.Conflict);
                    resp.Content      = new StringContent(errMsg);
                    resp.ReasonPhrase = "Object already exist.";
                    ErrorLog _err = new ErrorLog();
                    _err.ErrorCode  = (int)HttpStatusCode.Conflict;
                    _err.Message    = errMsg;
                    _err.StackTrace = Environment.StackTrace;

                    var err = ErrorLogger.Log(_err);

                    transactionLogger.LogGoodsReceiptTransaction(goodsReceipt, false, "A", HttpContext.Current.Request.UserHostAddress, _err);
                    throw new HttpResponseException(resp);
                }

                if (repo.Add(goodsReceipt) != 0)
                {
                    errMsg = GlobalInstance.Instance.SBOErrorMessage;
                    var resp = new HttpResponseMessage(HttpStatusCode.Conflict);
                    resp.Content      = new StringContent(errMsg);
                    resp.ReasonPhrase = "SBO Error";
                    ErrorLog _err = new ErrorLog();
                    _err.ErrorCode  = (int)HttpStatusCode.Conflict;
                    _err.Message    = errMsg;
                    _err.StackTrace = Environment.StackTrace;

                    var err = ErrorLogger.Log(_err);

                    transactionLogger.LogGoodsReceiptTransaction(goodsReceipt, false, "A", HttpContext.Current.Request.UserHostAddress, _err);
                    throw new HttpResponseException(resp);
                }

                transactionLogger.LogGoodsReceiptTransaction(goodsReceipt, true, "A", HttpContext.Current.Request.UserHostAddress);
                var grpo = await repo.GetByBatchNo(goodsReceipt.BatchNumber);

                return(new { SAPGRDocumentNumber = grpo.DocNo, ReturnMessage = $"Goods receipt {goodsReceipt.BatchNumber} successfully added." });
            }
            catch (HttpResponseException ex)
            {
                throw new HttpResponseException(ex.Response);
            }
        }