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(); } }
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)); }