USP_GLTRANSACTION_ADDGIFTFEEREVERSALS
Adds gift fee reversal transactions for the given revenue record.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUEID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CHANGEDATE | datetime | IN | |
@POSTDATE | datetime | IN |
Definition
Copy
CREATE procedure dbo.USP_GLTRANSACTION_ADDGIFTFEEREVERSALS
(
@REVENUEID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier = null,
@CHANGEDATE datetime = null,
@POSTDATE 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';
--Get the postdate for REVERSAL from the last adjustment posted
if @POSTDATE is null
select top 1 @POSTDATE = POSTDATE
from dbo.GIFTFEEADJUSTMENT
where
REVENUEID = @REVENUEID and
POSTSTATUSCODE = 0
order by DATEADDED desc;
--If there are no posted adjustments then get the postdate for REVERSAL from the REVENUE record
if @POSTDATE is null
select @POSTDATE = POSTDATE from dbo.REVENUE where ID = @REVENUEID;
declare @REVERSALS table(
ORIGINALTRANSACTIONID uniqueidentifier,
REVERSALTRANSACTIONID uniqueidentifier,
ACCOUNT nvarchar(100),
AMOUNT money,
PROJECT nvarchar(100),
REFERENCE nvarchar(255),
TRANSACTIONTYPECODE tinyint,
BASECURRENCYID uniqueidentifier,
TRANSACTIONAMOUNT money,
TRANSACTIONCURRENCYID uniqueidentifier,
BASEEXCHANGERATEID uniqueidentifier,
ORGANIZATIONAMOUNT money,
ORGANIZATIONEXCHANGERATEID uniqueidentifier,
GLACCOUNTID uniqueidentifier,
FTLIID uniqueidentifier,
COPYFTLIID uniqueidentifier,
REVERSEDFTLIID uniqueidentifier,
SEQUENCE int
);
insert into @REVERSALS
(ORIGINALTRANSACTIONID, REVERSALTRANSACTIONID, ACCOUNT, AMOUNT, PROJECT, REFERENCE, TRANSACTIONTYPECODE,
TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID
,GLACCOUNTID, SEQUENCE)
select
JE.ID, newid(), GLACCOUNT.ACCOUNTNUMBER, JE.BASEAMOUNT, JEX.PROJECT, JE.COMMENT, JE.TRANSACTIONTYPECODE,
JE.TRANSACTIONAMOUNT, FT.TRANSACTIONCURRENCYID, FT.BASEEXCHANGERATEID, JE.ORGAMOUNT, FT.ORGEXCHANGERATEID
,JE.GLACCOUNTID, row_number() over (order by JE.DATEADDED)
from dbo.JOURNALENTRY JE
inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on JE.FINANCIALTRANSACTIONLINEITEMID = LI.ID
inner join dbo.FINANCIALTRANSACTION FT on LI.FINANCIALTRANSACTIONID = FT.ID
inner join dbo.JOURNALENTRY_EXT JEX on JE.ID = JEX.ID and JEX.TABLENAMECODE = 8
inner join dbo.GLACCOUNT on JE.GLACCOUNTID = GLACCOUNT.ID
where JEX.LOGICALREVENUEID = @REVENUEID and JEX.OUTDATED = 0 and LI.POSTSTATUSCODE = 2;
declare @ADJUSTMENTID uniqueidentifier
DECLARE @ADJUSTMENTPOSTSTATUSCODE tinyint
Select top 1 @ADJUSTMENTPOSTSTATUSCODE = A.POSTSTATUSCODE
,@ADJUSTMENTID = LIA.ID
from dbo.GIFTFEEADJUSTMENT A
inner join dbo.FINANCIALTRANSACTIONLINEITEMADJUSTMENT LIA on LIA.ID = A.ID
where REVENUEID = @REVENUEID
order by A.DATEADDED desc;
if @ADJUSTMENTPOSTSTATUSCODE <> 2
set @ADJUSTMENTPOSTSTATUSCODE = 1
declare @REVERSEDFTLIID as table
(
NEWFTLIID uniqueidentifier,
REVERSEDFTLIID uniqueidentifier,
COPYFTLIID uniqueidentifier
);
declare @TABLENAMECODE tinyint;
declare @ISADJUSTMENT bit = 0;
insert into @REVERSEDFTLIID (NEWFTLIID,REVERSEDFTLIID,COPYFTLIID)
select
NEWID(),T2.FINANCIALTRANSACTIONLINEITEMID, NEWID()
from @REVERSALS T1
inner join dbo.JOURNALENTRY T2 on T1.ORIGINALTRANSACTIONID = T2.ID
group by T2.FINANCIALTRANSACTIONLINEITEMID
update @REVERSALS set FTLIID = t3.NEWFTLIID, COPYFTLIID = T3.COPYFTLIID , REVERSEDFTLIID = T3.REVERSEDFTLIID
from @REVERSALS t1 inner join dbo.JOURNALENTRY t2 on t1.ORIGINALTRANSACTIONID = t2.ID
inner join @REVERSEDFTLIID t3 on t2.FINANCIALTRANSACTIONLINEITEMID = t3.REVERSEDFTLIID
if exists (select 1 from dbo.FINANCIALTRANSACTION FT inner join dbo.GIFTFEEADJUSTMENT T1 on T1.REVENUEID = FT.ID and T1.POSTSTATUSCODE != 0 where FT.ID = @REVENUEID)
set @ISADJUSTMENT = 1
--Add the reversal ftli
insert into dbo.FINANCIALTRANSACTIONLINEITEM (
ID, REVERSEDLINEITEMID, FINANCIALTRANSACTIONID, TRANSACTIONAMOUNT, VISIBLE,DESCRIPTION,SEQUENCE,TYPECODE,POSTDATE,POSTSTATUSCODE
,BASEAMOUNT,ORGAMOUNT , FINANCIALTRANSACTIONLINEITEMADJUSTMENTID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select distinct FTLIID, T3.ID, T3.FINANCIALTRANSACTIONID, T3.TRANSACTIONAMOUNT, 1,
T3.DESCRIPTION,T3.SEQUENCE, 1, @POSTDATE, 1, T3.TRANSACTIONAMOUNT, T3.ORGAMOUNT, @ADJUSTMENTID, T3.ADDEDBYID, T3.CHANGEDBYID, @CHANGEDATE, @CHANGEDATE
from @REVERSALS T1
inner join dbo.JOURNALENTRY T2 on T1.ORIGINALTRANSACTIONID = T2.ID
inner join dbo.FINANCIALTRANSACTIONLINEITEM T3 on T2.FINANCIALTRANSACTIONLINEITEMID = T3.ID
if @ISADJUSTMENT = 1
begin
--Add a copy of the current gift fee ftli. The copy will be marked as deleted
--and retain the old gift fee values. The old gift fee will be updated with the new
--give fee values.
--This step must be taken in case there are any foreign keys to the adjustment gift fee ftli.
--We want those foreign keys to point to the new, updated values.
insert into dbo.FINANCIALTRANSACTIONLINEITEM (
ID,
FINANCIALTRANSACTIONID,
TRANSACTIONAMOUNT,
VISIBLE,
DESCRIPTION,
SEQUENCE,
TYPECODE,
POSTDATE,
POSTSTATUSCODE,
BASEAMOUNT,
ORGAMOUNT,
SOURCELINEITEMID,
FINANCIALTRANSACTIONLINEITEMADJUSTMENTID,
REVERSEDLINEITEMID,
DELETEDON,
BATCHID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
select distinct
REVERSALS.COPYFTLIID,
FTLI.FINANCIALTRANSACTIONID,
FTLI.TRANSACTIONAMOUNT,
0 as VISIBLE,
FTLI.DESCRIPTION,
FTLI.SEQUENCE,
FTLI.TYPECODE,
FTLI.POSTDATE,
FTLI.POSTSTATUSCODE,
FTLI.BASEAMOUNT,
FTLI.ORGAMOUNT,
FTLI.SOURCELINEITEMID,
FTLI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID,
REVERSALS.REVERSEDFTLIID,
getdate() as DELETEDON,
FTLI.BATCHID,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CHANGEDATE,
@CHANGEDATE
from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
inner join @REVERSALS REVERSALS
on FTLI.ID = REVERSALS.REVERSEDFTLIID
declare @SOURCE table
(
ID uniqueidentifier,
TRANSACTIONAMOUNT money,
BASEAMOUNT money,
ORGANIZATIONAMOUNT money,
SOURCELINEITEMID uniqueidentifier,
SEQUENCE int
);
--Unroll merge statement for performance
insert into @SOURCE
(
ID,
TRANSACTIONAMOUNT,
BASEAMOUNT,
ORGANIZATIONAMOUNT,
SOURCELINEITEMID,
SEQUENCE
)
select
OLDPAYMENTFTLI.ID,
REVENUESPLITGIFTFEE.TRANSACTIONAMOUNT,
REVENUESPLITGIFTFEE.FEE as BASEAMOUNT,
REVENUESPLITGIFTFEE.ORGANIZATIONAMOUNT,
REVENUESPLITGIFTFEE.ID as SOURCELINEITEMID,
row_number() over (order by NEWPAYMENTFTLI.sequence)
from
dbo.REVENUESPLITGIFTFEE
left join dbo.FINANCIALTRANSACTIONLINEITEM as OLDPAYMENTFTLI on REVENUESPLITGIFTFEE.ID = OLDPAYMENTFTLI.REVERSEDLINEITEMID and OLDPAYMENTFTLI.TYPECODE = 0 and OLDPAYMENTFTLI.POSTSTATUSCODE = 2
inner join dbo.FINANCIALTRANSACTIONLINEITEM as NEWPAYMENTFTLI on REVENUESPLITGIFTFEE.ID = NEWPAYMENTFTLI.ID
where
NEWPAYMENTFTLI.FINANCIALTRANSACTIONID = @REVENUEID
--Update existing line items
update LI set
TRANSACTIONAMOUNT = SOURCELI.TRANSACTIONAMOUNT,
VISIBLE = 1,
SEQUENCE = SOURCELI.SEQUENCE,
POSTDATE = @POSTDATE,
POSTSTATUSCODE = 1,
BASEAMOUNT = SOURCELI.BASEAMOUNT,
ORGAMOUNT = SOURCELI.ORGANIZATIONAMOUNT,
SOURCELINEITEMID = SOURCELI.SOURCELINEITEMID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CHANGEDATE,
FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = @ADJUSTMENTID
from
@SOURCE SOURCELI
inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.SOURCELINEITEMID = SOURCELI.ID
where
LI.TYPECODE = 7
and LI.DELETEDON is null
and LI.FINANCIALTRANSACTIONID = @REVENUEID
--Add new line items
insert into dbo.FINANCIALTRANSACTIONLINEITEM
(
ID, FINANCIALTRANSACTIONID, TRANSACTIONAMOUNT, VISIBLE, DESCRIPTION, SEQUENCE, TYPECODE, POSTDATE, POSTSTATUSCODE,
BASEAMOUNT, ORGAMOUNT, SOURCELINEITEMID, FINANCIALTRANSACTIONLINEITEMADJUSTMENTID, BATCHID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
newid(), @REVENUEID, SOURCELI.TRANSACTIONAMOUNT, 1, 'Gift Fee', SOURCELI.SEQUENCE, 7, @POSTDATE, 1,
SOURCELI.BASEAMOUNT, SOURCELI.ORGANIZATIONAMOUNT, SOURCELI.SOURCELINEITEMID, @ADJUSTMENTID, null,
@CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE
from
@SOURCE SOURCELI
where
-- No line items in this transaction are gift fees for the current source
SOURCELI.ID not in
(select
SOURCELINEITEMID
from
dbo.FINANCIALTRANSACTIONLINEITEM LI
where
LI.FINANCIALTRANSACTIONID = @REVENUEID
and LI.TYPECODE = 7)
--Soft delete line items where the source no longer exists
update LI set
DELETEDON = @CHANGEDATE,
TYPECODE = 99,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CHANGEDATE,
FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = @ADJUSTMENTID
from
dbo.FINANCIALTRANSACTIONLINEITEM LI
where
LI.DELETEDON is not null
and LI.TYPECODE = 7
and LI.FINANCIALTRANSACTIONID = @REVENUEID
and LI.SOURCELINEITEMID not in
(select
ID
from
@SOURCE)
--Move the journal entries to the old-value ftli.
update JOURNALENTRY
set
FINANCIALTRANSACTIONLINEITEMID = REVERSALS.COPYFTLIID
from dbo.JOURNALENTRY
inner join @REVERSALS REVERSALS
on REVERSALS.REVERSEDFTLIID = JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID
end
insert into dbo.JOURNALENTRY
(ID,FINANCIALTRANSACTIONLINEITEMID,TRANSACTIONTYPECODE,SUBLEDGERTYPECODE, TRANSACTIONAMOUNT, BASEAMOUNT,ORGAMOUNT,COMMENT,POSTDATE,GLACCOUNTID,SEQUENCE ,TYPECODE,TRANSACTIONCURRENCYID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
select
source.REVERSALTRANSACTIONID
,source.FTLIID
,case source.TRANSACTIONTYPECODE when 0 then 1 else 0 end --check this
,case source.TRANSACTIONTYPECODE when 0 then 1 else 0 end
,source.TRANSACTIONAMOUNT
,source.AMOUNT
,source.ORGANIZATIONAMOUNT
,source.REFERENCE
,@POSTDATE
,source.GLACCOUNTID
,source.SEQUENCE
,case when source.TRANSACTIONCURRENCYID is null then 1 else 0 end
,source.TRANSACTIONCURRENCYID
,@CHANGEAGENTID, @CHANGEAGENTID, getdate(), getdate()
from @REVERSALS as source
insert into dbo.JOURNALENTRY_EXT
(ID,PROJECT,ACCOUNT,JOURNAL,REVERSEDGLTRANSACTIONID,TABLENAMECODE,
PRECALCORGANIZATIONEXCHANGERATEID,PRECALCBASEEXCHANGERATEID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED,OUTDATED)
select
source.REVERSALTRANSACTIONID
,source.PROJECT
,source.ACCOUNT
,@JOURNAL
,source.ORIGINALTRANSACTIONID
,0 -- gltransaction table
,source.ORGANIZATIONEXCHANGERATEID
,source.BASEEXCHANGERATEID
,@CHANGEAGENTID, @CHANGEAGENTID, getdate(), getdate(),1
from @REVERSALS as source
update dbo.JOURNALENTRY_EXT
set
REVERSEDATE = @CHANGEDATE
,OUTDATED = 1
,CHANGEDBYID = @CHANGEAGENTID
,DATECHANGED = @CHANGEDATE
from
@REVERSALS as REV
inner join
dbo.JOURNALENTRY_EXT on REV.ORIGINALTRANSACTIONID = JOURNALENTRY_EXT.ID;