Пример #1
0
        public IActionResult DeleteTransaction(Guid transactionId)
        {
            try
            {
                var transaction = transactionRepository.GetTransactionById(transactionId);

                if (transaction == null)
                {
                    return(NotFound("There is no transaction with specified id."));
                }

                transactionRepository.DeleteTransaction(transactionId);
                transactionRepository.SaveChanges();

                //Proizvod koji je kupljen
                var product = productMockService.GetProductById(transaction.ProductId);

                //Uvecaj broj dostupnih proizvoda
                TransactionReduceStockDto returnee = new TransactionReduceStockDto {
                    ProductId = product.ProductId, Quantity = (int)transaction.ProductsQuantity
                };

                bool returned = productMockService.ProductReturned(returnee);

                if (!returned)
                {
                    return(StatusCode(StatusCodes.Status500InternalServerError, "An error occurred while returning products to stock, contact administration"));
                }

                //Vrati novac na racun

                //Pronadji kupca koji je izvrsio transakciju
                var user = userMockService.GetAccounByUserId(transaction.BuyerId);

                //Trazimo nalog na koji vracamo novac
                var account = accountMockService.getAccountById(user.AccountId);

                //Iznos koji treba da vratimo
                decimal amount = (decimal)(product.Price * transaction.ProductsQuantity);

                TransactionChargeDto refund = new TransactionChargeDto {
                    AccountId = account.AccountId, Amount = amount
                };

                bool refunded = accountMockService.refund(refund);

                if (!refunded)
                {
                    return(StatusCode(StatusCodes.Status500InternalServerError, "An error occurred while refunding, contact administration"));
                }

                logger.Log(LogLevel.Information, $"requestId: {Request.HttpContext.TraceIdentifier}, previousRequestId:No previous ID, Message: Transaction successfully deleted.");
                return(Ok("Transaction successfully deleted."));
            }
            catch (Exception e)
            {
                logger.Log(LogLevel.Information, $"requestId: {Request.HttpContext.TraceIdentifier}, previousRequestId:No previous ID, Message: Transaction unsuccessfully deleted.");
                return(StatusCode(StatusCodes.Status500InternalServerError, "Create error " + e.Message));
            }
        }
        public bool ProductReturned(TransactionReduceStockDto returned)
        {
            Product product = Products.FirstOrDefault(p => p.ProductId == returned.ProductId);

            if (product != null)
            {
                product.Quantity += returned.Quantity;
                return(true);
            }
            return(false);
        }
Пример #3
0
        public ActionResult <TransactionDto> CreateTransaction([FromBody] TransactionCreateDto transaction)
        {
            try
            {
                var product = productMockService.GetProductById(transaction.ProductId);

                if (product == null)
                {
                    return(NotFound("Product with specified id does not exist."));
                }

                if (!productMockService.HasEnoughProducts(transaction.ProductId, transaction.ProductsQuantity))
                {
                    return(StatusCode(StatusCodes.Status406NotAcceptable, "There is no enough products."));
                }

                if (!transportTypeMockService.TransportTypeExistsById(transaction.TransportTypeId))
                {
                    return(NotFound("Transport type with specified id does not exist."));
                }


                Transaction transactionEntity = mapper.Map <Transaction>(transaction);

                transactionEntity.BuyingDateTime = DateTime.Now;

                Transaction createdTransaction = transactionRepository.CreateTransaction(transactionEntity);
                var         valid = transactionValidator.Validate(createdTransaction);
                if (!valid.IsValid)
                {
                    return(BadRequest(valid.Errors));
                }

                //Trazimo usera da bismo dobili id naloga sa kog treba da skinemo novac
                var user = userMockService.GetAccounByUserId(transaction.BuyerId);

                if (user == null)
                {
                    return(NotFound("User with specified id does not exist."));
                }

                //Trazimo nalog sa kog treba da skinemo novac
                var account = accountMockService.getAccountById(user.AccountId);

                //Iznos koji treba da skinemo sa naloga
                decimal amount = product.Price * transaction.ProductsQuantity;

                if (account == null)
                {
                    return(NotFound("User does not have account."));
                }

                if (account.AccountBalance < amount)
                {
                    return(StatusCode(StatusCodes.Status406NotAcceptable, "You do not have enough money to buy this product."));
                }

                TransactionChargeDto charge = new TransactionChargeDto {
                    AccountId = account.AccountId, Amount = amount
                };

                //Naplacujemo
                bool charged = accountMockService.charge(charge);

                //Proveravamo da li je naplaceno
                if (!charged)
                {
                    return(StatusCode(StatusCodes.Status500InternalServerError, "An error occurred while charging, contact administration"));
                }

                //Smanjujemo broj proizvoda na lageru
                TransactionReduceStockDto purchase = new TransactionReduceStockDto {
                    ProductId = transaction.ProductId, Quantity = transaction.ProductsQuantity
                };

                bool reducedStock = productMockService.ProductPurchased(purchase);

                if (!reducedStock)
                {
                    return(StatusCode(StatusCodes.Status500InternalServerError, "An error occurred while stock reducing, contact administration"));
                }

                transactionRepository.SaveChanges();

                logger.Log(LogLevel.Information, $"requestId: {Request.HttpContext.TraceIdentifier}, previousRequestId:No previous ID, Message: Transaction successfully created.");

                string location = linkGenerator.GetPathByAction("GetTransaction", "Transaction", new { transactionId = createdTransaction.TransactionId });

                return(Created(location, mapper.Map <TransactionDto>(createdTransaction)));
            }
            catch (Exception e)
            {
                logger.Log(LogLevel.Warning, $"requestId: {Request.HttpContext.TraceIdentifier}, previousRequestId:No previous ID, Message: Transaction unsuccessfully created.", e);
                return(StatusCode(StatusCodes.Status500InternalServerError, "Create error " + e.Message));
            }
        }