Copy Code Trigger Definition

        
CREATE trigger [dbo].[TR_BANKACCOUNTDEPOSITPAYMENT_IUD] ON [dbo].[BANKACCOUNTDEPOSITPAYMENT] FOR INSERT,UPDATE,DELETE NOT FOR REPLICATION AS

    --NOTE: if making changes to this trigger see also the trigger(s) on the revenue table 

    --        to and make sure they are in synch


    BEGIN

        SET NOCOUNT ON                    

        --see if the original deposit is locked - if so, raise an error

        if exists(Select DEPOSITID from DELETED 
            INNER JOIN DBO.BANKACCOUNTDEPOSIT ON BANKACCOUNTDEPOSIT.ID=DELETED.DEPOSITID 
            INNER JOIN DBO.BANKACCOUNTTRANSACTION on BANKACCOUNTTRANSACTION.ID=DELETED.DEPOSITID
            where DELETED.DEPOSITID is not null AND BANKACCOUNTDEPOSIT.STATUSCODE=0 AND BANKACCOUNTTRANSACTION.POSTSTATUSCODE != 0) BEGIN
                RAISERROR ('Payments cannot be removed from locked deposits.',  16, 1)
                ROLLBACK
        END
        
        --see if the new deposit is locked - if so, raise an error

        if exists(Select DEPOSITID from INSERTED INNER JOIN DBO.BANKACCOUNTDEPOSIT ON BANKACCOUNTDEPOSIT.ID=INSERTED.DEPOSITID where
            INSERTED.DEPOSITID is not null AND BANKACCOUNTDEPOSIT.STATUSCODE=0) BEGIN
                RAISERROR ('Payments cannot be added to locked deposits.',  16, 1)
                ROLLBACK
        END

        --see if the original bank is closed - if so, raise an error

        if exists(Select DEPOSITID from DELETED INNER JOIN DBO.BANKACCOUNTTRANSACTION DEPOSIT1 ON 
            DELETED.DEPOSITID=DEPOSIT1.ID INNER JOIN DBO.BANKACCOUNT ON DEPOSIT1.BANKACCOUNTID=BANKACCOUNT.ID where
            BANKACCOUNT.STATUSCODE=0) BEGIN
                RAISERROR ('Payments cannot be removed from deposits associated with closed bank accounts.',  16, 1)
                ROLLBACK
        END

        --see if the new bank is closed - if so, raise an error

        if exists(Select DEPOSITID from INSERTED INNER JOIN DBO.BANKACCOUNTTRANSACTION DEPOSIT1 ON 
            INSERTED.DEPOSITID=DEPOSIT1.ID INNER JOIN DBO.BANKACCOUNT ON DEPOSIT1.BANKACCOUNTID=BANKACCOUNT.ID where
            BANKACCOUNT.STATUSCODE=0) BEGIN
                RAISERROR ('Payments cannot be added to deposits associated with closed bank accounts.',  16, 1)
                ROLLBACK
        END
                            
        --see if the payment method is invalid for the new deposit - if so, raise an error

        if exists(Select DEPOSITID from INSERTED INNER JOIN DBO.BANKACCOUNTTRANSACTION DEPOSIT1 ON
            INSERTED.DEPOSITID=DEPOSIT1.ID where [dbo].[UFN_BANKACCOUNTDEPOSIT_VALIDPAYMENTTYPE](INSERTED.DEPOSITID, INSERTED.ID)=0) BEGIN
                RAISERROR ('The selected payment method is not allowed for the deposit specified.',  16, 1) 
                ROLLBACK
        END
        
        --Verify that the deposit and payment have the same post status

        if exists(select I.DEPOSITID 
            from INSERTED I
            inner join dbo.BANKACCOUNTTRANSACTION D on D.ID = I.DEPOSITID
            inner join dbo.REVENUE R on R.ID = I.ID
            where (D.POSTSTATUSCODE = 2 and R.DONOTPOST <> 1) or (D.POSTSTATUSCODE = 1 and R.DONOTPOST <> 0)) BEGIN
                RAISERROR ('ERR_BANKACCOUNTDEPOSITPAYMENT_POSTSTATUS',  16, 1) 
                ROLLBACK
        END
      
    if exists(select I.DEPOSITID
      from INSERTED I
      inner join dbo.REVENUE R on R.ID = I.ID
      inner join dbo.BANKACCOUNTDEPOSIT D on D.ID = I.DEPOSITID
      where R.TRANSACTIONCURRENCYID <> D.TRANSACTIONCURRENCYID)
      BEGIN
        RAISERROR ('ERR_BANKACCOUNTDEPOSITPAYMENT_TRANSACTIONCURRENCYIDMUSTMATCH', 16, 1)
        ROLLBACK
      END
            
        if exists(select I.ID
            from INSERTED I
            inner join dbo.REVENUE R on R.ID = I.ID
            inner join dbo.REVENUEPAYMENTMETHOD P on R.ID = P.REVENUEID 
            left outer join dbo.OTHERPAYMENTMETHODDETAIL O on P.ID = O.ID
            left outer join dbo.NONDEPOSITABLEPAYMENTMETHOD N on O.OTHERPAYMENTMETHODCODEID = N.ID
            where (R.TRANSACTIONTYPECODE != 0) or P.PAYMENTMETHODCODE not in (0,1,2,10) or 
            (P.PAYMENTMETHODCODE  = 10 and  N.ID is not null)  
            )    
          BEGIN
            RAISERROR ('The selected payment method is not allowed for deposits.', 16, 1)
            ROLLBACK
          END

        if exists(select I.ID
            from INSERTED I
            inner join dbo.PDACCOUNTSYSTEMFORREVENUE R on R.ID = I.ID
            inner join dbo.BANKACCOUNTTRANSACTION BT on I.DEPOSITID = BT.ID
            inner join dbo.BANKACCOUNT B on BT.BANKACCOUNTID = B.ID
            where R.PDACCOUNTSYSTEMID != B.PDACCOUNTSYSTEMID 
            )    
          BEGIN
            RAISERROR ('Payment and deposit must be in the same accounting system.', 16, 1)
            ROLLBACK
          END


        --*********************************************

        --place all error conditions ABOVE this comment

        --*********************************************


        BEGIN TRY
            
            declare @ORGAMOUNTORIGINCODE tinyint;
            declare @ORGCURRENCYID uniqueidentifier;
            select @ORGAMOUNTORIGINCODE = ORGANIZATIONAMOUNTORIGINCODE from dbo.MULTICURRENCYCONFIGURATION;
            select @ORGCURRENCYID = ID from dbo.CURRENCY where ISORGANIZATIONCURRENCY = 1;
            
      --update the new deposit's payment amount

      update dbo.BANKACCOUNTDEPOSIT
      set 
                TOTALPAYMENTAMOUNT = DEPOSIT2.TOTALPAYMENTAMOUNT + T1.AMOUNT
                ,CHANGEDBYID = T1.CHANGEDBYID 
                ,DATECHANGED = T1.DATECHANGED
      FROM (SELECT INSERTED.DEPOSITID, SUM(COALESCE(REVENUE.TRANSACTIONAMOUNT,0)) AMOUNT, INSERTED.CHANGEDBYID, INSERTED.DATECHANGED
                  FROM INSERTED 
            INNER JOIN dbo.BANKACCOUNTTRANSACTION DEPOSIT1 ON INSERTED.DEPOSITID=DEPOSIT1.ID 
                  INNER JOIN REVENUE ON INSERTED.ID=REVENUE.ID
                  GROUP BY INSERTED.DEPOSITID, INSERTED.CHANGEDBYID, INSERTED.DATECHANGED) T1 
            INNER JOIN dbo.BANKACCOUNTDEPOSIT DEPOSIT2 ON T1.DEPOSITID =DEPOSIT2.ID
      
            --update the new deposit's multicurrency amounts

            update dbo.BANKACCOUNTTRANSACTION
            set
                TRANSACTIONAMOUNT = BANKACCOUNTTRANSACTION.TRANSACTIONAMOUNT + T1.TRANSACTIONAMOUNT
                ,AMOUNT = BANKACCOUNTTRANSACTION.AMOUNT + T1.BASEAMOUNT
                ,ORGANIZATIONAMOUNT = BANKACCOUNTTRANSACTION.ORGANIZATIONAMOUNT + T1.ORGAMOUNT
            from dbo.BANKACCOUNTTRANSACTION 
            inner join (
                select 
                    SUM(isnull(
                        case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                            then R.TRANSACTIONAMOUNT
                            else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                        end, 0)
                    ) as [TRANSACTIONAMOUNT]
                    ,SUM(isnull(
                        case when BA.TRANSACTIONCURRENCYID = BAT.BASECURRENCYID
                            then 
                                case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                    then R.TRANSACTIONAMOUNT
                                    else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                end
                            else
                                dbo.UFN_CURRENCY_CONVERT(
                                    case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                        then R.TRANSACTIONAMOUNT
                                        else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                    end
                                    ,BAT.BASEEXCHANGERATEID)
                        end, 0)
                    ) as [BASEAMOUNT]
                    ,SUM(isnull(
                        case when @ORGAMOUNTORIGINCODE = 1
                            then 
                                case when BA.TRANSACTIONCURRENCYID = @ORGCURRENCYID
                                    then
                                        case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                            then R.TRANSACTIONAMOUNT
                                            else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                        end
                                    else
                                        dbo.UFN_CURRENCY_CONVERT(
                                            case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                                then R.TRANSACTIONAMOUNT
                                                else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                            end
                                            ,BAT.ORGANIZATIONEXCHANGERATEID)
                                end
                            else
                                case when BAT.BASECURRENCYID = @ORGCURRENCYID
                                    then
                                        case when BA.TRANSACTIONCURRENCYID = BAT.BASECURRENCYID
                                            then 
                                                case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                                    then R.TRANSACTIONAMOUNT
                                                    else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                                end
                                            else
                                                dbo.UFN_CURRENCY_CONVERT(
                                                    case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                                        then R.TRANSACTIONAMOUNT
                                                        else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                                    end
                                                    ,BAT.BASEEXCHANGERATEID)
                                        end
                                    else
                                        dbo.UFN_CURRENCY_CONVERT(
                                            case when BA.TRANSACTIONCURRENCYID = BAT.BASECURRENCYID
                                                then 
                                                    case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                                        then R.TRANSACTIONAMOUNT
                                                        else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                                    end
                                                else
                                                    dbo.UFN_CURRENCY_CONVERT(
                                                        case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                                            then R.TRANSACTIONAMOUNT
                                                            else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                                        end
                                                        ,BAT.BASEEXCHANGERATEID)
                                            end
                                            ,BAT.ORGANIZATIONEXCHANGERATEID)
                                end
                        end, 0)) as [ORGAMOUNT]
                    ,D.ID
                    from INSERTED DP
                    inner join dbo.BANKACCOUNTDEPOSIT D on D.ID = DP.DEPOSITID
                    inner join dbo.REVENUE R on R.ID = DP.ID
                    inner join dbo.BANKACCOUNTTRANSACTION BAT on BAT.ID = D.ID
                    inner join dbo.BANKACCOUNT BA on BA.ID = BAT.BANKACCOUNTID
                    group by D.ID
            ) T1 on BANKACCOUNTTRANSACTION.ID = T1.ID
            
      --update the old deposit's payment amount

      update dbo.BANKACCOUNTDEPOSIT
      set 
                TOTALPAYMENTAMOUNT = DEPOSIT2.TOTALPAYMENTAMOUNT - T1.AMOUNT
                ,CHANGEDBYID = T1.CHANGEDBYID 
                ,DATECHANGED = T1.DATECHANGED
      FROM (SELECT DELETED.DEPOSITID, SUM(COALESCE(REVENUE.TRANSACTIONAMOUNT,0)) AMOUNT, DELETED.CHANGEDBYID, DELETED.DATECHANGED
                  FROM DELETED 
            INNER JOIN dbo.BANKACCOUNTTRANSACTION DEPOSIT1 ON DELETED.DEPOSITID=DEPOSIT1.ID 
                  INNER JOIN REVENUE ON DELETED.ID=REVENUE.ID
                  GROUP BY DELETED.DEPOSITID, DELETED.CHANGEDBYID, DELETED.DATECHANGED) T1 
            INNER JOIN dbo.BANKACCOUNTDEPOSIT DEPOSIT2 ON T1.DEPOSITID =DEPOSIT2.ID
            
            --update the old deposit's multicurrency amounts

            update dbo.BANKACCOUNTTRANSACTION
            set
                TRANSACTIONAMOUNT = BANKACCOUNTTRANSACTION.TRANSACTIONAMOUNT - T1.TRANSACTIONAMOUNT
                ,AMOUNT = BANKACCOUNTTRANSACTION.AMOUNT - T1.BASEAMOUNT
                ,ORGANIZATIONAMOUNT = BANKACCOUNTTRANSACTION.ORGANIZATIONAMOUNT - T1.ORGAMOUNT
            from dbo.BANKACCOUNTTRANSACTION
            inner join(
                select 
                    SUM(isnull(
                        case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                            then R.TRANSACTIONAMOUNT
                            else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                        end, 0)
                    ) as [TRANSACTIONAMOUNT]
                    ,SUM(isnull(
                        case when BA.TRANSACTIONCURRENCYID = BAT.BASECURRENCYID
                            then 
                                case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                    then R.TRANSACTIONAMOUNT
                                    else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                end
                            else
                                dbo.UFN_CURRENCY_CONVERT(
                                    case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                        then R.TRANSACTIONAMOUNT
                                        else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                    end
                                    ,BAT.BASEEXCHANGERATEID)
                        end, 0)
                    ) as [BASEAMOUNT]
                    ,SUM(isnull(
                        case when @ORGAMOUNTORIGINCODE = 1
                            then 
                                case when BA.TRANSACTIONCURRENCYID = @ORGCURRENCYID
                                    then
                                        case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                            then R.TRANSACTIONAMOUNT
                                            else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                        end
                                    else
                                        dbo.UFN_CURRENCY_CONVERT(
                                            case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                                then R.TRANSACTIONAMOUNT
                                                else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                            end
                                            ,BAT.ORGANIZATIONEXCHANGERATEID)
                                end
                            else
                                case when BAT.BASECURRENCYID = @ORGCURRENCYID
                                    then
                                        case when BA.TRANSACTIONCURRENCYID = BAT.BASECURRENCYID
                                            then 
                                                case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                                    then R.TRANSACTIONAMOUNT
                                                    else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                                end
                                            else
                                                dbo.UFN_CURRENCY_CONVERT(
                                                    case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                                        then R.TRANSACTIONAMOUNT
                                                        else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                                    end
                                                    ,BAT.BASEEXCHANGERATEID)
                                        end
                                    else
                                        dbo.UFN_CURRENCY_CONVERT(
                                            case when BA.TRANSACTIONCURRENCYID = BAT.BASECURRENCYID
                                                then 
                                                    case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                                        then R.TRANSACTIONAMOUNT
                                                        else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                                    end
                                                else
                                                    dbo.UFN_CURRENCY_CONVERT(
                                                        case when D.TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
                                                            then R.TRANSACTIONAMOUNT
                                                            else dbo.UFN_CURRENCY_CONVERT(R.TRANSACTIONAMOUNT, D.TRANSACTIONEXCHANGERATEID)
                                                        end
                                                        ,BAT.BASEEXCHANGERATEID)
                                            end
                                            ,BAT.ORGANIZATIONEXCHANGERATEID)
                                end
                        end, 0)) as [ORGAMOUNT]
                    ,D.ID
                    from DELETED DP
                    inner join dbo.BANKACCOUNTDEPOSIT D on D.ID = DP.DEPOSITID
                    inner join dbo.REVENUE R on R.ID = DP.ID
                    inner join dbo.BANKACCOUNTTRANSACTION BAT on BAT.ID = D.ID
                    inner join dbo.BANKACCOUNT BA on BA.ID = BAT.BANKACCOUNTID
                    group by D.ID
            ) T1 on BANKACCOUNTTRANSACTION.ID = T1.ID
            
        END TRY
        BEGIN CATCH

            --Catch the arithmetic overflow error and re-raise a prettier one

            IF ERROR_NUMBER() = 8115 BEGIN
                --NOTE: the following error message needs to be revisited

                RAISERROR ('The maximum supported deposit amount has been exceeded.',  16, 1)
                ROLLBACK TRANSACTION
            END ELSE                 
              exec dbo.USP_RAISE_ERROR
            
        END CATCH

    END