USP_SAVE_AUCTIONPURCHASEGLDISTRIBUTION

Saves auction purchase GL distributions when a payment is added.

Parameters

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

Definition

Copy


            CREATE procedure [dbo].[USP_SAVE_AUCTIONPURCHASEGLDISTRIBUTION]
            (
                @REVENUEID uniqueidentifier,
                @CHANGEAGENTID uniqueidentifier = null,
                @CHANGEDATE datetime = null,
                @PDACCOUNTSYSTEMID uniqueidentifier = null
            )
            as
            begin

                set nocount on;

               if not exists(select 1 from dbo.REVENUESPLIT where REVENUEID = @REVENUEID and APPLICATIONCODE = 12 and TYPECODE = 12)
                    return;

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

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

                if @PDACCOUNTSYSTEMID is null
                    select @PDACCOUNTSYSTEMID = PDACCOUNTSYSTEMFORREVENUE.PDACCOUNTSYSTEMID
                    from dbo.REVENUE inner join dbo.PDACCOUNTSYSTEMFORREVENUE on REVENUE.ID = PDACCOUNTSYSTEMFORREVENUE.ID
                    where REVENUE.ID = @REVENUEID

                declare @CUSTOMIZED integer = 0;
                exec  @CUSTOMIZED = dbo.USP_SAVE_AUCTIONPURCHASEGLDISTRIBUTION_CUSTOMIZE @REVENUEID,@CHANGEAGENTID,@CHANGEDATE,@PDACCOUNTSYSTEMID

                if @CUSTOMIZED = 0
                begin

                    declare @DISTRIBUTIONS table(
                        GLTRANSACTIONID uniqueidentifier,
                        ACCOUNT nvarchar(100),
                        AMOUNT money,
                        PROJECT nvarchar(100),
                        REFERENCE nvarchar(255),
                        TRANSACTIONTYPECODE tinyint,
                        POSTDATE datetime,
                        GLPAYMENTMETHODREVENUETYPEMAPPINGID uniqueidentifier,
                        ACCOUNTID uniqueidentifier,
                        REVENUEID uniqueidentifier,
                        REVENUESPLITTYPECODE tinyint,
                        POSTSTATUSCODE tinyint,
                        AUCTIONITEMPOSTSTATUSCODE tinyint,
                        REVENUEPURCHASEID uniqueidentifier,
                        BASECURRENCYID uniqueidentifier,
                        TRANSACTIONCURRENCYID uniqueidentifier,
                        BASEEXCHANGERATEID uniqueidentifier,
                        ORGANIZATIONEXCHANGERATEID uniqueidentifier,
                        TRANSACTIONAMOUNT money,
                        ORGANIZATIONAMOUNT money,
                        ERRORMESSAGE nvarchar(max),
                        MAPPEDVALUES xml,
                        SYSTEMDISTRIBUTION bit default 0,
                        REVENUESPLITID uniqueidentifier
                    );

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

                    -- Generate GL distributions for the auction purchase record.

                    insert into @DISTRIBUTIONS(
                        GLTRANSACTIONID,
                        ACCOUNT,
                        AMOUNT,
                        PROJECT,
                        REFERENCE,
                        TRANSACTIONTYPECODE,
                        POSTDATE,
                        GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                        ACCOUNTID,
                        REVENUEID,
                        REVENUESPLITTYPECODE,
                        POSTSTATUSCODE,
                        AUCTIONITEMPOSTSTATUSCODE,
                        REVENUEPURCHASEID,
                      BASECURRENCYID,
                      TRANSACTIONCURRENCYID,
                      BASEEXCHANGERATEID,
                      ORGANIZATIONEXCHANGERATEID,
                      TRANSACTIONAMOUNT,
                      ORGANIZATIONAMOUNT,
                      ERRORMESSAGE,
                      MAPPEDVALUES,
                      REVENUESPLITID
                    )
                    select 
                        newid(),
                        DISTRIBUTIONS.ACCOUNTSTRING,
                        DISTRIBUTIONS.AMOUNT,
                        DISTRIBUTIONS.PROJECT,
                        DISTRIBUTIONS.REFERENCE, 
                        DISTRIBUTIONS.TRANSACTIONTYPECODE,
                        DISTRIBUTIONS.POSTDATE,
                        DISTRIBUTIONS.GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                        DISTRIBUTIONS.ACCOUNTID,
                        DISTRIBUTIONS.REVENUEID,
                        DISTRIBUTIONS.REVENUESPLITTYPECODE,
                        1,--DISTRIBUTIONS.POSTSTATUSCODE,

                        DISTRIBUTIONS.AUCTIONITEMPOSTSTATUSCODE,
                        DISTRIBUTIONS.REVENUEPURCHASEID,
                      DISTRIBUTIONS.BASECURRENCYID,
                      DISTRIBUTIONS.TRANSACTIONCURRENCYID,
                      DISTRIBUTIONS.BASEEXCHANGERATEID,
                      DISTRIBUTIONS.ORGANIZATIONEXCHANGERATEID,
                      DISTRIBUTIONS.TRANSACTIONAMOUNT,
                      DISTRIBUTIONS.ORGANIZATIONAMOUNT,
                      DISTRIBUTIONS.ERRORMESSAGE,
                      DISTRIBUTIONS.MAPPEDVALUES,
                      DISTRIBUTIONS.REVENUESPLITID
                    from 
                        dbo.UFN_REVENUE_GENERATEAUCTIONPURCHASEGLDISTRIBUTION_2(@REVENUEID,null) as DISTRIBUTIONS

                    declare @ERRORMESSAGE nvarchar(max);

                    select top 1 @ERRORMESSAGE = ERRORMESSAGE from @DISTRIBUTIONS where ACCOUNTID is null
                    if @ERRORMESSAGE <> ''
                        raiserror('%s', 13, 1, @ERRORMESSAGE);
                    else
                        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(varchar(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)

                    if (select count(*) from @DISTRIBUTIONS) > 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)

            if (select count(*) from @DISTRIBUTIONS) > 0
                    begin

                        declare @AUCTIONITEMDONATIONID uniqueidentifier;
                        declare @AUCTIONITEMPOSTSTATUSCODE tinyint;
                        declare @PAYMENTPOSTSTATUSCODE tinyint;
                        declare @REVENUEPURCHASEID uniqueidentifier;
                        declare @ADJUSTMENTDATE datetime;

                        set @ADJUSTMENTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE)

                        end
                        --Create a cursor to go through all of the auction items that received a payment with this revenue        

                        declare AUCTIONITEM_CURSOR cursor local fast_forward

                        for 
                            select distinct 
                                DISTRIBUTIONS.REVENUEID,
                                DISTRIBUTIONS.AUCTIONITEMPOSTSTATUSCODE,
                                DISTRIBUTIONS.POSTSTATUSCODE,
                                DISTRIBUTIONS.REVENUEPURCHASEID
                            from 
                                @DISTRIBUTIONS DISTRIBUTIONS 
                            inner join dbo.AUCTIONITEM on 
                                AUCTIONITEM.REVENUEAUCTIONDONATIONID = DISTRIBUTIONS.REVENUEID

                        open AUCTIONITEM_CURSOR

                        fetch next from AUCTIONITEM_CURSOR into
                             @AUCTIONITEMDONATIONID,
                             @AUCTIONITEMPOSTSTATUSCODE,
                             @PAYMENTPOSTSTATUSCODE,
                             @REVENUEPURCHASEID

                        while @@FETCH_STATUS = 0
                        begin     

                            --Previously we only added/updated distributions if the original auction

                            -- item donation was not set to DONOTPOST and the payment was not set to DONOTPOST.

                            -- However, we now only check the auction purchase payment post status; per

                            -- Bug 285104 we now know the auction donation post status should not impact

                            -- auction purchase GL distributions (in the same way pledge post status does not

                            -- impact pledge payment GL distributions).

                            if @PAYMENTPOSTSTATUSCODE <> 2
                            begin

                            ----Handle Old Distributions----


                                declare @GLTRANSACTIONSTODELETE table (GLTRANSACTIONID uniqueidentifier,AUCTIONPURCHASEGLDISTRIBUTIONID uniqueidentifier);    


                            insert into @GLTRANSACTIONSTODELETE (GLTRANSACTIONID,AUCTIONPURCHASEGLDISTRIBUTIONID)    
                            select  AUCTIONPURCHASEGLDISTRIBUTION.GLTRANSACTIONID,AUCTIONPURCHASEGLDISTRIBUTION.ID from
                                     dbo.AUCTIONPURCHASEGLDISTRIBUTION     

                                left join dbo.AUCTIONITEMPURCHASE on 
                                    AUCTIONITEMPURCHASE.PURCHASEID = AUCTIONPURCHASEGLDISTRIBUTION.REVENUEPURCHASEID
                                left join dbo.GLTRANSACTION on
                                    AUCTIONPURCHASEGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
                                where
                                    AUCTIONPURCHASEGLDISTRIBUTION.REVENUEPURCHASEID = @REVENUEPURCHASEID and
                                    AUCTIONPURCHASEGLDISTRIBUTION.REVENUEID = @AUCTIONITEMDONATIONID and
                                    GLTRANSACTION.POSTSTATUSCODE = 1




                                delete 
                                    dbo.AUCTIONPURCHASEGLDISTRIBUTION 
                                where
                                    AUCTIONPURCHASEGLDISTRIBUTION.ID in (select AUCTIONPURCHASEGLDISTRIBUTIONID from @GLTRANSACTIONSTODELETE)                                

                                --Delete the GL Transactions

                                delete 
                                    dbo.GLTRANSACTION 
                                where
                                    GLTRANSACTION.ID in (select GLTRANSACTIONID from @GLTRANSACTIONSTODELETE)

                                --Determine if any posted distributions exist

                                if((select
                                        count(*)
                                    from
                                         dbo.AUCTIONPURCHASEGLDISTRIBUTION     
                                    left join dbo.GLTRANSACTION on
                                        AUCTIONPURCHASEGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
                                    where
                                        AUCTIONPURCHASEGLDISTRIBUTION.REVENUEPURCHASEID = @REVENUEPURCHASEID and
                                        AUCTIONPURCHASEGLDISTRIBUTION.REVENUEID = @AUCTIONITEMDONATIONID and
                                        GLTRANSACTION.POSTSTATUSCODE = 0
                                    > 0)
                                begin
                                    exec dbo.USP_SAVE_AUCTIONPURCHASEADJUSTMENT 
                                        @REVENUEID = @REVENUEID,
                                        @DATE = @ADJUSTMENTDATE,
                                        @CHANGEAGENTID = @CHANGEAGENTID,
                                        @CHANGEDATE = @CHANGEDATE,
                                        @POSTDATE = @ADJUSTMENTDATE
                                end                                                                        
                                --Insert New Distributions----


                                declare @ORGDECIMALDIGITS tinyint;
                                declare @ORGROUNDINGTYPECODE tinyint;

                                select 
                                    @ORGDECIMALDIGITS = ORGCURRENCY.DECIMALDIGITS,
                                    @ORGROUNDINGTYPECODE = ORGCURRENCY.ROUNDINGTYPECODE
                                --from @DISTRIBUTIONS DISTRIBUTION

                                --inner join dbo.CURRENCY ORGCURRENCY on ORGCURRENCY.ID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()

                                from dbo.CURRENCY ORGCURRENCY
                                where ORGCURRENCY.ID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()

                        insert into dbo.JOURNALENTRY (ID, FINANCIALTRANSACTIONLINEITEMID, TRANSACTIONTYPECODE, BASEAMOUNT, COMMENT
                            POSTDATE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, GLACCOUNTID, ORGAMOUNT, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, TYPECODE, SUBLEDGERTYPECODE)        
                        select GLTRANSACTIONID, REVENUESPLITID, TRANSACTIONTYPECODE, AMOUNT, REFERENCE,
                            POSTDATE, @CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE, ACCOUNTID, ORGANIZATIONAMOUNT, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, case when SYSTEMDISTRIBUTION = 1 then 1 else 0 end, TRANSACTIONTYPECODE
                        from @DISTRIBUTIONS
                        where 
                            REVENUEPURCHASEID = @REVENUEPURCHASEID and
                            REVENUEID = @AUCTIONITEMDONATIONID
                        and
                            (AMOUNT != 0 or TRANSACTIONAMOUNT != 0 or 
                            (dbo.UFN_AUCTIONPACKAGE_CURRENCY_ROUND(ORGANIZATIONAMOUNT, @ORGDECIMALDIGITS, @ORGROUNDINGTYPECODE) != 0));

                        insert into dbo.JOURNALENTRY_EXT (ID, DISTRIBUTIONTABLEID, TABLENAMECODE, PROJECT, JOURNAL, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, PRECALCPOSTSTATUSCODE, PRECALCORGANIZATIONEXCHANGERATEID,
                            PRECALCBASEEXCHANGERATEID,  ACCOUNT, GLPAYMENTMETHODREVENUETYPEMAPPINGID, REVENUEPURCHASEID)
                        select GLTRANSACTIONID,GLTRANSACTIONID,2,PROJECT, @JOURNAL, @CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE, POSTSTATUSCODE, ORGANIZATIONEXCHANGERATEID,
                            BASEEXCHANGERATEID,  ACCOUNT, GLPAYMENTMETHODREVENUETYPEMAPPINGID, @REVENUEPURCHASEID
                        from @DISTRIBUTIONS
                        where 
                            REVENUEPURCHASEID = @REVENUEPURCHASEID and
                            REVENUEID = @AUCTIONITEMDONATIONID
                        and
                            (AMOUNT != 0 or TRANSACTIONAMOUNT != 0 or 
                            (dbo.UFN_AUCTIONPACKAGE_CURRENCY_ROUND(ORGANIZATIONAMOUNT, @ORGDECIMALDIGITS, @ORGROUNDINGTYPECODE) != 0));

                                  end                          

                            fetch next from AUCTIONITEM_CURSOR into
                                @AUCTIONITEMDONATIONID,
                                @AUCTIONITEMPOSTSTATUSCODE,
                                @PAYMENTPOSTSTATUSCODE,
                                @REVENUEPURCHASEID
                        end

                        close AUCTIONITEM_CURSOR;
                        deallocate AUCTIONITEM_CURSOR;

                        --Save the realized gain/loss on the currency exchange rates

                        exec dbo.USP_SAVE_AUCTIONPURCHASEREALIZEDGLDISTRIBUTION @REVENUEID, @PDACCOUNTSYSTEMID, @CHANGEAGENTID;

                    end
                end