public ActionResult Save(SlsSalesReturnViewModel objT)
        {
            int userId = Convert.ToInt32(Session["userId"]);
            int companyId = Convert.ToInt32(Session["companyId"]);
            Operation objOperation = new Operation { Success = false };

            if (ModelState.IsValid)
            {

                //Get store id of logged in user.
                var dbfactory = new DatabaseFactory();
                IOfficeService offservice = new OfficeService(new OfficeRepository(dbfactory), new UnitOfWork(dbfactory));
                SlsOffice off = offservice.GetUserOffice(userId);
                int officeId = off.Id;
                IStoreService storeservice = new StoreService(new InvStoreRepository(dbfactory), new UnitOfWork(dbfactory));
                InvStore store = storeservice.GetStoresForOffice(officeId);
                int storeId = store.Id;

                if (objT.Id == 0)
                {
                    if ((bool)Session["Add"])
                    {
                        objT.CreatedBy = userId;
                        objT.CreatedDate = DateTime.Now.Date;
                        objT.SecCompanyId = companyId;
                        objOperation = _SalesReturnService.Save(objT, storeId);
                    }
                    else { objOperation.OperationId = -1; }

                }
                else
                {
                    if ((bool)Session["Edit"])
                    {
                        objT.ModifiedBy = userId;
                        objT.ModifiedDate = DateTime.Now.Date;
                        objOperation = _SalesReturnService.Update(objT, storeId);
                    }
                    else { objOperation.OperationId = -2; }
                }
            }
            return Json(objOperation, JsonRequestBehavior.DenyGet);
        }
        public static SlsSalesReturn MapToSlsSalesReturn(SlsSalesReturnViewModel obj)
        {
            SlsSalesReturn model = new SlsSalesReturn();

            model.Id = obj.Id;

            model.PartyType = obj.PartyType;
            model.Party = obj.Party;
            model.RefNo = obj.RefNo;
            model.Reason = obj.Reason;

            if (!obj.IsAdjusted)
            {
                //Means no amount to be adjusted
                model.AdjustedAmount = 0;
            }
            else
            {
                model.AdjustedAmount = CalculateAdjustedAmount(obj.DetailList);
            }
            model.SecCompanyId = obj.SecCompanyId;

            model.CreatedBy = obj.CreatedBy;
            model.CreatedDate = obj.CreatedDate;
            model.ModifiedBy = obj.ModifiedBy;
            model.ModifiedDate = obj.ModifiedDate;

            return model;
        }
        public static SlsSalesReturnViewModel MapToSlsSalesReturn(SlsSalesReturn obj)
        {
            SlsSalesReturnViewModel model = new SlsSalesReturnViewModel();

            model.Id = obj.Id;

            model.PartyType = obj.PartyType;
            model.Party = obj.Party;
            model.RefNo = obj.RefNo;
            model.Reason = obj.Reason;
            model.AdjustedAmount = obj.AdjustedAmount;
            model.SecCompanyId = obj.SecCompanyId;

            model.CreatedBy = obj.CreatedBy;
            model.CreatedDate = obj.CreatedDate;
            model.ModifiedBy = obj.ModifiedBy;
            model.ModifiedDate = obj.ModifiedDate;

            //calculative
            if (model.AdjustedAmount != null && model.AdjustedAmount > 0)
            {
                model.IsAdjusted = true;
            }

            return model;
        }
        public Operation Update(SlsSalesReturnViewModel objVM, int storedId)
        {
            Operation objOperation = new Operation { Success = false };
            using (var dbContextTransaction = _SalesReturnRepository.BeginTransaction())
            {
                try
                {
                    SlsSalesReturn objT = SlsSalesReturnMapVMToModel.MapToSlsSalesReturn(objVM);
                    objOperation = new Operation { Success = true, OperationId = objT.Id };
                    _SalesReturnRepository.Update(objT);
                    _SalesReturnRepository.SaveChanges();

                    //add or update categories to each item
                    IList<SlsSalesReturnDetail> adddOrUpdateList = new List<SlsSalesReturnDetail>();
                    IList<SlsSalesReturnDetail> detailList = new List<SlsSalesReturnDetail>();
                    foreach (SlsSalesReturnDetailViewModel detail in objVM.DetailList)
                    {

                        SlsSalesReturnDetail objD = SlsSalesReturnMapVMToModel.MapToSlsSalesReturnDetail(detail);
                        objD.SlsReturnId = objT.Id;
                        //calculations

                        if (objD.Id <= 0)
                        {
                            detailList.Add(objD);
                            adddOrUpdateList.Add(objD);
                        }

                        else
                        {
                            _SalesReturnDetailRepository.Update(objD);
                            ManageStockForSalesReturn(storedId, objT.Id, objT.CreatedDate, objD, "Update");
                            adddOrUpdateList.Add(objD);
                        }

                    }
                    //Add detail list - new
                    if (detailList != null && detailList.Count > 0)
                    {
                        _SalesReturnDetailRepository.AddEntityList(detailList);
                        foreach (var slrDetail in detailList)
                        {
                            ManageStockForSalesReturn(storedId, objT.Id, objT.CreatedDate, slrDetail, "Add");
                        }
                    }

                    //To delete removed items
                    IList<int> savedItems = _SalesReturnDetailRepository.GetAll().Where(j => j.SlsReturnId == objT.Id).Select(i => i.Id).ToList();
                    foreach (int savedId in savedItems)
                    {
                        var addedOrUpdatedObj = adddOrUpdateList.Where(i => i.Id == savedId).FirstOrDefault();
                        if (addedOrUpdatedObj == null)
                        {
                            //this saved id item removed from UI
                            var removedObj = _SalesReturnDetailRepository.GetById(savedId);
                            _SalesReturnDetailRepository.Delete(removedObj);
                            ManageStockForSalesReturn(storedId, objT.Id, objT.CreatedDate, removedObj, "Delete");
                        }
                    }
                    //end of deletion action
                    _SalesReturnDetailRepository.SaveChanges();

                    try
                    {
                        //_unitOfWork.Commit();
                        _SalesReturnRepository.Commit(dbContextTransaction);
                    }
                    catch (Exception ex)
                    {
                        objOperation.Success = false;
                        throw ex;
                    }
                }
                catch (Exception ex)
                {
                    _SalesReturnRepository.Rollback(dbContextTransaction);
                }
            }
            return objOperation;
        }
        public Operation Save(SlsSalesReturnViewModel objVM, int storedId)
        {
            Operation objOperation = new Operation { Success = false };

            using (var dbContextTransaction = _SalesReturnRepository.BeginTransaction())
            {
                try
                {
                    objOperation = new Operation { Success = true };
                    SlsSalesReturn objT = SlsSalesReturnMapVMToModel.MapToSlsSalesReturn(objVM);

                    int Id = _SalesReturnRepository.AddEntity(objT);
                    _SalesReturnRepository.SaveChanges();
                    objOperation.OperationId = Id;
                    objT.Id = Id;

                    //add or update categories to each item
                    IList<SlsSalesReturnDetail> detailList = new List<SlsSalesReturnDetail>();
                    foreach (SlsSalesReturnDetailViewModel detail in objVM.DetailList)
                    {
                        SlsSalesReturnDetail objD = SlsSalesReturnMapVMToModel.MapToSlsSalesReturnDetail(detail);
                        objD.SlsReturnId = objT.Id;

                        //calculations

                        if (objD.Id <= 0)
                            detailList.Add(objD);

                        else
                        {
                            _SalesReturnDetailRepository.Update(objD);
                            ManageStockForSalesReturn(storedId, objT.Id, objT.CreatedDate, objD, "Update");
                        }
                    }
                    //Add detail list - new
                    if (detailList != null && detailList.Count > 0)
                    {
                        _SalesReturnDetailRepository.AddEntityList(detailList);
                        foreach (var slrDetail in detailList)
                        {
                            ManageStockForSalesReturn(storedId, objT.Id, objT.CreatedDate, slrDetail, "Add");
                        }
                    }

                    _SalesReturnDetailRepository.SaveChanges();

                    try
                    {
                        _SalesReturnRepository.Commit(dbContextTransaction);
                    }
                    catch (Exception ex)
                    {
                        objOperation.Success = false;
                        throw ex;
                    }
                }
                catch (Exception ex)
                {
                    _SalesReturnRepository.Rollback(dbContextTransaction);
                }
            }
            return objOperation;
        }