USP_DATAFORMTEMPLATE_EDIT_GRANTAWARD_2

The save procedure used by the edit dataform template "Grant Award Edit Form".

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
@SPLITS xml IN Designations
@FREQUENCYCODE tinyint IN Frequency
@NUMBEROFINSTALLMENTS int IN No. installments remaining
@NEXTTRANSACTIONDATE datetime IN Next installment date
@INSTALLMENTS xml IN
@DONOTACKNOWLEDGE bit IN Do not acknowledge
@CATEGORYCODEID uniqueidentifier IN Revenue category
@ISREIMBURSABLE bit IN Grant award is reimbursable
@OPPORTUNITYID uniqueidentifier IN Opportunity
@BASECURRENCYID uniqueidentifier IN Base currency
@TRANSACTIONCURRENCYID uniqueidentifier IN Transaction currency
@BASEEXCHANGERATEID uniqueidentifier IN Exchange rate ID
@EXCHANGERATE decimal(20, 8) IN Exchange rate
@HADSPOTRATE bit IN Had spot rate
@RATECHANGED bit IN Rate changed

Definition

Copy


                    CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_GRANTAWARD_2
                    (
                        @ID uniqueidentifier,
                        @CHANGEAGENTID uniqueidentifier = null,
                        @DATE datetime,
                        @AMOUNT money,
                        @POSTSTATUSCODE tinyint,
                        @POSTDATE datetime,
                        @SPLITS xml,
                        @FREQUENCYCODE tinyint,
                        @NUMBEROFINSTALLMENTS int,
                        @NEXTTRANSACTIONDATE datetime,
                        @INSTALLMENTS xml,
                        @DONOTACKNOWLEDGE bit,
                        @CATEGORYCODEID uniqueidentifier,
                        @ISREIMBURSABLE bit,
                        @OPPORTUNITYID uniqueidentifier,
                        @BASECURRENCYID uniqueidentifier,
                        @TRANSACTIONCURRENCYID uniqueidentifier,
                        @BASEEXCHANGERATEID uniqueidentifier,
                        @EXCHANGERATE decimal(20,8),
                        @HADSPOTRATE bit,
                        @RATECHANGED bit
                    )
                    as

                        set nocount on;

                        -- Check GL business rule for this account system and set to 'Do not post' if needed.

                        -- ****

                        declare @PDACCOUNTSYSTEMID uniqueidentifier;
                        select @PDACCOUNTSYSTEMID = PDACCOUNTSYSTEMID 
                        from dbo.PDACCOUNTSYSTEMFORREVENUE
                        where ID = @ID;

                        declare @ALLOWGLDISTRIBUTIONS bit;
                        set @ALLOWGLDISTRIBUTIONS = dbo.UFN_PDACCOUNTSYSTEM_ALLOWGLDISTRIBUTIONS(@PDACCOUNTSYSTEMID);
                        if @ALLOWGLDISTRIBUTIONS = 0
                            begin
                                set @POSTSTATUSCODE = 2        -- Do not post

                                set @POSTDATE = null
                            end
                        -- ****                


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

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

                        begin try
                            declare @SUM money;
                            declare @COUNT int;

                            declare @contextCache varbinary(128);

                            -- Multicurrency - If the revenue previously used a spot rate, but

                            -- its rate has changed, store the old rate's ID, so we can remove it later.

                            declare @OLDSPOTRATE uniqueidentifier
                            if @HADSPOTRATE = 1 and @RATECHANGED = 1
                            begin
                                select 
                                    @OLDSPOTRATE = BASEEXCHANGERATEID
                                from dbo.REVENUE
                                where ID = @ID
                            end

                            --If the record uses a new spot rate, create it and set the rate ID.

                            if @BASEEXCHANGERATEID = '00000000-0000-0000-0000-000000000001'
                            begin

                                set @BASEEXCHANGERATEID = newid()

                                insert into dbo.CURRENCYEXCHANGERATE(
                                    ID, 
                                    FROMCURRENCYID,
                                    TOCURRENCYID,
                                    RATE,
                                    ASOFDATE,
                                    TYPECODE,
                                    SOURCECODEID,
                                    ADDEDBYID, 
                                    CHANGEDBYID, 
                                    DATEADDED, 
                                    DATECHANGED
                                )
                                values(
                                    @BASEEXCHANGERATEID,
                                    @TRANSACTIONCURRENCYID,
                                    @BASECURRENCYID,
                                    @EXCHANGERATE,
                                    @DATE,
                                    2,
                                    null,
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE
                                );
                            end

                            exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS=@SPLITS, @REVENUEAMOUNT=@AMOUNT, @REVENUEID=@ID, @TRANSACTIONCURRENCYID=@TRANSACTIONCURRENCYID;

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

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

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

                            /* You can only edit unposted grant awards here */
                            if exists (select 1 from dbo.REVENUEPOSTED where REVENUEPOSTED.ID = @ID)
                                raiserror('You cannot edit a posted grant award.', 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_2_FROMITEMLISTXML(@INSTALLMENTS) XMLINST
                                on INSTALLMENT.ID = XMLINST.ID
                                where XMLINST.AMOUNT < XMLINST.APPLIED) > 0
                                raiserror('GRANTAWARDPAYMENT_INSTALLMENTAPPLIED',13,1);

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

                            declare @REACKNOWLEDGEFIELDCHANGED bit;    
                            declare @CLEARGLDISTRIBUTION bit;
                            declare @CLEARWRITEOFFGLDISTRIBUTION bit;

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

                            -- check to see if designations have changed

                            if dbo.UFN_CHECKDETAIL_SPLITSCHANGED(@ID, @SPLITS) = 1
                            begin
                                set @CLEARGLDISTRIBUTION = 1;
                                set @CLEARWRITEOFFGLDISTRIBUTION = 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 @CLEARGLDISTRIBUTION = 1;
                                set @CLEARWRITEOFFGLDISTRIBUTION = 1;
                            end


                            --Multicurrency - Retrieve and calculate the necessary multicurrency values.                

                            declare @BASEAMOUNT money;
                            declare @ORGANIZATIONCURRENCYID uniqueidentifier;
                            declare @ORGANIZATIONAMOUNT money;
                            declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;

                            exec dbo.USP_CURRENCY_GETCURRENCYVALUES
                                @AMOUNT,
                                @DATE,
                                @BASECURRENCYID,
                                @BASEEXCHANGERATEID,
                                @TRANSACTIONCURRENCYID output,
                                @BASEAMOUNT output,
                                @ORGANIZATIONCURRENCYID output,
                                @ORGANIZATIONAMOUNT output,
                                @ORGANIZATIONEXCHANGERATEID output,
                                1;

                            -- check to see if amounts, postdate, post status, or exchange rates has changed

                            if @CLEARGLDISTRIBUTION = 0
                                if (
                                    select 
                                        count(REVENUE.ID) 
                                    from 
                                        dbo.REVENUE 
                                    where 
                                        REVENUE.ID = @ID 
                                        and TRANSACTIONAMOUNT = @AMOUNT
                                        and POSTDATE = @POSTDATE 
                                        and ((@POSTSTATUSCODE = 2 and DONOTPOST = 1) or (@POSTSTATUSCODE = 1 and DONOTPOST = 0))
                                        and AMOUNT = @BASEAMOUNT
                                        and ORGANIZATIONAMOUNT = @ORGANIZATIONAMOUNT
                                        and BASEEXCHANGERATEID = @BASEEXCHANGERATEID
                                        and ORGANIZATIONEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID
                                        and TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID
                                        and BASECURRENCYID = @BASECURRENCYID
                                ) = 0 
                                begin
                                    set @CLEARGLDISTRIBUTION = 1;
                                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 TRANSACTIONAMOUNT = @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.REVENUE
                            set
                                DATE = @DATE,
                                DONOTPOST = @DONOTPOST,
                                POSTDATE = @POSTDATE,
                                AMOUNT = @BASEAMOUNT,
                                DONOTACKNOWLEDGE = @DONOTACKNOWLEDGE,
                                CHANGEDBYID = @CHANGEAGENTID,
                                DATECHANGED = @CURRENTDATE,
                                ISREIMBURSABLE = @ISREIMBURSABLE,
                                BASECURRENCYID = @BASECURRENCYID,
                                ORGANIZATIONAMOUNT = @ORGANIZATIONAMOUNT,
                                TRANSACTIONAMOUNT = @AMOUNT,
                                BASEEXCHANGERATEID = @BASEEXCHANGERATEID,
                                ORGANIZATIONEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID
                            where
                                ID = @ID;

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

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

                            -- Multicurrency - Process the splits xml to calculate the base and organization amounts and place them in proper nodes.

                            set @SPLITS = dbo.UFN_REVENUESPLIT_CONVERTAMOUNTSINXML(@SPLITS,@BASECURRENCYID,@ORGANIZATIONEXCHANGERATEID,@TRANSACTIONCURRENCYID,@BASEEXCHANGERATEID);
                            exec dbo.USP_REVENUE_GETSPLITS_2_UPDATEFROMXML @ID, @SPLITS, @CHANGEAGENTID, @CURRENTDATE;        

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

                            if (@OPPORTUNITYID is not null) and (@OPPORTUNITYID <> '00000000-0000-0000-0000-000000000000')
                            begin
                                --Pull in default solicitors before changing the opportunity record.

                                exec dbo.USP_REVENUE_PULLSOLICITORSFROMOPPORTUNITY @ID, @OPPORTUNITYID, @CHANGEAGENTID, @CURRENTDATE

                                update dbo.REVENUEOPPORTUNITY
                                set
                                    OPPORTUNITYID = @OPPORTUNITYID,
                                    CHANGEDBYID = @CHANGEAGENTID,
                                    DATECHANGED = @CURRENTDATE
                                where
                                    ID in (select ID from dbo.REVENUESPLIT where REVENUEID = @ID)

                                insert into dbo.REVENUEOPPORTUNITY
                                (
                                    ID, OPPORTUNITYID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                )
                                select
                                    ID, @OPPORTUNITYID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                from (
                                    select REVENUESPLIT.ID [ID]
                                    from dbo.REVENUESPLIT
                                    left join dbo.REVENUEOPPORTUNITY on REVENUEOPPORTUNITY.ID = REVENUESPLIT.ID
                                    where REVENUEID = @ID and REVENUEOPPORTUNITY.ID is null
                                ) [NEWSPLITS];

                                exec dbo.USP_OPPORTUNITY_UPDATEACCEPTEDSTATUS @OPPORTUNITYID, @DATE, @CHANGEAGENTID, @CURRENTDATE
                            end
                            else
                            begin
                                exec dbo.USP_REVENUE_PULLSOLICITORSFROMFUNDINGREQUEST_ONLYNEWSPLITS @SPLITS, @ID, @CHANGEAGENTID, @CURRENTDATE;    
                            end

                            --MMR not sure we still need this?

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

                            -- Multicurrency - Pass in multicurrency information so we can convert the amount in the xml 

                            -- once installment splits are pulled out of their installments.

                            exec dbo.USP_PLEDGE_UPDATEINSTALLMENT3 @ID, @INSTALLMENTS, @CHANGEAGENTID, @CURRENTDATE
                                null, null, null, '',
                                @BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASEEXCHANGERATEID;

                            -- 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
                                    exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE;

                                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 @SPLITSCHANGED = 1
                                exec dbo.USP_PLEDGE_CLEARANDADDCAMPAIGNS @ID,null,@CHANGEAGENTID,@CURRENTDATE;


                            -- Multicurrency - If we stored an old spot rate earlier, now is the time to remove it.

                            if @OLDSPOTRATE is not null
                            begin
                                delete CURRENCYEXCHANGERATE where ID = @OLDSPOTRATE;
                            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;