public ActionResult SaveSalesDeliveryInternal(SlsSalesOrderViewModel objS)
        {
            int soId = objS.Id;
            decimal discount = objS.Discount;
            decimal total = objS.Total;

            SlsDeliveryViewModel objT = new SlsDeliveryViewModel();

            int userId = Convert.ToInt32(Session["userId"]);
            int companyId = Convert.ToInt32(Session["companyId"]);
            int employeeId = Convert.ToInt32(Session["employeeId"]);
            SecCompany objCmnCompany = _SecCompanyService.GetById(companyId);
            SlsOffice office = _officeService.GetById((int)_hrmEmployeeService.GetById(employeeId).SlsOfficeId);
            string challanNo = _DeliveryService.GetChallanNo(objCmnCompany.Prefix, office.Code);
            string invoiceNo = _DeliveryService.GetInvoiceNo(objCmnCompany.Prefix, office.Code);

            Operation objOperation = new Operation { Success = false };

            if (ModelState.IsValid)
            {
                if (objT.Id == 0)
                {
                    if ((bool)Session["Add"])
                    {
                        objT.SlsSalesOrderId = soId;
                        objT.DeliveryDate = DateTime.Now;
                        objT.ChallanNo = challanNo;
                        objT.InvoiceNo = invoiceNo;
                        objT.VehicleNo = "";
                        objT.Remarks = "";
                        objT.Discount = discount;
                        objT.Total = total;
                        objT.ReceivedStatus = 1;
                        objT.ReceivedDate = DateTime.Now;
                        objT.ReceivedRemarks = "";
                        objT.CreatedBy = userId;
                        objT.CreatedDate = DateTime.Now.Date;

                        //map details of sales items to delivery items.
                        IList<SlsDeliverDetailViewModel> details = new List<SlsDeliverDetailViewModel>();

                        foreach(var det in objS.SalesOrderDetails)
                        {
                            SlsDeliverDetailViewModel dObj = new SlsDeliverDetailViewModel();

                            dObj.SlsProductId = det.SlsProductId;
                            dObj.Quantity = det.SalesOrderQuantity;
                            dObj.SlsUnitId = det.SlsUnitId;
                            dObj.Rate = det.Rate;
                            dObj.Price = det.Price;
                            dObj.Discount = det.Discount;
                            dObj.Total = det.Total;
                            dObj.SalesOrderQuantity = det.SalesOrderQuantity;
                            dObj.SlsProductName = det.SlsProductName;
                            dObj.SlsUnitName = det.SlsUnitName;

                            details.Add(dObj);
                        }

                        objT.SlsDeliverDetails = details;

                        objOperation = _DeliveryService.Save(objT);
                    }
                    else { objOperation.OperationId = -1; }

                }
                else
                {
                    if ((bool)Session["Edit"])
                    {
                        //Normally not required till now - as this will perform once upon a time
                        objT.ModifiedBy = userId;
                        objT.ModifiedDate = DateTime.Now.Date;
                        objOperation = _DeliveryService.Update(objT);
                    }
                    else { objOperation.OperationId = -2; }
                }
            }
            return Json(objOperation, JsonRequestBehavior.DenyGet);
        }
        public ActionResult SaveSalesDelivery(SlsDeliveryViewModel objT)
        {
            int userId = Convert.ToInt32(Session["userId"]);
            Operation objOperation = new Operation { Success = false };

            if (ModelState.IsValid)
            {
                if (objT.Id == 0)
                {
                    if ((bool)Session["Add"])
                    {
                        objT.CreatedBy = userId;
                        objT.CreatedDate = DateTime.Now.Date;
                        objOperation = _DeliveryService.Save(objT);
                    }
                    else { objOperation.OperationId = -1; }

                }
                else
                {
                    if ((bool)Session["Edit"])
                    {
                        objT.ModifiedBy = userId;
                        objT.ModifiedDate = DateTime.Now.Date;
                        objOperation = _DeliveryService.Update(objT);
                    }
                    else { objOperation.OperationId = -2; }
                }
            }
            return Json(objOperation, JsonRequestBehavior.DenyGet);
        }
        public Operation Update(SlsDeliveryViewModel objVM)
        {
            Operation objOperation = new Operation { Success = false };
            using (var dbContextTransaction = _DeliveryRepository.BeginTransaction())
            {
                try
                {
                    //set status
                    objVM.ReceivedStatus = IsDeliveryComplete(objVM.SlsDeliverDetails, objVM.Id);

                    SlsDelivery objT = _DeliveryRepository.GetById(objVM.Id);
                    objT = SlsSalesDeliveryMapVMToModel.MapToSlsSalesDelivery(objVM, objT);
                    objOperation = new Operation { Success = true, OperationId = objT.Id };

                    _DeliveryRepository.Update(objT);
                    _DeliveryRepository.SaveChanges();

                    //add or update categories to each item
                    IList<SlsDeliverDetail> detailList = new List<SlsDeliverDetail>();
                    foreach (SlsDeliverDetailViewModel detail in objVM.SlsDeliverDetails)
                    {

                        SlsDeliverDetail objD = SlsSalesDeliveryMapVMToModel.MapToSlsSalesDeliveryDetail(detail);
                        objD.SlsDeliveryId = objT.Id;

                        //calculations
                        objD.Price = objD.Rate * objD.Quantity;

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

                        else
                            _DeliveryDetailRepository.Update(objD);

                    }
                    //Add detail list - new
                    if (detailList != null && detailList.Count > 0)
                    {
                        _DeliveryDetailRepository.AddEntityList(detailList);
                    }

                    ////To delete removed items
                    //IList<int> savedItems = _DeliveryDetailRepository.GetAll().Where(j => j.SlsDeliveryId == objT.Id).Select(i => i.Id).ToList();
                    //foreach (int savedId in savedItems)
                    //{
                    //    var addedOrUpdatedObj = detailList.Where(i => i.Id == savedId).FirstOrDefault();
                    //    if (addedOrUpdatedObj == null)
                    //    {
                    //        //this saved id item removed from UI
                    //        var removedObj = _DeliveryDetailRepository.GetById(savedId);
                    //        _DeliveryDetailRepository.Delete(removedObj);
                    //    }
                    //}
                    ////end of deletion action

                    _DeliveryDetailRepository.SaveChanges();

                    try
                    {
                        //_unitOfWork.Commit();
                        _DeliveryRepository.Commit(dbContextTransaction);
                    }
                    catch (Exception ex)
                    {
                        objOperation.Success = false;
                        throw ex;
                    }
                }
                catch (Exception ex)
                {
                    _DeliveryRepository.Rollback(dbContextTransaction);
                }
            }
            return objOperation;
        }
        public static SlsDelivery MapToSlsSalesDelivery(SlsDeliveryViewModel obj, SlsDelivery model)
        {
            if (model == null)
                model = new SlsDelivery();

            model.Id = obj.Id;
            model.SlsSalesOrderId = obj.SlsSalesOrderId;
            model.DeliveryDate = obj.DeliveryDate;
            model.ChallanNo = obj.ChallanNo;
            model.InvoiceNo = obj.InvoiceNo;
            model.VehicleNo = obj.VehicleNo;
            model.Remarks = obj.Remarks;
            model.Discount = obj.Discount;
            model.Total = obj.Total;
            model.ReceivedStatus = obj.ReceivedStatus;
            model.ReceivedDate = obj.ReceivedDate;
            model.ReceivedRemarks = obj.ReceivedRemarks;
            model.CreatedBy = obj.CreatedBy;
            model.CreatedDate = obj.CreatedDate;
            model.ModifiedBy = obj.ModifiedBy;
            model.ModifiedDate = obj.ModifiedDate;

            return model;
        }
        public Operation Save(SlsDeliveryViewModel objVM)
        {
            Operation objOperation = new Operation { Success = false };

            using (var dbContextTransaction = _DeliveryRepository.BeginTransaction())
            {
                try
                {

                    objOperation = new Operation { Success = true };

                    SlsDelivery objT = SlsSalesDeliveryMapVMToModel.MapToSlsSalesDelivery(objVM, null);

                    //set status
                    objT.ReceivedStatus = IsDeliveryComplete(objVM.SlsDeliverDetails, objT.Id);

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

                    //add or update categories to each item
                    IList<SlsDeliverDetail> detailList = new List<SlsDeliverDetail>();
                    foreach (SlsDeliverDetailViewModel detail in objVM.SlsDeliverDetails)
                    {
                        SlsDeliverDetail objD = SlsSalesDeliveryMapVMToModel.MapToSlsSalesDeliveryDetail(detail);
                        objD.SlsDeliveryId = objT.Id;

                        //calculations
                        objD.Price = objD.Rate * objD.Quantity;

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

                        else
                            _DeliveryDetailRepository.Update(objD);
                    }
                    //Add detail list - new
                    if (detailList != null && detailList.Count > 0)
                    {
                        _DeliveryDetailRepository.AddEntityList(detailList);
                    }
                    _DeliveryDetailRepository.SaveChanges();

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