public ActionResult <IEnumerable <DtoDeparture> > SaveDeparture(DepartureModel departure)
        {
            DtoDeparture added = new DtoDeparture();

            if (ModelState.IsValid)
            {
                try
                {
                    added = _departureService.RegistryDeparture(DepartureMapper.convertModelToDTO(departure));
                }
                catch (Exception e)
                {
                    if (e is AppException)
                    {
                        return(UnprocessableEntity(e.Message));
                    }
                    else
                    {
                        return(BadRequest(e.Message));
                    }
                }
            }

            return(CreatedAtAction(nameof(GetDeparture), new { id = added.Id }, added));
        }
        public DtoDeparture RegistryDeparture(DtoDeparture departure)
        {
            double      totalCharge;
            var         departureTime = DateTime.Now;
            EntryEntity lastEntry     = GetInfoEntryByVehicleId(departure.IdVehicle);

            if (lastEntry == null)
            {
                throw new DepartureException("No existe un registro de entrada para el vehículo");
            }

            RateEntity rateEntity = _rateService.GetRateByVehicleType(lastEntry.IdVehicleType);

            if (rateEntity == null)
            {
                throw new DepartureException("No existe una tarifa configurada para el tipo de vehículo");
            }

            var    difference = departureTime - lastEntry.EntryTime;//Math.Ceiling((departureTime - lastEntry.EntryTime).TotalHours);
            int    days       = difference.Days;
            double hours      = Math.Ceiling(difference.TotalHours);

            if (days < 1)
            {
                if (hours >= rateEntity.DayChargeFrom)
                {
                    totalCharge = rateEntity.DayValue;
                }
                else
                {
                    totalCharge = rateEntity.HourValue * hours;
                }
            }
            else
            {
                var additionalHours = hours % 24;
                totalCharge  = days * rateEntity.DayValue;
                totalCharge += additionalHours * rateEntity.HourValue;
            }

            if (lastEntry.IdVehicleType == VehicleTypeEnum.motorcycle)
            {
                bool isParsed = short.TryParse(lastEntry.CC, out short cc);
                if (!isParsed)
                {
                    throw new DepartureException("No fue posible determinar el cilindraje del vehículo");
                }
                if (cc >= rateEntity.SpecialChargeFromCC)
                {
                    totalCharge += rateEntity.SpecialChargeValue;
                }
            }

            var entryEntity = _departureRepository.Add(DepartureMapper.ConvertDTOToEntity(departure, lastEntry, totalCharge));

            _cellService.IncreaseCell(lastEntry.IdVehicleType, 1);
            return(DepartureMapper.ConvertEntityToDTO(entryEntity));
        }
        public ActionResult <DtoDeparture> GetDeparture(string id)
        {
            var cell = DepartureMapper.convertDTOToModel(_departureService.GetEntryById(id));

            if (cell == null)
            {
                return(NotFound());
            }

            return(Ok(cell));
        }
 public DtoDeparture GetEntryById(string id)
 {
     return(DepartureMapper.ConvertEntityToDTO(_departureRepository.GetById(id)));
 }
 public IEnumerable <DtoDeparture> GetDepartures()
 {
     return(DepartureMapper.ConvertEntityToDTO(_departureRepository.List().ToList()));
 }