using Business.KFTCBusiness; using Business.TPApi; using Business.Utility; using Common; using Common.Helper; using Common.Language; using Common.Model; using Common.Model.Config; using Common.Model.Notification; using Common.Model.SendMoney; using Common.Model.TPSendMoney; using log4net; using Newtonsoft.Json; using PushNotification; using Repository.Coupon; using Repository.Mobile; using Repository.Reward; using Repository.SendMoney; using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Runtime.Remoting.Messaging; using System.Text; using System.Threading.Tasks; using System.Web; using Notify = Common.Model.Notification; namespace Business.SendMoney { public class SendMoneyBusiness : ISendMoneyBusiness { private readonly ISendMoneyRepository _repo; private readonly IKftcProcessBusiness _kftcBuss; private readonly IRewardRepository _irewardrepo; private readonly ICouponRepository icouponrepo; private readonly IMobileServicesRepo _requestServices; private readonly ThirdPartyAPI _tpApi = new ThirdPartyAPI(); private static readonly ILog Log = LogManager.GetLogger(typeof(SendMoneyBusiness)); public SendMoneyBusiness(ISendMoneyRepository repo, IKftcProcessBusiness kftcBuss, IRewardRepository irewardrepo, ICouponRepository icouponrepo, IMobileServicesRepo requestServices) { _repo = repo; _kftcBuss = kftcBuss; _irewardrepo = irewardrepo; this.icouponrepo = icouponrepo; _requestServices = requestServices; } public JsonRxResponse LoadCountryServiceDetail(CountryServiceModel request) { JsonRxResponse jsonRx = new JsonRxResponse(); try { jsonRx.SetResponse("1", "Error"); CountryServiceDetail res = _repo.LoadCountryServiceDetail(request); if (res == null) { Log.Debug("LoadCountryServiceDetail | Returning null while fetching country service details."); return jsonRx; } Log.Debug("LoadCountryServiceDetail | Calling LoadCountryServiceDetail Success..."); jsonRx.SetResponse("0", "Success"); var path = GetStatic.ReadWebConfig("ServiceType_Resource", ""); var text = File.ReadAllText(path); List sd = JsonConvert.DeserializeObject>(text); var lang = Convert.ToString(CallContext.GetData(Constants.Language)); if (string.IsNullOrEmpty(lang)) { lang = "en"; } var idx = sd.FindIndex(x => x.countryCode == lang); var data = new ServiceTypeDetails(); if (idx < 0) { data = sd[sd.FindIndex(x => x.countryCode == "en")]; } else { data = sd[idx]; } foreach (var item in res.PayoutMode) { switch (item.Mode.ToLower()) { case "cash payment": item.ModeDescription = data.cashPayment; break; case "bank deposit": item.ModeDescription = data.bankDeposit; break; case "mobile wallet": item.ModeDescription = data.mobileWallet; break; case "home delivery": item.ModeDescription = data.homeDelivery; break; case "card payment": item.ModeDescription = data.cardPayment; break; } } jsonRx.Data = res; return jsonRx; } catch (Exception ex) { Log.Error("Something Went Wrong, Please Try Again!!", ex); jsonRx.SetResponse("1", "Unable to fetch the country service details."); return jsonRx; } } public JsonRxResponse LoadBankBranch(string country, string bank, string search) { JsonRxResponse jsonRx = new JsonRxResponse(); try { jsonRx.SetResponse("1", "Sorry, No branch found."); List res = _repo.LoadBankBranch(country, bank, search); if (res == null) { Log.Debug("LoadCountryBankServiceDetail | Returning null while fetching the list of bank branches details."); return jsonRx; } Log.Debug("LoadBankBranch | DB Call Success.."); jsonRx.SetResponse("0", "Success"); jsonRx.Data = res; return jsonRx; } catch (Exception ex) { Log.Error("Something Went Wrong, Please Try Again!!", ex); jsonRx.SetResponse("1", "Unable to fetch the list of bank branches details."); return jsonRx; } } public JsonRxResponse Calculate(ExRateCalculateRequest m) { JsonRxResponse response = new JsonRxResponse(); APIJsonResponse jsonResponse = new APIJsonResponse(); try { ExRateCalculate model = new ExRateCalculate() { SBranch = Convert.ToInt32(GetStatic.ReadWebConfig("sBranch", "")), SSuperAgent = Convert.ToInt32(GetStatic.ReadWebConfig("sSuperAgent", "")), AgentRefId = "", CalcBy = m.calcBy, CAmount = Convert.ToDecimal(m.cAmount == "" ? "0" : m.cAmount), CardOnline = "", CollCurrency = m.sCurrency, CouponCode = m.DeviceType, CustomerId = 0, IsManualSc = false, IsOnline = false, ManualSc = 0, PAgentId = Convert.ToInt32(m.pAgent == "" ? "0" : m.pAgent), PAgentName = "", PAmount = Convert.ToDecimal(m.pAmount == "" ? "0" : m.pAmount), PaymentType = m.paymentType, PayoutPartner = Convert.ToInt32(m.payoutPartner == "" ? "0" : m.payoutPartner), PCountry = Convert.ToInt32(m.pCountry == "" ? "0" : m.pCountry), pCountryCode = m.pCountryName, PCountryName = m.pCountryName, PCurrency = m.pCurrency, ProcessFor = "send", ProcessId = m.processId == "" ? Guid.NewGuid().ToString() : m.processId, ProviderId = "", RequestedBy = "mobile", SAgent = 0, SchemeId = m.schemeId, SCountry = Convert.ToInt32(m.sCountry == "" ? "0" : m.sCountry), SCurrency = m.sCurrency, ServiceType = m.serviceType, SessionId = Guid.NewGuid().ToString(), tPExRate = m.tpExRate, UserName = m.userId, DiscountedFee = Convert.ToDecimal(string.IsNullOrEmpty(m.discountedFee) ? "0" : m.discountedFee) }; Log.Debug("Calculate | DATA SENT TO TPAPI : " + JsonConvert.SerializeObject(model)); APIJsonResponse result = _tpApi.ThirdPartyApiGetDataOnly(model, "TP/ExRate", out jsonResponse); Log.Debug("Calculate | TPAPI RRESPONSE : " + JsonConvert.SerializeObject(result)); response = new JsonRxResponse() { ErrorCode = result.ResponseCode, Id = result.Id, Msg = result.Msg, Data = result.Data, Extra = result.Extra, Extra2 = result.Extra1, FootNoteMessage = result.FootNoteMessage }; return response; } catch (Exception ex) { Log.Error("Something Went Wrong, Please Try Again!!", ex); response.SetResponse("1", "Error occured while calculating ex-rate"); return response; } } public JsonRxResponse TrackTransaction(TrackTransactionParam param) { JsonRxResponse jsonRx = new JsonRxResponse(); try { jsonRx = _repo.TrackTransaction(param); Log.Debug("TrackTransaction | DB RESPONSE : " + JsonConvert.SerializeObject(jsonRx)); if (!jsonRx.ErrorCode.Equals("0")) { Log.Debug("TrackTransaction | Error occurred while calling TrackTransaction..." + "ControlNo: " + param.ControlNo); return jsonRx; } return jsonRx; } catch (Exception ex) { Log.Error("Something Went Wrong, Please Try Again!!", ex); jsonRx.SetResponse("1", "Error occurred while fetching the paystatus of the transaction."); return jsonRx; } } public JsonRxResponse AmendTransaction(TrackTransactionParam param) { JsonRxResponse jsonRx = new JsonRxResponse(); try { jsonRx = _repo.AmendTransaction(param); Log.Debug("AmendTransaction | DB RESPONSE : " + JsonConvert.SerializeObject(jsonRx)); if (!jsonRx.ErrorCode.Equals("0")) { return jsonRx; } string body = "Hello JME Support,
"; body += param.UserId + " Send Amendment request for JME No: " + param.ControlNo; body += param.Body; //EmailParameters _emailParams = new EmailParameters() //{ // To = ApplicationConfig.ReadWebConfig("JMESupport"), // MsgSubject = "Amendment request for JME No: " + param.ControlNo, // MsgBody = body //}; //Task.Run(() => GetStatic.SendEmail(_emailParams)); //Task.Run(() => //{ // SendNotificationRequest request = new SendNotificationRequest() // { // IsBulkNotification = false, // UserName = param.UserId, // ProcessId = param.ControlNo, // ProviderId = param.ControlNo, // NotificationTypeId = NOTIFICATION_TYPE.EMAIL.ToString(), // Template = Common.Model.Enum.NotifyTemplate.RESET_PASSWORD, // Recipients = new List() // { // new RecipientViewModel() // { // NotificationContent = new NotificationDTO() { // Body = body, // //Title will be set by mapping json // }, // Address= ApplicationConfig.ReadWebConfig("JMESupport") // } // } // }; // NotifierV2.SendNotification(request, NOTIFICATION_TYPE.EMAIL); //}); return jsonRx; } catch (Exception ex) { Log.Error("Something Went Wrong, Please Try Again!!", ex); jsonRx.SetResponse("1", "Error occurred while requesting the transaction amendment request."); return jsonRx; } } public JsonRxResponse AmendTransactionV2(AmendTransactionParam param) { JsonRxResponse jsonRx = new JsonRxResponse(); try { var xml = GetXMLValues(param); jsonRx = _repo.AmendTransactionV2(param, xml); Log.Debug("AmendTransactionV2 | DB RESPONSE : " + JsonConvert.SerializeObject(jsonRx)); if (!jsonRx.ErrorCode.Equals("0")) { return jsonRx; } //string body = "Hello JME Support,
"; //body += param.UserId + " Send Amendment request for JME No: " + param.ControlNo; //body += param.Body; //EmailParameters _emailParams = new EmailParameters() //{ // To = ApplicationConfig.ReadWebConfig("JMESupport"), // MsgSubject = "Amendment request for JME No: " + param.ControlNo, // MsgBody = body //}; //Task.Run(() => GetStatic.SendEmail(_emailParams)); return jsonRx; } catch (Exception ex) { Log.Error("Something Went Wrong, Please Try Again!!", ex); jsonRx.SetResponse("1", "Error occurred while requesting the transaction amendment request."); return jsonRx; } } private string GetXMLValues(AmendTransactionParam param) { StringBuilder sb = new StringBuilder(""); foreach (var item in param.ChangeParams) { sb.Append(""); } sb.AppendLine(""); return sb.ToString(); } public JsonRxResponse CancelTransaction(TrackTransactionParam param) { JsonRxResponse jsonRx = new JsonRxResponse(); try { jsonRx = _repo.CancelTransaction(param); Log.Debug("CancelTransaction | DB RESPONSE : " + JsonConvert.SerializeObject(jsonRx)); if (!jsonRx.ErrorCode.Equals("0")) { return jsonRx; } //string body = "Hello JME Support,
"; //body += param.UserId + " Send cancellation request for JME No: " + param.ControlNo; //body += param.Body; //EmailParameters _emailParams = new EmailParameters() //{ // To = ApplicationConfig.ReadWebConfig("JMESupport"), // MsgSubject = "Cancellation request for JME No: " + param.ControlNo, // MsgBody = body //}; //Task.Run(() => GetStatic.SendEmail(_emailParams)); return jsonRx; } catch (Exception ex) { Log.Error("Something Went Wrong, Please Try Again!!", ex); jsonRx.SetResponse("1", "Error occurred while requesting the transaction cancel."); return jsonRx; } } public JsonRxResponse RejectTransaction(RejectTransactionParam param) { JsonRxResponse jsonRx = new JsonRxResponse(); //JsonRxResponse response = new JsonRxResponse(); APIJsonResponse jsonResponse = new APIJsonResponse(); try { DbResult _dbRes = _repo.GetTxnApproveData(param.UserId, param.TranId); Log.Debug("RejectTransaction | GetTxnApproveData RESPONSE : " + JsonConvert.SerializeObject(_dbRes)); if (_dbRes.Extra == "True" || _dbRes.Extra == "1")//is realtime { CancelTxnPartner model = new CancelTxnPartner() { ProviderId = _dbRes.Msg, PartnerPinNo = _dbRes.Id, CancelReason = "41", ProcessId = param.ProcessId }; Log.Debug("RejectTransaction | DATA SENT TO TPAPI : " + JsonConvert.SerializeObject(model)); APIJsonResponse result = _tpApi.ThirdPartyApiGetDataOnly(model, "TP/cancelTxn", out jsonResponse); Log.Debug("RejectTransaction | TPAPI RRESPONSE : " + JsonConvert.SerializeObject(result)); if (result.ResponseCode == "0") { jsonRx = _repo.RejectTransaction(param); } else { jsonRx = new JsonRxResponse() { ErrorCode = result.ResponseCode, Id = result.Id, Msg = result.Msg, Data = result.Data, Extra = result.Extra, Extra2 = result.Extra1 }; } return jsonRx; } else { jsonRx = _repo.RejectTransaction(param); Log.Debug("RejectTransaction | DB RESPONSE : " + JsonConvert.SerializeObject(jsonRx)); } return jsonRx; } catch (Exception ex) { Log.Error("Something Went Wrong, Please Try Again!!", ex); jsonRx.SetResponse("1", "Error occurred while rejecting the transaction."); return jsonRx; } } public Common.Model.DbResult CheckLoginPassword(string user, string txnPassword, string paymentType, string customerId) { return _repo.CheckLoginPassword(user, txnPassword, paymentType, customerId); } public Common.Model.DbResult CheckLoginPIN(string user, string txnPassword, string paymentType, string customerId) { return _repo.CheckLoginPIN(user, txnPassword, paymentType, customerId); } public JsonRxResponse SendTransaction(MobileRemitRequest model) { JsonRxResponse response = new JsonRxResponse(); APIJsonResponse jsonResponse = new APIJsonResponse(); try { TpSendMoney tp = new TpSendMoney() { CalBy = model.CalBy, CDDI = new CustomerDueDiligence() { PurposeOfRemittance = model.PurposeOfRemittance, RelWithSender = model.RelWithSender, SourceOfFund = model.SourceOfFund, otherPurposeOfRemittance = model.otherPurposeOfRemittance, otherSourceOfFund = model.otherSourceOfFund, GoodsOrigin = model.GoodsOrigin, GoodsType = model.GoodsType, PortOfShipment = model.PortOfShipment }, CollAmt = model.CollAmt, CollCurr = model.CollCurr, DeliveryMethodId = Convert.ToInt32(model.DeliveryMethodId == "" || model.DeliveryMethodId == null ? "0" : model.DeliveryMethodId), ExRate = model.ExRate, ForexSessionId = model.FOREX_SESSION_ID, IsRealtime = false, PaymentType = model.PaymentType, PayoutAmt = model.PayoutAmt == "" ? "0" : model.PayoutAmt, PayoutCurr = model.PCurr, PayOutPartnerId = Convert.ToInt32(model.PayOutPartner == "" || model.PayOutPartner == null ? "0" : model.PayOutPartner), // PBankId = model.DeliveryMethodId == "2" ? Convert.ToInt32(model.PAgent == "" || model.PAgent == null ? "0" : model.PAgent) : 0, PBankId = Convert.ToInt32(model.PAgent == "" || model.PAgent == null ? "0" : model.PAgent), PBranchId = Convert.ToInt32(model.PBranch == "" || model.PBranch == null ? "0" : model.PBranch), PCountryId = 0, ProcessId = model.ProcessId, ProviderId = "", Receiver = new ReceiverInfo() { ReceiverId = model.ReceiverId, AccountNo = model.ReceiverAccountNo }, RequestedBy = "mobile", ScDiscount = model.Discount, //SchemeId = model.schemeId, SCountryId = 0, SenderId = model.SenderId, ServiceCharge = model.ServiceCharge, SessionId = "", SIpAddress = model.IpAddress, SourceType = "", TpExRate = model.TpExRate, TpPCurr = model.TpPCurr, TransferAmt = model.TransferAmt, UserName = model.User, DiscountedFee = model.DiscountedFee, SiteId = ConfigurationManager.AppSettings["sitereference"].ToString() }; Log.Debug("DOTRANSACTION | DATA SENT TO TPAPI : " + JsonConvert.SerializeObject(tp)); APIJsonResponse result = _tpApi.ThirdPartyApiGetDataOnly(tp, "TP/mobileSendTxn", out jsonResponse); Log.Debug("DOTRANSACTION | TPAPI RESPONSE : " + JsonConvert.SerializeObject(result)); response = new JsonRxResponse() { ErrorCode = result.ResponseCode, Id = result.Id, Msg = result.Msg, Data = result.Data, Extra = result.Extra, Extra2 = result.Extra2, Extra3 = result.Extra3, Extra4 = result.Extra4 }; if (response.ErrorCode.Equals("0")) { //var randomPassword = PasswordGenerator.GenerateRandomPassword(new PasswordGenerator.PasswordOptions() //{ RequireDigit = true, RequiredLength = 10, RequiredUniqueChars = 2, RequireLowercase = true, RequireNonAlphanumeric = true, RequireUppercase = true }); string eID = HttpUtility.UrlEncode(AesOperation.EncryptString(ConfigurationManager.AppSettings["encryptKey"].ToString(), result.Id)); string eCn = HttpUtility.UrlEncode(AesOperation.EncryptString(ConfigurationManager.AppSettings["encryptKey"].ToString(), result.Extra)); var trustpaymentCallback = ApplicationConfig.ReadWebConfig("trustpaymentCallback"); var trustpaymentSuccess = ApplicationConfig.ReadWebConfig("trustpaymentSuccess"); var trustpaymentFail = ApplicationConfig.ReadWebConfig("trustpaymentFail"); Gateway gateway = new Gateway() { Code = result.Extra2, IsRedirect = result.Extra3.Equals("Y") ? true : false, //Token = randomPassword, RedirectURL = result.Extra3.Equals("Y") ? $"{trustpaymentCallback}?id={eID}&ref={response.Extra4}&cn={eCn}&token=" : "", CheckSuccessURL = result.Extra3.Equals("Y") ? trustpaymentSuccess : "", CheckFailURL = result.Extra3.Equals("Y") ? trustpaymentFail : "" }; response.Data = gateway; string email = model.User; try { if (!result.Extra3.Equals("Y")) { UserDetails userDetails = _requestServices.GetUserDetails(email); List bodyMappings = new List(); bodyMappings.Add(new Notify.Mapping() { SValue = "CustomerName", SText = userDetails.FullName }); bodyMappings.Add(new Notify.Mapping() { SValue = "CollectAmt", SText = GetStatic.ShowDecimal(model.CollAmt) }); SendNotificationRequest request = new SendNotificationRequest() { IsBulkNotification = false, UserName = userDetails.Email, ProviderId = "BankTransferTxnPendingStatus", NotificationTypeId = NOTIFICATION_TYPE.EMAIL.ToString(), Template = Common.Model.Enum.NotifyTemplate.BANK_TRANSFER_TXN_PENDING, Recipients = new List() { new RecipientViewModel() { NotificationContent = new NotificationDTO() { Body = JsonConvert.SerializeObject(bodyMappings), //Title will be set by mapping json }, Address= userDetails.Email } } }; NotifierV2.SendNotification(request, NOTIFICATION_TYPE.EMAIL); } } catch (Exception ex) { Log.Error("BankTransferTxnPendingStatus", ex); } } return response; } catch (Exception ex) { Log.Error("Something Went Wrong, Please Try Again!!", ex); response.SetResponse("1", "Error occured while SendTransaction"); return response; } } public JsonRxResponse AccountValidation(AccountValidationModel model) { JsonRxResponse response = new JsonRxResponse(); APIJsonResponse jsonResponse = new APIJsonResponse(); try { string providerid = string.Empty; string paymentMode = model.PaymentMode ?? ""; string remarks = string.Empty; bool allowProceed = true; AccountValidate accountValidate = new AccountValidate() { AccountNumber = model.AccountNumber, BankCode = model.BankCode, UserName = model.UserName, ReceiverName = !string.IsNullOrEmpty(model.ReceiverName) ? model.ReceiverName : Utilities.GetFullName(model.FirstName, model.MiddleName, model.LastName), ControlNo = model.ControlNo ?? "", PaymentMode = model.PaymentMode, SessionId = "", ProcessId = model.ProcessId }; if (string.IsNullOrEmpty(providerid)) { if (model.BankCountry.Equals("BD")) { providerid = "394414"; paymentMode = model.Equals("2") ? "AC" : "MW"; } else if (model.BankCountry.Equals("NP")) { providerid = "394397"; if (model.BankCode == "2454") accountValidate.BankCode = "IMEPAY"; else if (model.BankCode == "2662") accountValidate.BankCode = "KHALTI"; } else if (model.BankCountry.Equals("LK")) { providerid = "394400"; } else if (model.BankCountry.Equals("VD")) { providerid = "394132"; } } accountValidate.ProviderId = providerid; Log.Debug("AccountValidation | DATA SENT TO TPAPI : " + JsonConvert.SerializeObject(accountValidate)); APIJsonResponse result = _tpApi.ThirdPartyApiGetDataOnly(accountValidate, "TP/Verify", out jsonResponse); Log.Debug("AccountValidation | TPAPI RESPONSE : " + JsonConvert.SerializeObject(result)); response = new JsonRxResponse() { ErrorCode = result.ResponseCode.Equals("0") ? "0" : "1", Id = result.Id, Msg = result.ResponseCode.Equals("0") ? "Validation Success" : "Validation Failed", Data = result.Data, Extra = allowProceed ? "Y" : "N", Extra2 = result.Extra1, Extra3 = result.Extra3 }; return response; } catch (Exception ex) { Log.Error("AccountValidation", ex); response.SetResponse("1", "Error occured while AccountValidation"); return response; } } } }