USP_SAVE_GIFTAIDGLDISTRIBUTION

Saves gift aid GL distributions for a revenue record.

Parameters

Parameter Parameter Type Mode Description
@REVENUESPLITGIFTAIDID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN

Definition

Copy


            CREATE procedure dbo.USP_SAVE_GIFTAIDGLDISTRIBUTION
            (
                @REVENUESPLITGIFTAIDID uniqueidentifier,
                @CHANGEAGENTID uniqueidentifier = null,
                @CHANGEDATE datetime = null
            )
            as
                set nocount on;

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

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

                declare @ERRORMESSAGE nvarchar(255);

                declare @JOURNAL nvarchar(50);
                set @JOURNAL = 'Blackbaud Enterprise';

                declare @REVENUEID uniqueidentifier;
                select @REVENUEID = REVENUEID from dbo.REVENUESPLIT where ID = @REVENUESPLITGIFTAIDID;

                declare @ADJUSTMENTPOSTSTATUSCODE tinyint;
                set @ADJUSTMENTPOSTSTATUSCODE = 1;

                declare @DISTRIBUTIONS table(
                    GLTRANSACTIONID uniqueidentifier,
                    ACCOUNT nvarchar(100),
                    AMOUNT money,
                    PROJECT nvarchar(100),
                    REFERENCE nvarchar(255),
                    TRANSACTIONTYPECODE tinyint,
                    POSTDATE datetime,
                    GLPAYMENTMETHODREVENUETYPEMAPPINGID uniqueidentifier,
                    BASECURRENCYID uniqueidentifier,
                    TRANSACTIONAMOUNT money,
                    TRANSACTIONCURRENCYID uniqueidentifier,
                    BASEEXCHANGERATEID uniqueidentifier,
                    ORGANIZATIONAMOUNT money,
                    ORGANIZATIONEXCHANGERATEID uniqueidentifier,
                    ERRORMESSAGE nvarchar(max),
                    MAPPEDVALUES xml,
                    ACCOUNTID uniqueidentifier
                );

                -- Generate GL distributions for the gift aid record.

                insert into @DISTRIBUTIONS(GLTRANSACTIONID, ACCOUNT, AMOUNT, PROJECT, REFERENCE, TRANSACTIONTYPECODE, POSTDATE, GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                                           BASECURRENCYID, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID, ERRORMESSAGE, MAPPEDVALUES, ACCOUNTID)
                select 
                    newid(),
                    GIFTAIDDISTRIBUTIONS.ACCOUNTSTRING,
                    GIFTAIDDISTRIBUTIONS.AMOUNT,
                    GIFTAIDDISTRIBUTIONS.PROJECT,
                    GIFTAIDDISTRIBUTIONS.REFERENCE, 
                    GIFTAIDDISTRIBUTIONS.TRANSACTIONTYPECODE,
                    GIFTAIDDISTRIBUTIONS.POSTDATE,
                    GIFTAIDDISTRIBUTIONS.GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                    GIFTAIDDISTRIBUTIONS.BASECURRENCYID,
                    GIFTAIDDISTRIBUTIONS.TRANSACTIONAMOUNT,
                    GIFTAIDDISTRIBUTIONS.TRANSACTIONCURRENCYID,
                    GIFTAIDDISTRIBUTIONS.BASEEXCHANGERATEID,
                    GIFTAIDDISTRIBUTIONS.ORGANIZATIONAMOUNT,
                    GIFTAIDDISTRIBUTIONS.ORGANIZATIONEXCHANGERATEID,
                    GIFTAIDDISTRIBUTIONS.ERRORMESSAGE,
                    GIFTAIDDISTRIBUTIONS.MAPPEDVALUES,
                    GIFTAIDDISTRIBUTIONS.ACCOUNTID
                from 
                    dbo.UFN_REVENUESPLITGIFTAID_GENERATEGLDISTRIBUTION(@REVENUESPLITGIFTAIDID) as GIFTAIDDISTRIBUTIONS
                where not exists
                    (select
                        1
                    from
                        dbo.JOURNALENTRY JE
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = JE.FINANCIALTRANSACTIONLINEITEMID
                    where
                        LI.SOURCELINEITEMID = GIFTAIDDISTRIBUTIONS.REVENUESPLITID
                        and LI.POSTSTATUSCODE <> 1)


        --Only throw an error if the account ID is null because we want to allow the record to save but also trap the error

                -- when a holding account exists.

                select top 1 @ERRORMESSAGE = ERRORMESSAGE from @DISTRIBUTIONS where nullif(ERRORMESSAGE,'') is not null and ACCOUNTID is null;

                if nullif(@ERRORMESSAGE,'') is not null
                    raiserror('%s', 13, 1, @ERRORMESSAGE);
                else
                    --Trap the error when a holding account exists so we can show it to the user later.

                    insert into dbo.GLACCOUNTMAPPINGERROR (
                        [TRANSACTIONID]
                        ,[TRANSACTIONTYPECODE]
                        ,[ERRORMESSAGE]
                        ,[MAPPEDVALUES]
                        ,[ADDEDBYID]
                        ,[CHANGEDBYID]
                        ,[DATEADDED]
                        ,[DATECHANGED])
                    select distinct
                        R.REVENUEID
                        ,(select TRANSACTIONTYPECODE from dbo.REVENUE where ID = R.REVENUEID)
                        ,D.ERRORMESSAGE
                        ,convert(varchar(max),D.MAPPEDVALUES)
                        ,@CHANGEAGENTID
                        ,@CHANGEAGENTID
                        ,@CHANGEDATE
                        ,@CHANGEDATE
                    from @DISTRIBUTIONS
                    inner join dbo.REVENUESPLIT R on R.ID = @REVENUESPLITGIFTAIDID
                    where nullif(D.ERRORMESSAGE,'') is not null 
                        and D.ERRORMESSAGE not in (select ERRORMESSAGE from dbo.GLACCOUNTMAPPINGERROR where TRANSACTIONID = R.REVENUEID and DELETED = 0)


                declare @Cache table (HashCode uniqueidentifier, ErrorMessage nvarchar(max), GLAccountID uniqueidentifier, TransactionTypeCode tinyint, ErrorNumber tinyint, MappedValues nvarchar(max), PDAccountSystemID uniqueidentifier)
                insert into @Cache(HashCode, ErrorMessage, GLAccountID, TransactionTypeCode, ErrorNumber, MappedValues, PDAccountSystemID)
                select
                   v.MD5HASHCODE
                  ,d.ERRORMESSAGE
                  ,d.ACCOUNTID
                  ,d.TRANSACTIONTYPECODE
                  ,v.ERRORCODE
                  ,v.MAPPEDVALUES        
                  ,v.PDACCOUNTSYSTEMID        
                from @DISTRIBUTIONS d
                cross apply dbo.UFN_PDACCOUNTLOOKUPCACHE_PARSE_MAPPEDVALUES(MAPPEDVALUES) v
                where v.MD5HASHCODE is not null

                insert into dbo.PDACCOUNTLOOKUPCACHE (MD5HASHCODE, ERRORMESSAGE, GLACCOUNTID, TRANSACTIONTYPECODE, ERRORNUMBER, MAPPEDVALUES, PDACCOUNTSYSTEMID)
                select HashCode, ErrorMessage, GLAccountID, TransactionTypeCode, ErrorNumber, MappedValues, PDAccountSystemID
                from @Cache tt
                where not exists (select MD5HASHCODE from dbo.PDACCOUNTLOOKUPCACHE with (NOLOCK) where MD5HASHCODE = tt.HashCode and TRANSACTIONTYPECODE = tt.TransactionTypeCode and MAPPEDVALUES = tt.MappedValues)

                declare @LINEITEMID uniqueidentifier;

                select top 1
                    @LINEITEMID = ID
                from
                    dbo.FINANCIALTRANSACTIONLINEITEM
                where
                    TYPECODE = 8 and
                    SOURCELINEITEMID = @REVENUESPLITGIFTAIDID and
                    DELETEDON is null and
                    FINANCIALTRANSACTIONID = @REVENUEID

                if @LINEITEMID is null 
                begin                

                    set @LINEITEMID = NEWID();
                    insert into dbo.FINANCIALTRANSACTIONLINEITEM (
                        ID
                        ,FINANCIALTRANSACTIONID
                        ,TRANSACTIONAMOUNT
                        ,VISIBLE
                        ,ADDEDBYID
                        ,CHANGEDBYID
                        ,DATEADDED
                        ,DATECHANGED
                        ,DESCRIPTION
                        ,SEQUENCE
                        ,TYPECODE
                        ,POSTDATE
                        ,POSTSTATUSCODE
                        ,BASEAMOUNT
                        ,ORGAMOUNT
                        ,SOURCELINEITEMID
                      )
                      select distinct
                        @LINEITEMID
                        ,@REVENUEID
                        ,isnull(tmp.TRANSACTIONAMOUNT, 0)
                        ,0
                        ,@CHANGEAGENTID
                        ,@CHANGEAGENTID
                        ,@CHANGEDATE
                        ,@CHANGEDATE
                        ,'GiftAid'
                        ,1
                        ,8
                        ,SOURCELI.POSTDATE
                        ,case SOURCELI.POSTSTATUSCODE when 3 then 3
                                    else 1
                                    end
                        ,tmp.AMOUNT
                        ,tmp.ORGANIZATIONAMOUNT
                        ,@REVENUESPLITGIFTAIDID
                      from @DISTRIBUTIONS as tmp 
                        inner join dbo.FINANCIALTRANSACTION as FT on @REVENUEID = FT.ID
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM SOURCELI on SOURCELI.FINANCIALTRANSACTIONID = FT.ID and SOURCELI.ID = @REVENUESPLITGIFTAIDID
                        left join dbo.FINANCIALTRANSACTIONLINEITEM as FTLI on FTLI.FINANCIALTRANSACTIONID = FT.ID 
                            and FTLI.TYPECODE = 8 and FTLI.SOURCELINEITEMID = @REVENUESPLITGIFTAIDID
                        where FTLI.ID is null
                    end

            delete
            from
                dbo.JOURNALENTRY
            where
                FINANCIALTRANSACTIONLINEITEMID = @LINEITEMID

            insert into dbo.JOURNALENTRY
                (ID,FINANCIALTRANSACTIONLINEITEMID,TRANSACTIONTYPECODE,SUBLEDGERTYPECODE,TRANSACTIONAMOUNT,
                BASEAMOUNT,ORGAMOUNT,COMMENT,POSTDATE,GLACCOUNTID,SEQUENCE,TYPECODE,TRANSACTIONCURRENCYID,
                ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
            select 
                GLTRANSACTIONID,@LINEITEMID,TRANSACTIONTYPECODE,TRANSACTIONTYPECODE,TRANSACTIONAMOUNT,
                AMOUNT,ORGANIZATIONAMOUNT,REFERENCE,POSTDATE,ACCOUNTID,row_number() over (order by GLTRANSACTIONID),0,TRANSACTIONCURRENCYID,
                @CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE
            from
                @DISTRIBUTIONS;

            insert into JOURNALENTRY_EXT
                (ID,DISTRIBUTIONTABLEID,PROJECT,ACCOUNT,JOURNAL,PRECALCORGANIZATIONEXCHANGERATEID,
                PRECALCBASEEXCHANGERATEID,GLPAYMENTMETHODREVENUETYPEMAPPINGID,TABLENAMECODE,OUTDATED,
                LOGICALREVENUEID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED, REVENUESPLITGIFTAIDID)
            select
                D.GLTRANSACTIONID,NEWID(),coalesce(PROJECT, ''),GL.ACCOUNTNUMBER,@JOURNAL,ORGANIZATIONEXCHANGERATEID,
                BASEEXCHANGERATEID,GLPAYMENTMETHODREVENUETYPEMAPPINGID,7,0,
                @REVENUEID,@CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE, @REVENUESPLITGIFTAIDID
            from 
                @DISTRIBUTIONS D
                inner join dbo.GLACCOUNT GL on GL.ID = D.ACCOUNTID