USP_REVENUE_GETSPLITS_3_CUSTOMUPDATEFROMXML

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@XML xml IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN
@POSTDATE datetime IN

Definition

Copy


CREATE procedure dbo.USP_REVENUE_GETSPLITS_3_CUSTOMUPDATEFROMXML (
  @REVENUEID uniqueidentifier
  ,@XML xml
  ,@CHANGEAGENTID uniqueidentifier = null
  ,@CHANGEDATE datetime = null
  ,@POSTDATE 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 (
  [AMOUNT] money
  ,[APPLICATIONCODE] tinyint
  ,[BASECURRENCYID] uniqueidentifier
  ,[BASEEXCHANGERATEID] uniqueidentifier
  ,[CATEGORYCODEID] uniqueidentifier
  ,[DESIGNATIONID] uniqueidentifier
  ,[ID] uniqueidentifier
  ,[ORGANIZATIONAMOUNT] money
  ,[ORGANIZATIONEXCHANGERATEID] uniqueidentifier
  ,[TRANSACTIONAMOUNT] money
  ,[TRANSACTIONCURRENCYID] uniqueidentifier
  ,[TYPECODE] tinyint
  )

insert into @TempTbl
select [AMOUNT]
  ,[APPLICATIONCODE]
  ,[BASECURRENCYID]
  ,[BASEEXCHANGERATEID]
  ,[CATEGORYCODEID]
  ,[DESIGNATIONID]
  ,[ID]
  ,[ORGANIZATIONAMOUNT]
  ,[ORGANIZATIONEXCHANGERATEID]
  ,[TRANSACTIONAMOUNT]
  ,[TRANSACTIONCURRENCYID]
  ,[TYPECODE]
from dbo.UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML(@XML)

declare @POSTSTATUSCODE tinyint;

select @POSTSTATUSCODE = case when FT.POSTSTATUSCODE = 2 then 1 else FT.POSTSTATUSCODE end
  ,@POSTDATE = case FT.POSTSTATUSCODE when 3 then FT.[DATE] else isnull(@POSTDATE, FT.POSTDATE) end
from dbo.FINANCIALTRANSACTION FT
where FT.ID = @REVENUEID;

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;

declare @SPLITSTODELETE xml

set @SPLITSTODELETE = (
    select SPLITS.ID
    from (
      select ID
      from dbo.UFN_REVENUE_GETSPLITS_2(@REVENUEID)

      except

      select ID
      from @TempTbl
      ) SPLITS
    for xml raw('ITEM')
      ,type
      ,elements
      ,root('SPLITSTODELETE')
      ,binary BASE64
    );

-- delete any items that no longer exist in the XML table

--exec dbo.USP_REVENUESPLIT_DELETESPLITS @SPLITSTODELETE, @CHANGEAGENTID, @CHANGEDATE;

exec dbo.USP_FINANCIALTRANSACTIONLINEITEM_DELETESPLITSANDMARKORPHANED @SPLITSTODELETE
  ,@CHANGEAGENTID
  ,@CHANGEDATE

-- delete any items that no longer exist in the XML table

delete
from dbo.[REVENUECATEGORY]
where [REVENUECATEGORY].ID in (
    select ID
    from dbo.UFN_REVENUE_GETSPLITS_2(@REVENUEID)

    except

    select data.ID
    from @TempTbl as data
    where (not data.CATEGORYCODEID is null)
    )

select @e = @@error;

-- reset CONTEXT_INFO to previous value 

if not @contextCache is null
  set CONTEXT_INFO @contextCache;

if @e <> 0
  return 2;

declare @FINANCIALTRANSACTIONLINEITEMADJUSTMENTID uniqueidentifier;

select @FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = LIA.ID
from dbo.ADJUSTMENT A
inner join dbo.FINANCIALTRANSACTIONLINEITEMADJUSTMENT LIA on LIA.ID = A.ID
where A.REVENUEID = @REVENUEID
  and A.POSTSTATUSCODE <> 0

declare @ORGANIZATIONCURRENCYID as uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY ();

update FINANCIALTRANSACTIONLINEITEM
set BASEAMOUNT = temp.AMOUNT
  ,ORGAMOUNT = case when temp.ORGANIZATIONEXCHANGERATEID is null
      and (
        temp.BASECURRENCYID is null
        or temp.BASECURRENCYID = @ORGANIZATIONCURRENCYID
        )
      and temp.BASEEXCHANGERATEID is null
      and (
        temp.TRANSACTIONCURRENCYID is null
        or temp.TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID
        )
      and (
        isnull(temp.ORGANIZATIONAMOUNT, 0) <> isnull(temp.AMOUNT, 0)
        or isnull(temp.TRANSACTIONAMOUNT, 0) <> isnull(temp.AMOUNT, 0)
        or isnull(temp.AMOUNT, 0) = 0
        )
      and (
        FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT = FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT
        and FINANCIALTRANSACTIONLINEITEM.ORGAMOUNT = FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT
        ) then temp.AMOUNT else isnull(temp.ORGANIZATIONAMOUNT, 0) end
  ,TRANSACTIONAMOUNT = case when temp.ORGANIZATIONEXCHANGERATEID is null
      and (
        temp.BASECURRENCYID is null
        or temp.BASECURRENCYID = @ORGANIZATIONCURRENCYID
        )
      and temp.BASEEXCHANGERATEID is null
      and (
        temp.TRANSACTIONCURRENCYID is null
        or temp.TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID
        )
      and (
        isnull(temp.ORGANIZATIONAMOUNT, 0) <> isnull(temp.AMOUNT, 0)
        or isnull(temp.TRANSACTIONAMOUNT, 0) <> isnull(temp.AMOUNT, 0)
        or isnull(temp.AMOUNT, 0) = 0
        )
      and (
        FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT = FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT
        and FINANCIALTRANSACTIONLINEITEM.ORGAMOUNT = FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT
        ) then temp.AMOUNT else isnull(temp.TRANSACTIONAMOUNT, 0) end
  ,CHANGEDBYID = @CHANGEAGENTID
  ,DATECHANGED = @CHANGEDATE
  ,FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = @FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
from dbo.FINANCIALTRANSACTIONLINEITEM
inner join @TempTbl as temp on FINANCIALTRANSACTIONLINEITEM.ID = temp.ID
inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
where ([FINANCIALTRANSACTIONLINEITEM].[BASEAMOUNT] <> temp.[AMOUNT])
  or (
    [FINANCIALTRANSACTIONLINEITEM].[BASEAMOUNT] is null
    and temp.[AMOUNT] is not null
    )
  or (
    [FINANCIALTRANSACTIONLINEITEM].[BASEAMOUNT] is not null
    and temp.[AMOUNT] is null
    )
  or ([REVENUESPLIT_EXT].[APPLICATIONCODE] <> temp.[APPLICATIONCODE])
  or (
    [REVENUESPLIT_EXT].[APPLICATIONCODE] is null
    and temp.[APPLICATIONCODE] is not null
    )
  or (
    [REVENUESPLIT_EXT].[APPLICATIONCODE] is not null
    and temp.[APPLICATIONCODE] is null
    )
  or ([FINANCIALTRANSACTION].[BASEEXCHANGERATEID] <> temp.[BASEEXCHANGERATEID])
  or (
    [FINANCIALTRANSACTION].[BASEEXCHANGERATEID] is null
    and temp.[BASEEXCHANGERATEID] is not null
    )
  or (
    [FINANCIALTRANSACTION].[BASEEXCHANGERATEID] is not null
    and temp.[BASEEXCHANGERATEID] is null
    )
  or ([REVENUESPLIT_EXT].[DESIGNATIONID] <> temp.[DESIGNATIONID])
  or (
    [REVENUESPLIT_EXT].[DESIGNATIONID] is null
    and temp.[DESIGNATIONID] is not null
    )
  or (
    [REVENUESPLIT_EXT].[DESIGNATIONID] is not null
    and temp.[DESIGNATIONID] is null
    )
  or ([FINANCIALTRANSACTIONLINEITEM].[ORGAMOUNT] <> temp.[ORGANIZATIONAMOUNT])
  or (
    [FINANCIALTRANSACTIONLINEITEM].[ORGAMOUNT] is null
    and temp.[ORGANIZATIONAMOUNT] is not null
    )
  or (
    [FINANCIALTRANSACTIONLINEITEM].[ORGAMOUNT] is not null
    and temp.[ORGANIZATIONAMOUNT] is null
    )
  or ([FINANCIALTRANSACTION].[ORGEXCHANGERATEID] <> temp.[ORGANIZATIONEXCHANGERATEID])
  or (
    [FINANCIALTRANSACTION].[ORGEXCHANGERATEID] is null
    and temp.[ORGANIZATIONEXCHANGERATEID] is not null
    )
  or (
    [FINANCIALTRANSACTION].[ORGEXCHANGERATEID] is not null
    and temp.[ORGANIZATIONEXCHANGERATEID] is null
    )
  or ([FINANCIALTRANSACTIONLINEITEM].[TRANSACTIONAMOUNT] <> temp.[TRANSACTIONAMOUNT])
  or (
    [FINANCIALTRANSACTIONLINEITEM].[TRANSACTIONAMOUNT] is null
    and temp.[TRANSACTIONAMOUNT] is not null
    )
  or (
    [FINANCIALTRANSACTIONLINEITEM].[TRANSACTIONAMOUNT] is not null
    and temp.[TRANSACTIONAMOUNT] is null
    )
  or ([FINANCIALTRANSACTION].[TRANSACTIONCURRENCYID] <> temp.[TRANSACTIONCURRENCYID])
  or (
    [FINANCIALTRANSACTION].[TRANSACTIONCURRENCYID] is null
    and temp.[TRANSACTIONCURRENCYID] is not null
    )
  or (
    [FINANCIALTRANSACTION].[TRANSACTIONCURRENCYID] is not null
    and temp.[TRANSACTIONCURRENCYID] is null
    )
  or ([REVENUESPLIT_EXT].[TYPECODE] <> temp.[TYPECODE])
  or (
    [REVENUESPLIT_EXT].[TYPECODE] is null
    and temp.[TYPECODE] is not null
    )
  or (
    [REVENUESPLIT_EXT].[TYPECODE] is not null
    and temp.[TYPECODE] is null
    )

update REVENUESPLIT_EXT
set APPLICATIONCODE = temp.APPLICATIONCODE
  ,DESIGNATIONID = temp.DESIGNATIONID
  ,TYPECODE = temp.TYPECODE
  ,CHANGEDBYID = @CHANGEAGENTID
  ,DATECHANGED = @CHANGEDATE
from dbo.REVENUESPLIT_EXT
inner join @TempTbl as temp on REVENUESPLIT_EXT.ID = temp.ID
inner join dbo.FINANCIALTRANSACTIONLINEITEM on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
where ([FINANCIALTRANSACTIONLINEITEM].[BASEAMOUNT] <> temp.[AMOUNT])
  or (
    [FINANCIALTRANSACTIONLINEITEM].[BASEAMOUNT] is null
    and temp.[AMOUNT] is not null
    )
  or (
    [FINANCIALTRANSACTIONLINEITEM].[BASEAMOUNT] is not null
    and temp.[AMOUNT] is null
    )
  or ([REVENUESPLIT_EXT].[APPLICATIONCODE] <> temp.[APPLICATIONCODE])
  or (
    [REVENUESPLIT_EXT].[APPLICATIONCODE] is null
    and temp.[APPLICATIONCODE] is not null
    )
  or (
    [REVENUESPLIT_EXT].[APPLICATIONCODE] is not null
    and temp.[APPLICATIONCODE] is null
    )
  or ([FINANCIALTRANSACTION].[BASEEXCHANGERATEID] <> temp.[BASEEXCHANGERATEID])
  or (
    [FINANCIALTRANSACTION].[BASEEXCHANGERATEID] is null
    and temp.[BASEEXCHANGERATEID] is not null
    )
  or (
    [FINANCIALTRANSACTION].[BASEEXCHANGERATEID] is not null
    and temp.[BASEEXCHANGERATEID] is null
    )
  or ([REVENUESPLIT_EXT].[DESIGNATIONID] <> temp.[DESIGNATIONID])
  or (
    [REVENUESPLIT_EXT].[DESIGNATIONID] is null
    and temp.[DESIGNATIONID] is not null
    )
  or (
    [REVENUESPLIT_EXT].[DESIGNATIONID] is not null
    and temp.[DESIGNATIONID] is null
    )
  or ([FINANCIALTRANSACTIONLINEITEM].[ORGAMOUNT] <> temp.[ORGANIZATIONAMOUNT])
  or (
    [FINANCIALTRANSACTIONLINEITEM].[ORGAMOUNT] is null
    and temp.[ORGANIZATIONAMOUNT] is not null
    )
  or (
    [FINANCIALTRANSACTIONLINEITEM].[ORGAMOUNT] is not null
    and temp.[ORGANIZATIONAMOUNT] is null
    )
  or ([FINANCIALTRANSACTION].[ORGEXCHANGERATEID] <> temp.[ORGANIZATIONEXCHANGERATEID])
  or (
    [FINANCIALTRANSACTION].[ORGEXCHANGERATEID] is null
    and temp.[ORGANIZATIONEXCHANGERATEID] is not null
    )
  or (
    [FINANCIALTRANSACTION].[ORGEXCHANGERATEID] is not null
    and temp.[ORGANIZATIONEXCHANGERATEID] is null
    )
  or ([FINANCIALTRANSACTIONLINEITEM].[TRANSACTIONAMOUNT] <> temp.[TRANSACTIONAMOUNT])
  or (
    [FINANCIALTRANSACTIONLINEITEM].[TRANSACTIONAMOUNT] is null
    and temp.[TRANSACTIONAMOUNT] is not null
    )
  or (
    [FINANCIALTRANSACTIONLINEITEM].[TRANSACTIONAMOUNT] is not null
    and temp.[TRANSACTIONAMOUNT] is null
    )
  or ([FINANCIALTRANSACTION].[TRANSACTIONCURRENCYID] <> temp.[TRANSACTIONCURRENCYID])
  or (
    [FINANCIALTRANSACTION].[TRANSACTIONCURRENCYID] is null
    and temp.[TRANSACTIONCURRENCYID] is not null
    )
  or (
    [FINANCIALTRANSACTION].[TRANSACTIONCURRENCYID] is not null
    and temp.[TRANSACTIONCURRENCYID] is null
    )
  or ([REVENUESPLIT_EXT].[TYPECODE] <> temp.[TYPECODE])
  or (
    [REVENUESPLIT_EXT].[TYPECODE] is null
    and temp.[TYPECODE] is not null
    )
  or (
    [REVENUESPLIT_EXT].[TYPECODE] is not null
    and temp.[TYPECODE] is null
    )

-- Update the revenue category table as well

update [REVENUECATEGORY]
set [REVENUECATEGORY].[GLREVENUECATEGORYMAPPINGID] = temp.[CATEGORYCODEID]
  ,[REVENUECATEGORY].CHANGEDBYID = @CHANGEAGENTID
  ,[REVENUECATEGORY].DATECHANGED = @CHANGEDATE
from dbo.[REVENUECATEGORY]
inner join @TempTbl as [temp] on [REVENUECATEGORY].ID = [temp].ID
where ([REVENUECATEGORY].[GLREVENUECATEGORYMAPPINGID] <> temp.[CATEGORYCODEID])

if @@Error <> 0
  return 3;

-- insert new items

insert into dbo.FINANCIALTRANSACTIONLINEITEM (
  ID
  ,FINANCIALTRANSACTIONID
  ,BASEAMOUNT
  ,ORGAMOUNT
  ,TRANSACTIONAMOUNT
  ,POSTSTATUSCODE
  ,POSTDATE
  ,FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
  ,ADDEDBYID
  ,CHANGEDBYID
  ,DATEADDED
  ,DATECHANGED
  )
select ID
  ,@REVENUEID
  ,AMOUNT
  ,case when ORGANIZATIONEXCHANGERATEID is null
      and (
        BASECURRENCYID is null
        or BASECURRENCYID = @ORGANIZATIONCURRENCYID
        )
      and BASEEXCHANGERATEID is null
      and (
        TRANSACTIONCURRENCYID is null
        or TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID
        )
      and (
        isnull(ORGANIZATIONAMOUNT, 0) <> isnull(AMOUNT, 0)
        or isnull(TRANSACTIONAMOUNT, 0) <> isnull(AMOUNT, 0)
        or isnull(AMOUNT, 0) = 0
        ) then isnull(AMOUNT, 0) else coalesce(ORGANIZATIONAMOUNT, AMOUNT, 0) end
  ,case when ORGANIZATIONEXCHANGERATEID is null
      and (
        BASECURRENCYID is null
        or BASECURRENCYID = @ORGANIZATIONCURRENCYID
        )
      and BASEEXCHANGERATEID is null
      and (
        TRANSACTIONCURRENCYID is null
        or TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID
        )
      and (
        isnull(ORGANIZATIONAMOUNT, 0) <> isnull(AMOUNT, 0)
        or isnull(TRANSACTIONAMOUNT, 0) <> isnull(AMOUNT, 0)
        or isnull(AMOUNT, 0) = 0
        ) then isnull(AMOUNT, 0) else coalesce(TRANSACTIONAMOUNT, AMOUNT, 0) end
  ,@POSTSTATUSCODE
  ,@POSTDATE
  ,@FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
  ,@CHANGEAGENTID
  ,@CHANGEAGENTID
  ,@CHANGEDATE
  ,@CHANGEDATE
from @TempTbl as temp
where not exists (
    select 1
    from dbo.FINANCIALTRANSACTIONLINEITEM
    where ID = temp.ID
    )

insert into dbo.REVENUESPLIT_EXT (
  ID
  ,APPLICATIONCODE
  ,DESIGNATIONID
  ,TYPECODE
  ,ADDEDBYID
  ,CHANGEDBYID
  ,DATEADDED
  ,DATECHANGED
  )
select ID
  ,APPLICATIONCODE
  ,DESIGNATIONID
  ,TYPECODE
  ,@CHANGEAGENTID
  ,@CHANGEAGENTID
  ,@CHANGEDATE
  ,@CHANGEDATE
from @TempTbl as temp
where not exists (
    select 1
    from dbo.REVENUESPLIT_EXT
    where ID = temp.ID
    )

-- insert new revenue category items

insert into [REVENUECATEGORY] (
  [ID]
  ,[GLREVENUECATEGORYMAPPINGID]
  ,ADDEDBYID
  ,CHANGEDBYID
  ,DATEADDED
  ,DATECHANGED
  )
select [ID]
  ,[CATEGORYCODEID]
  ,@CHANGEAGENTID
  ,@CHANGEAGENTID
  ,@CHANGEDATE
  ,@CHANGEDATE
from @TempTbl as [temp]
where (
    not exists (
      select ID
      from dbo.[REVENUECATEGORY] as data
      where data.ID = [temp].ID
      )
    )
  and (not [temp].CATEGORYCODEID is null)

if @@Error <> 0
  return 4;

return 0;