USP_GLTRANSACTION_ADDWRITEOFFREVERSALS

Adds write-off reversal transactions for the given write-off record.

Parameters

Parameter Parameter Type Mode Description
@WRITEOFFID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN
@POSTDATE datetime IN

Definition

Copy


CREATE procedure dbo.USP_GLTRANSACTION_ADDWRITEOFFREVERSALS (
  @WRITEOFFID 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.WRITEOFFADJUSTMENT
  where WRITEOFFID = @WRITEOFFID
    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.WRITEOFF
  where ID = @WRITEOFFID;

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
  ,DELETED tinyint
  );

insert into @REVERSALS (
  ORIGINALTRANSACTIONID
  ,REVERSALTRANSACTIONID
  ,ACCOUNT
  ,TRANSACTIONAMOUNT
  ,AMOUNT
  ,ORGANIZATIONAMOUNT
  ,PROJECT
  ,REFERENCE
  ,TRANSACTIONTYPECODE
  ,BASECURRENCYID
  ,TRANSACTIONCURRENCYID
  ,BASEEXCHANGERATEID
  ,ORGANIZATIONEXCHANGERATEID
  ,GLACCOUNTID
  ,SEQUENCE
  ,DELETED
  )
select JOURNALENTRY.ID
  ,newid()
  ,JOURNALENTRY_EXT.ACCOUNT
  ,JOURNALENTRY.TRANSACTIONAMOUNT
  ,JOURNALENTRY.BASEAMOUNT
  ,JOURNALENTRY.ORGAMOUNT
  ,JOURNALENTRY_EXT.PROJECT
  ,JOURNALENTRY.COMMENT
  ,JOURNALENTRY.TRANSACTIONTYPECODE
  ,V.BASECURRENCYID
  ,JOURNALENTRY.TRANSACTIONCURRENCYID
  ,JOURNALENTRY_EXT.PRECALCBASEEXCHANGERATEID
  ,JOURNALENTRY_EXT.PRECALCORGANIZATIONEXCHANGERATEID
  ,JOURNALENTRY.GLACCOUNTID
  ,row_number() over (
    order by JOURNALENTRY.DATEADDED
    )
  ,case 
    when FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
      then 0
    else 1
    end
from dbo.JOURNALENTRY
inner join dbo.FINANCIALTRANSACTIONLINEITEM on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
inner join dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = V.FINANCIALTRANSACTIONID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
inner join dbo.JOURNALENTRY_EXT on JOURNALENTRY.ID = JOURNALENTRY_EXT.ID
  and JOURNALENTRY_EXT.TABLENAMECODE = 12
where FINANCIALTRANSACTION.ID = @WRITEOFFID
  and OUTDATED = 0;

declare @WRITEOFFADJUSTMENTID uniqueidentifier
declare @WRITEOFFADJUSTMENTPOSTSTATUSCODE tinyint

select top 1 @WRITEOFFADJUSTMENTPOSTSTATUSCODE = A.POSTSTATUSCODE
  ,@WRITEOFFADJUSTMENTID = LIA.ID
from dbo.WRITEOFFADJUSTMENT A
inner join dbo.FINANCIALTRANSACTIONLINEITEMADJUSTMENT LIA on LIA.ID = A.ID
where WRITEOFFID = @WRITEOFFID
order by A.DATEADDED desc;

if @WRITEOFFADJUSTMENTPOSTSTATUSCODE <> 2
  set @WRITEOFFADJUSTMENTPOSTSTATUSCODE = 1

declare @REVERSEDFTLIID as table (
  NEWFTLIID uniqueidentifier
  ,REVERSEDFTLIID uniqueidentifier
  ,COPYFTLIID uniqueidentifier
  );
declare @FTID uniqueidentifier;
declare @ISADJUSTMENT bit = 0;
declare @DELETED bit = 0;

if exists (
    select 1
    from @REVERSALS
    where DELETED = 1
    )
  set @DELETED = 1

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

select top 1 @FTID = FTLI.FINANCIALTRANSACTIONID
from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
inner join @REVERSEDFTLIID T1 on FTLI.ID = T1.REVERSEDFTLIID

if exists (
    select 1
    from dbo.FINANCIALTRANSACTION FT
    inner join dbo.WRITEOFFADJUSTMENT T1 on T1.WRITEOFFID = FT.ID
      and T1.POSTSTATUSCODE != 0
    where FT.ID = @FTID
    )
  set @ISADJUSTMENT = 1

if @ISADJUSTMENT = 1
  and @DELETED = 0
begin
  insert into dbo.FINANCIALTRANSACTIONLINEITEM (
    ID
    ,REVERSEDLINEITEMID
    ,FINANCIALTRANSACTIONID
    ,TRANSACTIONAMOUNT
    ,BASEAMOUNT
    ,ORGAMOUNT
    ,VISIBLE
    ,DESCRIPTION
    ,SEQUENCE
    ,TYPECODE
    ,POSTDATE
    ,POSTSTATUSCODE
    ,FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
    ,BATCHID
    ,ADDEDBYID
    ,CHANGEDBYID
    ,DATEADDED
    ,DATECHANGED
    ,SOURCELINEITEMID
    )
  select distinct 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
  from @REVERSALS T1
  inner join dbo.JOURNALENTRY T2 on T1.ORIGINALTRANSACTIONID = T2.ID
  inner join dbo.FINANCIALTRANSACTIONLINEITEM T3 on T2.FINANCIALTRANSACTIONLINEITEMID = T3.ID

  insert into dbo.REVENUESPLIT_EXT (
    ID
    ,DESIGNATIONID
    ,APPLICATIONCODE
    ,TYPECODE
    ,ADDEDBYID
    ,CHANGEDBYID
    ,DATEADDED
    ,DATECHANGED
    )
  select distinct T2.COPYFTLIID
    ,T1.DESIGNATIONID
    ,T1.APPLICATIONCODE
    ,T1.TYPECODE
    ,T1.ADDEDBYID
    ,T1.CHANGEDBYID
    ,T1.DATEADDED
    ,T1.DATECHANGED
  from dbo.REVENUESPLIT_EXT T1
  inner join @REVERSALS T2 on T1.ID = T2.REVERSEDFTLIID
end

insert into dbo.FINANCIALTRANSACTIONLINEITEM (
  ID
  ,REVERSEDLINEITEMID
  ,FINANCIALTRANSACTIONID
  ,TRANSACTIONAMOUNT
  ,BASEAMOUNT
  ,ORGAMOUNT
  ,VISIBLE
  ,DESCRIPTION
  ,SEQUENCE
  ,TYPECODE
  ,POSTDATE
  ,POSTSTATUSCODE
  ,FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
  ,ADDEDBYID
  ,CHANGEDBYID
  ,DATEADDED
  ,DATECHANGED
  )
select distinct T1.FTLIID
  ,T1.REVERSEDFTLIID
  ,T3.FINANCIALTRANSACTIONID
  ,T3.TRANSACTIONAMOUNT
  ,T3.BASEAMOUNT
  ,T3.ORGAMOUNT
  ,1
  ,T3.DESCRIPTION
  ,T3.SEQUENCE
  ,1
  ,@POSTDATE
  ,1
  ,@WRITEOFFADJUSTMENTID
  ,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
  and @DELETED = 0
  update FTLI
  set POSTSTATUSCODE = 1
    ,POSTDATE = @POSTDATE
    ,FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = @WRITEOFFADJUSTMENTID
    ,BATCHID = null
  from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
  inner join @REVERSEDFTLIID R on FTLI.ID = R.REVERSEDFTLIID
  inner join @REVERSALS INS on R.REVERSEDFTLIID = INS.REVERSEDFTLIID

if @ISADJUSTMENT = 1
  and @DELETED = 1
  update FTLI
  set FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = @WRITEOFFADJUSTMENTID
    ,BATCHID = null
  from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
  inner join @REVERSEDFTLIID R on FTLI.ID = R.REVERSEDFTLIID

if @DELETED = 0
  update FTLI
  set DELETEDON = getdate()
  from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
  inner join @REVERSEDFTLIID R on FTLI.ID = R.COPYFTLIID

if @ISADJUSTMENT = 1
  and @DELETED = 0
  update JOURNALENTRY
  set FINANCIALTRANSACTIONLINEITEMID = T1.COPYFTLIID
  from @REVERSALS 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
  ,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

--Set the reversed write-off GL distributions as out of date

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