USP_RECURRINGGIFT_EDITSTATUS

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@STATUSCODE tinyint IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN
@REASONCODEID uniqueidentifier IN
@INSTALLMENTS xml IN
@SKIPPEDINSTALLMENTID uniqueidentifier IN
@STATUSCHANGETYPECODE tinyint IN

Definition

Copy


            CREATE procedure dbo.USP_RECURRINGGIFT_EDITSTATUS
            (
                @ID uniqueidentifier,
                @STATUSCODE tinyint,
                @CHANGEAGENTID uniqueidentifier = null,
                @CHANGEDATE datetime = null,
                @REASONCODEID uniqueidentifier = null,
                @INSTALLMENTS xml = null,
                @SKIPPEDINSTALLMENTID uniqueidentifier = null,
                @STATUSCHANGETYPECODE tinyint = 0
            )
            as 
            set nocount on;

            if @CHANGEAGENTID is null
                exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

            if @CHANGEDATE is null
                set @CHANGEDATE = getdate();

            begin try
              -- skip functionality when status is held

              if @STATUSCODE = 1
              begin
                -- If the old status was Canceled or Terminated, update the status to Held so that the skip USP will work properly.

                -- We need to pass through the original status in order to log the amendment.

                declare @ORIGINALSTATUSCODE tinyint;

                select @ORIGINALSTATUSCODE = STATUSCODE
                from dbo.REVENUESCHEDULE
                where ID = @ID;

                if @ORIGINALSTATUSCODE in(2,3)
                  update dbo.REVENUESCHEDULE
                  set STATUSCODE = @STATUSCODE,
                      ENDDATE = null,
                      NEXTTRANSACTIONDATE = null,   -- This will get reset if needed by USP_RECURRINGGIFT_UPDATEREVENUESCHEDULE

                      CHANGEDBYID = @CHANGEAGENTID,
                      DATECHANGED = @CHANGEDATE
                  from dbo.REVENUESCHEDULE
                  where ID = @ID;
                else
                  set @ORIGINALSTATUSCODE = null;

                --use the date of the last (newest) future installment to be skipped to create all other future expected installments that will be skipped

                declare @NEWESTINSTALLMENTDATE date;

                select @NEWESTINSTALLMENTDATE = max(T.c.value('(DATE)[1]', 'date'))
                    from @INSTALLMENTS.nodes('/INSTALLMENTS/ITEM') T(c)    

                exec dbo.USP_RECURRINGGIFT_ADDSKIPANDWRITEOFF
                    @REVENUEID = @ID,
                    @CHANGEAGENTID = @CHANGEAGENTID,
                    @DATE = @CHANGEDATE,
                    @SKIPREASONID = @REASONCODEID,
                    @INSTALLMENTS = @INSTALLMENTS,
                    @ASOFDATE = @NEWESTINSTALLMENTDATE,
                    @TYPECODE = 1,
                    @ORIGINALSTATUSCODE = @ORIGINALSTATUSCODE;
              end

              else

              begin
                -- if setting the status to Active or Lapsed and skips exist, undo those skips

                if @STATUSCODE in(0,5) and @SKIPPEDINSTALLMENTID is not null
                begin
                  declare @INSTALLMENTDATE date;

                  select @INSTALLMENTDATE = DATE
                  from dbo.RECURRINGGIFTINSTALLMENT
                  where ID = @SKIPPEDINSTALLMENTID;

                  exec dbo.USP_RECURRINGGIFTINSTALLMENTUNDOSKIP @ID, @INSTALLMENTDATE, @SKIPPEDINSTALLMENTID, 0, @CHANGEAGENTID;
                end

                declare @AMOUNT money;
                declare @BASECURRENCYID uniqueidentifier;
                declare @ORGANIZATIONAMOUNT money;
                declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
                declare @TRANSACTIONAMOUNT money;
                declare @TRANSACTIONCURRENCYID uniqueidentifier;
                declare @BASEEXCHANGERATEID uniqueidentifier;
                declare @PREVIOUSSTATUSCODE tinyint;

                --Set previous status to be used in amendments table

                select 
                  @PREVIOUSSTATUSCODE = STATUSCODE
                from dbo.REVENUESCHEDULE
                where ID = @ID

                if not exists(select 'x' from dbo.RECURRINGGIFTINSTALLMENT where REVENUEID = @ID)
                begin
                    exec dbo.USP_RECURRINGGIFT_FIXMISSINGINSTALLMENTSCHEDULE @ID, @CHANGEAGENTID, @CHANGEDATE
                end

                -- on change to inactive, bring the installments up to date,

                -- but then get rid of any future installments so they won't

                -- be counted as expected/past due

                if @STATUSCODE not in (0,1,5)
                begin
                    select 
                        @AMOUNT = AMOUNT,
                        @BASECURRENCYID = BASECURRENCYID,
                        @ORGANIZATIONAMOUNT = ORGANIZATIONAMOUNT,
                        @ORGANIZATIONEXCHANGERATEID = ORGANIZATIONEXCHANGERATEID,
                        @TRANSACTIONAMOUNT = TRANSACTIONAMOUNT,
                        @TRANSACTIONCURRENCYID = TRANSACTIONCURRENCYID,
                        @BASEEXCHANGERATEID = BASEEXCHANGERATEID
                    from dbo.REVENUE
                    where ID = @ID;

                    exec dbo.USP_RECURRINGGIFT_ADDMISSINGINSTALLMENTS 
                        @ID = @ID,
                        @CHANGEAGENTID = @CHANGEAGENTID,
                        @CREATIONDATE = @CHANGEDATE,
                        @AMOUNT = @AMOUNT,
                        @BASECURRENCYID = @BASECURRENCYID,
                        @ORGANIZATIONAMOUNT = @ORGANIZATIONAMOUNT,
                        @ORGANIZATIONEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID,
                        @TRANSACTIONAMOUNT = @TRANSACTIONAMOUNT,
                        @TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID,
                        @BASEEXCHANGERATEID = @BASEEXCHANGERATEID

                    -- Only delete future installments if the status is not changing to Held. In that case we want the a next expected installment to exist

                    if @STATUSCODE <> 1
                    begin              
                      --Cache CONTEXT INFO

                      declare @contextCache varbinary(128);
                      set @contextCache = CONTEXT_INFO();
                      set CONTEXT_INFO @CHANGEAGENTID;

                      -- delete future installments

                      delete from dbo.RECURRINGGIFTINSTALLMENT
                      where REVENUEID = @ID
                      and DATE > @CHANGEDATE
                      and not exists(select 'x' from dbo.RECURRINGGIFTINSTALLMENTPAYMENT where RECURRINGGIFTINSTALLMENTID = RECURRINGGIFTINSTALLMENT.ID)
                      and not exists(select 'x' from dbo.RECURRINGGIFTINSTALLMENTWRITEOFF where RECURRINGGIFTINSTALLMENTID = RECURRINGGIFTINSTALLMENT.ID);

                      if not @contextCache is null
                          set CONTEXT_INFO @contextCache
                    end
                end

                -- only update status if the recurring gift is not a sponsorship recurring additional gift (SRAG)

                -- and there are no other active SRAG on the linked sponsorship.


                if @STATUSCODE in (0,1,5)
                begin
                    if (select count(*
                        from dbo.SPONSORSHIPRECURRINGADDITIONALGIFT SRAG1
                        inner join dbo.SPONSORSHIPRECURRINGADDITIONALGIFT SRAG2 on SRAG2.SPONSORSHIPID = SRAG1.SPONSORSHIPID
                        where SRAG1.REVENUEID = @ID
                        and SRAG2.STATUSCODE in(0,1,5)
                        and SRAG2.ID <> SRAG1.ID
                 ) > 0
                    raiserror('BERR_LINKEDSPONSORSHIPHASACTIVE', 13, 1);
                end

                --UPDATE STATUS

                update dbo.REVENUESCHEDULE
                set STATUSCODE = @STATUSCODE,
                    ENDDATE = case when @STATUSCODE = 3 then case when ENDDATE is null or ENDDATE > cast(@CHANGEDATE as date) then case when cast(@CHANGEDATE as date) < STARTDATE then STARTDATE else cast(@CHANGEDATE as date) end else ENDDATE end  -- Ensure a current end date for Canceled

                                   when @STATUSCODE in(0,1,5) and @PREVIOUSSTATUSCODE in(2,3) then null  -- Clear out end date for Active/Lapsed/Held

                                   else ENDDATE end,
                    NEXTTRANSACTIONDATE = null,   -- This will get reset if needed by USP_RECURRINGGIFT_UPDATEREVENUESCHEDULE

                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CHANGEDATE
                from dbo.REVENUESCHEDULE
                where ID = @ID;

                -- on change to active, refresh the schedule after the update has occurred

                -- Handle Lapsed like Active status

                if @STATUSCODE in (0,1,5)
                begin
                    select 
                        @AMOUNT = AMOUNT,
                        @BASECURRENCYID = BASECURRENCYID,
                        @ORGANIZATIONAMOUNT = ORGANIZATIONAMOUNT,
                        @ORGANIZATIONEXCHANGERATEID = ORGANIZATIONEXCHANGERATEID,
                        @TRANSACTIONAMOUNT = TRANSACTIONAMOUNT,
                        @TRANSACTIONCURRENCYID = TRANSACTIONCURRENCYID,
                        @BASEEXCHANGERATEID = BASEEXCHANGERATEID
                    from dbo.REVENUE
                    where ID = @ID;

                    exec dbo.USP_RECURRINGGIFT_ADDMISSINGINSTALLMENTS 
                        @ID = @ID,
                        @CHANGEAGENTID = @CHANGEAGENTID,
                        @CREATIONDATE = @CHANGEDATE,
                        @AMOUNT = @AMOUNT,
                        @BASECURRENCYID = @BASECURRENCYID,
                        @ORGANIZATIONAMOUNT = @ORGANIZATIONAMOUNT,
                        @ORGANIZATIONEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID,
                        @TRANSACTIONAMOUNT = @TRANSACTIONAMOUNT,
                        @TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID,
                        @BASEEXCHANGERATEID = @BASEEXCHANGERATEID;
                end

                exec dbo.USP_RECURRINGGIFT_UPDATEREVENUESCHEDULE
                  @ID,
                  @STATUSCHANGETYPECODE,
                  @REASONCODEID,
                  @PREVIOUSSTATUSCODE,
                  @STATUSCODE,
                  @AMOUNT,
                  @BASECURRENCYID,
                  @ORGANIZATIONAMOUNT,
                  @ORGANIZATIONEXCHANGERATEID,
                  @TRANSACTIONAMOUNT,
                  @TRANSACTIONCURRENCYID,
                  @BASEEXCHANGERATEID,
                  @CHANGEAGENTID,
                  @CHANGEDATE
              end

            end try
            begin catch 
                exec dbo.USP_RAISE_ERROR;
                return 1;
            end catch

            return 0;