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)); }
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)); }
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}")); }