示例#1
0
 public async Task <IActionResult> PutAsync(CarUnparkRequest carUnparkRequest)
 {
     try
     {
         return(Ok(await _ooParkingLotRepository.UpdateParkingTransactionAsync(carUnparkRequest)));
     }
     catch (Exception ex)
     {
         _logger.LogError(JsonConvert.SerializeObject(ex));
         return(BadRequest());
     }
 }
示例#2
0
        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);
        }