public async Task <bool> UploadAndImportFile(int periodId, Stream stream, string fileName, int userId)
        {
            var randomFileName  = Guid.NewGuid().ToString();
            var fileUploadModel = new FileUploadModel
            {
                FileName  = randomFileName,
                FileType  = Shared.Enum.FileType.UploadDocument,
                Extension = Path.GetExtension(fileName),
                PeriodId  = periodId,
                UserId    = userId
            };

            var fileUploadSuccess = await _fileAccessor.WriteFileAsync(stream, fileUploadModel);

            if (fileUploadSuccess)
            {
                await _importProcess.ProcessFileAsync(fileUploadModel);
            }

            return(true);
        }
        public async Task ProcessAsync(FileUploadModel message)
        {
            Dictionary <string, decimal> accountBalances = new Dictionary <string, decimal>();

            await ReadDataFromFile(message, accountBalances);

            var responseMessage = new StringBuilder();

            if (accountBalances != null)
            {
                int successCount = 0;
                using (var uow = await _applicationDbFactory.BeginUnitOfWorkAsync())
                {
                    var allAccount = uow.Accounts.GetAll();
                    foreach (var item in accountBalances)
                    {
                        var account = allAccount.FirstOrDefault(a => a.AccountName == item.Key.Trim());
                        if (account != null)
                        {
                            var balanceRecord = uow.AccountPeriodBalances.GetAll().FirstOrDefault(b => b.PeriodId == message.PeriodId && b.AccountId == account.AccountId);
                            if (balanceRecord == null)
                            {
                                var accountBalance = new AccountPeriodBalance
                                {
                                    AccountId   = account.AccountId,
                                    Balance     = item.Value,
                                    CreatedBy   = message.UserId,
                                    CreatedDate = DateTimeOffset.Now,
                                    PeriodId    = message.PeriodId
                                };
                                uow.AccountPeriodBalances.Insert(accountBalance);
                                successCount++;
                            }
                            else
                            {
                                balanceRecord.Balance     = item.Value;
                                balanceRecord.CreatedDate = DateTimeOffset.Now;
                                balanceRecord.CreatedBy   = message.UserId;

                                uow.AccountPeriodBalances.Update(balanceRecord);
                                successCount++;
                            }
                        }
                        else
                        {
                            responseMessage.Append(item.Key + " : Account does not exist !" + System.Environment.NewLine);
                        }
                    }
                    await uow.SaveAsync();

                    responseMessage.Insert(0, successCount.ToString() + " Records amended succesfully!" + System.Environment.NewLine);
                }
            }
            else
            {
                responseMessage.Append("Data extraction error !" + System.Environment.NewLine);
            }

            byte[]       resutByteArray = Encoding.UTF8.GetBytes(responseMessage.ToString());
            MemoryStream resultStream   = new MemoryStream(resutByteArray);
            await _fileAccessor.WriteFileAsync(resultStream, new FileUploadModel
            {
                Extension = ".txt",
                FileName  = message.FileName,
                FileType  = Shared.Enum.FileType.ResultDocument
            });
        }