Exemple #1
0
 public TransactionViewModel(PWTransaction transaction)
 {
     if (transaction.Сounteragent == null)
     {
         throw new NullReferenceException("TransactionViewModel - PWTransaction has invalid property value of Сounteragent");
     }
     Id                   = transaction.Id;
     AgentId              = transaction.AgentId;
     СounteragentId       = transaction.СounteragentId;
     СounteragentFullName = transaction.Сounteragent.FullName;
     СounteragentUserName = transaction.Сounteragent.UserName;
     TransactionAmount    = transaction.TransactionAmount;
     AgentBalance         = transaction.AgentBalance;
     OperationDateTime    = transaction.OperationDateTime;
     Description          = transaction.Description;
 }
        private void AddTransactions(PWTranscationContext context)
        {
            var users      = context.Users.Where(c => c.UserName.Contains("demo") || c.UserName.Contains("system")).ToList();
            var demoUser   = users.FirstOrDefault(user => user.UserName.Contains("*****@*****.**"));
            var systemUser = users.FirstOrDefault(user => user.UserName.Contains("*****@*****.**"));

            var demotransaction = new PWTransaction()
            {
                Id                = Guid.NewGuid(),
                AgentId           = demoUser.Id,
                СounteragentId    = systemUser.Id,
                OperationDateTime = DateTime.UtcNow.AddDays(-30),
                AgentBalance      = 100000,
                TransactionAmount = 100000,
                Description       = "Bonus"
            };

            context.PWTransactions.Add(demotransaction);

            for (int i = 0; i < users.Count; i++)
            {
                if (users[i] != systemUser && users[i] != demoUser)
                {
                    PWTransaction transaction = new PWTransaction()
                    {
                        Id                = Guid.NewGuid(),
                        AgentId           = users[i].Id,
                        СounteragentId    = systemUser.Id,
                        OperationDateTime = DateTime.UtcNow.AddDays(-30).AddTicks(i),
                        AgentBalance      = 500,
                        TransactionAmount = 500,
                        Description       = "Bonus"
                    };
                    context.PWTransactions.Add(transaction);
                }
            }

            for (int i = 0; i < users.Count; i++)
            {
                if (users[i] != systemUser)
                {
                    DateTime      dateOper       = DateTime.UtcNow.AddDays(-25).AddTicks(i);
                    PWTransaction transactionOne = new PWTransaction()
                    {
                        Id                = Guid.NewGuid(),
                        AgentId           = demoUser.Id,
                        СounteragentId    = users[i].Id,
                        OperationDateTime = dateOper,
                        AgentBalance      = 100000 - i * 50 - 50,
                        TransactionAmount = -50,
                        Description       = ""
                    };

                    context.PWTransactions.Add(transactionOne);

                    PWTransaction transactionTwo = new PWTransaction()
                    {
                        Id                = Guid.NewGuid(),
                        AgentId           = users[i].Id,
                        СounteragentId    = demoUser.Id,
                        OperationDateTime = dateOper,
                        AgentBalance      = 550,
                        TransactionAmount = 50,
                        Description       = ""
                    };

                    context.PWTransactions.Add(transactionTwo);

                    PWOperationPair operationPair = new PWOperationPair()
                    {
                        TransactionOneId = transactionOne.Id,
                        TransactionTwoId = transactionTwo.Id
                    };

                    context.PWOperationPairs.Add(operationPair);
                }
            }
        }
Exemple #3
0
        public async Task <ActionResult <TransactionViewModel> > Transfer(TransactionModel model)
        {
            string agentId = _identityService.GetUserIdentity();

            if (model.TransactionAmount < 0 ||
                String.IsNullOrWhiteSpace(model.CounteragentId) ||
                Guid.TryParse(model.CounteragentId, out var s) == false ||
                agentId == model.CounteragentId)
            {
                return(BadRequest());
            }

            var agentOneLastTr = await _unitOfWork.TransactionRepository.GetLastTransaction(agentId);

            var agentTwoLastTr = await _unitOfWork.TransactionRepository.GetLastTransaction(model.CounteragentId);

            var operationTime = DateTime.UtcNow;

            model.TransactionAmount = Decimal.Round(model.TransactionAmount, 2);

            if (agentOneLastTr.AgentBalance < model.TransactionAmount)
            {
                ModelState.AddModelError("transactionAmount", "Agent balance less than transaction amount");
                return(BadRequest(ModelState));
            }

            PWTransaction transactionOne = new PWTransaction()
            {
                Id                = Guid.NewGuid(),
                AgentId           = agentId,
                СounteragentId    = model.CounteragentId,
                TransactionAmount = -model.TransactionAmount,
                Description       = model.Description ?? "",
                OperationDateTime = operationTime <= agentOneLastTr.OperationDateTime ? agentOneLastTr.OperationDateTime.AddTicks(1) : operationTime,
                AgentBalance      = agentOneLastTr.AgentBalance - model.TransactionAmount
            };

            PWTransaction transactionTwo = new PWTransaction()
            {
                Id                = Guid.NewGuid(),
                AgentId           = model.CounteragentId,
                СounteragentId    = agentId,
                TransactionAmount = model.TransactionAmount,
                Description       = model.Description ?? "",
                OperationDateTime = operationTime <= agentTwoLastTr.OperationDateTime ? agentTwoLastTr.OperationDateTime.AddTicks(1) : operationTime,
                AgentBalance      = agentTwoLastTr.AgentBalance + model.TransactionAmount
            };

            PWOperationPair operationPair = new PWOperationPair()
            {
                TransactionOneId = transactionOne.Id,
                TransactionTwoId = transactionTwo.Id
            };

            _unitOfWork.TransactionRepository.Create(transactionOne);
            _unitOfWork.TransactionRepository.Create(transactionTwo);
            _unitOfWork.OperationPairsRepository.Create(operationPair);

            try
            {
                await _unitOfWork.SaveChangesAsync();

                transactionOne = await _unitOfWork.TransactionRepository.GetTransactionWithInclude(agentId, transactionOne.Id);
            }
            catch (DbException exc)
            {
                _logger.LogWarning($"PostTransaction agentId: {agentId}; counteragentId: {model.CounteragentId}; transactionAmount: {model.TransactionAmount}; Error: {exc.ToString()}.");
                throw;
            }

            return(CreatedAtAction("GetTransaction", new { id = transactionOne.Id }, new TransactionViewModel(transactionOne)));
        }