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