USP_DATAFORMTEMPLATE_EDIT_RECURRINGGIFTINSTALLMENTWRITEOFF

Parameters

Parameter Parameter Type Mode Description
@ID nvarchar(42) IN
@INSTALLMENTWRITEOFFS xml IN
@CHANGEAGENTID uniqueidentifier IN
@TRANSACTIONCURRENCYID uniqueidentifier IN

Definition

Copy

                CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_RECURRINGGIFTINSTALLMENTWRITEOFF 
                (
                @ID nvarchar(42),
                @INSTALLMENTWRITEOFFS xml,
                @CHANGEAGENTID uniqueidentifier,
                @TRANSACTIONCURRENCYID uniqueidentifier
                )
                as

                    set nocount on;

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

                    declare @CURRENTDATE datetime
                    set @CURRENTDATE = getdate();

                    declare @INSTALLMENTID uniqueidentifier = cast(substring(@ID,1,36) as uniqueidentifier);

                    declare @RGID uniqueidentifier;

                    -- build a temporary table containing the write-offs
                    declare @TempTbl table (
                       ID uniqueidentifier,
                       WRITEOFFID uniqueidentifier,
                       DATE datetime,
                       AMOUNT money,
                       REASONCODEID uniqueidentifier,
                       NEW_WRITEOFFID uniqueidentifier)

                    insert into @TempTbl select 
                       ID,
                       WRITEOFFID,
                       DATE,
                       AMOUNT,
                       REASONCODEID,
                       newid()
                    from dbo.UFN_RECURRINGGIFTINSTALLMENT_GETWRITEOFFS_FROMITEMLISTXML(@INSTALLMENTWRITEOFFS);

                    declare @WRITEOFF_CHANGE smallint;

                    -- -1 = Total write-off amount decreased, 0 = Stayed the same, 1 = increased
                    select @WRITEOFF_CHANGE = sign(sum(isnull(t.AMOUNT,0))-sum(w.AMOUNT))
                    from dbo.RECURRINGGIFTINSTALLMENTWRITEOFF w
                    left join @TempTbl t on w.ID = t.ID
                    where w.RECURRINGGIFTINSTALLMENTID = @INSTALLMENTID;


                    ---------------------------------------------------------------------------
                    -- delete records for removed write-offs

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

                    if not @CHANGEAGENTID is null
                      set CONTEXT_INFO @CHANGEAGENTID;

                    declare @DELETEDINFO table (ID uniqueidentifier, WRITEOFFID uniqueidentifier, DATE date);

                    insert into @DELETEDINFO
                    select ID, WRITEOFFID, DATE
                    from dbo.UFN_RECURRINGGIFTINSTALLMENT_GETWRITEOFFS(@INSTALLMENTID)
                    where ID not in(select ID from @TempTbl where AMOUNT > 0);

                    -- delete all the RECURRINGGIFTINSTALLMENTWRITEOFF records that no longer exist in the XML table or have a 0 amount
                    delete from dbo.RECURRINGGIFTINSTALLMENTWRITEOFF 
                    where ID in (select ID from @DELETEDINFO)

                    -- delete only the write-off entries that no longer have a RECURRINGGIFTINSTALLMENTWRITEOFF entry
                    delete from dbo.RECURRINGGIFTWRITEOFF
                    where ID in(select WRITEOFFID
                                from @DELETEDINFO
                                where WRITEOFFID not in(select WRITEOFFID from dbo.RECURRINGGIFTINSTALLMENTWRITEOFF));

                    if exists(select 'x'
                              from @DELETEDINFO
                              where DATE = cast(@CURRENTDATE as date))
                    begin
                      select @RGID = REVENUEID
                      from dbo.RECURRINGGIFTINSTALLMENT
                      where ID = @INSTALLMENTID;

                      exec dbo.USP_RECURRINGGIFT_DELETEFUTUREINSTALLMENTS @RGID, @CHANGEAGENTID;
                    end

                    if not @contextCache is null
                      set CONTEXT_INFO @contextCache;


                    ---------------------------------------------------------------------------
                    -- update records for updated write-offs

                    -- update recurringgiftwriteoff
                    -- if the parent record is shared by other installment writeoff records, create a new one instead of affecting the others
                    merge dbo.RECURRINGGIFTWRITEOFF w
                    using (select case when (select count(*) from dbo.RECURRINGGIFTINSTALLMENTWRITEOFF iw where iw.WRITEOFFID = tw.ID and iw.ID <> temp.ID) = 0 then tw.ID
                                       else temp.NEW_WRITEOFFID end ID,
                                  temp.DATE,
                                  temp.REASONCODEID,
                                  tw.REVENUEID
                           from dbo.RECURRINGGIFTWRITEOFF tw
                           inner join @TempTbl temp on tw.ID = temp.WRITEOFFID
                           where (tw.DATE <> temp.DATE or tw.REASONCODEID <> temp.REASONCODEID)
                           and temp.AMOUNT > 0) t
                    on (w.ID = t.ID)
                    when not matched then
                      insert (ID, REVENUEID, DATE, REASONCODEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, TYPECODE)
                      values (t.ID, t.REVENUEID, t.DATE, t.REASONCODEID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, 0)
                    when matched then
                      update set DATE = t.DATE,
                                 REASONCODEID = t.REASONCODEID,
                                 CHANGEDBYID = @CHANGEAGENTID,
                                 DATECHANGED = @CURRENTDATE;

                    -- update any changes made to the installment write-off amount
                    update iw
                    set TRANSACTIONAMOUNT = temp.AMOUNT,
                        AMOUNT = WRITEOFFAMOUNTCURRENCYVALUES.BASEAMOUNT,
                        ORGANIZATIONAMOUNT = WRITEOFFAMOUNTCURRENCYVALUES.ORGANIZATIONAMOUNT,
                        WRITEOFFID = isnull(w.ID,iw.WRITEOFFID),
                        CHANGEDBYID = @CHANGEAGENTID,
                        DATECHANGED = @CURRENTDATE
                    from dbo.RECURRINGGIFTINSTALLMENTWRITEOFF iw
                    inner join @TempTbl temp on iw.ID = temp.ID
                    left join dbo.RECURRINGGIFTWRITEOFF w on w.ID = temp.NEW_WRITEOFFID
                    outer apply dbo.UFN_CURRENCY_GETCURRENCYVALUES_2
                          (temp.AMOUNT,
                           null,
                           iw.BASECURRENCYID,
                           iw.BASEEXCHANGERATEID,
                           iw.TRANSACTIONCURRENCYID,
                           null,
                           null,
                           null,
                           iw.ORGANIZATIONEXCHANGERATEID,
                           0
                          ) as WRITEOFFAMOUNTCURRENCYVALUES
                     where (iw.TRANSACTIONAMOUNT <> temp.AMOUNT or w.ID is not null)
                     and temp.AMOUNT > 0;

                    -- If the write-off amount changed, update the RG status and next transaction date as needed.
                    if @WRITEOFF_CHANGE <> 0
                    begin
                      select @RGID = REVENUEID
                      from dbo.RECURRINGGIFTINSTALLMENT
                      where ID = @INSTALLMENTID;

                      declare @STATUSCHANGETYPECODE tinyint = case @WRITEOFF_CHANGE when -1 then 4 else 3 end

                      exec dbo.USP_RECURRINGGIFT_UPDATEREVENUESCHEDULE
                        @REVENUEID = @RGID,
    @STATUSCHANGETYPECODE = @STATUSCHANGETYPECODE,
                        @CHANGEAGENTID = @CHANGEAGENTID,
                        @CURRENTDATETIME = @CURRENTDATE
                    end

                return 0;