/****** Object: StoredProcedure [dbo].[uspMatchPayment] Script Date: 12/9/2020 10:06:04 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[uspMatchPayment] @PaymentID INT = NULL, @AuditUserId INT = NULL AS BEGIN BEGIN TRY ---CHECK IF PAYMENTID EXISTS IF NOT @PaymentID IS NULL BEGIN IF NOT EXISTS ( SELECT PaymentID FROM tblPayment WHERE PaymentID = @PaymentID AND ValidityTo IS NULL) RETURN 1 END SET @AuditUserId =ISNULL(@AuditUserId, -1) DECLARE @InTopIsolation as bit SET @InTopIsolation = -1 IF @@TRANCOUNT = 0 SET @InTopIsolation =0 ELSE SET @InTopIsolation =1 IF @InTopIsolation = 0 BEGIN BEGIN TRANSACTION MATCHPAYMENT END DECLARE @tblHeader TABLE(PaymentID BIGINT, officerCode nvarchar(12),PhoneNumber nvarchar(12),paymentDate DATE,ReceivedAmount DECIMAL(18,2),TotalPolicyValue DECIMAL(18,2), isValid BIT, TransactionNo NVARCHAR(50)) DECLARE @tblDetail TABLE(PaymentDetailsID BIGINT, PaymentID BIGINT, InsuranceNumber nvarchar(12),productCode nvarchar(8), enrollmentDate DATE,PolicyStage CHAR(1), MatchedDate DATE, PolicyValue DECIMAL(18,2),DistributedValue DECIMAL(18,2), policyID INT, RenewalpolicyID INT, PremiumID INT, PolicyStatus INT,AlreadyPaidDValue DECIMAL(18,2)) DECLARE @tblResult TABLE(policyID INT, PremiumId INT) DECLARE @tblFeedback TABLE(fdMsg NVARCHAR(MAX), fdType NVARCHAR(1),paymentID INT,InsuranceNumber nvarchar(12),PhoneNumber nvarchar(12),productCode nvarchar(8), Balance DECIMAL(18,2), isActivated BIT, PaymentFound INT, PaymentMatched INT, APIKey NVARCHAR(100)) DECLARE @tblPaidPolicies TABLE(PolicyID INT, Amount DECIMAL(18,2), PolicyValue DECIMAL(18,2)) DECLARE @tblPeriod TABLE(startDate DATE, expiryDate DATE, HasCycle BIT) DECLARE @paymentFound INT DECLARE @paymentMatched INT --GET ALL UNMATCHED RECEIVED PAYMENTS INSERT INTO @tblDetail(PaymentDetailsID, PaymentID, InsuranceNumber, ProductCode, enrollmentDate, policyID, PolicyStage, PolicyValue, PremiumID,PolicyStatus, AlreadyPaidDValue) SELECT PaymentDetailsID, PaymentID, InsuranceNumber, ProductCode, EnrollDate, PolicyID, PolicyStage, PolicyValue, PremiumId, PolicyStatus, AlreadyPaidDValue FROM( SELECT ROW_NUMBER() OVER(PARTITION BY PR.ProductCode,I.CHFID ORDER BY PL.EnrollDate DESC) RN, PD.PaymentDetailsID, PY.PaymentID,PD.InsuranceNumber, PD.ProductCode,PL.EnrollDate, PL.PolicyID, PD.PolicyStage, PL.PolicyValue, PRM.PremiumId, PL.PolicyStatus, (SELECT SUM(PDD.Amount) FROM tblPaymentDetails PDD INNER JOIN tblPayment PYY ON PDD.PaymentID = PYY.PaymentID WHERE PYY.MatchedDate IS NOT NULL and PDD.ValidityTo is NULL) AlreadyPaidDValue FROM tblPaymentDetails PD LEFT OUTER JOIN tblInsuree I ON I.CHFID = PD.InsuranceNumber LEFT OUTER JOIN tblFamilies F ON F.FamilyID = I.FamilyID LEFT OUTER JOIN tblProduct PR ON PR.ProductCode = PD.ProductCode LEFT OUTER JOIN (SELECT PolicyID, EnrollDate, PolicyValue,FamilyID, ProdID,PolicyStatus FROM tblPolicy WHERE ProdID = ProdID AND FamilyID = FamilyID AND ValidityTo IS NULL AND PolicyStatus NOT IN (4,8) ) PL ON PL.ProdID = PR.ProdID AND PL.FamilyID = I.FamilyID LEFT OUTER JOIN ( SELECT MAX(PremiumId) PremiumId , PolicyID FROM tblPremium WHERE ValidityTo IS NULL GROUP BY PolicyID ) PRM ON PRM.PolicyID = PL.PolicyID INNER JOIN tblPayment PY ON PY.PaymentID = PD.PaymentID WHERE PD.PremiumID IS NULL AND PD.ValidityTo IS NULL AND I.ValidityTo IS NULL AND PR.ValidityTo IS NULL AND F.ValidityTo IS NULL AND PY.ValidityTo IS NULL AND PY.PaymentStatus = 4 --Received Payment AND PD.PaymentID = ISNULL(@PaymentID,PD.PaymentID) )XX --WHERE RN =1 INSERT INTO @tblHeader(PaymentID, ReceivedAmount, PhoneNumber, TotalPolicyValue, TransactionNo, officerCode) SELECT P.PaymentID, P.ReceivedAmount, P.PhoneNumber, D.TotalPolicyValue, P.TransactionNo, P.OfficerCode FROM tblPayment P INNER JOIN (SELECT PaymentID, SUM(PolicyValue) TotalPolicyValue FROM @tblDetail GROUP BY PaymentID) D ON P.PaymentID = D.PaymentID WHERE P.ValidityTo IS NULL AND P.PaymentStatus = 4 IF EXISTS(SELECT COUNT(1) FROM @tblHeader PH ) BEGIN SET @paymentFound= (SELECT COUNT(1) FROM @tblHeader PH ) INSERT INTO @tblFeedback(fdMsg, fdType ) SELECT CONVERT(NVARCHAR(4), ISNULL(@paymentFound,0)) +' Unmatched Payment(s) found ', 'I' END /********************************************************************************************************************** VALIDATION STARTS *********************************************************************************************************************/ --1. Insurance number is missing on tblPaymentDetails IF EXISTS(SELECT 1 FROM @tblDetail WHERE LEN(ISNULL(InsuranceNumber,'')) = 0) BEGIN INSERT INTO @tblFeedback(fdMsg, fdType, paymentID ) SELECT CONVERT(NVARCHAR(4), COUNT(1) OVER(PARTITION BY InsuranceNumber)) +' Insurance number(s) missing in tblPaymentDetails ', 'E', PaymentID FROM @tblDetail WHERE LEN(ISNULL(InsuranceNumber,'')) = 0 END --2. Product code is missing on tblPaymentDetails INSERT INTO @tblFeedback(fdMsg, fdType, paymentID ) SELECT 'Family with Insurance Number ' + QUOTENAME(PD.InsuranceNumber) + ' is missing product code ', 'E', PD.PaymentID FROM @tblDetail PD WHERE LEN(ISNULL(productCode,'')) = 0 --2. Insurance number is missing in tblinsuree INSERT INTO @tblFeedback(fdMsg, fdType, paymentID ) SELECT 'Family with Insurance Number' + QUOTENAME(PD.InsuranceNumber) + ' does not exists', 'E', PD.PaymentID FROM @tblDetail PD LEFT OUTER JOIN tblInsuree I ON I.CHFID = PD.InsuranceNumber WHERE I.ValidityTo IS NULL AND I.CHFID IS NULL --1. Policy/Prevous Policy not found INSERT INTO @tblFeedback(fdMsg, fdType, paymentID ) SELECT 'Family with Insurance Number ' + QUOTENAME(PD.InsuranceNumber) + ' does not have Policy or Previous Policy for the product '+QUOTENAME(PD.productCode), 'E', PD.PaymentID FROM @tblDetail PD WHERE policyID IS NULL AND ISNULL(LEN(PD.productCode),'') > 0 AND ISNULL(LEN(PD.InsuranceNumber),'') > 0 --3. Invalid Product INSERT INTO @tblFeedback(fdMsg, fdType, paymentID) SELECT 'Family with insurance number '+ QUOTENAME(PD.InsuranceNumber) +' can not enroll to product '+ QUOTENAME(PD.productCode),'E',PD.PaymentID FROM @tblDetail PD INNER JOIN tblInsuree I ON I.CHFID = PD.InsuranceNumber INNER JOIN tblFamilies F ON F.InsureeID = I.InsureeID INNER JOIN tblVillages V ON V.VillageId = F.LocationId INNER JOIN tblWards W ON W.WardId = V.WardId INNER JOIN tblDistricts D ON D.DistrictId = W.DistrictId INNER JOIN tblRegions R ON R.RegionId = D.Region LEFT OUTER JOIN tblProduct PR ON (PR.LocationId IS NULL OR PR.LocationId = D.Region OR PR.LocationId = D.DistrictId) AND (GETDATE() BETWEEN PR.DateFrom AND PR.DateTo) AND PR.ProductCode = PD.ProductCode WHERE I.ValidityTo IS NULL AND F.ValidityTo IS NULL AND PR.ValidityTo IS NULL AND PR.ProdID IS NULL AND ISNULL(LEN(PD.productCode),'') > 0 AND ISNULL(LEN(PD.InsuranceNumber),'') > 0 --4. Invalid Officer INSERT INTO @tblFeedback(fdMsg, fdType, paymentID) SELECT 'Enrollment officer '+ QUOTENAME(PY.officerCode) +' does not exists ' ,'E',PD.PaymentID FROM @tblDetail PD INNER JOIN @tblHeader PY ON PY.PaymentID = PD.PaymentID LEFT OUTER JOIN tblOfficer O ON O.Code = PY.OfficerCode WHERE O.ValidityTo IS NULL AND PY.OfficerCode IS NOT NULL AND O.Code IS NULL --4. Invalid Officer/Product Match INSERT INTO @tblFeedback(fdMsg, fdType, paymentID) SELECT 'Enrollment officer '+ QUOTENAME(PY.officerCode) +' can not sell the product '+ QUOTENAME(PD.productCode),'E',PD.PaymentID FROM @tblDetail PD INNER JOIN @tblHeader PY ON PY.PaymentID = PD.PaymentID LEFT OUTER JOIN tblOfficer O ON O.Code = PY.OfficerCode INNER JOIN tblDistricts D ON D.DistrictId = O.LocationId LEFT JOIN tblProduct PR ON PR.ProductCode = PD.ProductCode AND (PR.LocationId IS NULL OR PR.LocationID = D.Region OR PR.LocationId = D.DistrictId) WHERE O.ValidityTo IS NULL AND PY.OfficerCode IS NOT NULL AND PR.ValidityTo IS NULL AND D.ValidityTo IS NULL AND PR.ProdID IS NULL --5. Premiums not available INSERT INTO @tblFeedback(fdMsg, fdType, paymentID) SELECT 'Premium from Enrollment officer '+ QUOTENAME(PY.officerCode) +' is not yet available ','E',PD.PaymentID FROM @tblDetail PD INNER JOIN @tblHeader PY ON PY.PaymentID = PD.PaymentID WHERE PD.PremiumID IS NULL AND PY.officerCode IS NOT NULL /********************************************************************************************************************** VALIDATION ENDS *********************************************************************************************************************/ ---DELETE ALL INVALID PAYMENTS DELETE PY FROM @tblHeader PY INNER JOIN @tblFeedback F ON F.paymentID = PY.PaymentID WHERE F.fdType ='E' DELETE PD FROM @tblDetail PD INNER JOIN @tblFeedback F ON F.paymentID = PD.PaymentID WHERE F.fdType ='E' IF NOT EXISTS(SELECT 1 FROM @tblHeader) INSERT INTO @tblFeedback(fdMsg, fdType ) SELECT 'No Payment matched ', 'I' FROM @tblHeader P --DISTRIBUTE PAYMENTS DECLARE @curPaymentID int, @ReceivedAmount DECIMAL(18,2), @TotalPolicyValue DECIMAL(18,2), @AmountAvailable DECIMAL(18,2) DECLARE CUR_Pay CURSOR FAST_FORWARD FOR SELECT PH.PaymentID, ReceivedAmount, TotalPolicyValue FROM @tblHeader PH OPEN CUR_Pay FETCH NEXT FROM CUR_Pay INTO @curPaymentID, @ReceivedAmount WHILE @@FETCH_STATUS = 0 BEGIN SET @AmountAvailable = @ReceivedAmount SELECT @TotalPolicyValue = SUM(PD.PolicyValue-PD.DistributedValue-Pd.AlreadyPaidDValue ) FROM @tblDetail pd WHERE pd.PaymentID = @curPaymentID and PD.PolicyValue > (PD.DistributedValue + PD.AlreadyPaidDValue) WHILE @AmountAvailable > 0 or @AmountAvailable = @ReceivedAmount - @TotalPolicyValue begin UPDATE PD SET PD.DistributedValue = CASE WHEN @TotalPolicyValue <= @AmountAvailable THEN PD.PolicyValue WHEN @AmountAvailable*( PD.PolicyValue/@TotalPolicyValue)< PD.PolicyValue THEN @AmountAvailable*( PD.PolicyValue/@TotalPolicyValue) ELSE PD.PolicyValue END FROM @tblDetail PD where pd.PaymentID = @curPaymentID and PD.PolicyValue > PD.DistributedValue SELECT @AmountAvailable = (@ReceivedAmount - SUM(PD.DistributedValue)) FROM @tblDetail pd WHERE pd.PaymentID = @curPaymentID -- update the remainig policyvalue SELECT @TotalPolicyValue = SUM(PD.PolicyValue-PD.DistributedValue-Pd.AlreadyPaidDValue ) FROM @tblDetail pd WHERE pd.PaymentID = @curPaymentID and PD.PolicyValue > (PD.DistributedValue + PD.AlreadyPaidDValue) END FETCH NEXT FROM CUR_Pay INTO @curPaymentID, @ReceivedAmount END -- UPDATE POLICY STATUS DECLARE @DistributedValue DECIMAL(18, 2) DECLARE @InsuranceNumber NVARCHAR(12) DECLARE @productCode NVARCHAR(8) DECLARE @PhoneNumber NVARCHAR(12) DECLARE @PaymentDetailsID INT DECLARE @Ready INT = 16 DECLARe @PolicyStage INT DECLARE @PreviousPolicyID INT DECLARE @PolicyProcessed TABLE(id int, matchedPayment int) DECLARE @AlreadyPaidDValue DECIMAL(18, 2) DECLARE @PremiumId INT -- loop below only INSERT for : -- SELF PAYER RENEW (stage R no officer) -- contribution without payment (Stage N status @ready status with officer) -- PolicyID and PhoneNumber required in both cases IF EXISTS(SELECT 1 FROM @tblDetail PD INNER JOIN @tblHeader P ON PD.PaymentID = P.PaymentID WHERE ((PD.PolicyStage ='R' AND P.officerCode IS NULL ) OR (PD.PolicyStatus=@Ready AND PD.PolicyStage ='N' AND P.officerCode IS NOT NULL))AND P.PhoneNumber IS NOT NULL AND PD.policyID IS NOT NULL) BEGIN DECLARE CurPolicies CURSOR FOR SELECT PaymentDetailsID, InsuranceNumber, productCode, PhoneNumber, DistributedValue, policyID, PolicyStage, AlreadyPaidDValue,PremiumID FROM @tblDetail PD INNER JOIN @tblHeader P ON PD.PaymentID = P.PaymentID OPEN CurPolicies; FETCH NEXT FROM CurPolicies INTO @PaymentDetailsID, @InsuranceNumber, @productCode, @PhoneNumber, @DistributedValue, @PreviousPolicyID, @PolicyStage, @AlreadyPaidDValue, @PremiumID WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @ProdId INT DECLARE @FamilyId INT DECLARE @OfficerID INT DECLARE @PolicyId INT DECLARE @StartDate DATE DECLARE @ExpiryDate DATE DECLARE @EffectiveDate DATE DECLARE @EnrollmentDate DATE = GETDATE() DECLARE @PolicyStatus TINYINT=1 DECLARE @PreviousPolicyStatus TINYINT=1 DECLARE @PolicyValue DECIMAL(18, 2) DECLARE @PaidAmount DECIMAL(18, 2) DECLARE @Balance DECIMAL(18, 2) DECLARE @ErrorCode INT DECLARE @HasCycle BIT DECLARE @isActivated BIT = 0 DECLARE @TransactionNo NVARCHAR(50) -- DECLARE @PolicyStage INT SELECT @ProdId = ProdID, @FamilyId = FamilyID, @OfficerID = OfficerID, @PreviousPolicyStatus = PolicyStatus FROM tblPolicy WHERE PolicyID = @PreviousPolicyID AND ValidityTo IS NULL -- execute the storeProc for PolicyID unknown EXEC @PolicyValue = uspPolicyValue @FamilyId, @ProdId, 0, @PolicyStage, @enrollmentDate, @PreviousPolicyID, @ErrorCode OUTPUT; DELETE FROM @tblPeriod SET @TransactionNo = (SELECT ISNULL(PY.TransactionNo,'') FROM @tblHeader PY INNER JOIN @tblDetail PD ON PD.PaymentID = PY.PaymentID AND PD.policyID = @PreviousPolicyID) DECLARE @Idle TINYINT = 1 DECLARE @Active TINYINT = 2 -- DECLARE @Ready TINYINT = 16 DECLARE @ActivationOption INT SELECT @ActivationOption = ActivationOption FROM tblIMISDefaults -- Get the previous paid amount SELECT @PaidAmount = (SUM(PD.DistributedValue)) FROM @tblDetail pd WHERE Pd.PolicyID = @PreviousPolicyID -- support multiple payment; FIXME should we support hybrid payment (contribution and payment) IF ((@PreviousPolicyStatus = @Idle AND @PolicyStage = 'R') OR (@PreviousPolicyStatus = @Ready AND @ActivationOption = 3 AND @PolicyStage = 'N')) AND (SELECT COUNT(id) FROM @PolicyProcessed WHERE id=@PreviousPolicyID )=0 BEGIN --Get the previous paid amount for only Idle policy -- SELECT @PaidAmount = ISNULL(SUM(Amount),0) FROM tblPremium PR -- LEFT OUTER JOIN tblPolicy PL ON PR.PolicyID = PL.PolicyID -- WHERE PR.PolicyID = @PreviousPolicyID -- AND PR.ValidityTo IS NULL -- AND PL.ValidityTo IS NULL -- AND PL.PolicyStatus = @Idle SELECT @PolicyValue = ISNULL(PolicyValue,0) FROM tblPolicy WHERE PolicyID = @PreviousPolicyID AND ValidityTo IS NULL -- if the policy value is covered and IF ( @AlreadyPaidDValue + ISNULL(@PaidAmount,0)) - ISNULL(@PolicyValue,0) >= 0 BEGIN SET @PolicyStatus = @Active SET @EffectiveDate = (SELECT StartDate FROM tblPolicy WHERE PolicyID = @PreviousPolicyID AND ValidityTo IS NULL) SET @isActivated = 1 SET @Balance = 0 INSERT INTO tblPolicy(FamilyID,EnrollDate,StartDate,EffectiveDate,ExpiryDate,PolicyStatus,PolicyValue,ProdID,OfficerID,PolicyStage,ValidityFrom, ValidityTo, LegacyID, AuditUserID, isOffline) SELECT FamilyID,EnrollDate,StartDate,EffectiveDate,ExpiryDate,PolicyStatus,PolicyValue,ProdID,OfficerID,PolicyStage,ValidityFrom,GETDATE(), PolicyID, AuditUserID, isOffline FROM tblPolicy WHERE PolicyID = @PreviousPolicyID INSERT INTO tblInsureePolicy (InsureeId,PolicyId,EnrollmentDate,StartDate,EffectiveDate,ExpiryDate,ValidityFrom,ValidityTo,LegacyId,AuditUserId,isOffline) SELECT InsureeId, PolicyId, EnrollmentDate, StartDate, EffectiveDate,ExpiryDate,ValidityFrom,GETDATE(),PolicyId,AuditUserId,isOffline FROM tblInsureePolicy WHERE PolicyID = @PreviousPolicyID AND ValidityTo IS NULL UPDATE tblPolicy SET PolicyStatus = @PolicyStatus, EffectiveDate = @EffectiveDate, ExpiryDate = @ExpiryDate, ValidityFrom = GETDATE(), AuditUserID = @AuditUserId WHERE PolicyID = @PreviousPolicyID UPDATE tblInsureePolicy SET EffectiveDate = @EffectiveDate, ValidityFrom = GETDATE(), AuditUserID = @AuditUserId WHERE ValidityTo IS NULL AND PolicyId = @PreviousPolicyID AND EffectiveDate IS NULL SET @PolicyId = @PreviousPolicyID END ELSE BEGIN SET @Balance = ISNULL(@PolicyValue,0) - (ISNULL(@DistributedValue,0) + ISNULL(@PaidAmount,0)) SET @isActivated = 0 SET @PolicyId = @PreviousPolicyID END -- mark the policy as processed INSERT INTO @PolicyProcessed (id,matchedpayment) VALUES (@PreviousPolicyID,1) END ELSE IF @PreviousPolicyStatus NOT IN ( @Idle, @Ready) AND (SELECT COUNT(id) FROM @PolicyProcessed WHERE id=@PreviousPolicyID )=0 -- FIXME should we renew suspended ? BEGIN --insert new Renewals if the policy is not Iddle DECLARE @StartCycle NVARCHAR(5) SELECT @StartCycle= ISNULL(StartCycle1, ISNULL(StartCycle2,ISNULL(StartCycle3,StartCycle4))) FROM tblProduct WHERE ProdID = @PreviousPolicyID IF @StartCycle IS NOT NULL SET @HasCycle = 1 ELSE SET @HasCycle = 0 SET @EnrollmentDate = (SELECT DATEADD(DAY,1,expiryDate) FROM tblPolicy WHERE PolicyID = @PreviousPolicyID AND ValidityTo IS NULL) INSERT INTO @tblPeriod(StartDate, ExpiryDate, HasCycle) EXEC uspGetPolicyPeriod @ProdId, @EnrollmentDate, @HasCycle; SET @StartDate = (SELECT startDate FROM @tblPeriod) SET @ExpiryDate =(SELECT expiryDate FROM @tblPeriod) IF ISNULL(@PaidAmount,0) - ISNULL(@PolicyValue,0) >= 0 BEGIN SET @PolicyStatus = @Active SET @EffectiveDate = @StartDate SET @isActivated = 1 SET @Balance = 0 END ELSE BEGIN SET @Balance = ISNULL(@PolicyValue,0) - (ISNULL(@PaidAmount,0)) SET @isActivated = 0 SET @PolicyStatus = @Idle END INSERT INTO tblPolicy(FamilyID,EnrollDate,StartDate,EffectiveDate,ExpiryDate,PolicyStatus,PolicyValue,ProdID,OfficerID,PolicyStage,ValidityFrom,AuditUserID, isOffline) SELECT @FamilyId, GETDATE(),@StartDate,@EffectiveDate,@ExpiryDate,@PolicyStatus,@PolicyValue,@ProdID,@OfficerID,@PolicyStage,GETDATE(),@AuditUserId, 0 isOffline SELECT @PolicyId = SCOPE_IDENTITY() UPDATE @tblDetail SET policyID = @PolicyId WHERE policyID = @PreviousPolicyID DECLARE @InsureeId INT DECLARE CurNewPolicy CURSOR FOR SELECT I.InsureeID FROM tblInsuree I WHERE I.FamilyID = @FamilyId AND I.ValidityTo IS NULL OPEN CurNewPolicy; FETCH NEXT FROM CurNewPolicy INTO @InsureeId; WHILE @@FETCH_STATUS = 0 BEGIN EXEC uspAddInsureePolicy @InsureeId; FETCH NEXT FROM CurNewPolicy INTO @InsureeId; END CLOSE CurNewPolicy; DEALLOCATE CurNewPolicy; INSERT INTO @PolicyProcessed (id,matchedpayment) VALUES (@PreviousPolicyID,1) END ELSE If (SELECT SUM(matchedpayment) FROM @PolicyProcessed WHERE id=@PreviousPolicyID )>0 UPDATE @PolicyProcessed SET matchedpayment = matchedpayment +1 WHERE id = @PreviousPolicyID --INSERT PREMIUMS FOR INDIVIDUAL RENEWALS ONLY if ISNULL(@PremiumID,0) = 0 BEGIN INSERT INTO tblPremium(PolicyID, Amount, PayType, Receipt, PayDate, ValidityFrom, AuditUserID) SELECT @PolicyId, @PaidAmount, 'C',@TransactionNo, GETDATE() PayDate, GETDATE() ValidityFrom, @AuditUserId AuditUserID SELECT @PremiumId = SCOPE_IDENTITY() END UPDATE @tblDetail SET PremiumID = @PremiumId WHERE PaymentDetailsID = @PaymentDetailsID -- insert message only once IF (SELECT SUM(matchedpayment) FROM @PolicyProcessed WHERE id=@PreviousPolicyID )=1 INSERT INTO @tblFeedback(InsuranceNumber, productCode, PhoneNumber, isActivated ,Balance, fdType) SELECT @InsuranceNumber, @productCode, @PhoneNumber, @isActivated,@Balance, 'A' FETCH NEXT FROM CurPolicies INTO @PaymentDetailsID, @InsuranceNumber, @productCode, @PhoneNumber, @DistributedValue, @PreviousPolicyID, @AlreadyPaidDValue, @PremiumID; END CLOSE CurPolicies; DEALLOCATE CurPolicies; END -- ABOVE LOOP SELF PAYER ONLY --Update the actual tblpayment & tblPaymentDetails UPDATE PD SET PD.PremiumID = TPD.PremiumId, PD.Amount = TPD.DistributedValue, ValidityFrom =GETDATE(), AuditedUserId = @AuditUserId FROM @tblDetail TPD INNER JOIN tblPaymentDetails PD ON PD.PaymentDetailsID = TPD.PaymentDetailsID UPDATE P SET P.PaymentStatus = 5, P.MatchedDate = GETDATE(), ValidityFrom = GETDATE(), AuditedUSerID = @AuditUserId FROM tblPayment P INNER JOIN @tblDetail PD ON PD.PaymentID = P.PaymentID IF EXISTS(SELECT COUNT(1) FROM @tblHeader PH ) BEGIN SET @paymentMatched= (SELECT COUNT(1) FROM @tblHeader PH ) -- some unvalid payment were removed after validation INSERT INTO @tblFeedback(fdMsg, fdType ) SELECT CONVERT(NVARCHAR(4), ISNULL(@paymentMatched,0)) +' Payment(s) matched ', 'I' END SELECT paymentMatched = SUM(matchedpayment) FROM @PolicyProcessed UPDATE @tblFeedback SET PaymentFound =ISNULL(@paymentFound,0), PaymentMatched = ISNULL(@paymentMatched,0),APIKey = (SELECT APIKey FROM tblIMISDefaults) IF @InTopIsolation = 0 COMMIT TRANSACTION MATCHPAYMENT SELECT fdMsg, fdType, productCode, InsuranceNumber, PhoneNumber, isActivated, Balance,PaymentFound, PaymentMatched, APIKey FROM @tblFeedback RETURN 0 END TRY BEGIN CATCH IF @InTopIsolation = 0 ROLLBACK TRANSACTION MATCHPAYMENT SELECT fdMsg, fdType FROM @tblFeedback SELECT ERROR_MESSAGE () RETURN -1 END CATCH END