Пример #1
0
        protected async override void DoWork()
        {
            var usdCurrency = await _currenciesRepository.FirstOrDefaultAsync(c => c.Code.Equals("USD"));

            if (usdCurrency == null)
            {
                _currenciesRepository.Insert(new Currency
                {
                    CreationTime = DateTime.Now.ToUniversalTime(),
                    Name         = "United States Dollar",
                    Code         = "USD",
                    ImageUrl     = "/assets/purchase-tokens/usd-icon.svg"
                });
            }

            var dcntCurrency = await _currenciesRepository.FirstOrDefaultAsync(c => c.Code.Equals("DCNT"));

            if (dcntCurrency == null)
            {
                _currenciesRepository.Insert(new Currency
                {
                    CreationTime = DateTime.Now.ToUniversalTime(),
                    Name         = "DCNT",
                    Code         = "DCNT",
                    ImageUrl     = "/assets/purchase-tokens/dc-icon.svg"
                });
            }

            Stop();
        }
Пример #2
0
        public async Task <PaymentResponceDto> SubmitPaymentAsync(CreditPayment body)
        {
            try
            {
                var currency = await _currenciesRepository.FirstOrDefaultAsync(body.UserData.UserPaymentData.CurrencyId);

                if (currency == null)
                {
                    throw new UserFriendlyException(L("CurrencyNotFound"));
                }

                StripeConfiguration.SetApiKey(StripeApiKey);


                var chargeOptions = new StripeChargeCreateOptions()
                {
                    Amount = Convert.ToInt32(body.UserData.UserPaymentData.Amount) * 100,
                    //TODO old Currency = body.UserData.UserPaymentData.CurrentType,
                    Currency    = currency.Code,
                    Description = "Charge for " + body.UserData.FirstName + " " + body.UserData.LastName,
                    SourceTokenOrExistingSourceId = body.PaymentData.Id
                };

                var transaction = _transactionRepository.GetAll().LastOrDefault(tran => tran.AmountDue == body.UserData.UserPaymentData.Amount &&
                                                                                tran.TransactionStatus == TransactionStatusEnum.Commited &&
                                                                                tran.UserId == body.UserData.UserPaymentData.UserId);

                var          chargeService = new StripeChargeService();
                StripeCharge charge        = chargeService.Create(chargeOptions);
                if (charge.Status.Equals("succeeded"))
                {
                    if (transaction != null)
                    {
                        transaction.TransactionStatus = TransactionStatusEnum.Paid;
                        await _transactionRepository.UpdateAsync(transaction);
                    }
                    await SavePaymentDataAsync(charge, body.UserData.UserPaymentData.UserId);
                }
                return(new PaymentResponceDto
                {
                    Status = charge.Status
                });
            }
            catch (StripeException ex)
            {
                throw new UserFriendlyException(ex.Message);
            }
            catch (Exception ex)
            {
                throw new UserFriendlyException(ex.Message);
            }
        }
Пример #3
0
        public async Task UpdateExchangeRatesAsync(Dictionary <string, ExchangeValue> exchangeRates)
        {
            using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant))
            {
                try
                {
                    foreach (var item in exchangeRates)
                    {
                        if (item.Value == null)
                        {
                            continue;
                        }

                        //TODO need refactoring
                        var currency = await _currenciesRepository.FirstOrDefaultAsync(c => c.Code.Equals(item.Key));

                        if (currency == null)
                        {
                            continue;
                        }

                        ExchangeRate exchangeRate = null;

                        exchangeRate = _exchangeRepository.FirstOrDefault(c => c.CurrencyId == currency.Id);

                        if (exchangeRate == null)
                        {
                            exchangeRate = new ExchangeRate {
                                CurrencyId = currency.Id
                            };
                        }

                        exchangeRate.CreationTime      = DateTime.Now.ToUniversalTime();
                        exchangeRate.Price             = item.Value.USD;
                        exchangeRate.IsAutomaticUpdate = true;
                        exchangeRate.UpdatedBy         = null;

                        await _exchangeRepository.InsertOrUpdateAsync(exchangeRate);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error(String.Empty, ex);
                }
            }
        }
Пример #4
0
        //ToDo: AddPermission

        //[AbpAuthorize(AppPermissions.Pages_Administration_Users_Create)]
        public async Task CreatePaymentManually(PaymentInput input)
        {
            try
            {
                long?transactionId = null;
                //get latestUnpaidTransaction
                if (input.TransactionId != null)
                {
                    //Demo step
                    transactionId = (long)input.TransactionId;
                }
                else
                {
                    //maybe also partially paid
                    var transactionByWaletId = await _transactionRepository.FirstOrDefaultAsync(x => x.WalletId == input.WalletId && x.TransactionStatus == TransactionStatusEnum.Commited);

                    if (transactionByWaletId != null)
                    {
                        transactionId = transactionByWaletId.Id;
                    }
                }
                if (transactionId == null)
                {
                    throw new UserFriendlyException("We are working on that feature");
                    // todo in case you have a user
                    //transactionId = _transactionRepository.InsertAndGetIdAsync(new Transaction() { })
                }
                var transaction = await _transactionRepository.GetAsync((long)transactionId);

                //create payment
                var payment = new Payments.Payment()
                {
                    AmountOfFunds = input.AmountOfFunds,
                    CreationTime  = DateTime.UtcNow,
                    //TODO: old CurrencyType = (CurrentTypeEnum)(Enum.Parse(typeof(CurrentTypeEnum), input.CurrencyType)),
                    CurrencyId          = input.CurrencyId,
                    PaymentReceivedTime = input.PaymentReceivedTime,
                    WalletId            = transaction.WalletId,
                    TrackingNumber      = input.TrackingNumber,
                    TenantId            = AbpSession.TenantId
                };

                payment.PaymentTransaction.Add(new PaymentTransaction.PaymentTransaction()
                {
                    PaymentId = payment.Id, TransactionId = transaction.Id
                });
                await _paymentRepository.InsertAsync(payment);

                //Convert currency and calculate Tokens Amount
                if (transaction.UserId == null)
                {
                    throw new UserFriendlyException("There is no user in found transaction!");
                }
                var currencies = await _walletAppService.GetBtcEthValue();

                var currentCurency = new  Wallet.Dto.ExchageRateDto();

                var currency = await _currenciesRepository.FirstOrDefaultAsync(input.CurrencyId);

                if (currency == null)
                {
                    throw new UserFriendlyException(L("CurrencyNotFound"));
                }

                if (!currency.IsCrypto)
                {
                    currentCurency.Price = 1;
                }
                else
                {
                    currentCurency = currencies.Find(x => x.Currency.Id == input.CurrencyId);
                }

                decimal amountTokens = (decimal)(((decimal)currentCurency.Price * input.AmountOfFunds) / 0.25M);
                var     user         = await _userRepository.GetAsync((long)transaction.UserId);

                user.AmountTokens      += amountTokens;
                user.DcntTokensBalance += amountTokens;
                await _userRepository.UpdateAsync(user);

                if (amountTokens > transaction.TokensIssued)
                {
                    //pay for current transaction
                    transaction.TransactionStatus = TransactionStatusEnum.Paid;
                    transaction.TokensIssued      = (long)amountTokens;
                    //search new unpaid transaction or create one
                }
                else if (amountTokens == transaction.TokensIssued)
                {
                    //Demo step
                    transaction.TransactionStatus = TransactionStatusEnum.Paid;
                    transaction.TokensIssued      = (long)amountTokens;
                }
                else if (amountTokens < transaction.TokensIssued)
                {
                    transaction.TransactionStatus = TransactionStatusEnum.PartiallyPaid;
                }
            }catch (Exception ex)
            {
                throw new UserFriendlyException(ex.Message);
            }
        }
Пример #5
0
        public async Task <PaymentOutput> PurchaseTokens(WalletLogsDto input)
        {
            try
            {
                if (input != null)
                {
                    var user = _userRepository.Get(input.UserId);


                    var dcnt   = input.Amount;
                    var dollar = dcnt * _dcntInUsd;
                    var dcntInBtcOrEthOrUsd = dollar;

                    var currency = await _currenciesRepository.FirstOrDefaultAsync(input.CurrencyId);

                    if (!currency.IsCrypto)
                    {
                        var users = await UserManager.GetUsersInRoleAsync("Admin");

                        var instruction = users.FirstOrDefault(item => item.WiredInstruction != null).WiredInstruction;
                        return(new PaymentOutput()
                        {
                            Instruction = instruction
                        });
                    }
                    if (currency == null)
                    {
                        throw new UserFriendlyException(L("CurrencyNotFound"));
                    }

                    var exchangeRate = await _exchangeRateRepository.FirstOrDefaultAsync(e => e.CurrencyId.Equals(currency.Id));

                    if (exchangeRate == null)
                    {
                        throw new UserFriendlyException(L("CurrencyNotFound"));
                    }

                    if (currency.IsCrypto)
                    {
                        if (Convert.ToDouble(input.Amount) != 0.0)
                        {
                            dcntInBtcOrEthOrUsd = (_dcntInUsd * input.Amount) / exchangeRate.Price;
                        }
                    }

                    var transaction = new Transaction()
                    {
                        UserId    = input.UserId,
                        AmountDue = dcntInBtcOrEthOrUsd,
                        //TODO: old CurrencyType = (int)Enum.Parse(typeof(CurrentTypeEnum), input.CurrentType),
                        WalletId          = input.WalletId,
                        CurrencyId        = currency.Id,
                        TransactionStatus = TransactionStatusEnum.Commited,
                        IsDeleted         = false,
                        FirstName         = user.Name,
                        LastName          = user.Surname,
                        TokensIssued      = (long)input.Amount,
                        EmailAddress      = user.EmailAddress,
                        TransactionDate   = DateTime.Now,
                        TenantId          = AbpSession.TenantId
                    };
                    await _walletLogsRepository.InsertAsync(transaction);

                    QRCodeGenerator        qrGenerator = new QRCodeGenerator();
                    var                    walletId    = (await _supportedCurrencyRepository.FirstOrDefaultAsync(x => x.CurrencyId == currency.Id)).WalletId;
                    QRCodeData             qrCodeData  = qrGenerator.CreateQrCode(walletId, QRCodeGenerator.ECCLevel.Q);
                    QRCode                 qrCode      = new QRCode(qrCodeData);
                    Bitmap                 qrCodeImage = qrCode.GetGraphic(4);
                    System.IO.MemoryStream ms          = new System.IO.MemoryStream();
                    qrCodeImage.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
                    byte[] byteImage    = ms.ToArray();
                    var    qrCodeBase64 = Convert.ToBase64String(byteImage);

                    var qrcodeDto = new PaymentOutput()
                    {
                        QrCode  = qrCodeBase64,
                        Address = walletId
                    };

                    var tenant = await _tenantRepository.FirstOrDefaultAsync(item => item.Id == AbpSession.TenantId);

                    var currencyImage = StoreClientAgreement(ms, currency.Name);
                    //TODO email
                    //Uri uri = new Uri(tenant.LogoUrl);
                    var emailData = new DcntEmailTemplateInput()
                    {
                        UserName            = user.Name,
                        WalletId            = walletId,
                        Amount              = input.Amount,
                        CurrentType         = currency.Name,
                        Dcnt                = dcnt,
                        Dollar              = dollar,
                        Uri                 = tenant.LogoUrl,
                        DcntInBtcOrEthOrUsd = dcntInBtcOrEthOrUsd,
                        QrCode              = currencyImage
                    };

                    var receiver = new MailAddress(user.EmailAddress, user.FullName);
                    var body     = _userEmailer.GetDCEmailTemplate(emailData);
                    await _userEmailer.SendEmailWithSendGrid(receiver, body);

                    return(qrcodeDto);
                }
            }
            catch (Exception ex)
            {
            }
            return(new PaymentOutput());
        }