/// <summary>
        /// Create new rental
        /// </summary>
        /// <param name="request"></param>
        public Response Add(CreateRentalRequestModel request)
        {
            var response = new Response();

            try
            {
                logger.LogInformation("Starting request validation");

                DateUtils.ValidateRangeDates(response, request.StartDate, request.EndDate);

                var vehicle = ValidateVehicle(request, response);

                ValidateClient(request, response);

                if (response.HasErrors())
                {
                    return(response);
                }

                logger.LogInformation("Request validated success");

                logger.LogInformation("Calling rental repository to find availables vehicles by range dates");

                var isVehicleAvailable = repository.RentalRepository.VerifyIfVehicleIsAvailableByRangeDates(request.VehicleId.Value, request.StartDate.Value, request.EndDate.Value);

                if (!isVehicleAvailable)
                {
                    response.AddError(Constants.VEHICLE_NOT_AVAILABLE, "Vehicle is not available");
                    return(response);
                }

                var totalDays = request.EndDate.Value.Subtract(request.StartDate.Value).TotalDays + 1;

                var rental = new Rental
                {
                    ClientId  = request.ClientId.Value,
                    VehicleId = request.VehicleId.Value,
                    StartDate = request.StartDate.Value,
                    EndDate   = request.EndDate.Value,
                    Price     = vehicle.PricePerDay * totalDays,
                    Status    = RentalStatus.Reserved
                };

                logger.LogInformation("Calling rental repository to save new rental");

                repository.RentalRepository.Add(rental);
                repository.Save();

                response.AddSuccess(Constants.RENTAL_SAVED, "A vehicle was reserved succesfully");
            }
            catch (Exception e)
            {
                ExceptionUtils.HandleGeneralError(response, logger, e);
            }

            return(response);
        }
예제 #2
0
        /// <summary>
        /// Create new vehicle
        /// </summary>
        /// <param name="request"></param>
        public Response Add(VehicleRequestModel request)
        {
            var response = new Response();

            logger.LogInformation("Starting request validation");

            if (string.IsNullOrWhiteSpace(request.Brand))
            {
                response.AddError(Constants.BRAND_EMPTY, "The field brand is required");
            }
            if (!request.PricePerDay.HasValue || request.PricePerDay <= 0)
            {
                response.AddError(Constants.PRICE_PER_DAY_INVALID, "The field pricePerDay is required");
            }

            if (response.HasErrors())
            {
                return(response);
            }

            logger.LogInformation("Request validated success");

            try
            {
                var domain = new Vehicle {
                    Brand = request.Brand, Year = request.Year, PricePerDay = request.PricePerDay.Value, Active = true
                };

                logger.LogInformation("Calling vehicle repository to save new vehicle");

                repository.VehicleRepository.Add(domain);
                repository.Save();

                response.AddSuccess(Constants.VEHICLE_SAVED, "Vehicle added succesfully");
            }
            catch (Exception e)
            {
                ExceptionUtils.HandleGeneralError(response, logger, e);
            }

            return(response);
        }
        /// <summary>
        /// Create a new client
        /// </summary>
        /// <param name="request"></param>
        public Response Add(ClientRequestModel request)
        {
            var response = new Response();

            logger.LogInformation("Starting request validation");

            if (string.IsNullOrWhiteSpace(request.Name))
            {
                response.AddError(Constants.NAME_EMPTY, "The field name is required");
            }
            if (string.IsNullOrWhiteSpace(request.Phone))
            {
                response.AddError(Constants.PHONE_EMPTY, "The field phone is required");
            }

            if (response.HasErrors())
            {
                return(response);
            }

            logger.LogInformation("Request validated success");

            try
            {
                var domain = new Client {
                    Name = request.Name, Phone = request.Phone, Active = true
                };

                logger.LogInformation("Calling client repository to save new client");

                repository.ClientRepository.Add(domain);
                repository.Save();

                response.AddSuccess(Constants.CLIENT_SAVED, "Client added succesfully");
            }
            catch (Exception e)
            {
                ExceptionUtils.HandleGeneralError(response, logger, e);
            }

            return(response);
        }
예제 #4
0
        /// <summary>
        /// Get available vehicles by range date
        /// </summary>
        /// <param name="request"></param>
        public Response <IList <VehicleAvailableResponseModel> > GetAvailables(SearchAvailableVehiclesRequestModel request)
        {
            var response = new Response <IList <VehicleAvailableResponseModel> >();

            logger.LogInformation("Starting request validation");

            DateUtils.ValidateRangeDates(response, request.StartDate, request.EndDate);

            if (response.HasErrors())
            {
                return(response);
            }

            try
            {
                logger.LogInformation("Calling rental repository to find availables vehicles by range dates");

                var vehicleAvailables = repository.RentalRepository.GetVehiclesAvailables(request.StartDate.Value, request.EndDate.Value);

                logger.LogInformation($"{vehicleAvailables.Count()} vehicles founds");

                response.Data = vehicleAvailables.Select(x => new VehicleAvailableResponseModel {
                    Id = x.Id, Brand = x.Brand, PricePerDay = x.PricePerDay, Year = x.Year
                }).ToList();

                if (!response.Data.Any())
                {
                    response.AddWarning(Constants.NO_VEHICLE_AVAILABLES, "No vehicles availables for selected dates");
                }
            }
            catch (Exception e)
            {
                ExceptionUtils.HandleGeneralError(response, logger, e);
            }

            return(response);
        }