USP_DATAFORMTEMPLATE_EDIT_PLEDGEADJUST_3

The save procedure used by the edit dataform template "Posted Pledge Edit Form 3".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN The input ID parameter indicating the ID of the record being edited.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@DATE datetime IN Date
@AMOUNT money IN Amount
@POSTSTATUSCODE tinyint IN Post status
@POSTDATE datetime IN Post date
@SENDPLEDGEREMINDER bit IN Send pledge reminders
@SPLITS xml IN Designations
@FREQUENCYCODE tinyint IN Frequency
@NUMBEROFINSTALLMENTS int IN No. installments remaining
@NEXTTRANSACTIONDATE datetime IN Next installment date
@INSTALLMENTS xml IN
@SOURCECODE nvarchar(50) IN Source code
@APPEALID uniqueidentifier IN Appeal
@BENEFITS xml IN Benefits
@BENEFITSWAIVED bit IN Benefits waived
@GIVENANONYMOUSLY bit IN Pledge is anonymous
@MAILINGID uniqueidentifier IN Mailing
@CHANNELCODEID uniqueidentifier IN Channel
@DONOTACKNOWLEDGE bit IN Do not acknowledge
@PLEDGESUBTYPEID uniqueidentifier IN Subtype
@OPPORTUNITYID uniqueidentifier IN Opportunity
@REFERENCE nvarchar(255) IN Reference
@CATEGORYCODEID uniqueidentifier IN Revenue category
@ADJUSTMENTDATE datetime IN Adjusted Date
@ADJUSTMENTPOSTDATE datetime IN Adjusted Post Date
@ADJUSTMENTREASON nvarchar(300) IN Adjustment reason

Definition

Copy


                    CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_PLEDGEADJUST_3
                    (
                        @ID uniqueidentifier,
                        @CHANGEAGENTID uniqueidentifier = null,
                        @DATE datetime,
                        @AMOUNT money,
                        @POSTSTATUSCODE tinyint,
                        @POSTDATE datetime,
                        @SENDPLEDGEREMINDER bit,
                        @SPLITS xml,
                        @FREQUENCYCODE tinyint,
                        @NUMBEROFINSTALLMENTS int,
                        @NEXTTRANSACTIONDATE datetime,
                        @INSTALLMENTS xml,
                        @SOURCECODE nvarchar(50),
                        @APPEALID uniqueidentifier,
                        @BENEFITS xml,
                        @BENEFITSWAIVED bit,
                        @GIVENANONYMOUSLY bit,
                        @MAILINGID uniqueidentifier,
                        @CHANNELCODEID uniqueidentifier,
                        @DONOTACKNOWLEDGE bit,
                        @PLEDGESUBTYPEID uniqueidentifier,
                        @OPPORTUNITYID uniqueidentifier,
                        @REFERENCE nvarchar(255),
                        @CATEGORYCODEID uniqueidentifier,
                        @ADJUSTMENTDATE datetime,
                        @ADJUSTMENTPOSTDATE datetime,
                        @ADJUSTMENTREASON nvarchar(300)
                    )
                    as
                    begin
                        set nocount on;

                        declare @CURRENTDATE datetime;
                        declare @SUM money;
                        declare @COUNT int;
                        declare @ADJUST bit;
                        declare @ADJUSTMENTID uniqueidentifier;
                        declare @CLEARGLDISTRIBUTION bit;
                        declare @CLEARWRITEOFFGLDISTRIBUTION bit;
                        declare @WRITEOFFADJUSTMENTID uniqueidentifier;
                        declare @ADJUSTEDWRITEOFFS table(WRITEOFFID uniqueidentifier, ADJUSTMENTID uniqueidentifier);
                        declare @REACKNOWLEDGEFIELDCHANGED bit;    

                        declare @contextCache varbinary(128);

                        --cache current context information

                        set @contextCache = CONTEXT_INFO();

                        --set CONTEXT_INFO to @CHANGEAGENTID

                        set CONTEXT_INFO @CHANGEAGENTID;

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

                            set @CURRENTDATE = GetDate();

                            set @ADJUST = 0;
                            set @ADJUSTMENTID = null;

                            set @CLEARGLDISTRIBUTION = 0;
                            set @CLEARWRITEOFFGLDISTRIBUTION = 0;
                            set @REACKNOWLEDGEFIELDCHANGED = 0;            

                            /* Check if designations changed */
                            if dbo.UFN_CHECKDETAIL_SPLITSCHANGED(@ID, @SPLITS) = 1
                            begin
                                set @ADJUST = 1;
                                set @CLEARGLDISTRIBUTION = 1;
                                set @REACKNOWLEDGEFIELDCHANGED = 1;
                            end

                            declare @OLDCATEGORYCODEID uniqueidentifier
                            select top 1 @OLDCATEGORYCODEID = REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID
                            from dbo.REVENUECATEGORY
                            inner join dbo.REVENUESPLIT on REVENUECATEGORY.ID = REVENUESPLIT.ID
                            where REVENUESPLIT.REVENUEID = @ID

                            /* Check if revenue category changed */
                            if (@CATEGORYCODEID is null and @OLDCATEGORYCODEID is not null
                            or (@CATEGORYCODEID is not null and @OLDCATEGORYCODEID is null)
                            or (@CATEGORYCODEID <> @OLDCATEGORYCODEID)
                                begin
                                    set @ADJUST = 1;
                                    set @CLEARGLDISTRIBUTION = 1;
                                    set @CLEARWRITEOFFGLDISTRIBUTION = 1;
                                end

                            /* Already adjusted */
                            if @ADJUST = 0
                                if (select COUNT(ADJUSTMENT.ID) from dbo.ADJUSTMENT where REVENUEID = @ID and POSTSTATUSCODE = 1) > 0
                                    set @ADJUST = 1

                            declare @TRIBUTEAMOUNT money;
                            select @TRIBUTEAMOUNT = sum(AMOUNT) from dbo.REVENUETRIBUTE where REVENUEID = @ID;

                            -- do not allow the gift amount to be adjusted less than the applied tribute amount

                            if (@TRIBUTEAMOUNT is not null) and (@AMOUNT < @TRIBUTEAMOUNT)
                            begin
                                raiserror('The pledge amount cannot be less than the sum of the tribute amounts applied to this pledge.', 13, 1)
                            end

                            /* If there was a change to GL related data log an adjustment */
                            if @ADJUST = 1
                            begin
                                exec dbo.USP_SAVE_ADJUSTMENT @ID, @ADJUSTMENTID output, @CHANGEAGENTID, @CURRENTDATE, @ADJUSTMENTDATE, @ADJUSTMENTPOSTDATE, @ADJUSTMENTREASON;
                            end

                            /* Adjust any write-offs for this pledge. */
                            if @CLEARWRITEOFFGLDISTRIBUTION = 1
                            begin
                                if exists (select GL.ID from dbo.WRITEOFFGLDISTRIBUTION GL inner join dbo.WRITEOFF on GL.WRITEOFFID = WRITEOFF.ID where WRITEOFF.REVENUEID = @ID
                                begin
                                    declare @WRITEOFFID uniqueidentifier;

                                    declare WRITEOFFCURSOR cursor local fast_forward for
                                    select WRITEOFF.ID from dbo.WRITEOFF where REVENUEID = @ID;

                                    open WRITEOFFCURSOR;
                                    fetch next from WRITEOFFCURSOR into @WRITEOFFID;

                                    while @@FETCH_STATUS = 0
                                    begin
                                        set @WRITEOFFADJUSTMENTID = null;

                                        exec dbo.USP_SAVE_WRITEOFFADJUSTMENT @WRITEOFFID, @WRITEOFFADJUSTMENTID output, @CHANGEAGENTID, @CURRENTDATE, @ADJUSTMENTDATE, @ADJUSTMENTPOSTDATE, @ADJUSTMENTREASON;

                                        --Save adjustment IDs for adjustment history

                                        insert into @ADJUSTEDWRITEOFFS(WRITEOFFID,ADJUSTMENTID) values (@WRITEOFFID,@WRITEOFFADJUSTMENTID);

                                        fetch next from WRITEOFFCURSOR into @WRITEOFFID;    
                                    end

                                    close WRITEOFFCURSOR;
                                    deallocate WRITEOFFCURSOR;
                                end
                            end

                            exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS, @AMOUNT;

                            select 
                                @SUM = sum(AMOUNT),
                                @COUNT = count(AMOUNT)
                            from 
                                dbo.UFN_INSTALLMENT_GETINSTALLMENTS_FROMITEMLISTXML(@INSTALLMENTS);

                            if @COUNT = 0
                                raiserror('INSTALLMENTCOUNT',13,1);

                            if @SUM <> @AMOUNT
                                raiserror('INSTALLMENTSUM',13,1);

                            /* You can only edit unposted pledges here */
                            if not exists (select 1 from dbo.REVENUEPOSTED where REVENUEPOSTED.ID = @ID)
                                raiserror('You cannot edit a unposted pledge.', 13, 1)

                            if dbo.UFN_INSTALLMENT_DATESOVERLAP(@INSTALLMENTS) = 1
                                raiserror('Installment dates are out of sequence.',13,1);

                            if (select count(INSTALLMENT.ID) from dbo.INSTALLMENT 
                                inner join dbo.UFN_INSTALLMENT_GETINSTALLMENTS_FROMITEMLISTXML(@INSTALLMENTS) XMLINST
                                on INSTALLMENT.ID = XMLINST.ID
                                where XMLINST.AMOUNT < XMLINST.APPLIED) > 0
                                raiserror('PLEDGEPAYMENT_INSTALLMENTAPPLIED',13,1);



                            declare @DONOTPOST bit;
                            set @DONOTPOST = case @POSTSTATUSCODE when 2 then 1 else 0 end;

                            -- check to see if the revenue record needs to be re-acknowledged                            

                            if (coalesce((select top 1 REACKNOWLEDGEREVENUE from dbo.ACKNOWLEDGEMENTPREFERENCE), 0)) = 1
                            begin    
                                -- check to see if amount have changed

                                if @REACKNOWLEDGEFIELDCHANGED = 0
                                    if (select count(REVENUE.ID) from dbo.REVENUE where REVENUE.ID = @ID and AMOUNT = @AMOUNT) = 0
                                        set @REACKNOWLEDGEFIELDCHANGED = 1;

                                -- if a field has changed, mark the revenue letters for this record out of date, if necessary

                                if @REACKNOWLEDGEFIELDCHANGED = 1
                                    exec dbo.USP_REVENUELETTER_SETREACKNOWLEDGEMENTS @ID, @CHANGEAGENTID;     
                            end

                            update
                                dbo.FINANCIALTRANSACTION
                            set
                                DATE = @DATE,
                                POSTSTATUSCODE = case when @DONOTPOST = 0 then 1 else 3 end,
                                POSTDATE = @POSTDATE,
                                TRANSACTIONAMOUNT = @AMOUNT,
                                CHANGEDBYID = @CHANGEAGENTID,
                                DATECHANGED = @CURRENTDATE
                            where
                                ID = @ID;

              update
                dbo.REVENUE_EXT
              set
                SOURCECODE = @SOURCECODE,
                                APPEALID = @APPEALID,
                                BENEFITSWAIVED = @BENEFITSWAIVED,
                                GIVENANONYMOUSLY = @GIVENANONYMOUSLY,
                                MAILINGID = @MAILINGID,
                                CHANNELCODEID = @CHANNELCODEID,
                                DONOTACKNOWLEDGE = @DONOTACKNOWLEDGE
              where
                ID = @ID


    exec dbo.USP_REVENUEREFERENCE_EDIT @ID, @REFERENCE, @CHANGEAGENTID;

                            update
                                dbo.REVENUESCHEDULE
                            set
                                FREQUENCYCODE = @FREQUENCYCODE,
                                NUMBEROFINSTALLMENTS = @COUNT,
                                NEXTTRANSACTIONDATE = @NEXTTRANSACTIONDATE,
                                PLEDGESUBTYPEID = @PLEDGESUBTYPEID,
                                SENDPLEDGEREMINDER = @SENDPLEDGEREMINDER,
                                CHANGEDBYID = @CHANGEAGENTID,
                                DATECHANGED = @CURRENTDATE
                            from 
                                dbo.REVENUESCHEDULE 
                            where
                                REVENUESCHEDULE.ID = @ID;

                            declare @SPLITSCHANGED bit
                            set @SPLITSCHANGED = dbo.UFN_CHECKDETAIL_SPLITSCHANGED(@ID, @SPLITS)

                            -- Set the IDs for any blank entries in the splits XML so that it can associate the declines with gift aid

                            -- flag with the generated splits.  Also, pull in the existing value for declines gift aid if it wasn't passed

                            -- in the xml.

                            set @SPLITS = (    select 
                                                case when SPLITS.[ID] is null or SPLITS.[ID] = '00000000-0000-0000-0000-000000000000' then newid() else SPLITS.[ID] end [ID],
                                                SPLITS.[AMOUNT],
                                                SPLITS.[APPLICATIONCODE],
                                                SPLITS.[DESIGNATIONID],
                                                SPLITS.[TYPECODE],
                                                case when SPLITS.[DECLINESGIFTAID] is null then REVENUESPLITGIFTAID.DECLINESGIFTAID else SPLITS.DECLINESGIFTAID end DECLINESGIFTAID
                                            from dbo.UFN_REVENUE_GETSPLITS_FROMITEMLISTXML(@SPLITS) SPLITS
                                            left join dbo.REVENUESPLITGIFTAID on SPLITS.ID = REVENUESPLITGIFTAID.ID
                                            for xml raw('ITEM'),type,elements,root('SPLITS'),BINARY BASE64)

                            exec dbo.USP_REVENUE_GETSPLITS_UPDATEFROMXML @ID, @SPLITS, @CHANGEAGENTID, @CURRENTDATE;        
                            exec dbo.USP_PLEDGE_UPDATEINSTALLMENT @ID, @INSTALLMENTS, @CHANGEAGENTID, @CURRENTDATE

                            exec dbo.USP_REVENUECATEGORY_UPDATESPLITS @ID, @CATEGORYCODEID, @CHANGEAGENTID, @CURRENTDATE;

                            --MMR not sure we still need this?

                            exec dbo.USP_PLEDGE_FIXDEPENDENTSPLITS @ID, @CHANGEAGENTID, @CURRENTDATE
                            exec dbo.USP_REVENUE_GETBENEFITS_UPDATEFROMXML @ID, @BENEFITS, @CHANGEAGENTID, @CURRENTDATE;
                            exec dbo.USP_REVENUE_UPDATESOLICITORS @ID, @CHANGEAGENTID, @CURRENTDATE;                            

                            -- clear the user-defined gl distributions

                            if @CLEARGLDISTRIBUTION = 1
                            begin

                                -- Clear GL

                                delete from dbo.REVENUEGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;    

                                -- Add new GL distributions

                                if @POSTSTATUSCODE <> 2
                begin
                                    exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE;
                  declare @DEPOSITID uniqueidentifier;
                  select @DEPOSITID = DEPOSITID
                  from dbo.BANKACCOUNTDEPOSITPAYMENT
                  where ID = @ID;
                  if @DEPOSITID is not null
                    exec dbo.USP_BANKACCOUNTDEPOSIT_OVERWRITEPAYMENTDEBITACCOUNTS @ID, @DEPOSITID, @CHANGEAGENTID, @CURRENTDATE;
                                end

                                if @CLEARWRITEOFFGLDISTRIBUTION = 1 and exists (select GL.ID from dbo.WRITEOFFGLDISTRIBUTION GL inner join dbo.WRITEOFF on GL.WRITEOFFID = WRITEOFF.ID where WRITEOFF.REVENUEID = @ID
                                begin
                                    delete from dbo.WRITEOFFGLDISTRIBUTION where WRITEOFFID in (select WO.ID from dbo.WRITEOFF WO where WO.REVENUEID = @ID) and OUTDATED = 0;

                                    -- Add new writeoff GL distributions

                                    if @POSTSTATUSCODE <> 2
                                        exec dbo.USP_SAVE_WRITEOFFGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE;
                                end
                            end

                            exec dbo.USP_PLEDGE_VALIDATE @ID;

                            if @OPPORTUNITYID is null
                            begin
                                delete REVENUEOPPORTUNITY
                                from dbo.REVENUEOPPORTUNITY 
                                inner join dbo.REVENUESPLIT
                                    on REVENUESPLIT.ID = REVENUEOPPORTUNITY.ID
                                where REVENUESPLIT.REVENUEID = @ID                                
                            end
                            else 
                            begin
                                insert into dbo.REVENUEOPPORTUNITY (ID, OPPORTUNITYID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                                    select ID, @OPPORTUNITYID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                    from dbo.REVENUESPLIT where REVENUEID = @ID
                                    and not exists(select top 1 REVENUEOPPORTUNITY.ID from REVENUEOPPORTUNITY where REVENUEOPPORTUNITY.ID = REVENUESPLIT.ID);

                                exec dbo.USP_OPPORTUNITY_UPDATEACCEPTEDSTATUS @OPPORTUNITYID, @DATE, @CHANGEAGENTID, @CURRENTDATE
                            end

                            --Gift Aid is for UK only

                            if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 1
                            begin
                                declare @PAYMENTMETHODCODE tinyint;
                                declare @CREDITTYPECODEID uniqueidentifier;
                                select @PAYMENTMETHODCODE = PAYMENTMETHODCODE from dbo.REVENUEPAYMENTMETHOD where REVENUEID = @ID;
                                if @PAYMENTMETHODCODE = 2
                                    select @CREDITTYPECODEID = CREDITCARD.CREDITTYPECODEID 
                                    from dbo.REVENUE
                                    inner join dbo.REVENUEPAYMENTMETHOD on REVENUE.ID = REVENUEPAYMENTMETHOD.REVENUEID
                                    left join dbo.REVENUESCHEDULE on REVENUE.ID = REVENUESCHEDULE.ID
                                    left join dbo.CREDITCARD on CREDITCARD.ID = REVENUESCHEDULE.CREDITCARDID
                                    where REVENUE.ID = @ID;

                                declare @SPLITSDECLININGGIFTAID xml
                                set @SPLITSDECLININGGIFTAID = (    select
                                                                    ID as REVENUESPLITID
                                                                from dbo.UFN_REVENUE_GETSPLITS_FROMITEMLISTXML(@SPLITS)
                                                                where DECLINESGIFTAID = 1
                                                                for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64)

                                exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID, @APPEALID, @PAYMENTMETHODCODE, @CREDITTYPECODEID, @CHANGEAGENTID, @DATE, 1, @SPLITSDECLININGGIFTAID; --revenue transaction type code of pledge is 1

                            end

                            if @SPLITSCHANGED = 1
                            begin
                                exec dbo.USP_PLEDGE_CLEARANDADDCAMPAIGNS @REVENUEID = @ID,
                                    @OPPORTUNITYID = @OPPORTUNITYID,
                                    @CHANGEAGENTID = @CHANGEAGENTID,
                                    @CHANGEDATE = @CURRENTDATE
                            end

                            if @ADJUST = 1 /*call USP_ADJUSTMENTHISTORY_REVENUE_SAVEHISTORY after the revenue tables are updated */
                                exec dbo.USP_ADJUSTMENTHISTORY_REVENUE_SAVEHISTORY @ID, @CHANGEAGENTID, null, @ADJUSTMENTID;

                            -- Save the adjustment history for any write-offs

                            if (select count(*) from @ADJUSTEDWRITEOFFS) > 0
                            begin
                                declare @HISTORYWRITEOFFID uniqueidentifier;
                                declare @HISTORYADJUSTMENTID uniqueidentifier;

                                /* Cursor to use for logging history adjustments */
                                declare HISTORYCURSOR cursor local fast_forward for
                                select WRITEOFFID, ADJUSTMENTID from @ADJUSTEDWRITEOFFS

                                open HISTORYCURSOR;
                                fetch next from HISTORYCURSOR into @HISTORYWRITEOFFID, @HISTORYADJUSTMENTID;

                                while @@FETCH_STATUS = 0 
                                begin
                                    if @HISTORYADJUSTMENTID is not null
                                        exec dbo.USP_ADJUSTMENTHISTORY_WRITEOFF_SAVEHISTORY @HISTORYWRITEOFFID, @CHANGEAGENTID, null, @HISTORYADJUSTMENTID;

                                    fetch next from HISTORYCURSOR into @HISTORYWRITEOFFID, @HISTORYADJUSTMENTID;
                                end

                                close HISTORYCURSOR;
                                deallocate HISTORYCURSOR;
                            end
                        end try

                        begin catch
                            --reset CONTEXT_INFO to previous value

                            if not @contextCache is null
                              set CONTEXT_INFO @contextCache;

                            exec dbo.USP_RAISE_ERROR;
                            return 1;
                        end catch

                        --reset CONTEXT_INFO to previous value

                        if not @contextCache is null
                          set CONTEXT_INFO @contextCache;

                        return 0;
                    end