public async Task PrepareTransfer(ExternalOperationModel operationModel)
        {
            var senderhelper = await _context.BankAccounts.Include(e => e.User).Where(e => e.Id == operationModel.TargetInternalAccountId).FirstOrDefaultAsync();

            ExternalTransferHelper transferHelper = new ExternalTransferHelper()
            {
                Title                  = operationModel.Title,
                Date                   = operationModel.OperationDate,
                Value                  = operationModel.Value,
                SenderName             = senderhelper.User.Name + " " + senderhelper.User.Secondname,
                RecipientName          = operationModel.FullName,
                RecipientAccountNumber = operationModel.RecipientAccountNumber,
                SenderAccountNumber    = senderhelper.AccountNumber
            };

            await MakeTransfer(transferHelper);
        }
        public async Task SettlementExternalTransfers()
        {
            var transfers = await GetExternalTransfers();

            if (transfers.Any())
            {
                foreach (var item in transfers)
                {
                    if (!item.Title.Equals("Zwrot - przelew odrzucony"))
                    {
                        ExternalOperationModel externalOperation = new ExternalOperationModel();
                        externalOperation.Type                    = "Przelew Zewnętrzny";
                        externalOperation.Title                   = item.Title;
                        externalOperation.OperationDate           = item.Date;
                        externalOperation.Incoming                = true;
                        externalOperation.RecipientAccountNumber  = item.SenderAccountNumber;
                        externalOperation.FullName                = item.SenderName;
                        externalOperation.Value                   = item.Value;
                        externalOperation.TargetInternalAccount   = _context.BankAccounts.Where(e => e.AccountNumber == item.RecipientAccountNumber).FirstOrDefault();
                        externalOperation.TargetInternalAccountId = externalOperation.TargetInternalAccount.Id;

                        externalOperation.TargetInternalAccount.Balance += item.Value;
                        await _context.ExternalOperations.AddAsync(externalOperation);
                    }
                    else
                    {
                        ExternalOperationModel externalOperation = new ExternalOperationModel();
                        externalOperation.Type                    = "Przelew Zewnętrzny";
                        externalOperation.Title                   = item.Title;
                        externalOperation.OperationDate           = item.Date;
                        externalOperation.Incoming                = true;
                        externalOperation.RecipientAccountNumber  = item.RecipientAccountNumber;
                        externalOperation.FullName                = item.RecipientName;
                        externalOperation.Value                   = item.Value;
                        externalOperation.TargetInternalAccount   = _context.BankAccounts.Where(e => e.AccountNumber == item.SenderAccountNumber).FirstOrDefault();
                        externalOperation.TargetInternalAccountId = externalOperation.TargetInternalAccount.Id;

                        externalOperation.TargetInternalAccount.Balance += item.Value;
                        await _context.ExternalOperations.AddAsync(externalOperation);
                    }
                }
                await _context.SaveChangesAsync();
            }
        }
예제 #3
0
        public async Task <ActionResult <ExternalOperationModel> > MakeExternalTransfer(ExternalOperationModel operationModel)
        {
            operationModel.OperationDate = DateTime.Now;
            var sender = await _context.BankAccounts.FirstOrDefaultAsync(e => e.Id == operationModel.TargetInternalAccountId);

            if (await _validator.HasUnusedLimit(operationModel.TargetInternalAccountId) && await _validator.IsTransferAmountCorrect(operationModel.TargetInternalAccountId, operationModel.Value) && await _validator.HasDailyAmountUnusedLimit(operationModel.TargetInternalAccountId, operationModel.Value))
            {
                if (sender.Balance < operationModel.Value)
                {
                    return(BadRequest("lack of account funds"));
                }
                else
                {
                    //send request to settlement unit
                    sender.Balance -= operationModel.Value;
                    await _settlementService.PrepareTransfer(operationModel);

                    await _settlementService.SettlementExternalTransfers();
                }
            }
            else
            {
                return(BadRequest("limits exceeded"));
            }
            _context.ExternalOperations.Add(operationModel);
            await _context.SaveChangesAsync();

            return(CreatedAtAction("GetExternalOperationModel", new { id = operationModel.Id }, operationModel));
        }