USP_SAVE_PLANNEDGIFTPAYOUTGLDISTRIBUTION

Adds distribution for planned gift payout.

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@PLANNEDGIFTPAYOUTID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN

Definition

Copy


CREATE procedure dbo.USP_SAVE_PLANNEDGIFTPAYOUTGLDISTRIBUTION
            (
                @REVENUEID uniqueidentifier,
                @PLANNEDGIFTPAYOUTID 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 @JOURNAL nvarchar(50);
                set @JOURNAL = 'Blackbaud Enterprise';

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

                -- Generate GL distributions for the revenue record.

                insert into @DISTRIBUTIONS(GLTRANSACTIONID, ACCOUNT, AMOUNT, PROJECT, REFERENCE, TRANSACTIONTYPECODE, POSTDATE, 
                            GLPAYMENTMETHODREVENUETYPEMAPPINGID,ACCOUNTID,ERRORMESSAGE,REVENUESPLITID,REVENUEGLDISTRIBUTIONID,
                            BASECURRENCYID, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ORGANIZATIONAMOUNT,
                            ORGANIZATIONEXCHANGERATEID, MAPPEDVALUES, FINANCIALTRANSACTIONLINEITEMID)
                select 
                    newid(),
                    REVDISTRIBUTIONS.ACCOUNTSTRING,
                    REVDISTRIBUTIONS.AMOUNT,
                    REVDISTRIBUTIONS.PROJECT,
                    REVDISTRIBUTIONS.REFERENCE, 
                    REVDISTRIBUTIONS.TRANSACTIONTYPECODE,
                    REVDISTRIBUTIONS.POSTDATE,
                    REVDISTRIBUTIONS.GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                    REVDISTRIBUTIONS.ACCOUNTID,
                    REVDISTRIBUTIONS.ERRORMESSAGE,
                    REVDISTRIBUTIONS.REVENUESPLITID,
                    newid(),
                    REVDISTRIBUTIONS.BASECURRENCYID,
                    REVDISTRIBUTIONS.TRANSACTIONAMOUNT,
                    REVDISTRIBUTIONS.TRANSACTIONCURRENCYID,
                    REVDISTRIBUTIONS.BASEEXCHANGERATEID,
                    REVDISTRIBUTIONS.ORGANIZATIONAMOUNT,
                    REVDISTRIBUTIONS.ORGANIZATIONEXCHANGERATEID,
                    REVDISTRIBUTIONS.MAPPEDVALUES,
                    REVDISTRIBUTIONS.FINANCIALTRANSACTIONLINEITEMID
                from 
                (
                select 
                    REVENUE.ID as REVENUEID, 
                    dbo.UFN_POSTTOGLPROCESS_GETGLPAYMENTMETHODREVENUETYPEMAPPINGID(REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE, REVENUE.TRANSACTIONTYPECODE, REVENUESPLIT.TYPECODE, REVENUESPLIT.APPLICATIONCODE, tf.TRANSACTIONTYPECODE) as GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                    tf.TRANSACTIONTYPECODE, 
                    case when PLANNEDGIFTPAYOUTADJUSTMENT.ID is null then REVENUE.POSTDATE        
                         else PLANNEDGIFTPAYOUTADJUSTMENT.POSTDATE
                    end as POSTDATE,
                    case when PLANNEDGIFTPAYOUTADJUSTMENT.ID is null then (case when REVENUE.DONOTPOST = 1 then 2 when REVENUEPOSTED.ID is not null then 0 else 1 end)        -- same reason as above. 

                         else PLANNEDGIFTPAYOUTADJUSTMENT.POSTSTATUSCODE
                    end as POSTSTATUSCODE,
                    tf.ACCOUNTSTRING, 
                    tf.PROJECTCODE as PROJECT, 
                    PLANNEDGIFTPAYOUTSPLIT.AMOUNT, 
                    dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, REVENUEPAYMENTMETHOD.PAYMENTMETHOD, REVENUESPLIT.APPLICATION) + ' Payout' as REFERENCE,
                    tf.ERRORMESSAGE,
                    REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE,
                    REVENUE.TRANSACTIONTYPECODE as REVENUETRANSACTIONTYPECODE,
                    tf.ACCOUNTID as ACCOUNTID,
                    REVENUESPLIT.ID as REVENUESPLITID,
                    PLANNEDGIFTPAYOUTSPLIT.BASECURRENCYID, 
                    PLANNEDGIFTPAYOUTSPLIT.TRANSACTIONAMOUNT, 
                    PLANNEDGIFTPAYOUTSPLIT.TRANSACTIONCURRENCYID, 
                    PLANNEDGIFTPAYOUTSPLIT.BASEEXCHANGERATEID, 
                    PLANNEDGIFTPAYOUTSPLIT.ORGANIZATIONAMOUNT, 
                    PLANNEDGIFTPAYOUTSPLIT.ORGANIZATIONEXCHANGERATEID
                    ,tf.MAPPEDVALUES,
                    PLANNEDGIFTPAYOUTSPLIT.ID as FINANCIALTRANSACTIONLINEITEMID
                from 
                    dbo.REVENUE 
                    left join dbo.REVENUEPOSTED  on REVENUEPOSTED.ID = REVENUE.ID
                    inner join dbo.PLANNEDGIFTPAYOUT on REVENUE.ID = PLANNEDGIFTPAYOUT.REVENUEID 
                    inner join dbo.PLANNEDGIFT  on PLANNEDGIFT.ID = PLANNEDGIFTPAYOUT.ID    
                    inner join dbo.PLANNEDGIFTPAYOUTSPLIT  on REVENUE.ID = PLANNEDGIFTPAYOUTSPLIT.REVENUEID     
                    inner join dbo.REVENUESPLIT  on REVENUE.ID = REVENUESPLIT.REVENUEID and REVENUESPLIT.DESIGNATIONID = PLANNEDGIFTPAYOUTSPLIT.DESIGNATIONID
                    inner join dbo.REVENUEPAYMENTMETHOD  on REVENUE.ID = REVENUEPAYMENTMETHOD.REVENUEID 
                    left join dbo.PLANNEDGIFTPAYOUTADJUSTMENT  on REVENUE.ID = PLANNEDGIFTPAYOUTADJUSTMENT.REVENUEID and PLANNEDGIFTPAYOUTADJUSTMENT.POSTSTATUSCODE <> 0 
                    cross apply dbo.UFN_REVENUE_GENERATEGLACCOUNT(REVENUESPLIT.ID, REVENUE.TRANSACTIONTYPECODE,REVENUESPLIT.TYPECODE, 21, PLANNEDGIFT.VEHICLECODE, REVENUESPLIT.DESIGNATIONID) as tf
                where    
                    (REVENUE.ID = @REVENUEID)
                    and (not REVENUESPLIT.APPLICATIONCODE in (1,2,5))                
                ) as REVDISTRIBUTIONS

                declare @ERRORMESSAGE nvarchar(max);
                select top 1 @ERRORMESSAGE = ERRORMESSAGE from @DISTRIBUTIONS where nullif(ERRORMESSAGE,'') is not null and ACCOUNTID is 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
                        @REVENUEID
                        ,(select TRANSACTIONTYPECODE from dbo.REVENUE where ID = @REVENUEID)
                        ,D.ERRORMESSAGE
                        ,convert(nvarchar(max),D.MAPPEDVALUES)
                        ,@CHANGEAGENTID
                        ,@CHANGEAGENTID
                        ,@CHANGEDATE
                        ,@CHANGEDATE
                    from @DISTRIBUTIONS
                    where nullif(D.ERRORMESSAGE,'') is not null 
                        and D.ERRORMESSAGE not in (select ERRORMESSAGE from dbo.GLACCOUNTMAPPINGERROR where TRANSACTIONID = @REVENUEID and DELETED = 0)

                set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE((select top 1 POSTDATE from @DISTRIBUTIONS));

                if @ERRORMESSAGE <> ''
                    raiserror(@ERRORMESSAGE, 13, 1);

        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)

        --Check to see if there is an adjustment, if so, use adjustment poststatuscode

        DECLARE @ADJUSTMENTPOSTSTATUSCODE tinyint
        SET @ADJUSTMENTPOSTSTATUSCODE = 1
        if EXISTS (SELECT ID FROM ADJUSTMENT WHERE REVENUEID = @REVENUEID)
          BEGIN
             SELECT @ADJUSTMENTPOSTSTATUSCODE = POSTSTATUSCODE FROM ADJUSTMENT WHERE REVENUEID = @REVENUEID
          END

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

        insert into dbo.JOURNALENTRY_EXT
            (ID, JOURNAL, TABLENAMECODE, GLPAYMENTMETHODREVENUETYPEMAPPINGID,
            ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, LOGICALREVENUEID, ACCOUNT,
            PRECALCPOSTSTATUSCODE, PLANNEDGIFTPAYOUTID, BENEFITTYPECODE, PRECALCBASEEXCHANGERATEID, PRECALCORGANIZATIONEXCHANGERATEID)
        select
            D.GLTRANSACTIONID, @JOURNAL, 9, D.GLPAYMENTMETHODREVENUETYPEMAPPINGID,
            @CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE, @REVENUEID, D.ACCOUNT,
            1, @PLANNEDGIFTPAYOUTID, 4, D.BASEEXCHANGERATEID, D.ORGANIZATIONEXCHANGERATEID
        from
            @DISTRIBUTIONS D