USP_FINANCIALTRANSACTIOLINEITEM_EDIT_IMPLEMENTATION
Insert, update, and delete line items for a financial transaction
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@FINANCIALTRANSACTIONID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@LINEITEMS | xml | IN | |
@UPDATEDISTRIBUTION | tinyint | IN | |
@MULTICURRENCY | tinyint | IN |
Definition
Copy
CREATE procedure dbo.USP_FINANCIALTRANSACTIOLINEITEM_EDIT_IMPLEMENTATION
(
@FINANCIALTRANSACTIONID uniqueidentifier
,@CHANGEAGENTID uniqueidentifier = null
,@LINEITEMS xml
,@UPDATEDISTRIBUTION tinyint
,@MULTICURRENCY tinyint = 0
)
as
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @TRANSACTIONCURRENCYID uniqueidentifier;
select @TRANSACTIONCURRENCYID = TRANSACTIONCURRENCYID from dbo.FINANCIALTRANSACTION where ID = @FINANCIALTRANSACTIONID;
declare @CURRENTDATE datetime;
set @CURRENTDATE = getdate();
begin try
declare @temp table (
ID uniqueidentifier NOT NULL
,FINANCIALTRANSACTIONID uniqueidentifier NOT NULL
,AMOUNT money NOT NULL
,BASEAMOUNT money NOT NULL
,ORGAMOUNT money NOT NULL
,DESCRIPTION nvarchar(100) NULL
,SEQUENCE integer NOT NULL
,TYPECODE tinyint NULL
,DELETED bit NULL
,REVERSEDLINEITEMID uniqueidentifier NULL
,POSTDATE datetime NULL
,POSTSTATUSCODE tinyint NOT NULL
,GLENTRIES xml
);
insert into @temp (
ID
,FINANCIALTRANSACTIONID
,AMOUNT
,BASEAMOUNT
,ORGAMOUNT
,DESCRIPTION
,SEQUENCE
,TYPECODE
,DELETED
,REVERSEDLINEITEMID
,POSTDATE
,POSTSTATUSCODE
,GLENTRIES)
select
isnull(FTLI.ID, NEWID())
,@FINANCIALTRANSACTIONID
,FTLI.AMOUNT
,FTLI.BASEAMOUNT
,FTLI.ORGAMOUNT
,FTLI.DESCRIPTION
,FTLI.SEQUENCE
,isnull(FTLI.TYPECODE,0)
,DELETED
,REVERSEDLINEITEMID
,isnull(FTLI.POSTDATE, FT.POSTDATE) --TODO: Postdate and poststatus will need to be changed to the lineitems poststatus/postdate
,isnull(FTLI.POSTSTATUSCODE,FT.POSTSTATUSCODE) --TODO: Postdate and poststatus will need to be changed to the lineitems poststatus/postdate
,FTLI.GLENTRIES
from dbo.UFN_FINANCIALTRANSACTION_LINEITEMS_FROMITEMLISTXML(@LINEITEMS,@MULTICURRENCY) FTLI
inner join dbo.FINANCIALTRANSACTION FT on @FINANCIALTRANSACTIONID = FT.ID
--Cache current context information
declare @CONTEXTCACHE varbinary(128);
set @CONTEXTCACHE = CONTEXT_INFO();
set CONTEXT_INFO @CHANGEAGENTID;
merge dbo.FINANCIALTRANSACTIONLINEITEM as target
using (select
ID
,FINANCIALTRANSACTIONID
,AMOUNT
,BASEAMOUNT
,ORGAMOUNT
,DESCRIPTION
,SEQUENCE
,TYPECODE
,DELETED
,REVERSEDLINEITEMID
,POSTDATE
,POSTSTATUSCODE
from @temp) as source (
ID
,FINANCIALTRANSACTIONID
,AMOUNT
,BASEAMOUNT
,ORGAMOUNT
,DESCRIPTION
,SEQUENCE
,TYPECODE
,DELETED
,REVERSEDLINEITEMID
,POSTDATE
,POSTSTATUSCODE)
on (target.ID = source.ID and target.FINANCIALTRANSACTIONID = @FINANCIALTRANSACTIONID and target.VISIBLE = 1)
when not matched by source and target.FINANCIALTRANSACTIONID = @FINANCIALTRANSACTIONID and target.VISIBLE = 1 then DELETE
when matched then
update set
ID = source.ID
,FINANCIALTRANSACTIONID = source.FINANCIALTRANSACTIONID
,TRANSACTIONAMOUNT = source.AMOUNT
,BASEAMOUNT = source.BASEAMOUNT
,ORGAMOUNT = source.ORGAMOUNT
,DESCRIPTION = source.DESCRIPTION
,SEQUENCE = source.SEQUENCE
,TYPECODE = source.TYPECODE
,DELETEDON = case when isnull(source.DELETED,0)=0 then NULL else @CURRENTDATE end
,REVERSEDLINEITEMID = source.REVERSEDLINEITEMID
,POSTDATE = source.POSTDATE
,POSTSTATUSCODE = source.POSTSTATUSCODE
,CHANGEDBYID = @CHANGEAGENTID
,DATECHANGED = @CURRENTDATE
when not matched then
insert (
ID
,FINANCIALTRANSACTIONID
,TRANSACTIONAMOUNT
,BASEAMOUNT
,ORGAMOUNT
,DESCRIPTION
,SEQUENCE
,TYPECODE
,DELETEDON
,REVERSEDLINEITEMID
,POSTDATE
,POSTSTATUSCODE
,ADDEDBYID
,DATEADDED
,CHANGEDBYID
,DATECHANGED)
values (
source.ID
,source.FINANCIALTRANSACTIONID
,source.AMOUNT
,source.BASEAMOUNT
,source.ORGAMOUNT
,source.DESCRIPTION
,source.SEQUENCE
,source.TYPECODE
,case when isnull(source.DELETED,0)=0 then NULL else @CURRENTDATE end
,source.REVERSEDLINEITEMID
,source.POSTDATE
,source.POSTSTATUSCODE
,@CHANGEAGENTID
,@CURRENTDATE
,@CHANGEAGENTID
,@CURRENTDATE);
-- Update JournalEntries
if @UPDATEDISTRIBUTION = 1
begin
declare @tempJE table (
FINANCIALTRANSACTIONLINEITEMID uniqueidentifier NOT NULL,
JOURNALENTRYID uniqueidentifier NOT NULL,
AMOUNT money NULL,
BASEAMOUNT money NULL,
ORGAMOUNT money NULL,
CLASSCODE tinyint NULL,
COMMENT nvarchar(60) NULL,
JOURNALCODEID uniqueidentifier NULL,
PERCENTAGE numeric(20,4) NULL,
SEQUENCE int NOT NULL,
TRANSACTIONTYPECODE tinyint NULL,
SUBLEDGERTYPECODE tinyint NULL,
POSTDATE date null,
DATAELEMENT1ID uniqueidentifier null,
DATAELEMENT2ID uniqueidentifier null,
DATAELEMENT3ID uniqueidentifier null,
DATAELEMENT4ID uniqueidentifier null,
DATAELEMENT5ID uniqueidentifier null,
DATAELEMENT6ID uniqueidentifier null,
DATAELEMENT7ID uniqueidentifier null,
DATAELEMENT8ID uniqueidentifier null,
DATAELEMENT9ID uniqueidentifier null,
DATAELEMENT10ID uniqueidentifier null,
DATAELEMENT11ID uniqueidentifier null,
DATAELEMENT12ID uniqueidentifier null,
DATAELEMENT13ID uniqueidentifier null,
DATAELEMENT14ID uniqueidentifier null,
DATAELEMENT15ID uniqueidentifier null,
DATAELEMENT16ID uniqueidentifier null,
DATAELEMENT17ID uniqueidentifier null,
DATAELEMENT18ID uniqueidentifier null,
DATAELEMENT19ID uniqueidentifier null,
DATAELEMENT20ID uniqueidentifier null,
DATAELEMENT21ID uniqueidentifier null,
DATAELEMENT22ID uniqueidentifier null,
DATAELEMENT23ID uniqueidentifier null,
DATAELEMENT24ID uniqueidentifier null,
DATAELEMENT25ID uniqueidentifier null,
DATAELEMENT26ID uniqueidentifier null,
DATAELEMENT27ID uniqueidentifier null,
DATAELEMENT28ID uniqueidentifier null,
DATAELEMENT29ID uniqueidentifier null,
DATAELEMENT30ID uniqueidentifier null,
ANNOTATIONXML xml null);
insert into @tempJE (
JOURNALENTRYID,
FINANCIALTRANSACTIONLINEITEMID,
AMOUNT,
ORGAMOUNT,
BASEAMOUNT,
CLASSCODE,
COMMENT,
JOURNALCODEID,
PERCENTAGE,
SEQUENCE,
POSTDATE,
TRANSACTIONTYPECODE,
SUBLEDGERTYPECODE,
DATAELEMENT1ID,
DATAELEMENT2ID,
DATAELEMENT3ID,
DATAELEMENT4ID,
DATAELEMENT5ID,
DATAELEMENT6ID,
DATAELEMENT7ID,
DATAELEMENT8ID,
DATAELEMENT9ID,
DATAELEMENT10ID,
DATAELEMENT11ID,
DATAELEMENT12ID,
DATAELEMENT13ID,
DATAELEMENT14ID,
DATAELEMENT15ID,
DATAELEMENT16ID,
DATAELEMENT17ID,
DATAELEMENT18ID,
DATAELEMENT19ID,
DATAELEMENT20ID,
DATAELEMENT21ID,
DATAELEMENT22ID,
DATAELEMENT23ID,
DATAELEMENT24ID,
DATAELEMENT25ID,
DATAELEMENT26ID,
DATAELEMENT27ID,
DATAELEMENT28ID,
DATAELEMENT29ID,
DATAELEMENT30ID,
ANNOTATIONXML)
select
CASE WHEN coalesce(GL.JOURNALENTRYID,'00000000-0000-0000-0000-000000000000')='00000000-0000-0000-0000-000000000000' THEN NEWID() ELSE GL.JOURNALENTRYID END JOURNALENTRYID
,T.ID
,abs(GL.AMOUNT) -- Amount is always positive.
,abs(GL.BASEAMOUNT)
,abs(GL.ORGAMOUNT)
,GL.CLASSCODE
,GL.COMMENT
,GL.JOURNALCODEID
,GL.PERCENTAGE
,GL.SEQUENCE
,GL.POSTDATE
,case when GL.AMOUNT>=0 then GL.TRANSACTIONTYPECODE else (-GL.TRANSACTIONTYPECODE)+1 end -- Negative amounts get to switch their transaction type code
,GL.TRANSACTIONTYPECODE as SUBLEDGERTYPECODE
,GL.DATAELEMENT1ID
,GL.DATAELEMENT2ID
,GL.DATAELEMENT3ID
,GL.DATAELEMENT4ID
,GL.DATAELEMENT5ID
,GL.DATAELEMENT6ID
,GL.DATAELEMENT7ID
,GL.DATAELEMENT8ID
,GL.DATAELEMENT9ID
,GL.DATAELEMENT10ID
,GL.DATAELEMENT11ID
,GL.DATAELEMENT12ID
,GL.DATAELEMENT13ID
,GL.DATAELEMENT14ID
,GL.DATAELEMENT15ID
,GL.DATAELEMENT16ID
,GL.DATAELEMENT17ID
,GL.DATAELEMENT18ID
,GL.DATAELEMENT19ID
,GL.DATAELEMENT20ID
,GL.DATAELEMENT21ID
,GL.DATAELEMENT22ID
,GL.DATAELEMENT23ID
,GL.DATAELEMENT24ID
,GL.DATAELEMENT25ID
,GL.DATAELEMENT26ID
,GL.DATAELEMENT27ID
,GL.DATAELEMENT28ID
,GL.DATAELEMENT29ID
,GL.DATAELEMENT30ID
,GL.ANNOTATIONS
from
@temp as T
cross apply dbo.UFN_FINANCIALTRANSACTION_LINEITEM_GL_FROMITEMLISTXML_MC(T.GLENTRIES,@MULTICURRENCY,T.BASEAMOUNT,T.ORGAMOUNT) as GL
merge dbo.JOURNALENTRY as target
using (
select
GL.JOURNALENTRYID as ID
,GL.FINANCIALTRANSACTIONLINEITEMID
,GL.AMOUNT
,GL.BASEAMOUNT
,GL.ORGAMOUNT
,GL.CLASSCODE
,GL.COMMENT
,GL.JOURNALCODEID
,GL.PERCENTAGE
,GL.SEQUENCE
,GL.POSTDATE
,GL.TRANSACTIONTYPECODE
,GL.SUBLEDGERTYPECODE
,GL.DATAELEMENT1ID
,GL.DATAELEMENT2ID
,GL.DATAELEMENT3ID
,GL.DATAELEMENT4ID
,GL.DATAELEMENT5ID
,GL.DATAELEMENT6ID
,GL.DATAELEMENT7ID
,GL.DATAELEMENT8ID
,GL.DATAELEMENT9ID
,GL.DATAELEMENT10ID
,GL.DATAELEMENT11ID
,GL.DATAELEMENT12ID
,GL.DATAELEMENT13ID
,GL.DATAELEMENT14ID
,GL.DATAELEMENT15ID
,GL.DATAELEMENT16ID
,GL.DATAELEMENT17ID
,GL.DATAELEMENT18ID
,GL.DATAELEMENT19ID
,GL.DATAELEMENT20ID
,GL.DATAELEMENT21ID
,GL.DATAELEMENT22ID
,GL.DATAELEMENT23ID
,GL.DATAELEMENT24ID
,GL.DATAELEMENT25ID
,GL.DATAELEMENT26ID
,GL.DATAELEMENT27ID
,GL.DATAELEMENT28ID
,GL.DATAELEMENT29ID
,GL.DATAELEMENT30ID
from
@tempJE as GL
) as source
on ( target.ID = source.ID )
when not matched by source and target.FINANCIALTRANSACTIONLINEITEMID in (select ID from dbo.FINANCIALTRANSACTIONLINEITEM where FINANCIALTRANSACTIONID = @FINANCIALTRANSACTIONID) then DELETE
when matched then
update set
TRANSACTIONAMOUNT = source.AMOUNT
,BASEAMOUNT = source.BASEAMOUNT
,ORGAMOUNT = source.ORGAMOUNT
,CLASSCODE = source.CLASSCODE
,COMMENT = source.COMMENT
,JOURNALCODEID = source.JOURNALCODEID
,PERCENTAGE = source.PERCENTAGE
,SEQUENCE = source.SEQUENCE
,POSTDATE = source.POSTDATE
,TRANSACTIONTYPECODE = source.TRANSACTIONTYPECODE
,SUBLEDGERTYPECODE = source.SUBLEDGERTYPECODE
,DATAELEMENT1ID = source.DATAELEMENT1ID
,DATAELEMENT2ID = source.DATAELEMENT2ID
,DATAELEMENT3ID = source.DATAELEMENT3ID
,DATAELEMENT4ID = source.DATAELEMENT4ID
,DATAELEMENT5ID = source.DATAELEMENT5ID
,DATAELEMENT6ID = source.DATAELEMENT6ID
,DATAELEMENT7ID = source.DATAELEMENT7ID
,DATAELEMENT8ID = source.DATAELEMENT8ID
,DATAELEMENT9ID = source.DATAELEMENT9ID
,DATAELEMENT10ID = source.DATAELEMENT10ID
,DATAELEMENT11ID = source.DATAELEMENT11ID
,DATAELEMENT12ID = source.DATAELEMENT12ID
,DATAELEMENT13ID = source.DATAELEMENT13ID
,DATAELEMENT14ID = source.DATAELEMENT14ID
,DATAELEMENT15ID = source.DATAELEMENT15ID
,DATAELEMENT16ID = source.DATAELEMENT16ID
,DATAELEMENT17ID = source.DATAELEMENT17ID
,DATAELEMENT18ID = source.DATAELEMENT18ID
,DATAELEMENT19ID = source.DATAELEMENT19ID
,DATAELEMENT20ID = source.DATAELEMENT20ID
,DATAELEMENT21ID = source.DATAELEMENT21ID
,DATAELEMENT22ID = source.DATAELEMENT22ID
,DATAELEMENT23ID = source.DATAELEMENT23ID
,DATAELEMENT24ID = source.DATAELEMENT24ID
,DATAELEMENT25ID = source.DATAELEMENT25ID
,DATAELEMENT26ID = source.DATAELEMENT26ID
,DATAELEMENT27ID = source.DATAELEMENT27ID
,DATAELEMENT28ID = source.DATAELEMENT28ID
,DATAELEMENT29ID = source.DATAELEMENT29ID
,DATAELEMENT30ID = source.DATAELEMENT30ID
,TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID
-- Boilerplate
,CHANGEDBYID = @CHANGEAGENTID
,DATECHANGED = @CURRENTDATE
when not matched then
insert (
ID
,FINANCIALTRANSACTIONLINEITEMID
,TRANSACTIONAMOUNT
,BASEAMOUNT
,ORGAMOUNT
,CLASSCODE
,COMMENT
,JOURNALCODEID
,PERCENTAGE
,SEQUENCE
,POSTDATE
,TRANSACTIONTYPECODE
,SUBLEDGERTYPECODE
,DATAELEMENT1ID
,DATAELEMENT2ID
,DATAELEMENT3ID
,DATAELEMENT4ID
,DATAELEMENT5ID
,DATAELEMENT6ID
,DATAELEMENT7ID
,DATAELEMENT8ID
,DATAELEMENT9ID
,DATAELEMENT10ID
,DATAELEMENT11ID
,DATAELEMENT12ID
,DATAELEMENT13ID
,DATAELEMENT14ID
,DATAELEMENT15ID
,DATAELEMENT16ID
,DATAELEMENT17ID
,DATAELEMENT18ID
,DATAELEMENT19ID
,DATAELEMENT20ID
,DATAELEMENT21ID
,DATAELEMENT22ID
,DATAELEMENT23ID
,DATAELEMENT24ID
,DATAELEMENT25ID
,DATAELEMENT26ID
,DATAELEMENT27ID
,DATAELEMENT28ID
,DATAELEMENT29ID
,DATAELEMENT30ID
,TRANSACTIONCURRENCYID
-- boilerplate
,ADDEDBYID
,DATEADDED
,CHANGEDBYID
,DATECHANGED
)
values (
COALESCE(source.ID, newid())
,source.FINANCIALTRANSACTIONLINEITEMID
,source.AMOUNT
,source.BASEAMOUNT
,source.ORGAMOUNT
,source.CLASSCODE
,source.COMMENT
,source.JOURNALCODEID
,source.PERCENTAGE
,source.SEQUENCE
,source.POSTDATE
,source.TRANSACTIONTYPECODE
,source.SUBLEDGERTYPECODE
,source.DATAELEMENT1ID
,source.DATAELEMENT2ID
,source.DATAELEMENT3ID
,source.DATAELEMENT4ID
,source.DATAELEMENT5ID
,source.DATAELEMENT6ID
,source.DATAELEMENT7ID
,source.DATAELEMENT8ID
,source.DATAELEMENT9ID
,source.DATAELEMENT10ID
,source.DATAELEMENT11ID
,source.DATAELEMENT12ID
,source.DATAELEMENT13ID
,source.DATAELEMENT14ID
,source.DATAELEMENT15ID
,source.DATAELEMENT16ID
,source.DATAELEMENT17ID
,source.DATAELEMENT18ID
,source.DATAELEMENT19ID
,source.DATAELEMENT20ID
,source.DATAELEMENT21ID
,source.DATAELEMENT22ID
,source.DATAELEMENT23ID
,source.DATAELEMENT24ID
,source.DATAELEMENT25ID
,source.DATAELEMENT26ID
,source.DATAELEMENT27ID
,source.DATAELEMENT28ID
,source.DATAELEMENT29ID
,source.DATAELEMENT30ID
,@TRANSACTIONCURRENCYID
-- boilerplate
,@CHANGEAGENTID
,@CURRENTDATE
,@CHANGEAGENTID
,@CURRENTDATE
);
--- Save annotations!
--the following use of a temp table is just a work-around for a bug in SQL Server 2008
--http://connect.microsoft.com/SQLServer/feedback/details/321459/mergesql-incorrectly-tries-to-insert-nulls
declare @temp2 table (
JOURNALENTRYID uniqueidentifier NOT NULL,
ID uniqueidentifier NOT NULL,
ANNOTATIONCATEGORYCODE tinyint NOT NULL,
REFERENCENAME nvarchar(255) NULL,
SEQUENCE int NOT NULL,
VALIDATIONCODE int NOT NULL,
[TEXT] nvarchar(4000) null,
APPUSERID uniqueidentifier null,
DATEADDED datetime not null)
insert into @temp2
(JOURNALENTRYID,ID,ANNOTATIONCATEGORYCODE,REFERENCENAME,SEQUENCE ,VALIDATIONCODE,[TEXT], APPUSERID, [DATEADDED])
select
T1.JOURNALENTRYID,
CASE WHEN coalesce(T2.ID,'00000000-0000-0000-0000-000000000000')='00000000-0000-0000-0000-000000000000' THEN NEWID() ELSE T2.ID END ID,
T2.ANNOTATIONCATEGORYCODE,
T2.REFERENCENAME,
T2.SEQUENCE,
T2.VALIDATIONCODE,
T2.[TEXT],
T2.[APPUSERID],
T2.[DATEADDED]
from @tempJE T1 CROSS APPLY dbo.UFN_JOURNALENTRYANNOTATIONS_FROMITEMLISTXML(T1.ANNOTATIONXML) T2
merge dbo.JOURNALENTRYANNOTATION as target
using (select * from @temp2) as source
on (target.JOURNALENTRYID=source.JOURNALENTRYID AND target.ID=source.ID)
when not matched by source and
(EXISTS (
SELECT *
FROM dbo.JOURNALENTRY as JE
inner join dbo.FINANCIALTRANSACTIONLINEITEM as LI on JE.FINANCIALTRANSACTIONLINEITEMID = LI.ID
WHERE JE.ID=target.JOURNALENTRYID AND LI.FINANCIALTRANSACTIONID=@FINANCIALTRANSACTIONID)
) then
delete
when matched then
update SET
ANNOTATIONCATEGORYCODE=source.ANNOTATIONCATEGORYCODE,
REFERENCENAME=source.REFERENCENAME,
SEQUENCE=source.SEQUENCE,
VALIDATIONCODE=source.VALIDATIONCODE,
[TEXT]=source.[TEXT],
CHANGEDBYID=@CHANGEAGENTID,
DATECHANGED=@CURRENTDATE
when not matched then
insert (
ID
,JOURNALENTRYID
,ANNOTATIONCATEGORYCODE
,REFERENCENAME
,SEQUENCE
,VALIDATIONCODE
,[TEXT]
,APPUSERID
,DATEADDED
,DATECHANGED
,ADDEDBYID
,CHANGEDBYID)
values (
isnull(source.ID,newid())
,source.JOURNALENTRYID
,source.ANNOTATIONCATEGORYCODE
,source.REFERENCENAME
,source.SEQUENCE
,source.VALIDATIONCODE
,source.[TEXT]
,source.APPUSERID
,@CURRENTDATE
,@CURRENTDATE
,@CHANGEAGENTID
,@CHANGEAGENTID
);
end;
if not @CONTEXTCACHE is null
set CONTEXT_INFO @CONTEXTCACHE;
end try
begin catch
exec dbo.USP_RAISE_ERROR
return 1
end catch
return 0;