private bool esValido(ViajeRequest viaje, GeviApiContext ctx, Empleado emp)
        {
            var res = ctx.Viajes
                      .Where(v => v.Empleado.Email.Equals(emp.Email))
                      .ToList();

            bool esValido = true;

            if (res.Count != 0)
            {
                foreach (var v in res)
                {
                    if (esValido)
                    {
                        var inicioViajeNuevoValido = NotBetween(viaje.FechaInicio, v.FechaInicio, v.FechaFin);
                        var finViajeNuevoValido    = NotBetween(viaje.FechaFin, v.FechaInicio, v.FechaFin);

                        if (inicioViajeNuevoValido && finViajeNuevoValido)
                        {
                            var inicioViajeExistenteValido = NotBetween(v.FechaInicio, viaje.FechaInicio, viaje.FechaFin);
                            var finViajeExistenteValido    = NotBetween(v.FechaFin, viaje.FechaInicio, viaje.FechaFin);

                            esValido = inicioViajeExistenteValido && finViajeExistenteValido;
                        }
                        else
                        {
                            esValido = false;
                        }
                    }
                }
            }

            return(esValido);
        }
        public HttpResponse <List <ViajeResponse> > Historial(ViajeRequest request)
        {
            using (var db = new GeviApiContext())
            {
                var empleado = db.Usuarios
                               .OfType <Empleado>()
                               .Where(u => u is Empleado && u.Id == request.EmpleadoId)
                               .Include(u => u.Viajes.Select(v => v.Proyecto.Cliente))
                               .Include(u => u.Viajes.Select(v => v.Gastos.Select(g => g.Tipo)))
                               .Include(u => u.Viajes.Select(v => v.Gastos.Select(g => g.Moneda)))
                               .FirstOrDefault();

                if (empleado != null)
                {
                    var viajes = empleado?.Viajes;

                    var response = new List <ViajeResponse>();

                    if (viajes != null)
                    {
                        foreach (var v in viajes)
                        {
                            var nuevo = new ViajeResponse()
                            {
                                Id                    = v.Id,
                                EmpleadoId            = request.EmpleadoId,
                                Estado                = v.Estado,
                                FechaFin              = v.FechaFin,
                                FechaInicio           = v.FechaInicio,
                                Gastos                = null,
                                Proyecto              = v.Proyecto?.Nombre,
                                ClienteProyectoNombre = v.Proyecto.Cliente.Nombre,
                                EmpleadoNombre        = empleado.Nombre
                            };

                            if (v.Gastos != null)
                            {
                                var gastosRespone = new List <GastoResponse>();

                                foreach (var g in v.Gastos)
                                {
                                    var nuevoGastoResponse = new GastoResponse()
                                    {
                                        Id       = g.Id,
                                        Estado   = g.Estado,
                                        Fecha    = g.Fecha,
                                        Moneda   = g.Moneda?.Nombre,
                                        Tipo     = g.Tipo?.Nombre,
                                        ViajeId  = v.Id,
                                        Proyecto = g.Viaje?.Proyecto?.Nombre,
                                        Total    = g.Total,
                                        Empleado = g.Empleado?.Nombre
                                    };

                                    gastosRespone.Add(nuevoGastoResponse);
                                }

                                nuevo.Gastos = gastosRespone;
                            }

                            response.Add(nuevo);
                        }
                    }
                    return(newHttpListResponse(response));
                }

                return(newHttpErrorListResponse(new Error("No existe el empleado")));
            }
        }
        public HttpResponse <ViajeResponse> NuevoViaje(ViajeRequest request)
        {
            if (request == null)
            {
                return(newHttpErrorResponse(new Error("El viaje que se intenta ingresar es invalido.")));
            }

            using (var db = new GeviApiContext())
            {
                var empleado = db.Usuarios
                               .OfType <Empleado>()
                               .Where(u => u is Empleado && u.Id == request.EmpleadoId)
                               .Include(u => u.Viajes)
                               .FirstOrDefault();

                var proyecto = db.Proyectos
                               .Where(p => p.Nombre.Equals(request.ProyectoNombre))
                               .Include(p => p.Cliente)
                               .FirstOrDefault();

                if (request?.FechaInicio < request?.FechaFin && empleado != null && proyecto != null && esValido(request, db, empleado))
                {
                    var nuevo = new Viaje()
                    {
                        Empleado    = empleado,
                        Estado      = Estado.PENDIENTE_APROBACION,
                        FechaInicio = request.FechaInicio,
                        FechaFin    = request.FechaFin,
                        Gastos      = null,
                        Proyecto    = proyecto
                    };

                    try
                    {
                        db.Viajes.Add(nuevo);
                        db.SaveChanges();
                    }
                    catch (DbUpdateException)
                    {
                        return(newHttpErrorResponse(new Error("Error al ingresar el viaje.")));
                    }

                    var response = new ViajeResponse()
                    {
                        Id                    = nuevo.Id,
                        EmpleadoId            = empleado.Id,
                        Estado                = Estado.PENDIENTE_APROBACION,
                        FechaInicio           = request.FechaInicio,
                        FechaFin              = request.FechaFin,
                        Gastos                = null,
                        Proyecto              = proyecto?.Nombre,
                        EmpleadoNombre        = empleado?.Nombre,
                        ClienteProyectoNombre = proyecto?.Cliente?.Nombre
                    };

                    return(newHttpResponse(response));
                }
                else
                {
                    if (request?.FechaInicio >= request?.FechaFin)
                    {
                        return(newHttpErrorResponse(new Error("La fecha de inicio debe ser mayor a la de fin")));
                    }
                    else
                    {
                        if (empleado == null)
                        {
                            return(newHttpErrorResponse(new Error("No existe el empleado")));
                        }
                        else
                        {
                            if (proyecto == null)
                            {
                                return(newHttpErrorResponse(new Error("No existe el proyecto")));
                            }
                            else
                            {
                                return(newHttpErrorResponse(new Error("Ya existe un viaje en esa fecha para el empleado.")));
                            }
                        }
                    }
                }
            }
        }