コード例 #1
0
        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());
            }
        }
コード例 #2
0
        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());
        }
コード例 #3
0
        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));
            }
        }