Ejemplo n.º 1
0
        public ActionResult Index()
        {
            try
            {
                Request.InputStream.Position = 0;

                var receivedModel = (PushReceivedModel.API3G)PushReceivedXmlSerializer.Deserialize(Request.InputStream);

                var confirmedPayment = new ConfirmedPaymentModel();
                confirmedPayment.TransactionToken = receivedModel.TransactionToken;
                confirmedPayment.TerminalType     = TerminalType.ExternalServer;
                confirmedPayment.TerminalUUID     = "DPO";
                confirmedPayment.Receipt          = receivedModel.TransactionApproval;
                confirmedPayment.Amount           = receivedModel.TransactionAmount;
                //transactionModel.CreatedTimestamp = DateTime.ParseExact(receivedModel.TransactionSettlementDate, "yyyy/MM/dd", CultureInfo.InvariantCulture);
                confirmedPayment.CustomerContactNumber = receivedModel.CustomerPhone;
                confirmedPayment.CustomerFirstName     = receivedModel.CustomerName;

                var paymentService = new PaymentService(CoreGatewaySession.SessionToken);
                paymentService.SettlePayment(confirmedPayment);

                return(Content("<?xml version=\"1.0\" encoding=\"utf-8\"?><API3G><Response>OK</Response></API3G>"));
            }
            catch (Exception ex)
            {
                Request.InputStream.Position = 0;

                var reader  = new StreamReader(Request.InputStream);
                var payload = reader.ReadToEnd();

                Log.Error(string.Format("Unxepected error when receiving: {0}", payload), ex);
                return(Content("<?xml version=\"1.0\" encoding=\"utf-8\"?><API3G><Response>Failed</Response></API3G>"));
            }
        }
Ejemplo n.º 2
0
        public void SettlePayment(ConfirmedPaymentModel model)
        {
            var request = new RestRequest("/api/Payment/Transaction", Method.PUT);

            request.RequestFormat  = DataFormat.Json;
            request.JsonSerializer = new RestSharpJsonNetSerializer();
            request.AddBody(model);

            var response = RestClient.Execute(request);

            if (response.StatusCode != HttpStatusCode.OK)
            {
                throw CreateException(response);
            }
        }
Ejemplo n.º 3
0
        private void ProcessUnallocated(DataContext dbContext, ConfirmedPaymentModel confirmedPaymentModel)
        {
            var rollingRegister = new RollingRegister();

            rollingRegister.Amount                = confirmedPaymentModel.Amount;
            rollingRegister.CredentialID          = SessionModel.CredentialID;
            rollingRegister.DateOpened            = DateTime.Now;
            rollingRegister.PaymentMethod         = (Data.Enums.PaymentMethod)confirmedPaymentModel.PaymentSource;
            rollingRegister.PaymentTransactionID  = null;
            rollingRegister.Reference             = string.Format("Token: {0}, Transaction Approval: {1}", confirmedPaymentModel.TransactionToken, confirmedPaymentModel.Receipt);
            rollingRegister.RollingRegisterStatus = Data.Enums.RollingRegisterStatus.Open;
            rollingRegister.RollingRegisterType   = Data.Enums.RollingRegisterType.Unallocated;

            dbContext.RollingRegisters.Add(rollingRegister);
            dbContext.SaveChanges();
        }
Ejemplo n.º 4
0
        public ActionResult CourtPayment(PaymentSummary model)
        {
            ViewBag.Districts = AuthenticatedUser.UserData.Districts;

            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            var paymentDate = DateTime.Now;

            if (!DateTime.TryParseExact(model.PaymentDate, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out paymentDate))
            {
                ModelState.AddModelError("PaymentDate", "Invalid Payment Date.");

                return(View(model));
            }

            try
            {
                PaymentSummary cachedModel = Session["PaymentSummary"] as PaymentSummary;
                model.Fines = cachedModel.Fines;

                var paymentTransaction = new PaymentTransactionModel();
                paymentTransaction.CredentialID          = AuthenticatedUser.SessionData.CredentialID;
                paymentTransaction.CustomerContactNumber = model.MobileNumber;
                paymentTransaction.CustomerIDNumber      = string.Empty;
                paymentTransaction.CustomerFirstName     = model.FirstName;
                paymentTransaction.CustomerLastName      = model.LastName;
                paymentTransaction.PaymentSource         = model.PaymentMethod;
                paymentTransaction.Receipt                 = model.PaymentReference;
                paymentTransaction.ReceiptTimestamp        = paymentDate;
                paymentTransaction.CourtID                 = model.CourtID;
                paymentTransaction.TerminalType            = Core.Gateway.Models.Enums.TerminalType.InternalServer;
                paymentTransaction.TerminalUUID            = "IMS";
                paymentTransaction.Amount                  = model.Fines.Sum(f => f.OutstandingAmount).Value;
                paymentTransaction.PaymentTransactionItems =
                    model.Fines.Select(f =>
                                       new PaymentTransactionItemModel
                {
                    ReferenceNumber       = f.ReferenceNumber,
                    Amount                = f.OutstandingAmount.Value,
                    TransactionToken      = string.Empty,
                    EntityReferenceTypeID = long.Parse(f.ReferenceNumber[1].ToString()),
                    Description           = "Notice issued."
                })
                    .ToList();

                var paymentService   = new PaymentService(AuthenticatedUser.SessionToken);
                var transactionToken = paymentService.RegisterPayment(paymentTransaction);

                var confirmedPayment = new ConfirmedPaymentModel();
                confirmedPayment.CustomerContactNumber = model.MobileNumber;
                confirmedPayment.CustomerIDNumber      = string.Empty;
                confirmedPayment.CustomerFirstName     = model.FirstName;
                confirmedPayment.CustomerLastName      = model.LastName;
                confirmedPayment.PaymentSource         = model.PaymentMethod;
                confirmedPayment.Receipt          = model.PaymentReference;
                confirmedPayment.TerminalType     = Core.Gateway.Models.Enums.TerminalType.InternalServer;
                confirmedPayment.TerminalUUID     = "IMS";
                confirmedPayment.Amount           = paymentTransaction.Amount;
                confirmedPayment.TransactionToken = transactionToken;

                paymentService.SettlePayment(confirmedPayment);

                Session.Remove("PaymentSummary");

                return(RedirectToAction("Index"));
            }
            catch (GatewayException ex)
            {
                ModelState.AddModelError(string.Empty, ex.Message);

                return(View(model));
            }
        }
Ejemplo n.º 5
0
        private void ProcessUnderpayment(DataContext dbContext, PaymentTransaction paymentTransaction, ConfirmedPaymentModel confirmedPaymentModel)
        {
            var paymentProvider = resolvePaymentProvider();

            var rollingRegister = new RollingRegister();

            rollingRegister.Amount                = confirmedPaymentModel.Amount;
            rollingRegister.CredentialID          = SessionModel.CredentialID;
            rollingRegister.DateOpened            = DateTime.Now;
            rollingRegister.PaymentMethod         = (Data.Enums.PaymentMethod)confirmedPaymentModel.PaymentSource;
            rollingRegister.PaymentTransactionID  = paymentTransaction.ID;
            rollingRegister.Reference             = string.Format("Token: {0}, Transaction Approval: {1}", confirmedPaymentModel.TransactionToken, confirmedPaymentModel.Receipt);
            rollingRegister.RollingRegisterStatus = Data.Enums.RollingRegisterStatus.Open;
            rollingRegister.RollingRegisterType   = Data.Enums.RollingRegisterType.UnderPayment;

            dbContext.RollingRegisters.Add(rollingRegister);

            paymentTransaction.CredentialID      = SessionModel.CredentialID;
            paymentTransaction.ModifiedTimestamp = DateTime.Now;
            paymentTransaction.Status            = Data.Enums.PaymentTransactionStatus.RollingRegister;

            foreach (var paymentTransactionItem in paymentTransaction.TransactionItems)
            {
                paymentTransactionItem.Status = Data.Enums.PaymentTransactionStatus.RollingRegister;

                try
                {
                    paymentProvider.CancelTransaction(paymentTransactionItem.TransactionToken);
                }
                catch
                {
                    // Empty on purpose
                }
            }

            dbContext.SaveChanges();
        }
Ejemplo n.º 6
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());
        }