USP_REVENUE_GETWRITEOFFGLDISTRIBUTION_CUSTOMUPDATEFROMXML_2
Stored procedure to update write-off GL distribution records from the given xml collection.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@WRITEOFFID | uniqueidentifier | IN | |
@XML | xml | IN | |
@POSTDATE | datetime | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CHANGEDATE | datetime | IN |
Definition
Copy
CREATE procedure dbo.USP_REVENUE_GETWRITEOFFGLDISTRIBUTION_CUSTOMUPDATEFROMXML_2
(
@WRITEOFFID uniqueidentifier,
@XML xml,
@POSTDATE datetime,
@CHANGEAGENTID uniqueidentifier = null,
@CHANGEDATE datetime = null
)
as
set nocount on;
if @CHANGEAGENTID is null
exec USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
if @CHANGEDATE is null
set @CHANGEDATE = getdate()
-- build a temporary table containing the values from the XML
declare @TempTbl table (
[ACCOUNT] nvarchar(100),
[AMOUNT] money,
[GLPAYMENTMETHODREVENUETYPEMAPPINGID] uniqueidentifier,
[ID] uniqueidentifier,
[PROJECT] nvarchar(100),
[REFERENCE] nvarchar(100),
[TRANSACTIONTYPECODE] tinyint,
[ORGANIZATIONAMOUNT] money,
[BASECURRENCYID] uniqueidentifier,
[TRANSACTIONAMOUNT] money,
[TRANSACTIONCURRENCYID] uniqueidentifier,
[BASEEXCHANGERATEID] uniqueidentifier,
[ORGANIZATIONEXCHANGERATEID] uniqueidentifier,
[GLACCOUNTID] uniqueidentifier
)
declare @PDACCOUNTSYSTEMID uniqueidentifier;
select @PDACCOUNTSYSTEMID = PDACCOUNTSYSTEMID
from dbo.FINANCIALTRANSACTION
where ID = @WRITEOFFID
insert into @TempTbl select
GL.[ACCOUNT],
GL.[AMOUNT],
GL.[GLPAYMENTMETHODREVENUETYPEMAPPINGID],
GL.[ID],
GL.[PROJECT],
GL.[REFERENCE],
GL.[TRANSACTIONTYPECODE],
GL.[ORGANIZATIONAMOUNT],
GL.[BASECURRENCYID],
GL.[TRANSACTIONAMOUNT],
GL.[TRANSACTIONCURRENCYID],
GL.[BASEEXCHANGERATEID],
GL.[ORGANIZATIONEXCHANGERATEID],
GLACCOUNT.ID [GLACCOUNTID]
from dbo.UFN_REVENUE_GETWRITEOFFGLDISTRIBUTION_FROMITEMLISTXML(@XML)GL
left outer join dbo.GLACCOUNT on GLACCOUNT.PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID and GLACCOUNT.ACCOUNTNUMBER = GL.ACCOUNT
declare @REVENUEID uniqueidentifier;
select @REVENUEID = WRITEOFF.REVENUEID from WRITEOFF where ID = @WRITEOFFID
if @REVENUEID is null
select top 1
@REVENUEID = WRITEOFFGLDISTRIBUTION.LOGICALREVENUEID
from
@TempTbl as [temp]
inner join
dbo.JOURNALENTRY_EXT WRITEOFFGLDISTRIBUTION on [temp].ID = isnull(WRITEOFFGLDISTRIBUTION.DISTRIBUTIONTABLEID,WRITEOFFGLDISTRIBUTION.ID);
update @TempTbl set ID = newid() where (ID is null) or (ID = '00000000-0000-0000-0000-000000000000');
if @@Error <> 0
return 1;
declare @contextCache varbinary(128);
declare @e int;
-- cache current context information
set @contextCache = CONTEXT_INFO();
-- set CONTEXT_INFO to @CHANGEAGENTID
if not @CHANGEAGENTID is null
set CONTEXT_INFO @CHANGEAGENTID;
-- delete any items that no longer exist in the XML table
delete from dbo.[WRITEOFFGLDISTRIBUTION] where [WRITEOFFGLDISTRIBUTION].ID in
(select ID from dbo.UFN_REVENUE_GETWRITEOFFGLDISTRIBUTION
(
@WRITEOFFID
)
EXCEPT select ID from @TempTbl)
select @e=@@error;
-- reset CONTEXT_INFO to previous value
if not @contextCache is null
set CONTEXT_INFO @contextCache;
if @e <> 0
return 2;
if exists(select 1 from @TempTbl where not LEN(ACCOUNT)>0)
raiserror ('CK_WRITEOFFGLDISTRIBUTION_ACCOUNT', 16, 1);
if exists(select 1 from @TempTbl where AMOUNT<0)
raiserror('CK_WRITEOFFGLDISTRIBUTION_VALIDAMOUNT', 16, 1);
-- update the items that exist in the XML table and the db
update JE set
TRANSACTIONAMOUNT = temp.[TRANSACTIONAMOUNT]
,BASEAMOUNT = temp.AMOUNT
,ORGAMOUNT = temp.[ORGANIZATIONAMOUNT]
,COMMENT = temp.[REFERENCE]
,TRANSACTIONTYPECODE = temp.[TRANSACTIONTYPECODE]
,SUBLEDGERTYPECODE = temp.[TRANSACTIONTYPECODE]
,TRANSACTIONCURRENCYID = temp.[TRANSACTIONCURRENCYID]
,GLACCOUNTID = temp.GLACCOUNTID
,CHANGEDBYID = @CHANGEAGENTID
,DATECHANGED = @CHANGEDATE
from @TempTbl [temp]
inner join dbo.JOURNALENTRY_EXT JEX on JEX.DISTRIBUTIONTABLEID = temp.ID and JEX.OUTDATED = 0
inner join dbo.JOURNALENTRY JE on JE.ID = JEX.ID
where
([JE].[TRANSACTIONAMOUNT]<>temp.[TRANSACTIONAMOUNT]) or
([JE].[TRANSACTIONAMOUNT] is null and temp.[TRANSACTIONAMOUNT] is not null) or
([JE].[TRANSACTIONAMOUNT] is not null and temp.[TRANSACTIONAMOUNT] is null) or
([JE].[BASEAMOUNT]<>temp.[AMOUNT]) or
([JE].[BASEAMOUNT] is null and temp.[AMOUNT] is not null) or
([JE].[BASEAMOUNT] is not null and temp.[AMOUNT] is null) or
([JE].[ORGAMOUNT]<>temp.[ORGANIZATIONAMOUNT]) or
([JE].[ORGAMOUNT] is null and temp.[ORGANIZATIONAMOUNT] is not null) or
([JE].[ORGAMOUNT] is not null and temp.[ORGANIZATIONAMOUNT] is null) or
([JE].[TRANSACTIONTYPECODE]<>temp.[TRANSACTIONTYPECODE]) or
([JE].[TRANSACTIONTYPECODE] is null and temp.[TRANSACTIONTYPECODE] is not null) or
([JE].[TRANSACTIONTYPECODE] is not null and temp.[TRANSACTIONTYPECODE] is null) or
([JE].[TRANSACTIONCURRENCYID]<>temp.[TRANSACTIONCURRENCYID]) or
([JE].[TRANSACTIONCURRENCYID] is null and temp.[TRANSACTIONCURRENCYID] is not null) or
([JE].[TRANSACTIONCURRENCYID] is not null and temp.[TRANSACTIONCURRENCYID] is null) or
([JE].[GLACCOUNTID] <> temp.GLACCOUNTID) or
([JE].[GLACCOUNTID] is null and temp.GLACCOUNTID is not null) or
([JE].[GLACCOUNTID] is not null and temp.GLACCOUNTID is null) or
([JE].[COMMENT]<>temp.[REFERENCE]) or
([JE].[COMMENT] is null and temp.[REFERENCE] is not null) or
([JE].[COMMENT] is not null and temp.[REFERENCE] is null);
update JEX set
ACCOUNT = temp.[ACCOUNT]
,GLPAYMENTMETHODREVENUETYPEMAPPINGID = temp.[GLPAYMENTMETHODREVENUETYPEMAPPINGID]
,PROJECT = temp.[PROJECT]
,PRECALCBASEEXCHANGERATEID = temp.[BASEEXCHANGERATEID]
,PRECALCORGANIZATIONEXCHANGERATEID = temp.[ORGANIZATIONEXCHANGERATEID]
,CHANGEDBYID = @CHANGEAGENTID
,DATECHANGED = @CHANGEDATE
from @TempTbl [temp]
inner join dbo.JOURNALENTRY_EXT JEX on JEX.DISTRIBUTIONTABLEID = temp.ID and JEX.OUTDATED = 0
where
([JEX].[ACCOUNT]<>temp.[ACCOUNT]) or
([JEX].[ACCOUNT] is null and temp.[ACCOUNT] is not null) or
([JEX].[ACCOUNT] is not null and temp.[ACCOUNT] is null) or
([JEX].[GLPAYMENTMETHODREVENUETYPEMAPPINGID]<>temp.[GLPAYMENTMETHODREVENUETYPEMAPPINGID]) or
([JEX].[GLPAYMENTMETHODREVENUETYPEMAPPINGID] is null and temp.[GLPAYMENTMETHODREVENUETYPEMAPPINGID] is not null) or
([JEX].[GLPAYMENTMETHODREVENUETYPEMAPPINGID] is not null and temp.[GLPAYMENTMETHODREVENUETYPEMAPPINGID] is null) or
([JEX].[PROJECT]<>temp.[PROJECT]) or
([JEX].[PROJECT] is null and temp.[PROJECT] is not null) or
([JEX].[PROJECT] is not null and temp.[PROJECT] is null) or
([JEX].[PRECALCBASEEXCHANGERATEID]<>temp.[BASEEXCHANGERATEID]) or
([JEX].[PRECALCBASEEXCHANGERATEID] is null and temp.[BASEEXCHANGERATEID] is not null) or
([JEX].[PRECALCBASEEXCHANGERATEID] is not null and temp.[BASEEXCHANGERATEID] is null) or
([JEX].[PRECALCORGANIZATIONEXCHANGERATEID]<>temp.[ORGANIZATIONEXCHANGERATEID]) or
([JEX].[PRECALCORGANIZATIONEXCHANGERATEID] is null and temp.[ORGANIZATIONEXCHANGERATEID] is not null) or
([JEX].[PRECALCORGANIZATIONEXCHANGERATEID] is not null and temp.[ORGANIZATIONEXCHANGERATEID] is null);
update LI set
POSTDATE = @POSTDATE
,CHANGEDBYID = @CHANGEAGENTID
,DATECHANGED = @CHANGEDATE
from dbo.FINANCIALTRANSACTIONLINEITEM LI
where LI.FINANCIALTRANSACTIONID = @WRITEOFFID
and LI.TYPECODE in (0,1,3,5,6,7,8,98)
and LI.POSTSTATUSCODE != 2;
if @@Error <> 0
return 3;
-- insert new items
declare @DISTRIBUTIONS table(
GLTRANSACTIONID uniqueidentifier,
ACCOUNT nvarchar(100),
AMOUNT money,
PROJECT nvarchar(100),
REFERENCE nvarchar(255),
TRANSACTIONTYPECODE tinyint,
GLPAYMENTMETHODREVENUETYPEMAPPINGID uniqueidentifier,
WRITEOFFGLDISTRIBUTIONID uniqueidentifier,
[ORGANIZATIONAMOUNT] money,
[BASECURRENCYID] uniqueidentifier,
[TRANSACTIONAMOUNT] money,
[TRANSACTIONCURRENCYID] uniqueidentifier,
[BASEEXCHANGERATEID] uniqueidentifier,
[ORGANIZATIONEXCHANGERATEID] uniqueidentifier,
GLACCOUNTID uniqueidentifier
);
insert into @DISTRIBUTIONS(GLTRANSACTIONID, ACCOUNT, AMOUNT, PROJECT, REFERENCE, TRANSACTIONTYPECODE, GLPAYMENTMETHODREVENUETYPEMAPPINGID, WRITEOFFGLDISTRIBUTIONID, [ORGANIZATIONAMOUNT], [BASECURRENCYID], [TRANSACTIONAMOUNT], [TRANSACTIONCURRENCYID], [BASEEXCHANGERATEID], [ORGANIZATIONEXCHANGERATEID],GLACCOUNTID)
select
newid(),
[ACCOUNT],
[AMOUNT],
[PROJECT],
[REFERENCE],
[TRANSACTIONTYPECODE],
[GLPAYMENTMETHODREVENUETYPEMAPPINGID],
[ID],
[ORGANIZATIONAMOUNT],
[BASECURRENCYID],
[TRANSACTIONAMOUNT],
[TRANSACTIONCURRENCYID],
[BASEEXCHANGERATEID],
[ORGANIZATIONEXCHANGERATEID],
temp.GLACCOUNTID
from @TempTbl as [temp]
where not exists (select ID from dbo.JOURNALENTRY_EXT as data where data.DISTRIBUTIONTABLEID = [temp].ID)
declare @FTLIID uniqueidentifier;
declare @sequenceBase int;
select @sequenceBase = isnull(max(SEQUENCE),0) from dbo.JOURNALENTRY where FINANCIALTRANSACTIONLINEITEMID is null and FINANCIALBATCHID is null;
select @FTLIID = LI.ID
from dbo.FINANCIALTRANSACTIONLINEITEM LI
where LI.FINANCIALTRANSACTIONID = @WRITEOFFID and LI.TYPECODE = 98 and LI.DELETEDON is NULL and LI.POSTSTATUSCODE != 2;
/*
if @FTLIID is null
begin
select @FTLIID = MAX(cast(LI.ID as nvarchar(36)))
from dbo.FINANCIALTRANSACTIONLINEITEM LI
where LI.FINANCIALTRANSACTIONID = @WRITEOFFID and LI.DELETEDON is NULL and LI.POSTSTATUSCODE != 2
having COUNT(LI.ID) = 1;
if @FTLIID is null
begin
set @FTLIID = newid();
insert into dbo.FINANCIALTRANSACTIONLINEITEM
(
ID
,FINANCIALTRANSACTIONID
,TRANSACTIONAMOUNT
,BASEAMOUNT
,ORGAMOUNT
,VISIBLE
,[DESCRIPTION]
,SEQUENCE
,TYPECODE
,POSTSTATUSCODE
,POSTDATE
-- Boilerplate
,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED
)
select
@FTLIID
,@WRITEOFFID
,0
,0
,0
,0
,''
,0
,98
,case FT.POSTSTATUSCODE when 2 then 1 when 1 then 1 else 3 end
,@POSTDATE
,@CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE
from dbo.FINANCIALTRANSACTION FT
where FT.ID = @WRITEOFFID;
end
end
-- Insert rows in JOURNALENTRY table
insert into dbo.JOURNALENTRY
(
ID
,FINANCIALTRANSACTIONLINEITEMID
,TRANSACTIONTYPECODE
,SUBLEDGERTYPECODE
,TRANSACTIONAMOUNT
,BASEAMOUNT
,ORGAMOUNT
,COMMENT
,POSTDATE
,GLACCOUNTID
,SEQUENCE
,TYPECODE
,TRANSACTIONCURRENCYID
-- Boilerplate
,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
select
T.GLTRANSACTIONID
,@FTLIID
,T.TRANSACTIONTYPECODE
,T.TRANSACTIONTYPECODE
,T.TRANSACTIONAMOUNT
,T.AMOUNT
,T.ORGANIZATIONAMOUNT
,T.REFERENCE
,@POSTDATE
,T.GLACCOUNTID
,row_number() over (order by ACCOUNT) + @sequenceBase
,case when T.TRANSACTIONCURRENCYID is null then 1 else 0 end
,T.TRANSACTIONCURRENCYID
,@CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE
from @DISTRIBUTIONS T
inner join dbo.FINANCIALTRANSACTION FT on FT.ID = @REVENUEID
insert into dbo.JOURNALENTRY_EXT
(
ID
,DISTRIBUTIONTABLEID
,GLPAYMENTMETHODREVENUETYPEMAPPINGID
,PROJECT
,JOURNAL
,OUTDATED
,TABLENAMECODE
,WRITEOFFID
,REVENUEID
,ACCOUNT
,PRECALCORGANIZATIONEXCHANGERATEID
,PRECALCBASEEXCHANGERATEID
-- Boilerplate
,ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
GLTRANSACTIONID
,WRITEOFFGLDISTRIBUTIONID
,GLPAYMENTMETHODREVENUETYPEMAPPINGID
,PROJECT
,'Blackbaud Enterprise'
,0
,12 -- WRITEOFFGLDISTRIBUTION
,@WRITEOFFID
,@REVENUEID
,ACCOUNT
,ORGANIZATIONEXCHANGERATEID
,BASEEXCHANGERATEID
,@CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE
from @DISTRIBUTIONS T
*/
if @@Error <> 0
return 4;
return 0;