You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

595 lines
26 KiB

using Common.Models.Bank;
using Common.Models.Bank_Account;
using Common.Models.ExchangeRate;
using Common.Models.Reports;
using Common.Models.RequestResponse;
using Common.Models.Status;
using Common.Models.TxnModel;
using Common.TPService;
using Common.Utility;
using GMENepal.GMEReference;
using GMENepal.Model;
using log4net;
using Newtonsoft.Json;
using System;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using Repository.DAO.ThirdParty;
namespace GMENepal.GMENepalAPIService
{
public class GMENepalAPI : ITPApiServices
{
private readonly ILog _log = LogManager.GetLogger(typeof(GMENepalAPI));
private readonly FastMoneyWebService _fastMoneyWeb = new FastMoneyWebService();
string UserName = GetStatic.ReadWebConfig("gme_user_name", "");
string Password = GetStatic.ReadWebConfig("gme_password", "");
string PartnerId = GetStatic.ReadWebConfig("gme_partnerId", "");
string GMEKey = GetStatic.ReadWebConfig("gme_key", "");
public TPResponse GetTPResponse<T>(T model, string MethodName) where T : class
{
switch (MethodName)
{
case "send":
return SendTransaction(model as SendTransaction);
case "bankList":
return GetBankList(model as BankRequest);
case "exRate":
return GetExRate(model as ExchangeRate);
case "status":
return GetTxnStatus(model as GetStatus);
case "cancelSend":
return CancelTransaction(model as CancelTxn);
case "amendmentRequest":
return ReconcileReport(model as TxnAmendment);
case "verify":
return AccountValidation(model as AccountValidate);
case "release":
return ReleseTrasaction(model as TFReleaseTxnRequest);
default:
return new TPResponse() { ResponseCode = "1", Msg = "Method Name Not Found !" };
}
}
private TPResponse ReleseTrasaction(TFReleaseTxnRequest releaseRequest)
{
DbResult response = new DbResult();
TPResponse _response = new TPResponse();
try
{
_log.Info("ConfirmTransaction | REQUEST :" + JsonConvert.SerializeObject(releaseRequest));
var res = _fastMoneyWeb.ConfirmTransaction(PartnerId, UserName, Password, releaseRequest.TfPin, releaseRequest.TxnId);
_log.Info("ConfirmTransaction | RESPONSE :" + JsonConvert.SerializeObject(res));
_response.Data = response;
_response.Msg = res.Message;
_response.ResponseCode = res.ErrorCode;
}
catch (Exception ex)
{
_response.ResponseCode = "1";
_response.Msg = "Unknown error!";
_log.ErrorFormat("ReleseTrasaction | Exception occured On AccountValidation Method At GMENepalApi ! Details :" + ex.Message);
}
return _response;
}
private TPResponse AccountValidation(AccountValidate accValidate)
{
DbResult response = new DbResult();
TPResponse _response = new TPResponse();
try
{
_log.Info("AccountValidation | REQUEST :" + JsonConvert.SerializeObject(accValidate).ToString());
if (accValidate.BankCode.ToLower() == "imepay" || accValidate.BankCode.ToLower() == "khalti")
{
WalletUserDetailResponse walletResponse = _fastMoneyWeb.GetWalletDetails(PartnerId, UserName, Password, accValidate.BankCode.ToUpper()
, accValidate.AccountNumber, "", GetAccValidateSignature(accValidate));
response.ErrorCode = walletResponse.ResponseCode;
response.Msg = walletResponse.ResponseMessage;
response.Extra = walletResponse.FullName;
response.Extra2 = JsonConvert.SerializeObject(walletResponse);
}
else
{
response = _fastMoneyWeb.AccountValidation(UserName, Password, accValidate.BankCode, accValidate.AccountNumber
, accValidate.ReceiverName);
}
_log.Info("AccountValidation | RESPONSE :" + JsonConvert.SerializeObject(response).ToString());
_response.Data = response;
_response.Msg = response.Msg.Replace("Please Contact Head Office.", "Please check and re-submit!");
_response.Extra = response.Extra;
_response.ResponseCode = response.ErrorCode;
}
catch (Exception ex)
{
_response.ResponseCode = "1";
_response.Msg = "Unknown error!";
_log.ErrorFormat("Exception occured On AccountValidation Method At GMENepalApi ! Details :" + ex.Message);
}
return _response;
}
private string GetAccValidateSignature(AccountValidate accValidate)
{
string sign = GMEKey + PartnerId + UserName + Password + accValidate.AccountNumber;
StringBuilder builder = new StringBuilder();
using (SHA256 sha256Hash = SHA256.Create())
{
// ComputeHash - returns byte array
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(sign));
// Convert byte array to a string
for (int i = 0; i < bytes.Length; i++)
{
builder.Append(bytes[i].ToString("x2"));
}
}
return builder.ToString();
}
private TPResponse GetBankList(BankRequest bankRequest)
{
if (bankRequest.IsBranch)
return GetBankBranchList(bankRequest);
GMEBankRequest bR = BankModelMap(bankRequest);
TPResponse _response = new CustomModelValidaton().IsModelValid(bR);
if (_response == null)
{
_response = new TPResponse();
BankList[] getResponse = _fastMoneyWeb.GetBankList(bR.PartnerId, bR.UserName, bR.Password, bR.SessionId, bR.PaymentMethod, bR.ReceivingCountry);
_response.Data = getResponse;
_response.ResponseCode = getResponse.First().ErrorCode;
_response.Msg = getResponse.First().Message;
if (!_response.ResponseCode.Equals("0"))
{
_response.ResponseCode = "1";
_log.ErrorFormat("Error Occured On GetBankList Method At GMENepalApi ! Details :" + getResponse);
}
}
else
{
_log.Info("GetBankList | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(bR).ToString());
}
return _response;
}
private TPResponse GetBankBranchList(BankRequest bRequest)
{
GMEBankBranchRequest bR = BankBranchModelMap(bRequest);
TPResponse _response = new CustomModelValidaton().IsModelValid(bR);
if (_response == null)
{
_response = new TPResponse();
BankBranchList getResponse = _fastMoneyWeb.GetBankBranchList(bR.PartnerId, bR.UserName, bR.Password, bR.BankCode, bR.SessionId);
_response.Data = getResponse.BRANCHES;
_response.ResponseCode = getResponse.ErrorCode;
_response.Msg = getResponse.Message;
if (!_response.ResponseCode.Equals("0"))
{
_response.ResponseCode = "1";
_log.ErrorFormat("Error Occured On GetBankBranchList Method At GMENepalApi ! Details :" + getResponse);
}
}
else
{
_log.Info("GetBankBranchList | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(bR).ToString());
}
return _response;
}
private TPResponse GetExRate(ExchangeRate exchangeRate)
{
GMEGetCalculationRequest gCR = GetExRateModelMap(exchangeRate);
TPResponse _response = new CustomModelValidaton().IsModelValid(gCR);
if (_response == null)
{
_response = new TPResponse();
_log.Info("GetExRate | REQUEST :" + JsonConvert.SerializeObject(exchangeRate).ToString());
GetCalculationResult model = _fastMoneyWeb.GetCalculation(
gCR.PartnerId, gCR.UserName, gCR.Password, gCR.SessionId, gCR.ReceivingAgentId,
gCR.RemitAmount, gCR.PaymentMethod, gCR.ReceivingCountry, gCR.CalculateBy
);
_log.Info("GetExRate | RESPONSE :" + JsonConvert.SerializeObject(model).ToString());
_response.Data = model;
_response.Msg = model.Message;
_response.Extra = model.ExConfirmId;
_response.ResponseCode = model.ErrorCode;
if (!_response.ResponseCode.Equals("0"))
{
_response.ResponseCode = "1";
_log.ErrorFormat("Error Occured On GetExRate Method At GMENepalApi ! Details :" + model);
}
}
else
{
_log.Info("GetExRate | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(gCR).ToString());
}
return _response;
}
private TPResponse SendTransaction(SendTransaction sendTransaction)
{
GMESendMoney gS = SendModelMap(sendTransaction);
DbResult model = new DbResult();
SendMoneyResult sendMoneyRes = new SendMoneyResult();
TPResponse _response = new CustomModelValidaton().IsModelValid(gS);
if (_response == null)
{
_response = new TPResponse();
var dt = gS.TransactionDate.Split('-');
string dateTxn = dt[1] + "-" + dt[2] + "-" + dt[0];
_log.Info("SendTransaction | REQUEST :" + JsonConvert.SerializeObject(gS).ToString());
if (gS.PaymentMethod.ToLower() == "c")
{
_response = new TPResponse();
var exRate = _fastMoneyWeb.GetCalculation(
gS.PartnerId, gS.UserName, gS.Password, gS.SessionId, "",
"1000", "C", gS.BeneCountry, "P"
);
_log.Info("GetExRate | RESPONSE :" + JsonConvert.SerializeObject(model).ToString());
var exConfirmId = exRate.ExConfirmId;
sendMoneyRes = _fastMoneyWeb.SendMoney(PartnerId, UserName, Password, gS.ControlNo, exConfirmId, gS.MembershipId, gS.CustomerName, gS.CustomerAddress,
gS.CustomerContact, gS.CustomerCity, gS.CustomerCountry, gS.CustomerIdType, gS.CustomerIdNumber, gS.BeneName, gS.BeneAddress, gS.BeneContact, gS.BeneCity
, gS.BeneCountry, gS.Profession, gS.IncomeSource, gS.Relationship, gS.PurposeOfRemittance, gS.SendingAmount, gS.ReceivingAmount, gS.PaymentMethod
, gS.BankCode, gS.BankName, gS.BankBranchName, gS.BankAccountNumber, dateTxn, gS.CalculateBy, gS.FreeCharge);
_log.Info("SendTransaction | RESPONSE :" + JsonConvert.SerializeObject(sendMoneyRes).ToString());
_response.ResponseCode = sendMoneyRes.ErrorCode;
_response.Msg = sendMoneyRes.Message;
_response.Extra = exRate.UsdVsNpr;
_response.Extra2 = sendMoneyRes.PinNo;
_response.Id = sendMoneyRes.TranId;
_response.Data = sendMoneyRes;
return _response;
}
else if (gS.PaymentMethod.ToLower() == "w" && (gS.BankCode.ToLower() == "imepay" || gS.BankCode.ToLower() == "khalti"))
{
model = _fastMoneyWeb.RealTimeWalletDeposit(PartnerId, UserName, Password, gS.BankCode, gS.CustomerName, gS.CustomerAddress
, gS.CustomerContact, gS.CustomerCountry, gS.CustomerIdType, gS.CustomerIdNumber, gS.BeneName, gS.BeneAddress
, gS.BankAccountNumber, gS.BeneCountry, gS.IncomeSource, gS.Relationship, gS.PurposeOfRemittance, Convert.ToString(gS.CollectionAmount)
, gS.CollectionCurrency, gS.SendingAmount, gS.ReceivingAmount, gS.FreeCharge, gS.PayoutCommCurr, dateTxn, gS.ControlNo
, gS.SenderCostRate, gS.ReceiverCostRate, Convert.ToString(gS.ExRate), gS.Signature);
}
else
{
AccountValidate accValidate = new AccountValidate
{
BankCode = gS.BankCode,
AccountNumber = gS.BankAccountNumber,
ReceiverName = gS.BeneName,
ControlNo = gS.ControlNo,
PaymentMode = gS.PaymentMethod
};
var response = AccountValidation(accValidate);
if (response.ResponseCode.Equals("0") || response.ResponseCode.Equals("100"))
{
var exRateBank = _fastMoneyWeb.GetCalculation(gS.PartnerId, gS.UserName, gS.Password, gS.SessionId, "", "1000", "B", gS.BeneCountry, "P");
model = _fastMoneyWeb.ProcessBankDeposit(gS.PartnerId, gS.UserName, gS.Password, gS.ControlNo, exRateBank.ExConfirmId
, gS.MembershipId, gS.CustomerName, gS.CustomerAddress, gS.CustomerContact, gS.CustomerCity, gS.CustomerCountry
, gS.CustomerIdType, gS.CustomerIdNumber, gS.BeneName, gS.BeneAddress, gS.BeneContact, gS.BeneCity, gS.BeneCountry, gS.Profession
, gS.IncomeSource, gS.Relationship, gS.PurposeOfRemittance, gS.SendingAmount, gS.ReceivingAmount, gS.PaymentMethod, gS.BankCode
, gS.BankName, gS.BankAccountNumber, dateTxn, gS.CalculateBy, gS.FreeCharge, gS.ControlNo, gS.PayoutCurrency, gS.ReceiverCostRate
, gS.SenderCostRate, gS.Signature);
_response.Extra = exRateBank.UsdVsNpr;
}
else
{
ThirdPartyRepo thirdPartyRepo = new ThirdPartyRepo();
thirdPartyRepo.SyncTxnAsComment(sendTransaction.ProviderId, sendTransaction.TranId.ToString(), gS.ControlNo, "", response.Msg);
_response.ResponseCode = response.ResponseCode;
_response.Msg = response.Msg;
return _response;
}
}
_log.Info("SendTransaction | RESPONSE :" + JsonConvert.SerializeObject(model).ToString());
_response.ResponseCode = model.ErrorCode;
_response.Msg = model.Msg;
_response.Extra2 = model.Extra2;
_response.Id = model.Id;
_response.Data = model;
}
else
{
_log.Info("SendTransaction | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(gS).ToString());
}
return _response;
}
private TPResponse GetTxnStatus(GetStatus getStatus)
{
if (getStatus.IsFromPartnerPinNo)
return GetTxnByPartnerPin(getStatus);
GMEGetStatus gS = StatusModelMap(getStatus);
TPResponse _response = new CustomModelValidaton().IsModelValid(gS);
if (_response == null)
{
_response = new TPResponse();
_log.Info("GetTxnStatus | REQUEST :" + JsonConvert.SerializeObject(gS).ToString());
var model = _fastMoneyWeb.GetStatus(gS.PartnerId, gS.UserName, gS.Password, gS.PinNo, gS.SessionId);
_log.Info("GetTxnStatus | RESPONSE :" + JsonConvert.SerializeObject(model).ToString());
_response.ResponseCode = model.ErrorCode;
_response.Msg = model.Message;
_response.Extra2 = model.Status;
_response.Data = model;
_response.Extra = model.ExRate;
if (!_response.ResponseCode.Equals("0"))
{
_response.ResponseCode = "1";
}
}
else
{
_log.Info("GetTxnStatus | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(gS).ToString());
}
return _response;
}
private TPResponse GetTxnByPartnerPin(GetStatus getStatus)
{
GMEGetStatusByPartnerPinNo gSP = StatusByPartmerIdModelMap(getStatus);
TPResponse _response = new CustomModelValidaton().IsModelValid(gSP);
if (_response == null)
{
_response = new TPResponse();
_log.Info("GetTxnByPartnerPin | REQUEST :" + JsonConvert.SerializeObject(gSP).ToString());
GetStatusByPartnerPinNoResult model = _fastMoneyWeb.GetStatusByPartnerPinNo(gSP.PartnerId, gSP.UserName, gSP.Password, gSP.PinNo, gSP.SessionId);
_log.Info("GetTxnByPartnerPin | RESPONSE :" + JsonConvert.SerializeObject(model).ToString());
_response.Data = model;
_response.ResponseCode = model.ErrorCode;
_response.Msg = model.Message;
if (!_response.ResponseCode.Equals("0"))
{
_response.ResponseCode = "1";
}
}
else
{
_log.Info("GetTxnByPartnerPin | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(gSP).ToString());
}
return _response;
}
private TPResponse CancelTransaction(CancelTxn cancelTxn)
{
GMECancelTransaction gCT = CancelTxnModelMap(cancelTxn);
TPResponse _response = new CustomModelValidaton().IsModelValid(gCT);
if (_response == null)
{
_response = new TPResponse();
CancelTransactionResult model = _fastMoneyWeb.CancelTransaction(gCT.PartnerId, gCT.UserName, gCT.Password, gCT.PinNo, gCT.SessionId, gCT.CancelRemarks);
_response.Data = model;
_response.ResponseCode = model.ErrorCode;
_response.Msg = model.Message;
if (!_response.ResponseCode.Equals("0"))
{
_response.ResponseCode = "1";
_log.ErrorFormat("Error Occured On CancelTransaction Method At GMENepalApi ! Details :" + model);
}
}
else
{
_log.Error("Error Validating Model!");
}
return _response;
}
private TPResponse ReconcileReport(TxnAmendment txnAmendment)
{
GMEReconcileReport rCR = ReconcileReportMap(txnAmendment);
TPResponse _response = new CustomModelValidaton().IsModelValid(rCR);
if (_response == null)
{
_response = new TPResponse();
ReconcileReportResult[] model = _fastMoneyWeb.ReconcileReport(rCR.PartnerId, rCR.UserName, rCR.Password, rCR.SessionId, rCR.ReportType, rCR.FromDate, rCR.ToDate);
_response.Data = model;
_response.ResponseCode = model.First().ErrorCode;
_response.Msg = model.First().Message;
if (!_response.ResponseCode.Equals("0"))
{
_response.ResponseCode = "1";
_log.ErrorFormat("Error Occured On ReconcileReport Method At GMENepalApi ! Details :" + model);
}
}
else
{
_log.Error("Error Validating Model!");
}
return _response;
}
#region dataMapping
private GMEBankRequest BankModelMap(BankRequest bK)
{
return new GMEBankRequest()
{
PaymentMethod = bK.PaymentMethod,
ReceivingCountry = bK.CountryCode
};
}
private GMEBankBranchRequest BankBranchModelMap(BankRequest bK)
{
return new GMEBankBranchRequest()
{
BankCode = bK.BankName
};
}
private GMEGetCalculationRequest GetExRateModelMap(ExchangeRate eR)
{
return new GMEGetCalculationRequest()
{
CalculateBy = eR.CalcBy,
PaymentMethod = eR.PaymentType == "Wallet" ? "W" : eR.PaymentType,
ReceivingAgentId = eR.PAgentName,
ReceivingCountry = eR.PCountryName,
RemitAmount = eR.CalcBy == "P" ? eR.CAmount.ToString() : eR.PAmount.ToString()
};
}
private GMESendMoney SendModelMap(SendTransaction sT)
{
return new GMESendMoney()
{
Signature = GetSignature(sT),
ControlNo = sT.Transaction.JMEControlNo,
PayoutCurrency = sT.Transaction.PCurr,
SenderCostRate = "",
ReceiverCostRate = Convert.ToString(sT.Transaction.SettlementDollarRate),
ExConfirmId = null,
MembershipId = null,
CustomerName = sT.Sender.SFullName,
CustomerAddress = sT.Sender.SAddress,
CustomerContact = sT.Sender.SMobile,
CustomerCity = sT.Sender.SCityId,
CustomerCountry = sT.Sender.SCountryName,
CustomerIdType = sT.Sender.SIdType,
CustomerIdNumber = sT.Sender.SIdNo,
BeneName = sT.Receiver.RFullName,
BeneAddress = sT.Receiver.RAdd1,
BeneContact = sT.Receiver.RMobile,
BeneCity = sT.Receiver.RCity,
BeneCountry = sT.Receiver.RCountry,
Profession = sT.Sender.SOccuptionName,
IncomeSource = sT.Sender.SourceOfFund,
Relationship = sT.Receiver.RelWithSenderName,
PurposeOfRemittance = sT.Transaction.PurposeOfRemittanceName,
SendingAmount = sT.Transaction.TAmt.ToString(),
ReceivingAmount = sT.Transaction.PAmt.ToString(),
PaymentMethod = sT.Transaction.PaymentType,
BankCode = sT.Agent.PBankId,
BankName = sT.Agent.PBankName,
BankBranchName = sT.Agent.PBankBranchName,
BankAccountNumber = sT.Receiver.RAccountNo,
TransactionDate = sT.Transaction.TxnDate,
CollectionCurrency = sT.Transaction.CollCurr,
CollectionAmount = sT.Transaction.CAmt,
ExRate = sT.Transaction.ExRate,
PayoutCommCurr = "NPR",
CalculateBy = "P",/*sT.Transaction.CalBy*/
FreeCharge = Convert.ToString(sT.Transaction.ServiceCharge) /*sT.Transaction.IsManualSc*/
};
}
private string GetSignature(SendTransaction sT)
{
string sign = "";
if (sT.Agent.PBankId.ToLower() == "imepay" || sT.Agent.PBankId.ToLower() == "khalti")
sign = GMEKey + PartnerId + UserName + Password + sT.Receiver.RAccountNo + sT.Transaction.PAmt;
else
sign = GMEKey + UserName + Password + sT.Transaction.JMEControlNo + sT.Transaction.PAmt + sT.Receiver.RAccountNo + sT.Agent.PBankId;
StringBuilder builder = new StringBuilder();
using (SHA256 sha256Hash = SHA256.Create())
{
// ComputeHash - returns byte array
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(sign));
// Convert byte array to a string
for (int i = 0; i < bytes.Length; i++)
{
builder.Append(bytes[i].ToString("x2"));
}
}
return builder.ToString();
}
private GMESendMoneyV2 SendV2ModelMap(SendTransaction sT)
{
GMESendMoney model = SendModelMap(sT);
return new GMESendMoneyV2()
{
GMESendMoney = model,
PCostRate = sT.Transaction.ExRate.ToString(),
SCostRate = sT.Transaction.SettlementDollarRate.ToString()
};
}
private GMEGetStatus StatusModelMap(GetStatus gS)
{
return new GMEGetStatus()
{
PinNo = gS.ControlNo
};
}
private GMEGetStatusByPartnerPinNo StatusByPartmerIdModelMap(GetStatus gS)
{
return new GMEGetStatusByPartnerPinNo()
{
PinNo = gS.PartnerPinNo
};
}
private GMECancelTransaction CancelTxnModelMap(CancelTxn cT)
{
return new GMECancelTransaction()
{
PinNo = cT.PartnerPinNo
};
}
private GMEReconcileReport ReconcileReportMap(TxnAmendment rR)
{
return new GMEReconcileReport()
{
FromDate = rR.FromDate,
ReportType = rR.ReportType,
ToDate = rR.ToDate
};
}
private GMEGetAgentSOABalance SOABalanceModelMap(AgentSOAReport aR)
{
return new GMEGetAgentSOABalance()
{
AgentMapCode = aR.AgentMapCode
};
}
#endregion dataMapping
}
}