/// <summary> /// Updates return date of given rental /// </summary> /// <param name="rentalId">Rental id</param> /// <param name="request">Update request with date to set</param> /// <returns>True if successful</returns> public async Task <bool> UpdateReturnDate(Guid rentalId, RentalUpdateDateRequest request) { var rental = await RentalRepo .GetAll() .FirstOrDefaultAsync(r => r.Id == rentalId); var cartridgeCopy = await CartridgeCopyRepo .GetAll() .FirstOrDefaultAsync(cc => cc.Id == rental.CartridgeCopyId); if (rental == null) { return(false); } rental.Returned = request.Date; if (request.Date == null) { cartridgeCopy.Avaible = false; } else { cartridgeCopy.Avaible = true; } CartridgeCopyRepo.Update(cartridgeCopy); await CartridgeCopyRepo.SaveChangesAsync(); await RentalRepo.SaveChangesAsync(); return(true); }
/// <summary> /// Gets all rentals /// </summary> /// <returns>List of rentals</returns> public async Task <IEnumerable <RentalForAdminList> > GetAllRentals() { var rentals = await RentalRepo .GetAll() .Include(r => r.CartridgeCopy) .ThenInclude(cc => cc.Cartridge) .ThenInclude(c => c.Movie) .Include(r => r.ShopUser) .ThenInclude(su => su.User) .ToListAsync(); if (rentals.Count == 0) { return(new List <RentalForAdminList>()); } var result = rentals.Select(r => { var rentalBaseInfo = Mapper.Map <RentalForAdminList>(r); rentalBaseInfo.MovieLanguage = r.CartridgeCopy.Cartridge.Language; rentalBaseInfo.MovieTitle = r.CartridgeCopy.Cartridge.Movie.Title; rentalBaseInfo.MovieReleaseYear = r.CartridgeCopy.Cartridge.Movie.ReleaseDate.Year; rentalBaseInfo.UserFirstName = r.ShopUser.User.FirstName; rentalBaseInfo.UserLastName = r.ShopUser.User.LastName; rentalBaseInfo.UserPhone = r.ShopUser.User.PhoneNumber; rentalBaseInfo.CopyAvaible = r.CartridgeCopy.Avaible; return(rentalBaseInfo); }); return(result); }
/// <summary> /// Gets cartridges details for edition /// </summary> /// <param name="id">Cartridge id</param> /// <returns>Cartridge edit details</returns> public async Task <CartridgeEditDetails> GetEditDetails(Guid id) { var cartridgeDb = await CartridgeRepo .GetAll() .Include(c => c.Copies) .Include(c => c.Movie) .FirstOrDefaultAsync(c => c.Id == id); var cartridge = Mapper.Map <CartridgeEditDetails>(cartridgeDb); cartridge.CopiesRented = await RentalRepo .GetAll() .Where(r => r.Returned != null && cartridgeDb.Copies.Select(c => c.Id).Contains(r.CartridgeCopyId)) .CountAsync(); cartridge.CopiesAvaible = cartridgeDb.Copies.Count(c => c.Avaible); cartridge.CopiesUnavaible = cartridgeDb.Copies.Count(c => !c.Avaible); cartridge.MaxCopiesToMakeAvaible = cartridge.CopiesUnavaible - cartridge.CopiesRented; cartridge.MaxCopiesToMakeUnavaible = cartridge.CopiesAvaible; return(cartridge); }
/// <summary> /// Gets data for given cartridge rent form /// </summary> /// <param name="cartridgeId">Cartridge to rent id</param> /// <param name="userId">User that wants to rent it</param> /// <returns>Data for cartridge rental form</returns> public async Task <CartridgeRental> CartridgeForRentForm(Guid cartridgeId, Guid userId) { var userDb = await ShopUserRepo .GetAll() .AsNoTracking() .FirstOrDefaultAsync(u => u.UserId == userId.ToString()); if (userDb == null) { return(null); } var unsettledRentals = await RentalRepo .GetAll(r => r.ShopUserId == userDb.Id) .Where(r => r.Returned == null) .ToListAsync(); var result = new CartridgeRental(); if (unsettledRentals.Count >= 3) { result.UserCanBorrow = false; return(result); } if (unsettledRentals.Any(r => DateTime.UtcNow > r.Rented.AddDays(r.DaysToReturn))) { result.UserCanBorrow = false; return(result); } result.UserCanBorrow = true; var cartridgeDb = await CartridgeRepo .GetAll() .AsNoTracking() .Include(c => c.Movie) .FirstOrDefaultAsync(c => c.Id == cartridgeId); if (cartridgeDb == null) { return(null); } var copiesAvaible = await CartridgeCopyRepo .GetAll(c => c.CartridgeId == cartridgeId) .CountAsync(c => c.Avaible); result.Avaible = copiesAvaible; if (copiesAvaible <= 0) { return(result); } Mapper.Map(cartridgeDb, result); var userAddressesDb = await AddressRepo .GetAll(a => a.UserId == userId.ToString() && a.IsActive) .ToListAsync(); result.Addresses = Mapper.Map <IEnumerable <AddressDto> >(userAddressesDb); return(result); }
/// <summary> /// Rents 1st of avaible catridge copies by given cartridge id to given user /// Adds new Rental to database /// </summary> /// <param name="cartridgeId">Cartridge id</param> /// <param name="userId">User that wants to rent id</param> /// <param name="request">Rental request</param> /// <returns>Null if cartridge or user is not found. True if user could rent given cartridge, false otherwise.</returns> public async Task <bool?> RentCartridge(Guid cartridgeId, Guid userId, CartridgeRentRequest request) { var cartridge = await CartridgeRepo .GetAll() .AsNoTracking() .FirstOrDefaultAsync(c => c.Id == cartridgeId); if (cartridge == null) { return(null); } var copy = await CartridgeCopyRepo .GetAll() .FirstOrDefaultAsync(c => c.CartridgeId == cartridgeId && c.Avaible); if (copy == null) { return(false); } var address = new Address(); if (request.Delivery == collectionInPerson) { address = null; } else if (request.AddAddress) { request.NewAddress.UserId = userId.ToString(); address = await AddressService.CreateAddress(request.NewAddress); } else { address = await AddressRepo .GetAll() .FirstOrDefaultAsync(a => a.Id == new Guid(request.AddressId)); if (address == null) { return(null); } } var shopUser = await ShopUserRepo .GetAll() .AsNoTracking() .FirstOrDefaultAsync(su => su.UserId == userId.ToString()); var rental = new Rental { DaysToReturn = cartridge.DaysToReturn, RentPrice = cartridge.RentPrice, Rented = DateTime.UtcNow, AddressId = address?.Id, CartridgeCopyId = copy.Id, Delivery = request.Delivery, ShopUserId = shopUser.Id, }; copy.Avaible = false; await CartridgeCopyRepo.SaveChangesAsync(); await RentalRepo.CreateAsync(rental); await RentalRepo.SaveChangesAsync(); return(true); }