/// <summary>
 /// This method used for nsert into posReturnBillItem and return primary key. -An
 /// </summary>
 /// <param name="posReturnBillItem">posReturnBillItem Contains POSBiillItemID,ReturnedQuantity</param>
 /// <returns></returns>
 public int AddPOSReturnBillItem(POSReturnBillItem posReturnBillItem)
 {
     try
     {
         _posReturnBillItemContext.Add(posReturnBillItem);
         _posReturnBillItemContext.SaveChanges();
         return(posReturnBillItem.Id);
     }
     catch (Exception ex)
     {
         _errorLog.LogException(ex);
         throw;
     }
 }
 /// <summary>
 /// This method used for update pos return bill item and return primary key. -An
 /// </summary>
 /// <param name="posRetunrBillItem"></param>
 /// <returns>id of bill</returns>
 public int UpdatePosReturnBillItem(POSReturnBillItem posRetunrBillItem)
 {
     try
     {
         posRetunrBillItem.ModifiedDateTime = DateTime.UtcNow;
         _posReturnBillItemContext.Update(posRetunrBillItem);
         _posReturnBillItemContext.SaveChanges();
         return(posRetunrBillItem.Id);
     }
     catch (Exception ex)
     {
         _errorLog.LogException(ex);
         throw;
     }
 }
        public IHttpActionResult SubmitPOSBill(POSReturnBillAC posReturnBillAC)
        {
            try
            {
                if (HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    if (posReturnBillAC != null)
                    {
                        int branchId;
                        if (posReturnBillAC.BranchId != 0)
                        {
                            branchId = posReturnBillAC.BranchId;
                        }
                        else
                        {
                            branchId = Convert.ToInt32(MerchantContext.UserDetails.BranchId);
                        }

                        POSReturnBill posReturnBill = new POSReturnBill();
                        posReturnBill.CreatedDateTime       = DateTime.UtcNow;
                        posReturnBill.IsProcessed           = false;
                        posReturnBill.IssuingBranchID       = Convert.ToInt32(MerchantContext.UserDetails.BranchId);
                        posReturnBill.POSBillId             = posReturnBillAC.POSBillId;
                        posReturnBill.ProcessingBranchID    = branchId;
                        posReturnBill.ProcessingDate        = posReturnBill.CreatedDateTime;
                        posReturnBill.ProcessorID           = MerchantContext.UserDetails.Id;
                        posReturnBill.ReturneBy             = posReturnBill.ProcessorID;
                        posReturnBill.ReturnedBillNo        = GetReturnBillNumber(posReturnBillAC.ReturnBillNumber);
                        posReturnBill.ReturnedCash          = posReturnBillAC.ReturnCashAmount;
                        posReturnBill.ReturningComments     = posReturnBillAC.Comment;
                        posReturnBill.ReturningDate         = posReturnBill.ProcessingDate;
                        posReturnBill.ReturningType         = Convert.ToInt32(POSBillPaymentType.Cash);
                        posReturnBill.SubstituteItemsAmount = posReturnBillAC.ReturnSubtituteItemsAmount;
                        int posReturnBillId = _iReturnBillRepository.AddPOSReturnBill(posReturnBill);
                        if (posReturnBillId != 0)
                        {
                            if (posReturnBillAC.ReturnBillItemList.Any())
                            {
                                foreach (var returnBillItem in posReturnBillAC.ReturnBillItemList) //this foreach used for add pos return bill item.
                                {
                                    if (returnBillItem.ReturnQunatity > 0)
                                    {
                                        POSReturnBillItem posReturnBillItem = new POSReturnBillItem();
                                        posReturnBillItem.CreatedDateTime  = DateTime.UtcNow;
                                        posReturnBillItem.POSBiillItemID   = returnBillItem.POSBillItemId;
                                        posReturnBillItem.ReturnedBillID   = posReturnBillId;
                                        posReturnBillItem.ReturnedQuantity = returnBillItem.ReturnQunatity;
                                        int id = _iReturnBillRepository.AddPOSReturnBillItem(posReturnBillItem);
                                        if (id != 0)
                                        {
                                            POSReturnBillItem returnPOSRetunBillItem = _iReturnBillRepository.GetPOSReturnBillItemById(id);
                                            if (returnPOSRetunBillItem != null)//this for maintain branch item qunatity,when client return quantity add quantity item in actual quantity.
                                            {
                                                var          posBillItem  = _iReturnBillRepository.GetPOSBillItemById(returnPOSRetunBillItem.POSBiillItemID);
                                                ItemProfile  itemProfile  = _iItemRepository.GetItemProfileObjectById(posBillItem.ItemID);
                                                ItemQuantity itemQuantity = new ItemQuantity();
                                                if (itemProfile != null)
                                                {
                                                    if (itemProfile.IsParentItem)
                                                    {
                                                        itemQuantity = _iItemRepository.GetItemQunatityByBranchIdAndItemId(posBillItem.ItemID, branchId);
                                                        if (itemQuantity != null)
                                                        {
                                                            itemQuantity.ActualQuantity = (itemQuantity.ActualQuantity + returnBillItem.ReturnQunatity);
                                                        }
                                                    }
                                                    else // for sub item
                                                    {
                                                        itemQuantity = _iItemRepository.GetItemQunatityByBranchIdAndItemId(Convert.ToInt32(itemProfile.ParentItemId), branchId);
                                                        if (itemQuantity != null)
                                                        {
                                                            int systemQuantity = itemQuantity.ActualQuantity + (itemProfile.BaseUnit * returnBillItem.ReturnQunatity);
                                                            itemQuantity.ActualQuantity = systemQuantity > 0 ? systemQuantity : 0;
                                                        }
                                                    }
                                                    _iItemRepository.UpdateItemQunatity(itemQuantity);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            return(Ok(new { isResult = posReturnBill.ReturnedBillNo }));
                        }
                    }
                    return(Ok(new { isResult = false }));
                }
                else
                {
                    return(BadRequest());
                }
            }
            catch (Exception ex)
            {
                _errorLog.LogException(ex);
                throw;
            }
        }