public IHttpActionResult CancelTransaction(string transactionTokenOrReceipt) { using (var dbContext = new DataContext()) { var paymentTransaction = dbContext.PaymentTransactions .Include(f => f.TransactionItems) .FirstOrDefault(f => (f.TransactionToken == transactionTokenOrReceipt || f.Receipt == transactionTokenOrReceipt) && f.Status == Data.Enums.PaymentTransactionStatus.Added); if (paymentTransaction == null) { return(this.BadRequestEx(Error.PaymentTransactionDoesNotExist)); } paymentTransaction.Status = Data.Enums.PaymentTransactionStatus.Cancelled; foreach (var paymentTransactionItem in paymentTransaction.TransactionItems) { paymentTransactionItem.Status = Data.Enums.PaymentTransactionStatus.Cancelled; } PaymentTransactionHub.SendStatusChanged( paymentTransaction.TransactionToken, (PaymentTransactionStatus)paymentTransaction.Status, paymentTransaction.Amount); return(Ok()); } }
public IHttpActionResult SettleTransaction(ConfirmedPaymentModel confirmedPaymentModel) { using (var dbContext = new DataContext()) { var paymentTransactions = dbContext.PaymentTransactions .Include(f => f.TransactionItems).Where(f => f.TransactionToken == confirmedPaymentModel.TransactionToken) .ToList(); if (paymentTransactions == null || paymentTransactions.Count == 0) { ProcessUnallocated(dbContext, confirmedPaymentModel); return(Ok()); } // Iffy var paymentTransaction = paymentTransactions.FirstOrDefault(f => f.Status == Data.Enums.PaymentTransactionStatus.Added); if (paymentTransaction == null) { ProcessDuplicate(dbContext, confirmedPaymentModel); return(Ok()); } if (confirmedPaymentModel.Amount < paymentTransaction.Amount) { ProcessUnderpayment(dbContext, paymentTransaction, confirmedPaymentModel); return(Ok()); } if (confirmedPaymentModel.Amount > paymentTransaction.Amount) { ProcessOverpayment(dbContext, paymentTransaction, confirmedPaymentModel); return(Ok()); } var paymentProvider = resolvePaymentProvider(); if (!paymentTransaction.TerminalID.HasValue) { var paymentTerminal = dbContext.PaymentTerminals.FirstOrDefault(f => f.TerminalType == (Data.Enums.TerminalType)confirmedPaymentModel.TerminalType && f.UUID == confirmedPaymentModel.TerminalUUID); if (paymentTerminal == null) { return(this.BadRequestEx(Error.PaymentTerminalDoesNotExist)); } paymentTransaction.TerminalID = paymentTerminal.ID; } if (string.IsNullOrEmpty(paymentTransaction.Receipt)) { paymentTransaction.Receipt = confirmedPaymentModel.Receipt; paymentTransaction.ReceiptTimestamp = confirmedPaymentModel.TransactionTimestamp; } paymentTransaction.CredentialID = SessionModel.CredentialID; paymentTransaction.ModifiedTimestamp = DateTime.Now; paymentTransaction.Status = Data.Enums.PaymentTransactionStatus.Settled; foreach (var paymentTransactionItem in paymentTransaction.TransactionItems) { paymentTransactionItem.Status = Data.Enums.PaymentTransactionStatus.Settled; try { paymentProvider.CancelTransaction(paymentTransactionItem.TransactionToken); } catch { // Empty on purpose } } dbContext.SaveChanges(); PaymentTransactionHub.SendStatusChanged( paymentTransaction.TransactionToken, (PaymentTransactionStatus)paymentTransaction.Status, paymentTransaction.Amount); Task.Run(() => ProcessTransaction(paymentTransaction.ID, SessionModel.CredentialID)); } return(Ok()); }
public IHttpActionResult RegisterTransaction(PaymentTransactionModel model) { if (model.Amount != model.PaymentTransactionItems.Sum(f => f.Amount)) { return(this.BadRequestEx(Error.PaymentTransactionInvalidAmount)); } using (var dbContext = new DataContext()) { var paymentTerminal = dbContext.PaymentTerminals.FirstOrDefault(f => f.TerminalType == (Data.Enums.TerminalType)model.TerminalType && f.UUID == model.TerminalUUID); if (paymentTerminal == null) { return(this.BadRequestEx(Error.PaymentTerminalDoesNotExist)); } if (paymentTerminal.Status != Data.Enums.Status.Active) { return(this.BadRequestEx(Error.PaymentTerminalIsNotActive)); } if (dbContext.PaymentTransactions.Any(f => f.Receipt == model.Receipt)) { return(this.BadRequestEx(Error.PaymentTransactionAlreadyExist)); } foreach (var modelItem in model.PaymentTransactionItems) { var register = dbContext.Registers.AsNoTracking().FirstOrDefault(f => f.ReferenceNumber == modelItem.ReferenceNumber); if (register == null) { return(this.BadRequestEx(Error.RegisterItemDoesNotExist)); } if (register.RegisterStatus >= 3000) { return(this.BadRequestEx(Error.RegisterItemNotPayable)); } if (string.IsNullOrWhiteSpace(modelItem.TransactionToken)) { var generatedReferenceNumber = dbContext.GeneratedReferenceNumbers.FirstOrDefault(f => f.ReferenceNumber == modelItem.ReferenceNumber); if (generatedReferenceNumber != null) { modelItem.TransactionToken = generatedReferenceNumber.ExternalToken; } } } PaymentTransaction paymentTransaction = null; if (model.PaymentTransactionItems.Count == 1) { var transactionToken = model.PaymentTransactionItems.First().TransactionToken; paymentTransaction = dbContext.PaymentTransactions.FirstOrDefault(f => f.TransactionToken == transactionToken && f.Status == Data.Enums.PaymentTransactionStatus.Added); paymentTransaction.Receipt = model.Receipt; paymentTransaction.ReceiptTimestamp = model.ReceiptTimestamp; paymentTransaction.CourtID = model.CourtID; paymentTransaction.TerminalID = paymentTerminal.ID; paymentTransaction.CustomerContactNumber = model.CustomerContactNumber; paymentTransaction.CustomerFirstName = model.CustomerFirstName; paymentTransaction.CustomerIDNumber = model.CustomerIDNumber; paymentTransaction.CustomerLastName = model.CustomerLastName; paymentTransaction.PaymentMethod = (Data.Enums.PaymentMethod)model.PaymentSource; } else { paymentTransaction = new PaymentTransaction(); paymentTransaction.Receipt = model.Receipt; paymentTransaction.ReceiptTimestamp = model.ReceiptTimestamp; paymentTransaction.CourtID = model.CourtID; paymentTransaction.TerminalID = paymentTerminal.ID; paymentTransaction.Amount = model.Amount; paymentTransaction.CreatedTimestamp = DateTime.Now; paymentTransaction.CustomerContactNumber = model.CustomerContactNumber; paymentTransaction.CustomerFirstName = model.CustomerFirstName; paymentTransaction.CustomerIDNumber = model.CustomerIDNumber; paymentTransaction.CustomerLastName = model.CustomerLastName; paymentTransaction.PaymentMethod = (Data.Enums.PaymentMethod)model.PaymentSource; paymentTransaction.Status = Data.Enums.PaymentTransactionStatus.Added; foreach (var modelItem in model.PaymentTransactionItems) { var paymentTransactionItem = new PaymentTransactionItem(); paymentTransactionItem.PaymentTransaction = paymentTransaction; paymentTransactionItem.ReferenceNumber = modelItem.ReferenceNumber; paymentTransactionItem.TransactionToken = modelItem.TransactionToken; paymentTransactionItem.EntityReferenceTypeID = long.Parse(modelItem.ReferenceNumber[1].ToString()); paymentTransactionItem.Description = modelItem.Description; paymentTransactionItem.Amount = modelItem.Amount; paymentTransactionItem.Status = Data.Enums.PaymentTransactionStatus.Added; dbContext.PaymentTransactionItems.Add(paymentTransactionItem); } if (model.PaymentSource == PaymentMethod.DumaPay) { var paymentProvider = resolvePaymentProvider(); var transactionIDModel = paymentProvider.RegisterTransaction( new ThirdParty.Payment.Models.TransactionModel { CustomerFirstName = paymentTransaction.CustomerFirstName, CustomerLastName = paymentTransaction.CustomerLastName, CompanyRef = string.Empty, CompanyAccRef = paymentTransaction.Receipt, Amount = paymentTransaction.Amount, UserID = SessionModel.UserName, ServiceDescription = "Payment Basket Registered", ServiceType = 6067 }); paymentTransaction.TransactionToken = transactionIDModel.TransactionToken; paymentTransaction.TransactionReference = transactionIDModel.TransactionReference; } else // Cash { paymentTransaction.TransactionToken = Guid.NewGuid().ToString(); paymentTransaction.TransactionReference = string.Empty; } dbContext.PaymentTransactions.Add(paymentTransaction); } dbContext.SaveChanges(); PaymentTransactionHub.SendStatusChanged( paymentTransaction.TransactionToken, (PaymentTransactionStatus)paymentTransaction.Status, paymentTransaction.Amount); return(Ok(paymentTransaction.TransactionToken)); } }