USP_GLTRANSACTION_ADDREVENUEREVERSALS

Adds revenue 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_ADDREVENUEREVERSALS (
  @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';
declare @BASECURRENCYID uniqueidentifier;
declare @ISADJUSTMENT bit = 0;

--Get the postdate for REVERSAL from the last adjustment posted

if @POSTDATE is null
  select top 1 @POSTDATE = POSTDATE
  from dbo.ADJUSTMENT
  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 = FT.POSTDATE 
        ,@BASECURRENCYID = CS.BASECURRENCYID
    from dbo.FINANCIALTRANSACTION FT
    inner join dbo.PDACCOUNTSYSTEM PD on FT.PDACCOUNTSYSTEMID = PD.ID
    inner join dbo.CURRENCYSET CS on CS.ID = PD.CURRENCYSETID
    where FT.ID = @REVENUEID;

if @BASECURRENCYID is null
    select @BASECURRENCYID = CS.BASECURRENCYID
    from dbo.FINANCIALTRANSACTION FT
    inner join dbo.PDACCOUNTSYSTEM PD on FT.PDACCOUNTSYSTEMID = PD.ID
    inner join dbo.CURRENCYSET CS on CS.ID = PD.CURRENCYSETID
    where FT.ID = @REVENUEID;

set @POSTDATE = convert(datetime, convert(date, @POSTDATE))

if object_id('tempdb..#TMP_REVENUEREVERSALS') is not null
    drop table #TMP_REVENUEREVERSALS;

create table #TMP_REVENUEREVERSALS(
  ORIGINALTRANSACTIONID uniqueidentifier
  ,REVERSALTRANSACTIONID uniqueidentifier
  ,ACCOUNT nvarchar(100) collate database_default
  ,AMOUNT money
  ,PROJECT nvarchar(100) collate database_default
  ,REFERENCE nvarchar(255) collate database_default
  ,TRANSACTIONTYPECODE tinyint
  ,BASECURRENCYID uniqueidentifier
  ,TRANSACTIONAMOUNT money
  ,TRANSACTIONCURRENCYID uniqueidentifier
  ,BASEEXCHANGERATEID uniqueidentifier
  ,ORGANIZATIONAMOUNT money
  ,ORGANIZATIONEXCHANGERATEID uniqueidentifier
  ,GLACCOUNTID uniqueidentifier
  ,FTLIID uniqueidentifier
  ,COPYFTLIID uniqueidentifier
  ,REVERSEDFTLIID uniqueidentifier
  ,TYPECODE tinyint
  );

insert into #TMP_REVENUEREVERSALS (
  ORIGINALTRANSACTIONID
  ,REVERSALTRANSACTIONID
  ,ACCOUNT
  ,AMOUNT
  ,PROJECT
  ,REFERENCE
  ,TRANSACTIONTYPECODE
  ,BASECURRENCYID
  ,TRANSACTIONAMOUNT
  ,TRANSACTIONCURRENCYID
  ,BASEEXCHANGERATEID
  ,ORGANIZATIONAMOUNT
  ,ORGANIZATIONEXCHANGERATEID
  ,GLACCOUNTID
  ,TYPECODE
  ,REVERSEDFTLIID
  )
select JOURNALENTRY.ID
  ,newid()
  ,JOURNALENTRY_EXT.ACCOUNT
  ,JOURNALENTRY.BASEAMOUNT
  ,JOURNALENTRY_EXT.PROJECT
  ,JOURNALENTRY.COMMENT
  ,JOURNALENTRY.TRANSACTIONTYPECODE
  ,@BASECURRENCYID
  ,JOURNALENTRY.TRANSACTIONAMOUNT
  ,JOURNALENTRY.TRANSACTIONCURRENCYID
  ,JOURNALENTRY_EXT.PRECALCBASEEXCHANGERATEID
  ,JOURNALENTRY.ORGAMOUNT
  ,JOURNALENTRY_EXT.PRECALCORGANIZATIONEXCHANGERATEID
  ,JOURNALENTRY.GLACCOUNTID
  ,JOURNALENTRY.TYPECODE
  ,JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID
from dbo.FINANCIALTRANSACTIONLINEITEM
inner join dbo.JOURNALENTRY on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID 
inner join dbo.JOURNALENTRY_EXT on JOURNALENTRY.ID = JOURNALENTRY_EXT.ID
where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @REVENUEID
    and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
    and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
    and JOURNALENTRY_EXT.TABLENAMECODE = 1;

declare @ADJUSTMENTID uniqueidentifier
declare @ADJUSTMENTPOSTSTATUSCODE tinyint

select top 1 @ADJUSTMENTPOSTSTATUSCODE = A.POSTSTATUSCODE
  ,@ADJUSTMENTID = LIA.ID
from dbo.ADJUSTMENT 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

if object_id('tempdb..#TMP_REVERSEDFTLIID') is not null
    drop table #TMP_REVERSEDFTLIID;

create table #TMP_REVERSEDFTLIID (
  NEWFTLIID uniqueidentifier
  ,REVERSEDFTLIID uniqueidentifier
  ,COPYFTLIID uniqueidentifier
  );

insert into #TMP_REVERSEDFTLIID (
  NEWFTLIID
  ,REVERSEDFTLIID
  ,COPYFTLIID
  )
select NEWID()
  ,T1.REVERSEDFTLIID
  ,NEWID()
from  #TMP_REVENUEREVERSALS T1
group by T1.REVERSEDFTLIID 

if exists(select top 1 1 from dbo.ADJUSTMENT where REVENUEID = @REVENUEID and POSTSTATUSCODE != 0)
    set @ISADJUSTMENT = 1;

if @ISADJUSTMENT = 1
begin
  insert into dbo.FINANCIALTRANSACTIONLINEITEM (
    ID
    ,REVERSEDLINEITEMID
    ,FINANCIALTRANSACTIONID
    ,TRANSACTIONAMOUNT
    ,BASEAMOUNT
    ,ORGAMOUNT
    ,VISIBLE
    ,DESCRIPTION
    ,SEQUENCE
    ,TYPECODE
    ,POSTDATE
    ,POSTSTATUSCODE
    ,FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
    ,BATCHID
    ,ADDEDBYID
    ,CHANGEDBYID
    ,DATEADDED
    ,DATECHANGED
    ,SOURCELINEITEMID
    ,DELETEDON
    )
  select 
    T1.COPYFTLIID
    ,T1.REVERSEDFTLIID
    ,T3.FINANCIALTRANSACTIONID
    ,T3.TRANSACTIONAMOUNT
    ,T3.BASEAMOUNT
    ,T3.ORGAMOUNT
    ,1
    ,T3.DESCRIPTION
    ,T3.SEQUENCE
    ,T3.TYPECODE
    ,T3.POSTDATE
    ,2
    ,T3.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
    ,T3.BATCHID
    ,@CHANGEAGENTID
    ,@CHANGEAGENTID
    ,@CHANGEDATE
    ,@CHANGEDATE
    ,T3.SOURCELINEITEMID
    ,GETDATE()
  from #TMP_REVERSEDFTLIID T1
  inner join dbo.FINANCIALTRANSACTIONLINEITEM T3 on T1.REVERSEDFTLIID = T3.ID

  insert into dbo.REVENUESPLIT_EXT (
    ID
    ,DESIGNATIONID
    ,APPLICATIONCODE
    ,TYPECODE
    ,ADDEDBYID
    ,CHANGEDBYID
    ,DATEADDED
    ,DATECHANGED
    )
  select T2.COPYFTLIID
    ,T1.DESIGNATIONID
    ,T1.APPLICATIONCODE
    ,T1.TYPECODE
    ,@CHANGEAGENTID
    ,@CHANGEAGENTID
    ,@CHANGEDATE
    ,@CHANGEDATE
  from #TMP_REVERSEDFTLIID T2
  inner join dbo.REVENUESPLIT_EXT T1 on T1.ID = T2.REVERSEDFTLIID

  update FTLI1 set 
      SOURCELINEITEMID = t1.COPYFTLIID
      ,CHANGEDBYID = @CHANGEAGENTID
      ,DATECHANGED = @CHANGEDATE
    from dbo.FINANCIALTRANSACTIONLINEITEM FTLI1
    inner join #TMP_REVERSEDFTLIID t1 on FTLI1.SOURCELINEITEMID = t1.REVERSEDFTLIID
    inner join FINANCIALTRANSACTIONLINEITEM FTLI2 on FTLI1.SOURCELINEITEMID = FTLI2.ID
    inner join FINANCIALTRANSACTION on FTLI2.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID and FINANCIALTRANSACTION.TYPECODE <> 1

end

insert into dbo.FINANCIALTRANSACTIONLINEITEM (
  ID
  ,REVERSEDLINEITEMID
  ,FINANCIALTRANSACTIONID
  ,TRANSACTIONAMOUNT
  ,BASEAMOUNT
  ,ORGAMOUNT
  ,VISIBLE
  ,DESCRIPTION
  ,SEQUENCE
  ,TYPECODE
  ,POSTDATE
  ,POSTSTATUSCODE
  ,FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
  ,ADDEDBYID
  ,CHANGEDBYID
  ,DATEADDED
  ,DATECHANGED
  )
select T1.NEWFTLIID
  ,T1.REVERSEDFTLIID
  ,T3.FINANCIALTRANSACTIONID
  ,T3.TRANSACTIONAMOUNT
  ,T3.BASEAMOUNT
  ,T3.ORGAMOUNT
  ,1
  ,T3.DESCRIPTION
  ,T3.SEQUENCE
  ,1
  ,@POSTDATE
  ,1
  ,@ADJUSTMENTID
  ,T3.ADDEDBYID
  ,T3.CHANGEDBYID
  ,@CHANGEDATE
  ,@CHANGEDATE
from #TMP_REVERSEDFTLIID T1
inner join dbo.FINANCIALTRANSACTIONLINEITEM T3 on T1.REVERSEDFTLIID = T3.ID    

if @ISADJUSTMENT = 1
  update FTLI set 
    POSTSTATUSCODE = case @ADJUSTMENTPOSTSTATUSCODE when 1 then 1 else 3 end
    ,POSTDATE = @POSTDATE
    ,FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = @ADJUSTMENTID
    ,SOURCELINEITEMID = null
    ,BATCHID = null
  from dbo.FINANCIALTRANSACTIONLINEITEM FTLI 
  inner join #TMP_REVERSEDFTLIID R on FTLI.ID = R.REVERSEDFTLIID

if @ISADJUSTMENT = 1
  update JOURNALENTRY set 
    FINANCIALTRANSACTIONLINEITEMID = T1.COPYFTLIID
    ,CHANGEDBYID = @CHANGEAGENTID
    ,DATECHANGED = @CHANGEDATE
  from #TMP_REVERSEDFTLIID T1 
  where JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = T1.REVERSEDFTLIID

insert into dbo.JOURNALENTRY (
  ID
  ,FINANCIALTRANSACTIONLINEITEMID
  ,TRANSACTIONTYPECODE
  ,SUBLEDGERTYPECODE
  ,TRANSACTIONAMOUNT
  ,BASEAMOUNT
  ,ORGAMOUNT
  ,COMMENT
  ,POSTDATE
  ,GLACCOUNTID
  ,SEQUENCE
  ,TYPECODE
  ,TRANSACTIONCURRENCYID
  ,ADDEDBYID
  ,CHANGEDBYID
  ,DATEADDED
  ,DATECHANGED
  )
select source.REVERSALTRANSACTIONID
  ,IDS.NEWFTLIID
  ,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
  ,1
  ,source.TYPECODE
  ,source.TRANSACTIONCURRENCYID
  ,@CHANGEAGENTID
  ,@CHANGEAGENTID
  ,getdate()
  ,getdate()
from #TMP_REVENUEREVERSALS as source
inner join #TMP_REVERSEDFTLIID IDS on source.REVERSEDFTLIID = IDS.REVERSEDFTLIID

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 #TMP_REVENUEREVERSALS as source

update dbo.JOURNALENTRY_EXT
set REVERSEDATE = @CHANGEDATE
  ,OUTDATED = 1
  ,CHANGEDBYID = @CHANGEAGENTID
  ,DATECHANGED = @CHANGEDATE
from #TMP_REVENUEREVERSALS as REV
inner join dbo.JOURNALENTRY_EXT on REV.ORIGINALTRANSACTIONID = JOURNALENTRY_EXT.ID

drop table #TMP_REVENUEREVERSALS;
drop table #TMP_REVERSEDFTLIID;