public async Task <ActionResult> UpdatePayment(AdminUpdatePaytopiaPaymentModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View("UpdatePaymentModal", model));
            }

            var result = await PaytopiaService.UpdatePaytopiaPayment(User.Identity.GetUserId(), model);

            if (!ModelState.IsWriterResultValid(result))
            {
                return(View("UpdatePaymentModal", model));
            }

            return(CloseModal(result));
        }
Ejemplo n.º 2
0
        public async Task <ActionResult> UpdatePayment(AdminUpdatePaytopiaPaymentModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View("UpdatePaymentModal", model));
            }

            var result = await PaytopiaWriter.AdminUpdatePaytopiaPayment(model);

            if (!ModelState.IsWriterResultValid(result))
            {
                return(View("UpdatePaymentModal", model));
            }

            return(CloseModal(result));
        }
Ejemplo n.º 3
0
        public async Task <IWriterResult> UpdatePaytopiaPayment(string adminUserId, AdminUpdatePaytopiaPaymentModel model)
        {
            var amount     = 0m;
            var currencyId = 0;
            var isRefund   = false;
            var userId     = string.Empty;

            using (var context = DataContextFactory.CreateContext())
            {
                var projection = await context.PaytopiaPayments
                                 .Where(x => x.Id == model.PaymentId)
                                 .Select(x => new {
                    Payment     = x,
                    PaymentItem = x.PaytopiaItem
                })
                                 .FirstOrDefaultNoLockAsync().ConfigureAwait(false);

                var payment = projection.Payment;
                payment.PaytopiaItem = projection.PaymentItem;

                if (payment == null)
                {
                    return(new WriterResult(false, $"Payment #{model.PaymentId} not found."));
                }

                if (payment.Status != PaytopiaPaymentStatus.Pending)
                {
                    return(new WriterResult(false, "You can only update 'Pending' payments items."));
                }

                if (payment.Status == PaytopiaPaymentStatus.Pending && model.Status == PaytopiaPaymentStatus.Refunded)
                {
                    if (payment.TransferId == 0)
                    {
                        return(new WriterResult(false, "No transaction found to refund."));
                    }

                    userId               = payment.UserId;
                    amount               = payment.Amount;
                    currencyId           = payment.PaytopiaItem.CurrencyId;
                    payment.Status       = PaytopiaPaymentStatus.Refunded;
                    payment.RefundReason = model.Reason;
                    await context.SaveChangesAsync().ConfigureAwait(false);

                    isRefund = true;
                }
                else if (payment.Status == PaytopiaPaymentStatus.Pending && model.Status == PaytopiaPaymentStatus.Complete)
                {
                    payment.Status = PaytopiaPaymentStatus.Complete;
                    context.LogActivity(adminUserId, $"Paytopia Payment {payment.Id} updated to complete");
                    await context.SaveChangesAsync().ConfigureAwait(false);

                    await CacheService.InvalidateAsync(CacheKey.ShareholderPaytopiaFeeInfo());
                }
            }

            if (isRefund)
            {
                var transferResult = await TradeService.CreateTransfer(Constant.SYSTEM_USER.ToString(), new CreateTransferModel
                {
                    Amount       = amount,
                    CurrencyId   = currencyId,
                    Receiver     = userId,
                    TransferType = TransferType.Paytopia
                });

                if (transferResult.IsError)
                {
                    return(new WriterResult(false, transferResult.Error));
                }

                using (var context = DataContextFactory.CreateContext())
                {
                    var payment =
                        await
                        context.PaytopiaPayments.Where(x => x.Id == model.PaymentId).FirstOrDefaultNoLockAsync().ConfigureAwait(false);

                    if (payment == null)
                    {
                        return(new WriterResult(false));
                    }

                    payment.RefundId = transferResult.TransferId;
                    context.LogActivity(adminUserId, $"Paytopia Refund. Payment: {payment.Id}, Refund Id: {payment.RefundId}");
                    await context.SaveChangesAsync().ConfigureAwait(false);
                }
                return(new WriterResult(true, $"Successfully refunded user for payment #{model.PaymentId}"));
            }

            return(new WriterResult(true, $"Successfully updated payment status for payment #{model.PaymentId} to {model.Status}"));
        }