internal async Task <IActionResult> DoTransaccion([NotNull] TransaccionDTO transaccionDTO, User mod = default, Operacion operacion = default, User userFrom = default)
        {
            IActionResult result      = default;
            Transaccion   transaccion = default;

            #region Validar Parametros
            if (Equals(operacion, default))
            {
                operacion = await Context.Operaciones.FindAsync(transaccionDTO.IdOperacion);
            }
            else if (transaccionDTO.IdOperacion != operacion.Id)
            {
                result = BadRequest($"La {nameof(Operacion)} '{transaccionDTO.IdOperacion}' no coincide con la enviada '{operacion.Id}'");
            }
            if (Equals(userFrom, default))
            {
                userFrom = Context.GetUserPermisoWithTransacciones(transaccionDTO.IdFrom);
            }
            else if (transaccionDTO.IdFrom != userFrom.Id)
            {
                result = BadRequest($"El {nameof(Models.User)} '{await Context.Users.FindAsync(transaccionDTO.IdFrom)}' no coincide con el enviado '{userFrom}'");
            }
            if (Equals(mod, default))
            {
                mod = Context.GetUserPermiso(Models.User.GetEmailFromHttpContext(ContextoHttp));
                if (!mod.IsModTransaccion)
                {
                    mod = default;
                }
            }
            else if (!mod.IsModTransaccion)
            {
                result = BadRequest($"El {nameof(Models.User)} {nameof(mod)}={mod} no tiene el permiso '{Permiso.MODTRANSACCION}' ({nameof(mod.IsModTransaccion)})");
            }
            #endregion
            if (Equals(result, default))
            {
                if (userFrom.TiempoDisponible - transaccionDTO.Minutos >= 0)
                {
                    //aqui pongo los criterios para poder hacer la operacion
                    //si se puede hacer creo la transacción
                    if (!operacion.IsRevisada || !Equals(mod, default))
                    {
                        operacion.Completada = transaccionDTO.IsComplete;
                        Context.Operaciones.Update(operacion);
                        transaccion = transaccionDTO.ToTransaccion();
                        if (!Equals(mod, default))
                        {
                            transaccion.UserValidator = mod;
                        }
                        await Context.Transacciones.AddAsync(transaccion);

                        await Context.SaveChangesAsync();
                    }
                }
                result = Ok(transaccion);
            }
            return(result);
        }
        public async Task <IActionResult> AddTransaccion(TransaccionDTO transaccionDTO)
        {
            IActionResult result;
            User          user;

            Operacion operacion;
            IEnumerable <Transaccion> transacciones;

            if (Equals(transaccionDTO, default))
            {
                result = BadRequest();
            }
            else if (ContextoHttp.IsAuthenticated)
            {
                user = Context.GetUserPermiso(Models.User.GetEmailFromHttpContext(ContextoHttp));
                if (user.IsValidated)
                {
                    operacion = await Context.Operaciones.FindAsync(transaccionDTO.IdOperacion);

                    if (Equals(operacion, default))
                    {
                        result = NotFound();
                    }
                    else
                    {
                        if (operacion.UserId != user.Id && !user.IsModTransaccion)
                        {
                            result = Unauthorized();//si la operación no la ha creado él o no es un mod no puede hacerlo
                        }
                        else if (operacion.Completada)
                        {
                            transacciones = Context.Transacciones.Where(t => t.OperacionId == operacion.Id);
                            if (transacciones.Any())
                            {
                                result = Ok(new TransaccionesGrupoDTO(transacciones));
                            }
                            else
                            {//si hay más participantes a dar el pago y se quiere añadir a posteriori
                                result = await DoTransaccion(transaccionDTO, user, operacion);
                            }
                        }
                        else
                        {
                            result = await DoTransaccion(transaccionDTO, user, operacion);
                        }
                    }
                }
                else
                {
                    result = this.NotValidated(); //no se puede trabajar con alguien no validado!
                }
            }
            else
            {
                result = this.NotLoggedIn();
            }
            return(result);
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> Post(TransaccionDTO transaccionDto)
        {
            var transaccion = _mapper.Map <Transacciones>(transaccionDto);
            await _transaccionServices.InsertTransaccion(transaccion);

            var response = new ApiResponse <TransaccionDTO>(transaccionDto);

            return(Ok(response));
        }
 public async Task <IActionResult> UpdateTransaccion(TransaccionDTO transaccionDTO)
 {
     return(await ModifyTransaccion(transaccionDTO, async (transaccion, tDTO) =>
     {
         IActionResult result;
         User user = Context.Users.Find(tDTO.IdTo);
         if (Equals(user, default))
         {
             result = NotFound();
         }
         else if (!user.IsValidated)
         {
             result = this.NotValidated();
         }
         else
         {
             result = await DoTransaccionUpdate(tDTO, default, transaccion);
        async Task <IActionResult> DoTransaccion([NotNull] TransaccionDTO transaccionDTO, User user, Operacion operacion)
        {
            IActionResult result;

            TransaccionDelegada transaccionDelegada;

            bool autoritzed;


            if (operacion.Id != transaccionDTO.IdOperacion)
            {
                result = BadRequest($"la {nameof(Operacion)} con {nameof(Operacion.Id)}={transaccionDTO.IdOperacion} no es la misma que la enviada {nameof(Operacion.Id)}={operacion.Id}");
            }
            else
            {
                autoritzed = user.Id == transaccionDTO.IdFrom || user.IsModTransaccion;

                if (!autoritzed)
                {
                    transaccionDelegada = Context.GetTransaccionDelegada(operacion);

                    autoritzed = !Equals(transaccionDelegada, default) &&
                                 user.Id == transaccionDelegada.UserId &&
                                 transaccionDelegada.IsActiva;
                }

                if (autoritzed)
                {
                    result = await DoTransaccion(transaccionDTO, operacion : operacion, userFrom : user);

                    if (result is OkObjectResult)
                    {
                        transaccionDTO.Id = ((result as OkObjectResult).Value as Transaccion).Id;
                        result            = StatusCode(StatusCodes.Status206PartialContent, transaccionDTO);
                    }
                }

                else
                {
                    result = Unauthorized();
                }
            }
            return(result);
        }
Ejemplo n.º 6
0
        public async Task <IActionResult> WithDraw(TransaccionDTO transaccionDto)
        {
            Dictionary <string, string> response = new Dictionary <string, string>();

            switch (transaccionDto.Account)
            {
            case "Saving":
                response = await _mediator.Send(new AddSavingAccountTransactionCommand.Command(transaccionDto.IdAccount, transaccionDto.Amount, transaccionDto.Tipo, transaccionDto.Saldo - transaccionDto.Amount, DateTime.Now));

                break;

            case "Checking":
                response = await _mediator.Send(new AddCheckingAccountTransactionCommand.Command(transaccionDto.IdAccount, transaccionDto.Amount, transaccionDto.Tipo, transaccionDto.Saldo - transaccionDto.Amount, DateTime.Now));

                break;
            }

            TempData["message"] = response["msg"];
            TempData["status"]  = response["res"];
            return(new RedirectResult($"account/{transaccionDto.IdAccount}/{transaccionDto.Account}"));
        }