// GET: InvReceipts/Details/5
        public ActionResult Details(long?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            InvReceipt    invReceipt    = db.InvReceipts.Find(id);
            InvReceiptDto invreceiptdto = new InvReceiptDto()
            {
                Description  = invReceipt.Description,
                Id           = invReceipt.Id,
                ObjectState  = (int)ObjectState.Unchanged,
                ReceiptDate  = invReceipt.ReceiptDate,
                ReceiptNo    = invReceipt.ReceiptNo,
                ReceivedById = invReceipt.ReceivedBy,
                VendorId     = invReceipt.VendorId,
                listUser     = db.AspNetUsers.Select(x => new UserDto {
                    Email = x.Email, Id = x.Id
                }).ToList(),
                listVendor = db.Vendors.Select(x => new VendorDto()
                {
                    Id = x.Id, Name = x.Name
                }).ToList(),
                listDetail        = GetDetails(invReceipt.Id),
                listReceivedPlace = RecievedPlaceDto.ConvertEnum(),
                ReceivedPlaceId   = (int)Enum.Parse(typeof(RecievePlace), invReceipt.ReceivedPlace)
            };

            if (invReceipt == null)
            {
                return(HttpNotFound());
            }
            return(View(invreceiptdto));
        }
        public async Task <List <InvReceiptDetailDto> > SaveDetailAsync(InvReceiptDto vm)
        {
            try
            {
                foreach (var item in vm.listDetail)
                {
                    var objsave = new InvReceiptDetail()
                    {
                        Id = item.DetailId,
                        InventoryItemId = item.InventoryItemId,
                        InvReceiptId    = vm.Id,
                        Quantity        = item.Quantity
                    };
                    if (objsave.Id > 0 && item.ObjectState != (int)ObjectState.Deleted)
                    {
                        item.ObjectState = (int)ObjectState.Modified;
                    }
                    if (objsave.Id <= 0 && item.ObjectState != (int)ObjectState.Deleted)
                    {
                        item.ObjectState = (int)ObjectState.Added;
                    }
                    switch (item.ObjectState)
                    {
                    case (int)ObjectState.Added:
                        db.InvReceiptDetails.Add(objsave);
                        await db.SaveChangesAsync();

                        break;

                    case (int)ObjectState.Modified:
                        db.Entry(objsave).State = EntityState.Modified;
                        await db.SaveChangesAsync();

                        break;
                    }
                    item.DetailId = objsave.Id;
                }
                vm.listDetail = GetDetails(vm.Id);
                return(vm.listDetail);
            }
            catch (Exception ex)
            {
                return(null);
            }
        }
        // GET: InvReceipts/Create
        public ActionResult Create()
        {
            InvReceiptDto invreceiptdto = new InvReceiptDto()
            {
                ObjectState = (int)ObjectState.Added,
                ReceiptDate = DateTime.Now,
                listUser    = db.AspNetUsers.Select(x => new UserDto {
                    Email = x.Email, Id = x.Id
                }).ToList(),
                listVendor = db.Vendors.Select(x => new VendorDto()
                {
                    Id = x.Id, Name = x.Name
                }).ToList(),
                listReceivedPlace = RecievedPlaceDto.ConvertEnum()
            };

            return(View(invreceiptdto));
        }
        public async Task <JsonResult> SaveAsync(InvReceiptDto vm)
        {
            try
            {
                if (vm.listDetailToDelete.Count() > 0)
                {
                    foreach (var item in vm.listDetailToDelete)
                    {
                        var objdelete = db.InvReceiptDetails.Find(item);
                        if (objdelete != null)
                        {
                            db.Entry(objdelete).State = EntityState.Deleted;
                            await db.SaveChangesAsync();
                        }
                    }
                }
                var objsave = new InvReceipt()
                {
                    Id            = vm.Id,
                    Description   = vm.Description,
                    ReceiptDate   = vm.ReceiptDate,
                    ReceiptNo     = vm.ReceiptNo,
                    ReceivedBy    = vm.ReceivedById,
                    VendorId      = vm.VendorId,
                    ReceivedPlace = ((RecievePlace)vm.ReceivedPlaceId).ToString()
                };
                if (objsave.Id > 0 && vm.ObjectState != (int)ObjectState.Deleted)
                {
                    vm.ObjectState = (int)ObjectState.Modified;
                }
                if (objsave.Id <= 0 && vm.ObjectState != (int)ObjectState.Deleted)
                {
                    vm.ObjectState = (int)ObjectState.Added;
                }
                switch (vm.ObjectState)
                {
                case (int)ObjectState.Added:
                    db.InvReceipts.Add(objsave);
                    await db.SaveChangesAsync();

                    break;

                case (int)ObjectState.Modified:
                    db.Entry(objsave).State = EntityState.Modified;
                    await db.SaveChangesAsync();

                    break;

                case (int)ObjectState.Deleted:
                    var returndetails = db.InvReceiptDetails.Where(x => x.InvReceiptId == objsave.Id).ToList();
                    foreach (var item in returndetails)
                    {
                        var invReturndetail = await db.InvReceiptDetails.FindAsync(item.Id);

                        db.Entry(invReturndetail).State = EntityState.Deleted;
                        db.SaveChanges();
                    }
                    db.Entry(objsave).State = EntityState.Deleted;
                    await db.SaveChangesAsync();

                    break;
                }
                vm.Id         = objsave.Id;
                vm.listDetail = await SaveDetailAsync(vm);

                var result = new { result = vm };
                return(Json(result));
            }
            catch (Exception ex)
            {
                return(Json(null));
            }
        }