public HttpResponse <List <ViajeResponse> > Pendientes()
        {
            using (var db = new GeviApiContext())
            {
                var viajes = db.Viajes
                             .Where(v => v.Estado == Estado.PENDIENTE_APROBACION)
                             .Include(v => v.Empleado)
                             .Include(v => v.Gastos.Select(g => g.Tipo))
                             .Include(v => v.Gastos.Select(g => g.Moneda))
                             .Include(v => v.Proyecto.Cliente)
                             .ToList();

                var response = new List <ViajeResponse>();

                foreach (var v in viajes)
                {
                    var nuevo = new ViajeResponse()
                    {
                        Id                    = v.Id,
                        EmpleadoId            = v.Empleado.Id,
                        Estado                = v.Estado,
                        FechaFin              = v.FechaFin,
                        FechaInicio           = v.FechaInicio,
                        Gastos                = null,
                        Proyecto              = v.Proyecto?.Nombre,
                        ClienteProyectoNombre = v.Proyecto?.Cliente?.Nombre,
                        EmpleadoNombre        = v.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));
            }
        }
 private HttpResponse <ViajeResponse> newHttpResponse(ViajeResponse response)
 {
     return(new HttpResponse <ViajeResponse>()
     {
         StatusCode = HttpStatusCode.OK,
         ApiResponse = new ApiResponse <ViajeResponse>()
         {
             Data = response,
             Error = null
         }
     });
 }
        public HttpResponse <LoginResponse> Login(string username, string password)
        {
            var encryptionManager = new EncryptionManager();
            var pass = encryptionManager.Encryptdata(password);

            using (var db = new GeviApiContext())
            {
                var user = db.Usuarios
                           .Where(u => u.Email.Equals(username) && u.Contrasenia.Equals(pass))
                           .FirstOrDefault();

                if (user != null)
                {
                    #region cargarListas
                    var clientes = db.Clientes
                                   .Include(c => c.Proyectos)
                                   .Include(c => c.Tipo)
                                   .ToList();


                    var tipoClientes = db.TipoClientes.ToList();
                    var monedas      = db.Monedas.ToList();
                    var tipoGastos   = db.TipoGastos.ToList();

                    var clientesResponse     = new List <ClienteResponse>();
                    var tipoClientesResponse = new List <TipoResponse>();
                    var tipoGastosResponse   = new List <TipoResponse>();

                    foreach (var c in clientes)
                    {
                        var nuevoCliente = new ClienteResponse()
                        {
                            Id        = c.Id,
                            Nombre    = c.Nombre,
                            Proyectos = null, // lo devuelvo null porque no me interesa devolver los proyectos
                            Tipo      = c.Tipo
                        };

                        clientesResponse.Add(nuevoCliente);
                    }

                    foreach (var tc in tipoClientes)
                    {
                        var nuevoTipoCliente = new TipoResponse()
                        {
                            TipoNombre = tc.Nombre
                        };

                        tipoClientesResponse.Add(nuevoTipoCliente);
                    }

                    foreach (var tg in tipoGastos)
                    {
                        var nuevoTipoGasto = new TipoResponse()
                        {
                            TipoNombre = tg.Nombre
                        };

                        tipoGastosResponse.Add(nuevoTipoGasto);
                    }
                    #endregion

                    if (user is Empleado)
                    {
                        Empleado usuario = user as Empleado;

                        var viajes = db.Viajes
                                     .Where(v => v.Empleado.Id == usuario.Id)
                                     .Where(v => v.Estado == Estado.APROBADO)
                                     .Include(v => v.Empleado)
                                     .Include(v => v.Gastos)
                                     .Include(v => v.Proyecto)
                                     .ToList();

                        var response = new List <ViajeResponse>();

                        #region traerViajesDelEmpleado
                        if (viajes != null)
                        {
                            foreach (var v in viajes)
                            {
                                var nuevo = new ViajeResponse()
                                {
                                    Id          = v.Id,
                                    EmpleadoId  = usuario.Id,
                                    Estado      = v.Estado,
                                    FechaFin    = v.FechaFin,
                                    FechaInicio = v.FechaInicio,
                                    Gastos      = null,
                                    Proyecto    = v.Proyecto?.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);
                            }
                        }
                        #endregion

                        return(newHttpResponse(new LoginResponse()
                        {
                            Id = user.Id,
                            Email = user.Email,
                            FechaRegistro = user.FechaRegistro,
                            Nombre = user.Nombre,
                            Clientes = clientesResponse,
                            Monedas = monedas,
                            TipoClientes = tipoClientesResponse,
                            TipoGastos = tipoGastosResponse,
                            EsEmpleado = user is Empleado,
                            ViajesAprobados = response
                        }));
                    }

                    if (user is Administrativo)
                    {
                        var empleados = db.Usuarios
                                        .OfType <Empleado>()
                                        .ToList();

                        return(newHttpResponse(new LoginResponse()
                        {
                            Id = user.Id,
                            Email = user.Email,
                            FechaRegistro = user.FechaRegistro,
                            Nombre = user.Nombre,
                            Clientes = clientesResponse,
                            Monedas = monedas,
                            TipoClientes = tipoClientesResponse,
                            TipoGastos = tipoGastosResponse,
                            EsEmpleado = user is Empleado,
                            Empleados = empleados
                        }));
                    }

                    return(newHttpResponse(new LoginResponse()
                    {
                        Id = user.Id,
                        Email = user.Email,
                        FechaRegistro = user.FechaRegistro,
                        Nombre = user.Nombre,
                        Clientes = clientesResponse,
                        Monedas = monedas,
                        TipoClientes = tipoClientesResponse,
                        TipoGastos = tipoGastosResponse,
                        EsEmpleado = user is Empleado
                    }));
                }
                else
                {
                    return(newHttpErrorResponse(new Error("Login invalido. Verifique las credenciales.")));
                }
            }
        }
        public HttpResponse <List <ViajeResponse> > EntreFechas(ListadoViajesRequest request)
        {
            using (var db = new GeviApiContext())
            {
                var viajes = db.Viajes
                             .Where(v => (!request.FechaInicio.Equals(DateTime.MinValue) ? v.FechaInicio >= request.FechaInicio : true) &&
                                    (!request.FechaFin.Equals(DateTime.MinValue) ? v.FechaFin <= request.FechaFin : true) &&
                                    (!String.IsNullOrEmpty(request.ClienteNombre) && (v.Proyecto != null) && (v.Proyecto.Cliente != null) ? v.Proyecto.Cliente.Nombre.Equals(request.ClienteNombre) : true))
                             .Include(v => v.Empleado)
                             .Include(v => v.Gastos.Select(g => g.Tipo))
                             .Include(v => v.Gastos.Select(g => g.Moneda))
                             .Include(v => v.Proyecto.Cliente)
                             .ToList();

                var response = new List <ViajeResponse>();

                foreach (var v in viajes)
                {
                    var nuevo = new ViajeResponse()
                    {
                        Id                    = v.Id,
                        EmpleadoId            = v.Empleado.Id,
                        Estado                = v.Estado,
                        FechaFin              = v.FechaFin,
                        FechaInicio           = v.FechaInicio,
                        Gastos                = null,
                        Proyecto              = v.Proyecto?.Nombre,
                        ClienteProyectoNombre = v.Proyecto?.Cliente?.Nombre,
                        EmpleadoNombre        = v.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));
            }
        }
        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.")));
                            }
                        }
                    }
                }
            }
        }
        public HttpResponse <ViajeResponse> ValidarViaje(ValidacionRequest request)
        {
            if (request == null)
            {
                return(newHttpErrorResponse(new Error("La request es invalida.")));
            }

            using (var db = new GeviApiContext())
            {
                var viaje = db.Viajes
                            .Where(v => v.Id == request.Id)
                            .Include(u => u.Empleado)
                            .Include(w => w.Proyecto.Cliente)
                            .FirstOrDefault();

                if (viaje != null)
                {
                    viaje.Estado          = request.Estado;
                    db.Entry(viaje).State = EntityState.Modified;
                    db.SaveChanges();

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

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

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

                            gastos.Add(nuevoGasto);
                        }

                        response.Gastos = gastos;
                    }

                    return(newHttpResponse(response));
                }
                return(newHttpErrorResponse(new Error("No existe el viaje")));
            }
        }