private B2BSERAWebService.Model.DownloadDocumentViewModel DownloadDocumentResponse(List <TransactionViewModel> listData)
        {
            DownloadDocumentViewModel DownloadDocumentResult = new DownloadDocumentViewModel();

            DownloadDocumentResult.Acknowledge = true;
            DownloadDocumentResult.TicketNo    = "EDE283E6BE1A866452AC76F106CC5CB80BA1902F0BBA8C019F27D3E5025C931139B8E385AD37F6E1CDA0FB029A1198E17DD968A5C711A1FFFB72F33405F34B8EA545F4CE02F7B8B83369C36AC83BF0FAE422B15B919D294047AEC92AF8DC67A0";
            DownloadDocumentResult.Message     = "Download Data Succeeded";


            List <TransactionDataModel> trans = new List <TransactionDataModel>();

            for (int i = 0; i < listData.Count; i++)
            {
                TransactionDataModel transData = new TransactionDataModel();
                transData.ID              = listData[i].TransactionDataID;
                transData.TransGUID       = listData[i].TransGUID;
                transData.DocumentNumber  = listData[i].DocumentNumber;
                transData.FileType        = listData[i].FileType;
                transData.IPAddress       = listData[i].IPAddress;
                transData.DestinationUser = listData[i].DestinationUser;
                transData.DataLength      = listData[i].DataLength;

                //TODO 2013-09-05: BUILD { Data = HS|PONUMBER|||||||| }
                List <string>       listString          = new List <string>();
                TransactionProvider transactionProvider = UnityContainerHelper.Container.Resolve <TransactionProvider>();
                listString = transactionProvider.SearchTransDetail(listData[i].TransactionDataID);

                transData.Data = listString.ToArray();

                trans.Add(transData);
            }
            DownloadDocumentResult.transactionData = trans;

            return(DownloadDocumentResult);
        }
        public async Task <IResponse <NoValue> > AddToTransaction(TransactionDataModel model)
        {
            var response = new Response <NoValue>();

            var transactions = new List <Transaction>();

            try
            {
                var jobTimeline = _entity.JobTimeline.Find(model.JobId);

                var fromAdapter = jobTimeline.Schedule.JobDefinition.Adapter;
                var toAdapter   = jobTimeline.Schedule.JobDefinition.Adapter1;

                var transactionList = model.Data;

                //remove intersecting transactions if job is recurrent
                var newTransactionsResponse = RemoveIntersection(model.Data, jobTimeline);

                if (newTransactionsResponse.Value.Count > 0)
                {
                    foreach (var transaction in newTransactionsResponse.Value)
                    {
                        var transactionTypeResponse = GetTransactionType(transaction);
                        var accountsResponse        = await _accountService.GetAccount(transaction.TransactionAccount, fromAdapter.EnterpriseAdapter.FirstOrDefault().Id, toAdapter.CryptoAdapter.FirstOrDefault().Id);

                        transactions.Add(new Transaction
                        {
                            TransactionId       = transaction.TransactionId,
                            AccountId           = accountsResponse.Value.Id,
                            TransactionAmount   = Math.Abs(Convert.ToDecimal(transaction.TransactionAmount)),
                            CreatedAt           = DateTime.UtcNow,
                            UpdatedAt           = DateTime.UtcNow,
                            TransactionTypeId   = transactionTypeResponse.Value.Id,
                            TransactionStatusId = (int)Common.Enums.TransactionStatus.Pending,
                            JobTimelineId       = model.JobId,
                        });
                    }
                    _entity.Transaction.AddRange(transactions);
                    _entity.SaveChanges();
                }
                response.Status = Common.Enums.StatusEnum.Success;
            }
            catch (Exception ex)
            {
                response.Message = Message.SomethingWentWrong;
                response.Status  = Common.Enums.StatusEnum.Error;
                _logger.Information($"TransactionService.AddToTransaction(model: {model})");
                _logger.Error(ex.Message);
            }
            return(response);
        }
        public async Task ExecuteJob(long jobId)
        {
            try
            {
                _jobHistoryService.ChangeJobStatus(JobStatus.Executing, jobId);
                var status = new StatusEnum();

                var jobTimeline     = _entity.JobTimeline.Find(jobId);
                var jobDefinitionId = jobTimeline.Schedule.JobDefinition.Id;
                var fromAdapter     = jobTimeline.Schedule.JobDefinition.Adapter;

                string fromBlock;
                string toBlock;
                string address;

                int ethLimit = Int32.Parse(_configuration["Limits:EthereumBlocks"]);
                int btcLimit = Int32.Parse(_configuration["Limits:BitcoinBlocks"]);
                int neoLimit = Int32.Parse(_configuration["Limits:NEOBlocks"]);
                int ltcLimit = Int32.Parse(_configuration["Limits:LitecoinBlocks"]);

                switch ((AdapterTypeItemEnum)fromAdapter.AdapterTypeItemId)
                {
                case AdapterTypeItemEnum.MSSQL:
                case AdapterTypeItemEnum.MySQL:
                case AdapterTypeItemEnum.Oracle:

                    var data = _dbAdapterService.GetAdapterData(jobDefinitionId);

                    if (data.Status == StatusEnum.Success && data.Value.Count > 0)
                    {
                        var transactionData = new TransactionDataModel
                        {
                            JobId = jobId,
                            Data  = data.Value
                        };

                        await _transactionService.AddToTransaction(transactionData);

                        var transactions = _transactionService.GetTransactionsWithoutHash(jobId);

                        if (transactions.Status == StatusEnum.Success)
                        {
                            var blockchainDataList = new List <BlockchainDataModel>()
                            {
                                new BlockchainDataModel
                                {
                                    JobId        = jobId,
                                    Transactions = transactions.Value
                                }
                            };

                            status = await SendData(jobId, blockchainDataList);

                            break;
                        }
                    }
                    status = StatusEnum.Error;
                    break;

                case AdapterTypeItemEnum.MongoDB:
                    break;

                case AdapterTypeItemEnum.Ethereum:

                    fromBlock = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.FromBlock).Value;
                    toBlock   = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.ToBlock).Value;
                    address   = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.EthereumAccount).Value;

                    int fromBlockConverted;
                    int toBlockConverted;

                    Int32.TryParse(fromBlock, out fromBlockConverted);
                    Int32.TryParse(toBlock, out toBlockConverted);

                    var ethereumCurrentBlock = await _blockchainService.GetCurrentBlockNumber(fromAdapter.Id, AdapterTypeItemEnum.Ethereum);

                    if (ethereumCurrentBlock.Status == StatusEnum.Success)
                    {
                        if (fromBlockConverted == 0)
                        {
                            fromBlockConverted = 1;
                        }

                        if (toBlockConverted == 0)
                        {
                            toBlockConverted = ethereumCurrentBlock.Value;
                        }

                        if (Math.Abs(toBlockConverted - fromBlockConverted) < ethLimit && fromBlockConverted < ethereumCurrentBlock.Value && toBlockConverted <= ethereumCurrentBlock.Value)
                        {
                            var blocks = await _blockchainService.GetBlocksWithTransactions <EthereumBlockModel>(fromAdapter.Id, fromBlockConverted, toBlockConverted, address);

                            if (blocks.Status == StatusEnum.Success)
                            {
                                status = await SendData(jobId, blocks.Value);

                                if (status != StatusEnum.Error)
                                {
                                    if (jobTimeline.Schedule.RecurrenceRule != null)
                                    {
                                        _blockTransactionService.AddBlocksWithTransactions(jobId, blocks.Value);
                                    }
                                    break;
                                }
                            }
                            status = StatusEnum.Error;
                            break;
                        }
                        _jobHistoryService.ChangeJobStatus(JobStatus.Failed, jobId, limitExceeded: true);
                        break;
                    }

                    status = StatusEnum.Error;
                    break;

                case AdapterTypeItemEnum.Cardano:
                case AdapterTypeItemEnum.EOS:
                    break;

                case AdapterTypeItemEnum.NEO:

                    fromBlock = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.FromBlock).Value;
                    toBlock   = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.ToBlock).Value;
                    address   = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.NeoAddress).Value;

                    Int32.TryParse(fromBlock, out fromBlockConverted);
                    Int32.TryParse(toBlock, out toBlockConverted);

                    var neoCurrentBlock = await _blockchainService.GetCurrentBlockNumber(fromAdapter.Id, AdapterTypeItemEnum.NEO);

                    if (neoCurrentBlock.Status == StatusEnum.Success)
                    {
                        if (fromBlockConverted == 0)
                        {
                            fromBlockConverted = 1;
                        }

                        if (toBlockConverted == 0)
                        {
                            toBlockConverted = neoCurrentBlock.Value;
                        }

                        if (Math.Abs(toBlockConverted - fromBlockConverted) < neoLimit && fromBlockConverted < neoCurrentBlock.Value && toBlockConverted <= neoCurrentBlock.Value)
                        {
                            var neoBlocks = await _blockchainService.GetBlocksWithTransactions <NeoBlockModel>(fromAdapter.Id, fromBlockConverted, toBlockConverted, address);

                            if (neoBlocks.Status == StatusEnum.Success)
                            {
                                status = await SendData(jobId, neoBlocks.Value);

                                if (status != StatusEnum.Error)
                                {
                                    if (jobTimeline.Schedule.RecurrenceRule != null)
                                    {
                                        _blockTransactionService.AddBlocksWithTransactions(jobId, neoBlocks.Value);
                                    }
                                    break;
                                }
                            }
                            status = StatusEnum.Error;
                            break;
                        }
                        _jobHistoryService.ChangeJobStatus(JobStatus.Failed, jobId, limitExceeded: true);
                        break;
                    }
                    status = StatusEnum.Error;
                    break;

                case AdapterTypeItemEnum.Bitcoin:

                    fromBlock = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.FromBlock).Value;
                    toBlock   = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.ToBlock).Value;
                    address   = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.BitcoinAddress).Value;

                    Int32.TryParse(fromBlock, out fromBlockConverted);
                    Int32.TryParse(toBlock, out toBlockConverted);

                    var bitcoinCurrentBlock = await _blockchainService.GetCurrentBlockNumber(fromAdapter.Id, AdapterTypeItemEnum.Bitcoin);

                    if (bitcoinCurrentBlock.Status == StatusEnum.Success)
                    {
                        if (fromBlockConverted == 0)
                        {
                            fromBlockConverted = 1;
                        }

                        if (toBlockConverted == 0)
                        {
                            toBlockConverted = bitcoinCurrentBlock.Value;
                        }

                        if (Math.Abs(toBlockConverted - fromBlockConverted) < btcLimit && fromBlockConverted < bitcoinCurrentBlock.Value && toBlockConverted <= bitcoinCurrentBlock.Value)
                        {
                            var bitcoinBlocks = await _blockchainService.GetBlocksWithTransactions <BitcoinBlockModel>(fromAdapter.Id, fromBlockConverted, toBlockConverted, address);

                            if (bitcoinBlocks.Status == StatusEnum.Success)
                            {
                                status = await SendData(jobId, bitcoinBlocks.Value);

                                if (status != StatusEnum.Error)
                                {
                                    if (jobTimeline.Schedule.RecurrenceRule != null)
                                    {
                                        _blockTransactionService.AddBlocksWithTransactions(jobId, bitcoinBlocks.Value);
                                    }
                                    break;
                                }
                            }
                            status = StatusEnum.Error;
                            break;
                        }
                        _jobHistoryService.ChangeJobStatus(JobStatus.Failed, jobId, limitExceeded: true);
                        break;
                    }
                    status = StatusEnum.Error;

                    break;

                case AdapterTypeItemEnum.Litecoin:

                    fromBlock = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.FromBlock).Value;
                    toBlock   = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.ToBlock).Value;
                    address   = jobTimeline.Schedule.JobDefinition.JobDefinitionProperty.FirstOrDefault(jdp => jdp.PropertyId == (long)PropertyEnum.LitecoinAddress).Value;

                    Int32.TryParse(fromBlock, out fromBlockConverted);
                    Int32.TryParse(toBlock, out toBlockConverted);

                    var litecoinCurrentBlock = await _blockchainService.GetCurrentBlockNumber(fromAdapter.Id, AdapterTypeItemEnum.Litecoin);

                    if (litecoinCurrentBlock.Status == StatusEnum.Success)
                    {
                        if (fromBlockConverted == 0)
                        {
                            fromBlockConverted = 1;
                        }

                        if (toBlockConverted == 0)
                        {
                            toBlockConverted = litecoinCurrentBlock.Value;
                        }

                        if (Math.Abs(toBlockConverted - fromBlockConverted) < ltcLimit && fromBlockConverted < litecoinCurrentBlock.Value && toBlockConverted <= litecoinCurrentBlock.Value)
                        {
                            var litecoinBlocks = await _blockchainService.GetBlocksWithTransactions <LitecoinBlockModel>(fromAdapter.Id, fromBlockConverted, toBlockConverted, address);

                            if (litecoinBlocks.Status == StatusEnum.Success)
                            {
                                status = await SendData(jobId, litecoinBlocks.Value);

                                if (status != StatusEnum.Error)
                                {
                                    if (jobTimeline.Schedule.RecurrenceRule != null)
                                    {
                                        _blockTransactionService.AddBlocksWithTransactions(jobId, litecoinBlocks.Value);
                                    }
                                    break;
                                }
                            }
                            status = StatusEnum.Error;
                            break;
                        }
                        _jobHistoryService.ChangeJobStatus(JobStatus.Failed, jobId, limitExceeded: true);
                        break;
                    }
                    status = StatusEnum.Error;

                    break;

                case AdapterTypeItemEnum.Excel:
                case AdapterTypeItemEnum.MATLAB:
                    break;

                default:
                    status = StatusEnum.Error;
                    break;
                }

                if (status == StatusEnum.Error)
                {
                    _jobHistoryService.ChangeJobStatus(JobStatus.Failed, jobId);
                }
            }
            catch (Exception ex)
            {
                _jobHistoryService.ChangeJobStatus(JobStatus.Failed, jobId);
                _logger.Information($"JobService.ExecuteJob(jobId: {jobId})");
                _logger.Error(ex.Message);
            }
        }