public async Task <IActionResult> PutAsync(CarUnparkRequest carUnparkRequest) { try { return(Ok(await _ooParkingLotRepository.UpdateParkingTransactionAsync(carUnparkRequest))); } catch (Exception ex) { _logger.LogError(JsonConvert.SerializeObject(ex)); return(BadRequest()); } }
public async Task <ParkingTransaction> UpdateParkingTransactionAsync(CarUnparkRequest carUnparkRequest) { if (!_ooParkingLotDbContext.ParkingTransactions.Any(o => o.PlateNumber == carUnparkRequest.PlateNumber && o.ExitDate == null)) { throw new Exception("Vehicle (Plate Number) not found in the parking!"); } var previousParkingTransaction = await _ooParkingLotDbContext.ParkingTransactions .OrderByDescending(o => o.EntryDate) .FirstOrDefaultAsync(f => f.PlateNumber == carUnparkRequest.PlateNumber && f.ExitDate != null); var parkingTransaction = await _ooParkingLotDbContext.ParkingTransactions .FirstOrDefaultAsync(f => f.PlateNumber == carUnparkRequest.PlateNumber && f.ExitDate == null); if (parkingTransaction != null && parkingTransaction.ExitDate == null) { var dateDiff = carUnparkRequest.ExitDate - parkingTransaction.EntryDate; var totalDaysPenalty = (Convert.ToInt32(dateDiff.TotalHours) / 24) * 5000; var totalHours = Convert.ToDecimal(Math.Round(dateDiff.TotalHours, 0, MidpointRounding.ToEven)); bool didReturnLessThanAnHour = false; if (previousParkingTransaction != null) { didReturnLessThanAnHour = ((DateTime)previousParkingTransaction.ExitDate - parkingTransaction.EntryDate).TotalMinutes < 60; } var hourlyRate = await(from ps in _ooParkingLotDbContext.ParkingSpaces where ps.Id == parkingTransaction.ParkingSpaceId join pc in _ooParkingLotDbContext.ParkingCategories on ps.ParkingCategoryId equals pc.Id select pc.HourlyRate).FirstOrDefaultAsync(); var amount = (hourlyRate * Math.Round(didReturnLessThanAnHour ? totalHours : (totalHours > 3 ? totalHours - 3 : 0))) + (didReturnLessThanAnHour ? 0 : 40); parkingTransaction.ExitDate = carUnparkRequest.ExitDate; parkingTransaction.Amount = amount; parkingTransaction.Penalties = totalDaysPenalty; parkingTransaction.TotalHours = totalHours; parkingTransaction.TotalAmount = amount + totalDaysPenalty; var parkingSpace = await _ooParkingLotDbContext.ParkingSpaces.FirstOrDefaultAsync(f => f.Id == parkingTransaction.ParkingSpaceId); if (parkingSpace != null) { parkingSpace.IsOccupied = false; } } await _ooParkingLotDbContext.SaveChangesAsync(); return(parkingTransaction); }