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.
 
 
 

433 lines
30 KiB

USE [FastMoneyPro_Remit]
GO
ALTER PROCEDURE [dbo].[proc_ExchangeRate]
@User VARCHAR(100),
@senderId BIGINT,
@pCountryId INT,
@deliveryMethodId INT,
@pBankId BIGINT = NULL,
@pBranchId BIGINT = NULL,
@collCurr VARCHAR(3),
@payoutCurr VARCHAR(3),
@collAmt MONEY,
@payoutAmt MONEY,
@calBy CHAR(1),
@tpExRate DECIMAL(30,12),
@payOutPartnerId BIGINT,
@paymentType VARCHAR(20),
@processId VARCHAR(40)
AS
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRY
DECLARE @complianceRuleId INT
,@cAmtUSD MONEY
,@complienceMessage VARCHAR(1000) = NULL
,@shortMsg VARCHAR(100) = NULL
,@complienceErrorCode TINYINT = NULL
,@compErrorCode INT
,@FOREX_SESSION_ID VARCHAR(40)
,@schemeId VARCHAR(10) = NULL
,@discountType VARCHAR(2) = null
,@discountvalue MONEY =NULL
,@couponType VARCHAR(3) = NULL
,@discountPercent MONEY = NULL
,@couponName VARCHAR(20) = NULL
,@customerType INT
IF @paymentType IS NULL
SET @paymentType = 'WALLET'
DECLARE @sCurrCostRate FLOAT ,@sCurrHoMargin FLOAT ,@pCurrCostRate FLOAT ,@customerRate FLOAT ,@sAgentSettRate FLOAT,@exRate DECIMAL(12,9),@sCountryId INT
DECLARE @iServiceCharge MONEY ,@iTAmt MONEY ,@iPAmt MONEY ,@iCAmt MONEY ,@iCustomerRate FLOAT
DECLARE @place INT ,@currDecimal INT
DECLARE @agentAvlLimit MONEY
DECLARE @msg VARCHAR(MAX)
DECLARE @sAgent BIGINT,@sAgentName VARCHAR(100),@sBranch INT,@sBranchName VARCHAR(100),@sSuperAgent INT,@sSuperAgentName VARCHAR(100)
DECLARE @serviceCharge MONEY,@tAmt MONEY,@scDiscount MONEY = 0
DECLARE @Status VARCHAR(10),@sBirthDate DATE,@sIdIssueDate DATE,@sIdExpiryDate DATE,@senderName VARCHAR(100),@sIdNo VARCHAR(50),@sIdType VARCHAR(50)
,@sMobile VARCHAR(15),@sOccupation VARCHAR(50)
DECLARE @pBranch BIGINT,@pAgent BIGINT,@pSuperAgent BIGINT,@pAgentName VARCHAR(100),@receiverName VARCHAR(100)
SELECT @sCountryId = 118,@sBranch = 2080
SELECT @sAgent = sAgent, @sAgentName = sAgentName, @sBranch = sBranch, @sBranchName = sBranchName,
@sSuperAgent = sSuperAgent, @sSuperAgentName = sSuperAgentName
FROM dbo.FNAGetBranchFullDetails(@sBranch)
----SELECT @pCountry = COUNTRYNAME FROM COUNTRYMASTER (NOLOCK) WHERE COUNTRYID = @pCountryId
SELECT TOP 1 @pAgent = AM.agentId
FROM agentMaster AM(NOLOCK)
WHERE AM.parentId = @payOutPartnerId AND agentType = 2903
AND AM.isSettlingAgent = 'Y' AND AM.isApiPartner = 1
IF EXISTS( SELECT TOP 1 'x'
FROM dbo.TblPartnerwiseCountry(NOLOCK)
WHERE IsActive = 1
AND AgentId=@payOutPartnerId
AND CountryId=@pCountryId
AND PaymentMethod = @deliveryMethodId
AND PartnerRate = 1)
BEGIN
IF ISNULL(@tpExRate,0) = 0
BEGIN
EXEC proc_errorHandler 5,'Fetch rate from partner side',NULL
RETURN
END
END
SELECT @pSuperAgent = sSuperAgent,@pAgent = sAgent,@pAgentName = sAgentName FROM dbo.FNAGetBranchFullDetails(@pAgent)
BEGIN
SELECT TOP 1
@senderId = customerId ,
@sIdNo = idNumber,
@sIdType = idType,
@agentAvlLimit = dbo.FNAGetCustomerACBal(email),
@Status = CASE WHEN approvedDate IS NULL THEN 'pending' ELSE 'verified' END,
@customerType = customerType
FROM customerMaster WITH ( NOLOCK )
WHERE email = @User AND approvedDate IS NOT NULL
IF ISNULL(@Status,'pending') = 'pending'
BEGIN
EXEC proc_errorHandler 1,'Your account is not yet verified,Call:15886864 for verification.',NULL
RETURN
END
IF @paymentType='autodebit'
BEGIN
DECLARE @DATE DATETIME, @NextDate datetime
select @DATE = CAST(GETDATE() AS DATE)
SELECT @NextDate = DATEADD(DAY,1,@DATE)
SELECT @DATE = @DATE+' 23:20:00',@NextDate = @NextDate+' 00:40:00'
IF GETDATE() BETWEEN @DATE AND @NextDate
BEGIN
SELECT '1' ErrorCode ,'KFTC service is not available between 11:30 PM to 12:30 AM' Msg ,NULL ID
RETURN
END
END
SELECT TOP 1 @sIdType = detailTitle FROM staticDataValue(NOLOCK) WHERE valueId = @sIdType
SELECT TOP 1 @place = place ,
@currDecimal = currDecimal
FROM currencyPayoutRound(NOLOCK)
WHERE ISNULL(isDeleted, 'N') = 'N'
AND currency = @payoutCurr AND tranType IS NULL;
SET @currDecimal = ISNULL(@currDecimal,0)
IF @payoutCurr IS NULL
BEGIN
EXEC proc_errorHandler 1,'Currency not been defined yet for receiving country.',NULL
RETURN;
END;
SELECT
@sCurrCostRate = sCurrCostRate
,@sCurrHoMargin = sCurrHoMargin
,@sAgentSettRate = sAgentSettRate
,@customerRate = customerRate
,@pCurrCostRate = pCurrCostRate
FROM dbo.FNAGetExRate(@sCountryId, @sAgent, @sBranch, @collCurr, @pCountryId, @pAgent, @payoutCurr, @deliveryMethodId)
IF ISNULL(@sAgentSettRate, 0) = 0
BEGIN
SET @msg = 'Exchange rate not defined yet for sending currency (' + @payoutCurr + ')'
EXEC proc_errorHandler 1,@msg,NULL
RETURN
END
----## FOR RIA AND CONTACT "LOG" GET ONE TIME RATE FROM PARTNER AND STORE IN TABLE ,"SYSTEM" IS FOR GME RATE,"PARTNER" GET RATE FROM PARTNER END REALTIME
IF EXISTS(SELECT TOP 1 'X' FROM TblPartnerwiseCountry(NOLOCK) WHERE AgentId = @payOutPartnerId AND PaymentMethod = @deliveryMethodId AND IsActive = 1 AND GetRateFrom='Log')
BEGIN
SELECT TOP 1 @tpExRate = CurrCostRate FROM TBL_PARTNER_COST_RATE(NOLOCK)
WHERE ProviderId = @payOutPartnerId AND GETDATE() BETWEEN EffectiveFrom AND EffectiveTo
AND ToCurr = @payoutCurr AND FromCurr = 'USD' ORDER BY CreatedDate desc
IF ISNULL(@tpExRate, 0) = 0
BEGIN
SET @msg = 'Exchange rate not defined yet for currency (' + @payoutCurr + ')'
EXEC proc_errorHandler 5,@msg,NULL
RETURN
END
END
IF @tpExRate IS NOT NULL
BEGIN
SELECT @exRate = ROUND(ISNULL(@tpExRate,0)/@sAgentSettRate, 8),@pCurrCostRate = @tpExRate
END
ELSE
SELECT @exRate = @customerRate
IF @exRate IS NULL
BEGIN
SET @msg = 'Exchange rate not defined yet for sending currency (' + @payoutCurr + ')'
EXEC proc_errorHandler 1,@msg,NULL
RETURN
END;
----- Calculation service charge using coupon
-- IF EXISTS ( SELECT '1'
-- FROM CouponIssue(NOLOCK) AS CI
-- INNER JOIN CouponSetup(NOLOCK) AS CS
-- ON CI.couponId = CS.rowId
-- WHERE CI.customerId = @senderId
-- AND CI.endDate >= GETDATE()
-- AND CI.isActive = 'Y'
-- AND CS.endDate >= GETDATE()
-- AND CS.isActive = 'Y'
-- AND CS.couponType = '1'
-- AND CS.couponType = '1'
-- AND (ISNULL(CS.usageLimit,0) = 0
-- OR ISNULL(CS.usageLimit,0) > ISNULL(CI.usedCount,0))
-- )
--BEGIN
SELECT TOP(1) @discountType = CS.discountType,
@couponName = CS.couponName,
@discountvalue = CS.discountValue,
@schemeId = CI.rowId, -- ADD coponIssue ID
@couponType = CS.couponType
FROM CouponIssue(NOLOCK) CI
INNER JOIN CouponSetup(NOLOCK) CS ON CI.couponId = CS.rowId
AND CI.isActive = 'Y'
AND CI.endDate >= GETDATE()
AND CS.endDate >= GETDATE()
AND CS.isActive = 'Y'
AND CS.couponType = '1'
AND customerId = @senderId
AND CS.couponType = '1'
AND (ISNULL(CS.usageLimit,0) = 0
OR CS.usageLimit > CI.usedCount)
ORDER BY CI.rowId ASC
IF @discountType ='2'
BEGIN
SET @scDiscount = @discountvalue
END
--END
IF @calBy = 'C'
BEGIN
SELECT @serviceCharge = amount
FROM [dbo].FNAGetServiceCharge(@sCountryId,@sSuperAgent,@sAgent,@sBranch,
@pCountryId,@pSuperAgent,@pAgent,@pBranch,@deliveryMethodId,@collAmt,@collCurr);
IF @serviceCharge IS NULL
BEGIN
EXEC proc_errorHandler 1,'Service charge not defined yet for receiving country',NULL
RETURN
END
IF @discountType = '1'
BEGIN
SET @discountPercent = @discountvalue
SET @discountvalue = @serviceCharge * (@discountvalue/100)
SET @scDiscount = @discountvalue
END
SET @tAmt = @collAmt - @serviceCharge;
SET @payoutAmt = ( @collAmt - @serviceCharge ) * @exRate
IF @payoutCurr = 'USD'
SET @payoutAmt = ROUND(@payoutAmt,2)
ELSE
SET @payoutAmt = ROUND(@payoutAmt,0)
END
ELSE IF @calBy = 'P'
BEGIN
SET @tAmt = @payoutAmt / @exRate
SELECT @serviceCharge = amount
FROM [dbo].FNAGetServiceCharge(@sCountryId,@sSuperAgent,@sAgent,@sBranch,
@pCountryId,@pSuperAgent,@pAgent,@pBranch,@deliveryMethodId,@tAmt, @collCurr);
IF @serviceCharge IS NULL
BEGIN
EXEC proc_errorHandler 1,'Service charge not defined yet for receiving country',NULL
RETURN
END
IF @discountType = '1'
BEGIN
SET @discountPercent = @discountvalue
SET @discountvalue = @serviceCharge * (@discountvalue/100)
SET @scDiscount = @discountvalue
END
SET @tAmt = ROUND(@tAmt, 2);
SET @collAmt = ( @tAmt + @serviceCharge )
SET @collAmt = ROUND(@collAmt, 0)
END
IF @serviceCharge > @collAmt
BEGIN
EXEC proc_errorHandler 1,'COLLECTION AMOUNT SHOULD BE MORE THAN SERVICE CHARGE',NULL
RETURN
END
/* Easy Remit limit check */
IF @customerType = '11048'
BEGIN
IF ISNULL(@collAmt, 0) > 1000000
BEGIN
EXEC proc_errorHandler 1,'You cannot remit more than one million(KRW)', NULL
RETURN
END
END
IF ISNULL(@paymentType,'wallet') = 'wallet'
BEGIN
IF ISNULL(@agentAvlLimit, 1) < ISNULL(@collAmt, 0)
BEGIN
EXEC proc_errorHandler 1,'You donot have sufficient balance to do the transaction',NULL
RETURN;
END
END
DECLARE @errorCode VARCHAR(5) ='0',@trantype VARCHAR(30)
SET @trantype = CAST(@deliveryMethodId AS VARCHAR(30))
--select flag = 's-limit', cAmt = @collAmt, pAmt = @payoutAmt, sCountryId = @sCountryId
-- ,deliveryMethod = @trantype,pCountryId = @pCountryId,pCurr = @payoutCurr, collCurr = @collCurr
-- ,pAgent = @pAgent, sAgent = @sAgent, sBranch = @sBranch
--4. Validate Country Sending Limit
EXEC PROC_CHECKCOUNTRYLIMIT @flag = 's-limit', @cAmt = @tAmt, @pAmt = @payoutAmt, @sCountryId = @sCountryId
,@deliveryMethod = @trantype,@pCountryId = @pCountryId,@pCurr = @payoutCurr, @collCurr = @collCurr
,@pAgent = @pAgent, @sAgent = @sAgent, @sBranch = @sBranch
,@msg = @msg OUT, @errorCode = @errorCode OUT
IF @errorCode <> '0'
BEGIN
EXEC proc_errorHandler @errorCode,@msg,NULL
RETURN
END
----Validate Country Sending Limit END
----5. Validate Country Receiving Limit
EXEC PROC_CHECKCOUNTRYLIMIT @flag = 'r-limit', @cAmt = @tAmt, @pAmt = @payoutAmt, @sCountryId = @sCountryId, @collMode = NULL
,@deliveryMethod = @deliveryMethodId,@sendingCustType = NULL,@pCountryId = @pCountryId,@pCurr = @payoutCurr, @collCurr = @collCurr
,@pAgent = @pAgent, @sAgent = @sAgent, @sBranch = @sBranch
,@msg = @msg OUT, @errorCode = @errorCode OUT
IF @errorCode <> '0'
BEGIN
SELECT @errorCode ErrorCode, @msg Msg,null Id
RETURN
END
----Validate Country Receiving Limit
SET @cAmtUSD = @tAmt / (@sCurrCostRate + ISNULL(@sCurrHoMargin, 0))
EXEC [proc_complianceRuleDetail]
@flag = 'sender-limit'
,@user = @user
,@sIdType = @sIdType
,@sIdNo = @sIdNo
,@receiverName = null
,@cAmt = @tAmt
,@cAmtUSD = @cAmtUSD
,@customerId = @senderId
,@pCountryId = @pCountryId
,@deliveryMethod= @deliveryMethodId
,@message = @complienceMessage OUTPUT
,@shortMessage = @shortMsg OUTPUT
,@errCode = @complienceErrorCode OUTPUT
,@ruleId = @complianceRuleId OUTPUT
IF(@complienceErrorCode <> 0)
BEGIN
IF(@complienceErrorCode = 1)
BEGIN
SET @compErrorCode = 101
END
ELSE
BEGIN
SET @compErrorCode = 101
INSERT remitTranComplianceTemp(csDetailTranId, matchTranId, agentRefId)
SELECT @complianceRuleId, NULL, @processId
--SELECT 102 errorCode,@msg msg, @complienceErrorCode id, @complienceMessage compApproveRemark,'compliance' vtype
END
INSERT INTO ComplianceLog(senderName, senderCountry, senderIdType, senderIdNumber, senderMobile, receiverName
, receiverCountry,payOutAmt,complianceId,complianceReason,complainceDetailMessage,createdBy,createdDate,logType)
SELECT @senderName, '118', @sIdType, @sIdNo, @sMobile, @receiverName
, @pCountryId, @collAmt, @complianceRuleId, @shortMsg, @complienceMessage, @user, GETDATE(),'online'
END
------------Validation End---------------------------------
IF @complienceErrorCode = '1'
BEGIN
EXEC proc_errorHandler @compErrorCode,@shortMsg,@complienceErrorCode
RETURN;
END;
SET @FOREX_SESSION_ID = NEWID()
DECLARE @id BIGINT
----## lock ex rate for individual txn
UPDATE exRateCalcHistory SET isExpired = 1 WHERE CUSTOMER_ID = @senderId AND isExpired = 0
INSERT INTO exRateCalcHistory (
CUSTOMER_ID,[USER_ID],FOREX_SESSION_ID,serviceCharge,pAmt,customerRate,sCurrCostRate,sCurrHoMargin
,sCurrAgentMargin,pCurrCostRate,pCurrHoMargin,pCurrAgentMargin,agentCrossSettRate,createdDate,isExpired,tAmt,schemeId
)
SELECT @senderId,@user,@FOREX_SESSION_ID,@serviceCharge,@payoutAmt,@exRate,@sCurrCostRate,@sCurrHoMargin
,0,@pCurrCostRate,0,0,@exRate,GETDATE(),0,@tAmt,@schemeId
SET @id = @@IDENTITY
SELECT ErrorCode = @errorCode ,
Msg = 'Message' ,
Id = @id,
scCharge = @serviceCharge ,
exRateDisplay = ROUND(@exRate , 6, -1),
exRate = @exRate,
pCurr = @payoutCurr ,
collAmt = @collAmt ,
pAmt = @payoutAmt ,
sAmt = ROUND(@tAmt, 0) ,
collCurr = @collCurr,
scDiscount = @scDiscount ,
tpExRate = @pCurrCostRate,
EXRATEID = @FOREX_SESSION_ID,
payOutPartnerId = @payOutPartnerId,
schemeId = ISNULL(@schemeId,''),
couponType = ISNULL(@couponType,''),
discountType = ISNULL(@discountType,''),
discountvalue = ISNULL(@scDiscount,''),
discountPercent = ISNULL(@discountPercent,''),
couponName = ISNULL(@couponName,'')
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT<>0
ROLLBACK TRANSACTION
DECLARE @errorMessage VARCHAR(MAX)
SET @errorMessage = ERROR_MESSAGE()
EXEC proc_errorHandler 1, @errorMessage, @user
END CATCH
GO