Exemplo n.º 1
0
        public ActionResult PayPointCallback(bool valid, string trans_id, string code, string auth_code, decimal?amount, string ip, string test_status, string hash, string message, string card_no, string customer, string expiry, int customerId)
        {
            var cus = this.customersRepository.GetChecked(customerId);

            if (test_status == "true")
            {
                // Use last 4 random digits as card number (to enable useful tests)
                string random4Digits = string.Format("{0}{1}", DateTime.UtcNow.Second, DateTime.UtcNow.Millisecond);
                if (random4Digits.Length > 4)
                {
                    random4Digits = random4Digits.Substring(random4Digits.Length - 4);
                }
                card_no = random4Digits;
                expiry  = string.Format("{0}{1}", "01", DateTime.Now.AddYears(2).Year.ToString().Substring(2, 2));
            }
            if (!valid || code != "A")
            {
                TempData["code"]    = code;
                TempData["message"] = message;
                return(View("Error"));
            }

            PayPointFacade payPointFacade = new PayPointFacade(cus.MinOpenLoanDate(), cus.CustomerOrigin.Name);

            if (!payPointFacade.CheckHash(hash, Request.Url))
            {
                throw new Exception("check hash failed");
            }

            bool paymentAdded = AddPayPointCardToCustomer(trans_id, card_no, cus, expiry, amount, payPointFacade.PayPointAccount);

            return(View("PayPointAdded", new PaypointAddedModel {
                Amount = amount ?? 0, PaymentAdded = paymentAdded
            }));
        }
Exemplo n.º 2
0
        public RedirectToRouteResult PayPointCallback(bool valid, string trans_id, string code, string auth_code, decimal?amount, string ip, string test_status, string hash, string message, decimal loan_amount, string card_no, string customer, string expiry)
        {
            //Session.Lock(_context.Customer, LockMode.Upgrade);

            if (test_status == "true")
            {
                // Use last 4 random digits as card number (to enable useful tests)
                string random4Digits = string.Format("{0}{1}", DateTime.UtcNow.Second, DateTime.UtcNow.Millisecond);
                if (random4Digits.Length > 4)
                {
                    random4Digits = random4Digits.Substring(random4Digits.Length - 4);
                }
                card_no = random4Digits;
                expiry  = string.Format("{0}{1}", "01", DateTime.Now.AddYears(2).Year.ToString().Substring(2, 2));
            }

            DateTime now = DateTime.UtcNow;
            Customer cus = this.context.Customer;

            try {
                if (!valid || code != "A")
                {
                    if (code == "N")
                    {
                        log.WarnFormat("Invalid transaction. Id = {0}, Code: {1}, Message: {2}", trans_id, code, message);
                    }
                    else
                    {
                        log.ErrorFormat("Invalid transaction. Id = {0}, Code: {1}, Message: {2}", trans_id, code, message);
                    }

                    // continue to log paypoint and pacnet transactions also for NL, i.e. do nothig new
                    this.logRepository.Log(this.context.UserId, DateTime.Now, "Paypoint GetCash Callback", "Falied",
                                           String.Format("Invalid transaction. Id = {0}, Code: {1}, Message: {2}", trans_id,
                                                         code, message));

                    this.context.Customer.PayPointErrorsCount++;

                    try {
                        // sending mail "Mandrill - Debit card authorization problem"
                        this.serviceClient.Instance.GetCashFailed(this.context.User.Id);
                    }
                    catch (Exception e) {
                        log.Error("Failed to send 'get cash failed' email.", e);
                    } // try

                    TempData["code"]    = code;
                    TempData["message"] = message;

                    return(RedirectToAction("Error", "Paypoint", new { Area = "Customer" }));
                }

                PayPointFacade payPointFacade = new PayPointFacade(cus.MinOpenLoanDate(), cus.CustomerOrigin.Name);
                if (!payPointFacade.CheckHash(hash, Request.Url))
                {
                    log.ErrorFormat("Paypoint callback is not authenticated for user {0}", this.context.Customer.Id);
                    // continue to log paypoint transaction also for NL
                    this.logRepository.Log(this.context.UserId, DateTime.Now, "Paypoint GetCash Callback", "Falied",
                                           String.Format("Paypoint callback is not authenticated for user {0}",
                                                         this.context.Customer.Id));
                    //return View("Error");
                    throw new Exception("check hash failed");
                }

                ValidateCustomerName(customer, cus);

                // "x rebate" pounds charged successfully, continue to save PayPointCard, create new loan, and make "rebate" payment

                // continue to log paypoint transaction also for NL
                this.logRepository.Log(this.context.UserId, DateTime.Now, "Paypoint GetCash Callback", "Successful", "");

                // save new PayPointCard
                var card = cus.TryAddPayPointCard(trans_id, card_no, expiry, customer, payPointFacade.PayPointAccount);

                Loan loan = this.loanCreator.CreateLoan(cus, loan_amount, card, now);

                RebatePayment(amount, loan, trans_id, now);

                cus.PayPointErrorsCount = 0;

                TempData["amount"]     = loan_amount;
                TempData["bankNumber"] = cus.BankAccount.AccountNumber;
                TempData["card_no"]    = card_no;

                this.customerRepository.Update(cus);

                // el: TODO save NL_Payments -> NL_PaypointTransactions for this PayPointCard; "AssignPaymentToLoan" strategy;

                /*
                 * 1. save NL_Payments with PaymentStatusID (NL_PaymentStatuses ("rebate"? / "system-repay" ?)), PaymentMethodID ([LoanTransactionMethod] 'Auto' ID 2)
                 *
                 * 2. save NL_PaypointTransactions with:
                 * PaypointCardID - from just created PayPointCard.Id,
                 * PaypointTransactionStatusID =1 (Done) NL_PaypointTransactionStatuses
                 * IP - from LoanTransaction IP
                 * Amount - from the method argument amount if not null, otherwise 5 pounds
                 * PaymentID - from 1.
                 *
                 * 3. new strategy AssignPaymentToLoan: argument: NL_Model with Loan.LoanID; decimal amount; output: NL_Model containing list of fees/schedules that covered by the amount/payment
                 * closest unpaid loan fees and schedules (1.fee if exists; 2.interest; 3.principal)
                 *
                 * 4. save into NL_LoanSchedulePayments : PaymentID just created + NL_LoanSchedules from AssignPaymentToLoan strategy
                 */

                return(RedirectToAction("Index", "PacnetStatus", new { Area = "Customer" }));
            }
            catch (OfferExpiredException) {
                this.logRepository.Log(this.context.UserId, DateTime.Now, "Paypoint GetCash Callback", "Falied",
                                       "Invalid apply for a loan period");
                return(RedirectToAction("ErrorOfferDate", "Paypoint", new { Area = "Customer" }));
            }
            catch (PacnetException) {
                try {
                    this.serviceClient.Instance.TransferCashFailed(this.context.User.Id);
                }
                catch (Exception e) {
                    log.Error("Failed to send 'transfer cash failed' email.", e);
                } // try
                return(RedirectToAction("Error", "Pacnet", new { Area = "Customer" }));
            }
            catch (TargetInvocationException) {
                return(RedirectToAction("ErrorOfferDate", "Paypoint", new { Area = "Customer" }));
            }
        }
Exemplo n.º 3
0
        public ActionResult Callback(
            bool valid,
            string trans_id,
            string code,
            string auth_code,
            decimal?amount,
            string ip,
            string test_status,
            string hash,
            string message,
            string type,
            int loanId,
            string card_no,
            string customer,
            string expiry
            )
        {
            if (test_status == "true")
            {
                // Use last 4 random digits as card number (to enable useful tests)
                string random4Digits = string.Format("{0}{1}", DateTime.UtcNow.Second, DateTime.UtcNow.Millisecond);

                if (random4Digits.Length > 4)
                {
                    random4Digits = random4Digits.Substring(random4Digits.Length - 4);
                }

                card_no = random4Digits;

                expiry = string.Format(
                    "{0}{1}",
                    "01",
                    DateTime.UtcNow.AddYears(2).Year.ToString().Substring(2, 2)
                    );
            }             // if

            var customerContext = this.context.Customer;

            PayPointFacade payPointFacade = new PayPointFacade(
                customerContext.MinOpenLoanDate(),
                customerContext.CustomerOrigin.Name
                );

            if (!payPointFacade.CheckHash(hash, Request.Url))
            {
                log.Alert("Paypoint callback is not authenticated for user {0}", customerContext.Id);

                this.logRepository.Log(
                    this.context.UserId,
                    DateTime.UtcNow,
                    "Paypoint Pay Redirect to ",
                    "Failed",
                    String.Format("Paypoint callback is not authenticated for user {0}", customerContext.Id)
                    );

                return(View("Error"));
            }             // if

            var statusDescription = PayPointStatusTranslator.TranslateStatusCode(code);

            if (!valid || code != "A")
            {
                if (code == "N")
                {
                    log.Warn(
                        "Paypoint result code is : {0} ({1}). Message: {2}",
                        code,
                        string.Join(", ", statusDescription.ToArray()),
                        message
                        );
                }
                else
                {
                    log.Alert(
                        "Paypoint result code is : {0} ({1}). Message: {2}",
                        code,
                        string.Join(", ", statusDescription.ToArray()),
                        message
                        );
                }                 // if

                this.logRepository.Log(
                    this.context.UserId,
                    DateTime.UtcNow,
                    "Paypoint Pay Redirect to ",
                    "Failed",
                    string.Format(
                        "Paypoint result code is : {0} ({1}). Message: {2}",
                        code,
                        string.Join(", ", statusDescription.ToArray()),
                        message
                        )
                    );

                return(View("Error"));
            }             // if

            if (!amount.HasValue)
            {
                log.Alert("Paypoint amount is null. Message: {0}", message);

                this.logRepository.Log(
                    this.context.UserId,
                    DateTime.UtcNow,
                    "Paypoint Pay Redirect to ",
                    "Failed",
                    String.Format("Paypoint amount is null. Message: {0}", message)
                    );

                return(View("Error"));
            }             // if

            // If there is transaction with such id in database,
            // it means that customer refreshes page
            // show in this case cashed result
            if (this.paypointTransactionRepository.ByGuid(trans_id).Any())
            {
                var data = TempData.Get <PaymentConfirmationModel>();

                if (data == null)
                {
                    return(RedirectToAction("Index", "Profile", new { Area = "Customer" }));
                }

                return(View(TempData.Get <PaymentConfirmationModel>()));
            }             // if

            NL_Payments nlPayment = new NL_Payments()
            {
                CreatedByUserID   = this.context.UserId,
                Amount            = amount.Value,
                PaymentMethodID   = (int)NLLoanTransactionMethods.CustomerAuto,
                PaymentSystemType = NLPaymentSystemTypes.Paypoint
            };

            log.Debug("Callback: Sending nlPayment: {0} for customer {1}, oldloanId {2}", nlPayment, this.context.UserId, loanId);

            LoanPaymentFacade loanRepaymentFacade = new LoanPaymentFacade();
            PaymentResult     res = loanRepaymentFacade.MakePayment(trans_id, amount.Value, ip, type, loanId, customerContext, null, "payment from customer", null, null, nlPayment);

            SendEmails(loanId, amount.Value, customerContext);

            this.logRepository.Log(this.context.UserId, DateTime.UtcNow, "Paypoint Pay Callback", "Successful", "");

            var refNumber = "";

            bool isEarly = false;

            if (loanId > 0)
            {
                var loan = customerContext.GetLoan(loanId);

                if (loan != null)
                {
                    refNumber = loan.RefNumber;

                    if (loan.Schedule != null)
                    {
                        List <LoanScheduleItem> scheduledPayments = loan.Schedule
                                                                    .Where(
                            x => x.Status == LoanScheduleStatus.StillToPay ||
                            x.Status == LoanScheduleStatus.Late ||
                            x.Status == LoanScheduleStatus.AlmostPaid
                            ).ToList();

                        if (scheduledPayments.Any())
                        {
                            DateTime earliestSchedule = scheduledPayments.Min(x => x.Date);

                            bool scheduleIsEarly = earliestSchedule.Date >= DateTime.UtcNow && (
                                earliestSchedule.Date.Year != DateTime.UtcNow.Year ||
                                earliestSchedule.Date.Month != DateTime.UtcNow.Month ||
                                earliestSchedule.Date.Day != DateTime.UtcNow.Day
                                );

                            if (scheduleIsEarly)
                            {
                                isEarly = true;
                            }
                        } // if
                    }     // if has schedule
                }         // if loan
            }             // if loan id

            if (string.IsNullOrEmpty(customer))
            {
                customer = customerContext.PersonalInfo.Fullname;
            }

            customerContext.TryAddPayPointCard(trans_id, card_no, expiry, customer, payPointFacade.PayPointAccount);

            var confirmation = new PaymentConfirmationModel {
                amount         = amount.Value.ToString(CultureInfo.InvariantCulture),
                saved          = res.Saved,
                savedPounds    = res.SavedPounds,
                card_no        = card_no,
                email          = customerContext.Name,
                surname        = customerContext.PersonalInfo.Surname,
                name           = customerContext.PersonalInfo.FirstName,
                refnum         = refNumber,
                transRefnums   = res.TransactionRefNumbersFormatted,
                hasLateLoans   = customerContext.HasLateLoans,
                isRolloverPaid = res.RolloverWasPaid,
                IsEarly        = isEarly
            };

            TempData.Put(confirmation);
            return(View(confirmation));
        }         // Callback
Exemplo n.º 4
0
        public ActionResult PayPointCallback(
            bool valid,
            string trans_id,
            string code,
            string auth_code,
            decimal?amount,
            string ip,
            string test_status,
            string hash,
            string message,
            string card_no,
            string customer,
            string expiry,
            int customerId
            )
        {
            ms_oLog.Debug(
                "PayPointCallback with args:" +
                "\n\tvalid: '{0}'" +
                "\n\ttrans_id: '{1}'" +
                "\n\tcode: '{2}'" +
                "\n\tauth_code: '{3}'" +
                "\n\tamount: '{4}'" +
                "\n\tip: '{5}'" +
                "\n\ttest_status: '{6}'" +
                "\n\thash: '{7}'" +
                "\n\tmessage: '{8}'" +
                "\n\tcard_no: '{9}'" +
                "\n\tcustomer: '{10}'" +
                "\n\texpiry: '{11}'" +
                "\n\tcustomer id: '{12}'",
                valid,
                trans_id,
                code,
                auth_code,
                amount,
                ip,
                test_status,
                hash,
                message,
                card_no,
                customer,
                expiry,
                customerId
                );

            if (test_status == "true")
            {
                // Use last 4 random digits as card number (to enable useful tests)
                string random4Digits = string.Format("{0}{1}", DateTime.UtcNow.Second, DateTime.UtcNow.Millisecond);

                if (random4Digits.Length > 4)
                {
                    random4Digits = random4Digits.Substring(random4Digits.Length - 4);
                }

                card_no = random4Digits;
                expiry  = string.Format("{0}{1}", "01", DateTime.Now.AddYears(2).Year.ToString().Substring(2, 2));
            }             // if

            if (!valid || code != "A")
            {
                ms_oLog.Debug("Failed to add debit card: invalid or code ain't no 'A'.");

                TempData["code"]    = code;
                TempData["message"] = message;
                return(View(new { error = "Failed to add debit card" }));
            }             // if

            var cust = m_oContext.Customer;

            PayPointFacade payPointFacade = new PayPointFacade(cust.MinOpenLoanDate(), cust.CustomerOrigin.Name);

            if (!payPointFacade.CheckHash(hash, Request.Url))
            {
                ms_oLog.Debug("Failed to add debit card: failed to CheckHash(\n\t hash: '{0}',\n\t Url: '{1}'\n).", hash, Request.Url);

                return(View(new { error = "Failed to add debit card" }));
            }             // if

            cust.TryAddPayPointCard(
                trans_id,
                card_no,
                expiry,
                cust.PersonalInfo.Fullname,
                payPointFacade.PayPointAccount
                );

            bool hasOpenLoans = cust.Loans.Any(x => x.Status != LoanStatus.PaidOff);

            if (amount > 0 && hasOpenLoans)
            {
                Loan loan = cust.Loans.First(x => x.Status != LoanStatus.PaidOff);

                NL_Payments nlPayment = new NL_Payments()
                {
                    Amount          = amount.Value,
                    CreatedByUserID = this.m_oContext.UserId,
                    //	LoanID = nlLoanId,
                    //PaymentStatusID = (int)NLPaymentStatuses.Active,
                    PaymentSystemType = NLPaymentSystemTypes.Paypoint,
                    PaymentMethodID   = (int)NLLoanTransactionMethods.SystemRepay,
                    PaymentTime       = DateTime.UtcNow,
                    Notes             = "add payPoint card",
                    CreationTime      = DateTime.UtcNow
                };

                var f = new LoanPaymentFacade();
                f.PayLoan(loan, trans_id, amount.Value, Request.UserHostAddress, DateTime.UtcNow, "system-repay", false, null, nlPayment);
            }

            if (amount > 0 && !hasOpenLoans)
            {
                this.m_oServiceClient.Instance.PayPointAddedWithoutOpenLoan(cust.Id, cust.Id, amount.Value, trans_id);
            }
            return(View(new { success = true }));
        }         // PayPointCallback