public TurnResultDto Reserve(DateTime date, int hourId, string name) { try { turnRepository.TransactionManager.BeginTransaction(); Helper.ThrowIfIsNullOrEmpty(name, "Debe ingresar el nombre de quien reserva."); Helper.ThrowIf(date < Helper.GetDateTimeZone(), "No se puede solicitar un turno para una fecha pasada."); Hour hour = hourRepository.Get(hourId); Helper.ThrowIfNull(hour, "Horario inválido."); Field field = fieldRepository.FindAvailableReserve(date, hour); Helper.ThrowIfNull(field, "No hay canchas disponibles."); Turn turn = new Turn(); turn.Date = date; turn.FullName = name; turn.State = EState.RESERVED; turn.Field = field; turn.Hour = hour; turnRepository.Save(turn); IList <Turn> requestedTurns = turnRepository.GetRequests(date, hour, field); foreach (Turn requestedTurn in requestedTurns) { Field requestedField = fieldRepository.FindAvailable(date, hour); if (requestedField != null) { requestedTurn.Field = requestedField; turnRepository.SaveOrUpdate(requestedTurn); } else { //Notificar los turnos que quedan sin canchas } } turnRepository.TransactionManager.CommitTransaction(); DateTime dateTime = new DateTime(turn.Date.Year, turn.Date.Month, turn.Date.Day, turn.Hour.Time.Hours, turn.Hour.Time.Minutes, turn.Hour.Time.Seconds); return(new TurnResultDto(turn.Id, dateTime, turn.FullName, turn.Field.Name)); } catch { turnRepository.TransactionManager.RollbackTransaction(); throw; } }