示例#1
0
        public async Task <Asset> GetBaseAssetOrDefault(string merchantId)
        {
            var baseAssetId = await GetBaseAssetId(merchantId) ?? GetDefaultBaseAssetId();

            Asset baseAsset = await _lykkeAssetsResolver.TryGetAssetAsync(baseAssetId);

            return(baseAsset);
        }
        public async Task <Payment> GetByInvoiceIdAsync(string invoiceId)
        {
            InvoiceModel invoice = await _payInvoiceClient.GetInvoiceAsync(invoiceId);

            var payment = Mapper.Map <Payment>(invoice);

            payment.SettlementAsset = await _lykkeAssetsResolver.TryGetAssetAsync(payment.SettlementAssetId);

            return(payment);
        }
        public async Task <Invoice> GetByIdAsync(string invoiceId)
        {
            InvoiceModel invoice = await _payInvoiceClient.GetInvoiceAsync(invoiceId);

            Asset settlementAsset = await _lykkeAssetsResolver.TryGetAssetAsync(invoice.SettlementAssetId);

            PaymentRequestModel paymentRequest = null;

            if (!string.IsNullOrEmpty(invoice.PaymentRequestId))
            {
                paymentRequest =
                    await _payInternalClient.GetPaymentRequestAsync(invoice.MerchantId, invoice.PaymentRequestId);
            }

            return(new Invoice
            {
                Id = invoice.Id,
                Number = invoice.Number,
                ClientEmail = invoice.ClientEmail,
                ClientName = invoice.ClientName,
                Amount = invoice.Amount,
                DueDate = invoice.DueDate,
                Status = invoice.Status,
                SettlementAssetId = invoice.SettlementAssetId,
                SettlementAsset = settlementAsset,
                PaymentAssetId = invoice.PaymentAssetId,
                PaymentRequestId = invoice.PaymentRequestId,
                WalletAddress = paymentRequest?.WalletAddress,
                CreatedDate = invoice.CreatedDate,
                Note = invoice.Note
            });
        }
示例#4
0
        public async Task <bool> SendAsync(string invoiceId, string checkoutUrl, IReadOnlyList <string> addresses)
        {
            InvoiceModel  invoice;
            MerchantModel merchant;

            try
            {
                invoice = await _payInvoiceClient.GetInvoiceAsync(invoiceId);

                merchant = await _payMerchantClient.Api.GetByIdAsync(invoice.MerchantId);
            }
            catch (Exception ex)
            {
                _log.ErrorWithDetails(ex, new { invoiceId });
                return(false);
            }

            Asset settlementAsset = await _lykkeAssetsResolver.TryGetAssetAsync(invoice.SettlementAssetId);

            var payload = new Dictionary <string, string>
            {
                { "UserName", invoice.ClientName },
                { "InvoiceNumber", invoice.Number },
                { "AmountToPay", invoice.Amount.ToStringNoZeros(settlementAsset.Accuracy) },
                { "AmountToPayAsset", settlementAsset.DisplayId },
                { "InvoiceDueDate", invoice.DueDate.ToString("d") },
                { "InvoiceUrl", checkoutUrl },
                { "Note", invoice.Note },
                { "Year", DateTime.Today.Year.ToString() },
                { "MerchantName", merchant.DisplayName ?? merchant.Name }
            };

            string template = string.IsNullOrEmpty(invoice.Note) ? EmailTemplateWithoutNote : EmailTemplate;

            try
            {
                await _emailPartnerRouterClient.Send(new SendEmailCommand
                {
                    ApplicationId  = Constants.EmailApplicationId,
                    EmailAddresses = addresses.ToArray(),
                    Template       = template,
                    Payload        = payload
                });
            }
            catch (Exception ex)
            {
                _log.ErrorWithDetails(ex, new { invoiceId, template });
                return(false);
            }

            return(true);
        }
        public async Task <IActionResult> GetRefundData([Guid] string paymentRequestId)
        {
            try
            {
                PaymentRequestDetailsModel paymentRequestDetails = await _payInternalClient.GetPaymentRequestDetailsAsync(User.GetMerchantId(), paymentRequestId);

                if (!IsStatusValidForRefund(paymentRequestDetails.Status, paymentRequestDetails.ProcessingError))
                {
                    _log.Warning("Attempt to refund in incorrect status, details: " + paymentRequestDetails.ToJson());

                    return(BadRequest(ErrorResponse.Create(RefundErrorType.NotAllowedInStatus.ToString())));
                }

                var paymentAsset = await _lykkeAssetsResolver.TryGetAssetAsync(paymentRequestDetails.PaymentAssetId);

                var refundData = new RefundDataResponse
                {
                    PaymentAsset          = Mapper.Map <AssetModel>(paymentAsset),
                    SourceWalletAddresses = paymentRequestDetails.Transactions.SelectMany(x => x.SourceWalletAddresses).ToList(),
                    Amount = paymentRequestDetails.Transactions.Sum(x => x.Amount)
                };

                return(Ok(refundData));
            }
            catch (Exception ex)
            {
                _log.ErrorWithDetails(ex, details: new { paymentRequestId });

                return(BadRequest(ErrorResponse.Create(PayInvoicePortalApiErrorCodes.UnexpectedError)));
            }

            bool IsStatusValidForRefund(PaymentRequestStatus status, PaymentRequestProcessingError processingError)
            {
                var invoiceStatus = status.ToInvoiceStatus(processingError);

                switch (invoiceStatus)
                {
                case InvoiceStatus.Underpaid:
                case InvoiceStatus.Overpaid:
                case InvoiceStatus.LatePaid:
                    return(true);

                default:
                    return(false);
                }
            }
        }
示例#6
0
        public async Task <IActionResult> GetSettings()
        {
            var employeeId = User.GetEmployeeId();
            var merchantId = User.GetMerchantId();

            try
            {
                var merchant = await _payMerchantClient.Api.GetByIdAsync(merchantId);

                var publicKeyInfo = await _payAuthClient.GetPayAuthInformationAsync(merchantId);

                var baseAssetId = await _assetService.GetBaseAssetId(merchantId);

                var availableBaseAssets = (await _assetService.GetSettlementAssetsAsync(merchantId)).ToDictionary(_ => _.Key, _ => _.Value);

                // need to add base asset if not empty to the list of available assets
                if (!string.IsNullOrEmpty(baseAssetId) && !availableBaseAssets.ContainsKey(baseAssetId))
                {
                    Asset asset = await _lykkeAssetsResolver.TryGetAssetAsync(baseAssetId);

                    availableBaseAssets.TryAdd(baseAssetId, asset?.DisplayId ?? baseAssetId);
                }

                var settings = new SettingsResponse
                {
                    MerchantDisplayName = merchant.DisplayName,
                    EmployeeFullname    = User.GetName(),
                    EmployeeEmail       = User.GetEmail(),
                    AvailableBaseAssets = availableBaseAssets.Select(o => new AssetItemViewModel(o.Key, o.Value)).ToList().OrderBy(_ => _.Title),
                    BaseAssetId         = baseAssetId,
                    MerchantId          = merchantId,
                    MerchantApiKey      = merchant.ApiKey,
                    HasPublicKey        = !string.IsNullOrEmpty(publicKeyInfo.RsaPublicKey)
                };

                return(Ok(settings));
            }
            catch (Exception e)
            {
                _log.Error(e, new { employeeId, merchantId }.ToJson());

                return(BadRequest(ErrorResponse.Create(PayInvoicePortalApiErrorCodes.UnexpectedError)));
            }
        }