//[RequiredLogin]
        public async Task<JsonResult> UpointTelkomselVoucher(UPointTelkomselVoucherViewModel model)
        {
            var api = GoPlayApi.Instance;
            if (!ModelState.IsValid)
            {
                return Json(new { errors = Errors(ModelState) });
            }

            var result = api.UpointAPI(new APIUpointParamModel()
            {
                enumAction = EUpointAction.GetTicketTelkomsel,
            }).Result;
            if (!result.HasData || result.Data.code != "201")
                return FailResult("hrn", !result.HasData ? ErrorCodes.ServerError.ToErrorMessage() : result.Data.info);

            model.hrn = model.hrn.Replace(" ", "");
            var transaction = GenerateCoinTransaction();
            var transactionUUID = Guid.Parse(transaction.order_id);
            transaction.telkom_order_id = result.Data.ticket;
            transaction.payment_method = Helper.GetDescription(PaymentMethod.UPoint_TelkomselVoucher);
            transaction.description = "HRN: " + model.hrn;
            transaction.status = Helper.GetDescription(TransactionStatus.Telkomsel_voucher_pending);
            transaction = api.CreateCoinTransaction(transaction).Data;
            if (transaction == null)
                return FailResult("hrn", ErrorCodes.ServerError.ToErrorMessage());
            string err = null;
            var upointParam = new APIUpointParamModel(transaction, "GToken")
                {
                    enumAction = EUpointAction.TelkomselVoucher,
                    amount = -1,
                    hrn = model.hrn,
                    ticket = result.Data.ticket
                };
            for (int i = 0; i < 5; i++)
            {
                result = api.UpointAPI(upointParam).Result;
                if (!result.HasData)
                {
                    err = ErrorCodes.ServerError.ToErrorCode();
                    break;
                }
                if (result.Data.code == "200")
                {
                    err = null;
                    break;
                }
                err = result.Data.info;
                Thread.Sleep(5000);//5s
                //# For result code of 100 - Voucher burning is still on progress
                //# Retry 5 times max
            }
            if (err != null)
            {
                UpdateTransactionFail(transaction, err);
                return FailResult("hrn", err);
            }
            if (result.Data.trx_id != transactionUUID.ToString("N"))
            {
                var errorMessage = "UPoint incorrect transaction order id: " + result.Data.trx_id;
                UpdateTransactionFail(transaction, errorMessage);

                return FailResult("hrn", errorMessage);
            }
            var voucherValue = result.Data.nominal.HasValue ? result.Data.nominal.Value : 0;
            var gtokenPackage = api.GetGTokenPackage(voucherValue, "IDR").Data;
            if (gtokenPackage == null)
            {
                var errorMessage = "UPoint incorrect transaction amount: " + voucherValue;
                UpdateTransactionFail(transaction, errorMessage);

                return FailResult("hrn", errorMessage);
            }
            var user = api.GetUserById(transaction.customer_account_id).Data;// require login first, user cannot null
            bool debug = false;
            bool.TryParse(ConfigurationManager.AppSettings["UPOINT_DEBUG"], out debug);
            decimal? totalAmount = 0;
            decimal? gtokenAmount = 0;
            if (!debug)
            {
                gtokenAmount = gtokenPackage.GetPlayToken(user);
                totalAmount = gtokenPackage.price;
            }
            transaction.gtoken_package_id = gtokenPackage.id;
            transaction.description += "; GToken Package: " + gtokenPackage.name;
            if (user.HasDiscount())
            {
                transaction.description += "; Extra 10% on GoPlay Token amount.";
                user.is_discount_permanent = true;
                api.UpdateCustomerAccount(user.id, true);
                if (transaction.amount.HasValue)
                    transaction.amount = transaction.amount.Value / decimal.Parse("1.1");
            }
            //# Add view invoice permission for user
            //identity = Identity(transaction.customerAccount.id)
            //identity.provides.add(ItemNeed('action', 'view_invoice', transaction.order_id))

            transaction.status = Helper.GetDescription(TransactionStatus.Success);
            api.UpdateCoinTransaction(transaction.id, transaction.status, transaction.description, transaction.telkom_order_id);
            var invoiceTemplate = new InvoiceViewModel()
            {
                transaction = transaction,
                payer = user,
                package = gtokenPackage,
                topupCard = transaction.topup_card_id.HasValue ? api.GetTopUpCard(transaction.topup_card_id.Value).Data : null
            };
            if (!(await EmailHelper.SendMailInvoice(invoiceTemplate)))
            {
                var errorMessage = "This guy purchased GToken with an improper email " + user.id + " " + user.email;
                return FailResult("hrn", errorMessage);
            }
            return Json(new { correct = true });
        }
        //[RequiredLogin]
        public async Task<JsonResult> UpointSpeedy(UPointSpeedyViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return Json(new { errors = Errors(ModelState) });
            }
            var api = GoPlayApi.Instance;
            var gtokenPackage = GoPlayApi.Instance.GetGTokenPackage(model.GtokenPackageSKU).Data;
            if (gtokenPackage == null)
                return FailResult("GtokenPackageSKU", ErrorCodes.INVALID_PACKAGE_ID.ToErrorMessage());
            var transaction = GenerateCoinTransaction(gtokenPackage);
            bool debug = false;
            bool.TryParse(ConfigurationManager.AppSettings["UPOINT_DEBUG"], out debug);
            if (debug)//# Speedy API doesn't accept amount of 0...
            {
                transaction.amount = decimal.Parse("0.04");
                transaction.price = decimal.Parse("0.04");
            }
            transaction.payment_method = Helper.GetDescription(PaymentMethod.UPoint_Speedy);
            transaction.status = Helper.GetDescription(TransactionStatus.Speedy_pending);
            transaction = api.CreateCoinTransaction(transaction).Data;
            if (transaction == null)
                return FailResult("GtokenPackageSKU", ErrorCodes.ServerError.ToErrorMessage());
            var result = api.UpointAPI(new APIUpointParamModel(transaction)
               {
                   enumAction = EUpointAction.Speedy,
                   phone_number = model.phoneNumber,
                   speedy_number = model.speedyNumber,
                   ip = Request.UserHostAddress
               }).Result;
            if (!result.HasData)
            {
                return FailResult("GtokenPackageSKU", ErrorCodes.ServerError.ToErrorMessage());
            }
            if (!result.Data.result)
            {
                UpdateTransactionFail(transaction, result.Data.error_info);
                return FailResult("phoneNumber", result.Data.error_info);
            }
            var transactionUUID = Guid.Parse(transaction.order_id);
            if (result.Data.trx_id != transactionUUID.ToString("N"))
            {
                var errorMessage = "UPoint incorrect transaction order id: " + result.Data.trx_id;
                UpdateTransactionFail(transaction, errorMessage);
                return FailResult("phoneNumber", errorMessage);
            }
            decimal GtokenRate = 0;
            decimal.TryParse(ConfigurationManager.AppSettings["IDR_PER_GTOKEN_RATE"], out GtokenRate);
            if (result.Data.amount / GtokenRate != transaction.amount)
            {
                var errorMessage = "UPoint incorrect transaction amount " + result.Data.amount;
                UpdateTransactionFail(transaction, errorMessage);
                return FailResult("phoneNumber", errorMessage);
            }
            //TODO
            // # Add view invoice permission for user
            //identity = Identity(transaction.customerAccount.id)
            //identity.provides.add(ItemNeed('action', 'view_invoice', transaction.order_id))
            transaction.telkom_order_id = result.Data.t_id;
            transaction.status = Helper.GetDescription(TransactionStatus.Success);
            api.UpdateCoinTransaction(transaction.id, transaction.status, transaction.description, transaction.telkom_order_id);

            var invoiceTemplate = new InvoiceViewModel()
            {
                transaction = transaction,
                payer = api.GetUserById(transaction.customer_account_id).Data,
                package = gtokenPackage,
                topupCard = transaction.topup_card_id.HasValue ? api.GetTopUpCard(transaction.topup_card_id.Value).Data : null
            };
            if (!(await EmailHelper.SendMailInvoice(invoiceTemplate)))
            {
                string customer_account_id = string.Empty;
                string email = string.Empty;
                if (invoiceTemplate.payer != null)
                {
                    customer_account_id = invoiceTemplate.payer.id.ToString();
                    email = invoiceTemplate.payer.email;
                }
                var errorMessage = "This guy purchased GToken with an improper email " + customer_account_id + " " + email;
                return FailResult("phoneNumber", errorMessage);
            }
            return Json(new { success = true, redirect = "transaction/invoice", order_id = transaction.order_id });
        }
        //[RequiredLogin]
        public async Task<JsonResult> UpointCallback(APIUpointModel model)
        {
            var api = GoPlayApi.Instance;
            Guid order_id = default(Guid);
            Guid.TryParse(model.trx_id, out order_id);//hex to guid
            coin_transaction transaction = api.GetCoinTransactionByOderId(order_id.ToString()).Data;
            if (transaction == null)
            {
                var err = "UPoint incorrect transaction order id: " + model.trx_id;
                return FailResult("errors", err);
            }
            var user = api.GetUserById(transaction.customer_account_id).Data;
            if (!model.result)
            {
                UpdateTransactionFail(transaction, model.error_info);
                string errorMessage = model.error_info;
                if (user == null || !(await EmailHelper.SendUpointCallBack(model.error_info, user.email)))
                    errorMessage = "This guy purchased GToken with an improper email " + user.id + " " + user.email;
                return FailResult("phoneNumber", errorMessage);
            }

            decimal GtokenRate = 0;
            decimal.TryParse(ConfigurationManager.AppSettings["IDR_PER_GTOKEN_RATE"], out GtokenRate);
            if (model.amount / GtokenRate != transaction.amount)
            {
                var errorMessage = "UPoint incorrect transaction amount " + model.amount;
                return FailResult("phoneNumber", errorMessage);
            }
            //# Add view invoice permission for user
            //identity = Identity(transaction.customerAccount.id)
            //identity.provides.add(ItemNeed('action', 'view_invoice', transaction.order_id))
            if (user.HasDiscount())
            {
                transaction.description += "; Extra 10% on GoPlay Token amount.";
                user.is_discount_permanent = true;
                api.UpdateCustomerAccount(user.id, true);
                if (transaction.amount.HasValue)
                    transaction.amount = transaction.amount.Value / decimal.Parse("1.1");
            }
            transaction.telkom_order_id = model.t_id;
            transaction.status = Helper.GetDescription(TransactionStatus.Success);
            api.UpdateCoinTransaction(transaction.id, transaction.status, transaction.description, transaction.telkom_order_id);
            var invoiceTemplate = new InvoiceViewModel()
            {
                transaction = transaction,
                payer = user,
                package = transaction.gtoken_package_id.HasValue?api.GetGTokenPackage(transaction.gtoken_package_id.Value).Data:null,
                topupCard = transaction.topup_card_id.HasValue ? api.GetTopUpCard(transaction.topup_card_id.Value).Data : null
            };
            if (!(await EmailHelper.SendMailInvoice(invoiceTemplate)))
            {
                var errorMessage = "This guy purchased GToken with an improper email " + user.id + " " + user.email;
                return FailResult("hrn", errorMessage);
            }
            return Json(new { result = true });
        }
Beispiel #4
0
 public static async Task<bool> SendMailInvoice(InvoiceViewModel data)
 {
     try
     {
         var client = new SmtpClient();
         client.DeliveryMethod = SmtpDeliveryMethod.Network;
         client.EnableSsl = true;
         var supportEmail = ConfigurationManager.AppSettings["CUSTOMER_SUPPORT_EMAIL_SENDER"];
         //   var email_temp = ConfigurationManager.AppSettings["CUSTOMER_SUPPORT_EMAIL_SENDER_TEST"];// TODO: have to replace to data.payer.email when deploy
         var displayName = ConfigurationManager.AppSettings["CUSTOMER_SUPPORT_EMAIL_NAME"];
         var from = new MailAddress(supportEmail, displayName);
         var to = new MailAddress(data.payer.email);//data.payer.email
         var mailMessage = new MailMessage(from, to)
         {
             Subject = "PlayToken - Electronic Receipt",
             Body = GetEmailBody(ConfigurationManager.AppSettings["InvoiceTemplate"], data),
             IsBodyHtml = true
         };
         await client.SendMailAsync(mailMessage);
         return true;
     }
     catch
     {
         return false;
     }
 }
        public async Task<JsonResult> topupCard(TopupCardForm form)
        {
            if (!ModelState.IsValid)
            {
                return Json(new { errors = Errors(ModelState) });
            }
            var api = GoPlayApi.Instance;
            var card = api.GetTopUpCard(form.cardNumber, form.cardPassword);
            dynamic transaction = new ExpandoObject();
            if (card.Data.is_free.HasValue && card.Data.is_free.Value)
            {
                transaction = CreateFreeCoinTrans(CurrentUser, card.Data);
            }
            else
            {
                transaction = CreateCoinTrans(CurrentUser, card.Data);
            }

            api.UpdateTopupCard(card.Data.id, CurrentUser.Id, "used", DateTime.UtcNow);

            var user = api.GetUserById(CurrentUser.Id);
            if (user.Data.HasDiscount())
            {
                user.Data.is_discount_permanent = true;
            }
            api.UpdateCustomerAccount(user.Data.id, user.Data.is_discount_permanent);

            //    Not use since March 1st 2015
            //if not card.is_free and card.is_bv:
            //    # Send a request to Venvici to update their database with the payment
            //    # So there are 3 types of topup cards now
            //    # - standard card, not free and has bv value
            //    # - free card, free and has no bv value
            //    # - no-bv card, not free and has no bv value
            //    venvici.pushBv(transaction.customerAccount, transaction.amount / 2)

            //    #Venici - from 15/3/2015    
            //#if not card.is_free and card.is_bv:
            //    #venvici.updateVenviciBalance(user,transaction)


            if (!card.Data.is_free.HasValue || !card.Data.is_free.Value)
            {
                var gTokenTransaction = GoPlayApi.Instance.CreateGTokenTransaction(new GTokenTransaction
                {
                    username = CurrentUser.UserName,
                    order_id = transaction.order_id,
                    original_price = card.Data.amount,
                    original_final_amount = card.Data.amount,
                    original_currency = ConstantCommon.DEFAULT_PAYPAL_CURRENCY,
                    discount_percentage = 0,
                    payment_method = Helper.GetDescription(PaymentMethod.TopUpCard),
                    description = transaction.description,
                    status = ConstantValues.S_SUCCESS,
                    is_venvici_applicable = card.Data.is_bv.HasValue ? card.Data.is_bv.HasValue : false,
                    revenue_percentage = decimal.Parse(ConfigurationManager.AppSettings["REVENUE_PERCENTAGE"].ToString())
                });
            }
            var payer = api.GetUserById(user.Data.id).Data;
            if (!string.IsNullOrEmpty(payer.email))
            {
                if (transaction is free_coin_transaction)
                {
                    Mapper.CreateMap<free_coin_transaction, coin_transaction>();
                    transaction = Mapper.Map<coin_transaction>(transaction);
                }
                var invoiceTemplate = new InvoiceViewModel()
                           {
                               transaction = transaction,
                               payer = payer,
                               package = null,
                               topupCard = card.Data
                           };
               await EmailHelper.SendMailInvoice(invoiceTemplate);
            }

            var message = String.Empty;
            if (card.Data.is_free.HasValue && card.Data.is_free.Value)
            {
                message = String.Format(Resources.Resources.You_topped_up_Free_Play_Token, Helper.displayDecimal(card.Data.amount));
            }
            else
            {
                message = String.Format(Resources.Resources.You_topped_up_Play_Token, Helper.displayDecimal(card.Data.amount));
            }
            return Json(new { success = true, message = message, is_free = (card.Data.is_free.Value && card.Data.is_free.Value), amount = card.Data.amount });
        }
        public async Task<ActionResult> PaypalExcecute()
        {
            string payerId = Request.Params["PayerID"];
            var order_id = Request.Params["order_id"];
            var api = GoPlayApi.Instance;
            var transaction = api.GetCoinTransactionByOderId(order_id.ToLower());

            var helper = new PaypalHelper();
            var payment = helper.Find(helper.GetGetAPIContext(), transaction.Data.paypal_payment_id);

            // Rechecks the total amount and currency of PayPal payment
            decimal paypalTotalAmount = Decimal.Parse(payment.transactions[0].amount.total);
            string paypalCurrency = payment.transactions[0].amount.currency;
            if (paypalTotalAmount != transaction.Data.price || paypalCurrency != ConstantCommon.DEFAULT_PAYPAL_CURRENCY)
            {
                transaction.Data.status = "failure";
                transaction.Data.description = "PayPal Error: Invalid currency or total amount.";
                api.UpdateCoinTransactionStatus(transaction.Data.id, transaction.Data.status, transaction.Data.description);

                await api.updateGTokenTransactionStatus(transaction.Data.order_id, "failure");

                return RedirectToAction("index", "transaction");
            }
            var executedPayment = payment.Execute(helper.GetGetAPIContext(), new PaymentExecution() { payer_id = payerId });
            if (executedPayment.state.ToLower() != "approved")
            {
                //when executedPayment is not approved
                //---------------------------------------------
                api.UpdateCoinTransactionStatus(transaction.Data.id, "failure", executedPayment.failed_transactions[0].message);
                await api.updateGTokenTransactionStatus(transaction.Data.order_id, "failure");
                try
                {
                    if (Int32.Parse(executedPayment.failed_transactions[0].code) == 400)
                    {
                        api.UpdateCoinTransactionStatus(transaction.Data.id, "pending");
                    }
                    try
                    {
                        string customerEmail = ConfigurationManager.AppSettings["ADMINS"];//should change
                        string subject = "PlayToken - Topup transaction notification";
                        string from = ConfigurationManager.AppSettings["CUSTOMER_SUPPORT_EMAIL_SENDER"];
                        string to = customerEmail;
                        string body = String.Format("Thank you for your business. Your payment {0} was under review by Paypal service and could take up to 24 hours to release. Once the transaction is completed, the system will update your Play Token automatically.", transaction.Data.paypal_payment_id);

                        var message = new MailMessage(from, to, subject, body);
                        EmailHelper.SendMail(message);
                    }
                    catch (Exception)
                    {
                        string adminEmail = ConfigurationManager.AppSettings["ADMINS"];
                        string subject = "PlayToken wrong email";
                        string from = ConfigurationManager.AppSettings["CUSTOMER_SUPPORT_EMAIL_SENDER"];
                        string to = adminEmail;
                        string body = String.Format("This guy purchased Play Token with a proper email {0} {1} but the payment was under review by Paypal.", CurrentUser.Id, CurrentUser.Email);

                        var message = new MailMessage(from, to, subject, body);
                        EmailHelper.SendMail(message);
                    }

                }
                catch (Exception e)
                {
                    logger.Fatal(e.StackTrace.ToString());

                }

            }
            else
            {
                try
                {
                    //State of transaction is approved
                    //---------------------------------------------
                    transaction.Data.status = "pending";
                    api.UpdateCoinTransactionStatus(transaction.Data.id, transaction.Data.status);
                    //Not use since March 1st 2015
                    //Send a request to Venvici to update their database with the payment
                    //venvici.pushBv(transaction.customerAccount, transaction.amount / 2)
                    try
                    {
                        var invoiceTemplate = new InvoiceViewModel()
                        {
                            transaction = transaction.Data,
                            payer = api.GetUserById(transaction.Data.customer_account_id).Data,
                            package = api.GetGTokenPackage(transaction.Data.gtoken_package_id.Value).Data,
                            topupCard = transaction.Data.topup_card_id.HasValue ? api.GetTopUpCard(transaction.Data.topup_card_id.Value).Data : null
                        };
                        await EmailHelper.SendMailInvoice(invoiceTemplate);

                    }
                    catch (Exception)
                    {
                        string adminEmail = ConfigurationManager.AppSettings["ADMINS"];
                        string subject = "PlayToken wrong email";
                        string from = ConfigurationManager.AppSettings["CUSTOMER_SUPPORT_EMAIL_SENDER"];
                        string to = adminEmail;
                        string body = String.Format("This guy purchased Play Token with a proper email {0} {1}", CurrentUser.Id, CurrentUser.Email);

                        var message = new MailMessage(from, to, subject, body);
                        EmailHelper.SendMail(message);
                    }

                    return RedirectToAction("invoice", "transaction", new { order_id = transaction.Data.order_id });
                }
                catch (Exception ex)
                {
                    api.UpdateCoinTransactionStatus(transaction.Data.id, ex.Message.ToString());
                }
            }
            return RedirectToAction("index", "transaction");
        }
 public ActionResult Invoice(string order_id)
 {
     var api = GoPlayApi.Instance;
     InvoiceViewModel model = new InvoiceViewModel();
     if (!string.IsNullOrEmpty(order_id))
     {
         GeneralTransaction trans = GetGeneralTransaction(order_id);
         if (trans != null && trans.customer_account_id == CurrentUser.Id)
         {
             model.generalTrans = trans;
             model.package = trans.gtoken_package_id.HasValue ? api.GetGTokenPackage(trans.gtoken_package_id.Value).Data : null;
             model.topupCard = trans.topup_card_id.HasValue ? api.GetTopUpCard(trans.topup_card_id.Value).Data : null;
         }
     }
     return View(model);
 }