public async Task <IActionResult> CreateNewOrder([FromBody] OrderRequest request)
        {
            var isValid = await ValidateRequest();

            if ((isValid as OkResult)?.StatusCode != Ok().StatusCode)
            {
                return(isValid);
            }


            var store = request?.GetRequest(MerchantId);

            if (store == null)
            {
                return(BadRequest());
            }



            store.MerchantPayRequestStatus = MerchantPayRequestStatus.New.ToString();
            //store.MerchantPayRequestNotification = MerchantPayRequestNotification.InProgress.ToString();

            var resp = await _gaService.ApiGeneratePostWithHttpMessagesAsync(new GenerateAddressRequest
            {
                MerchantId = MerchantId,
                AssertId   = store.ExchangeAssetId
            });

            var result = await GenerateOrder(store, resp.Body.Address);

            if (result == null)
            {
                return(BadRequest());
            }

            await Log.WriteInfoAsync(nameof(OrderController), nameof(CreateNewOrder), OrderContext(MerchantId, result), "Created new order");

            return(Json(result));
        }
        private async Task <OrderRequestResponse> GetOrder(string id)
        {
            var storeResponse = await _storeRequestClient.ApiStoreOrderByMerchantIdGetWithHttpMessagesAsync(MerchantId);

            var content = await storeResponse.Response.Content.ReadAsStringAsync();

            if (string.IsNullOrEmpty(content))
            {
                return(null);
            }

            var result = (from o in JsonConvert.DeserializeObject <List <Lykke.Pay.Service.StoreRequest.Client.Models.OrderRequest> >(content)
                          where
                          (id.Equals(o.RequestId, StringComparison.CurrentCultureIgnoreCase) || id.Equals(o.OrderId, StringComparison.CurrentCultureIgnoreCase) ||
                           !string.IsNullOrEmpty(o.TransactionId) && o.TransactionId.Equals(id, StringComparison.CurrentCultureIgnoreCase) ||
                           !string.IsNullOrEmpty(o.SourceAddress) && o.SourceAddress.Equals(id, StringComparison.CurrentCultureIgnoreCase)) &&
                          !string.IsNullOrEmpty(o.TransactionWaitingTime)
                          orderby o.TransactionWaitingTime.GetRepoDateTime()
                          select o).ToList();

            if (result.Count == 0)
            {
                return(null);
            }
            if (result.Count == 1 && result[0].TransactionWaitingTime.GetRepoDateTime() > DateTime.Now && result[0].MerchantPayRequestStatus != ((int)MerchantPayRequestStatus.New).ToString())
            {
                return(new OrderRequestResponse(result[0]));
            }

            var order = result.FirstOrDefault(
                o => o.MerchantPayRequestStatus != ((int)MerchantPayRequestStatus.New).ToString());

            if (order != null)
            {
                return(new OrderRequestResponse(order));
            }


            order = result.FirstOrDefault(o => o.TransactionWaitingTime.GetRepoDateTime() > DateTime.Now);
            if (order != null)
            {
                return(new OrderRequestResponse(order));
            }

            var oRequest = result.First();



            var request = new OrderRequest(Log)
            {
                Amount           = oRequest.OriginAmount.ToString(),
                Currency         = oRequest.AssetId,
                ExchangeCurrency = oRequest.ExchangeAssetId,
                ErrorUrl         = oRequest.ErrorUrl,
                ProgressUrl      = oRequest.ProgressUrl,
                SuccessUrl       = oRequest.SuccessUrl,
                Markup           = new Markup
                {
                    FixedFee = oRequest.Markup.FixedFee ?? 0,
                    Percent  = oRequest.Markup.Percent ?? 0,
                    Pips     = 0
                },
                OrderId = oRequest.OrderId,
            };

            var store = request.GetRequest(MerchantId);

            if (store == null)
            {
                return(null);
            }

            store.OriginAmount = oRequest.OriginAmount;
            return(await GenerateOrder(store, result.First().SourceAddress));
        }