USP_BANKACCOUNTTRANSACTION_GLDISTRIBUTION_MULTICURRENCY_UPDATEFROMXML

Update the bank account transaction GL distributions with multicurrency from the XML

Parameters

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

Definition

Copy


CREATE procedure dbo.USP_BANKACCOUNTTRANSACTION_GLDISTRIBUTION_MULTICURRENCY_UPDATEFROMXML
(
  @BANKACCOUNTTRANSACTIONID uniqueidentifier,
  @XML xml,
  @POSTDATE datetime,
  @CHANGEAGENTID uniqueidentifier = null,
  @CHANGEDATE datetime = null
)
as
  set nocount on;

  begin try        

    if @CHANGEAGENTID is null
      exec USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

    if @CHANGEDATE is null 
      set @CHANGEDATE = getdate()

    declare @TempTbl table (
      [ID] uniqueidentifier,
      [TRANSACTIONTYPECODE] tinyint,
      [ACCOUNT] nvarchar(100),
      [GLACCOUNTID] uniqueidentifier,
      [PROJECT] nvarchar(100),
      [AMOUNT] money,
      [REFERENCE] nvarchar(100),
      [ORGANIZATIONAMOUNT] money,
      [BASECURRENCYID] uniqueidentifier,
      [TRANSACTIONAMOUNT] money,
      [TRANSACTIONCURRENCYID] uniqueidentifier,
      [BASEEXCHANGERATEID] uniqueidentifier,
      [ORGANIZATIONEXCHANGERATEID] uniqueidentifier,    
      [GLTRANSACTIONID] uniqueidentifier);

    insert into @TempTbl
    select 
      D.ID, 
      D.TRANSACTIONTYPECODE, 
      A.ACCOUNTNUMBER [ACCOUNT], 
      D.GLACCOUNTID,
      D.PROJECT, 
      D.AMOUNT,     
      D.REFERENCE, 
      D.ORGANIZATIONAMOUNT,
      D.BASECURRENCYID,
      D.TRANSACTIONAMOUNT,
      D.TRANSACTIONCURRENCYID,
      D.BASEEXCHANGERATEID,
      D.ORGANIZATIONEXCHANGERATEID,
      D.GLTRANSACTIONID
    from dbo.UFN_BANKACCOUNTTRANSACTION_GETGLDISTRIBUTION_FROMITEMLISTXML(@XML) D
    inner join dbo.GLACCOUNT A on A.ID = D.GLACCOUNTID

    declare @GLACCOUNTID uniqueidentifier;
    declare @GLACCOUNT1ID uniqueidentifier;
    declare @ACCOUNTCODEID uniqueidentifier;
    declare @ACCOUNTCODE1ID uniqueidentifier;
    declare @PDACCOUNTSYSTEMID uniqueidentifier;
    declare @CHECKDEBITSIDE bit;
    declare @TRANSACTIONCURRENCYID uniqueidentifier;
    declare @TRANSACTIONCURRENCY1ID uniqueidentifier;
    declare @BATTYPECODE tinyint;

    select @GLACCOUNTID = BA.GLACCOUNTID
        ,@GLACCOUNT1ID = BA1.GLACCOUNTID
        ,@ACCOUNTCODEID = BA.PDACCOUNTSEGMENTVALUEID
        ,@ACCOUNTCODE1ID = BA1.PDACCOUNTSEGMENTVALUEID
        ,@CHECKDEBITSIDE = CASE WHEN BAT.TRANSACTIONTYPECODE in (17, 32) THEN 0 ELSE 1 END
        ,@PDACCOUNTSYSTEMID = BA.PDACCOUNTSYSTEMID
        ,@TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
        ,@TRANSACTIONCURRENCY1ID = BA1.TRANSACTIONCURRENCYID
        ,@BATTYPECODE = BAT.TRANSACTIONTYPECODE
    from dbo.BANKACCOUNTTRANSACTION as BAT 
    inner join dbo.BANKACCOUNT BA on BA.ID = BAT.BANKACCOUNTID
    left outer join dbo.BANKACCOUNT BA1 on BA1.ID = BAT.TRANSFERBANKACCOUNTID
    where BAT.ID = @BANKACCOUNTTRANSACTIONID

    declare @ACCOUNT nvarchar(100);
    if @TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCY1ID
    begin
        select @ACCOUNT = dbo.UFN_GLACCOUNT_GETDEFAULTACCOUNTSTRING_BYACCOUNTSYSTEM(@ACCOUNTCODE1ID,@PDACCOUNTSYSTEMID);
        select @GLACCOUNT1ID = ID from dbo.GLACCOUNT where ACCOUNTNUMBER = @ACCOUNT and PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID;
    end
    else
        set @GLACCOUNT1ID = null;

    if @GLACCOUNTID is not null
    begin
        if exists(select ID from @TempTbl where (GLACCOUNTID <> @GLACCOUNTID and @CHECKDEBITSIDE = 1 and TRANSACTIONTYPECODE = 0) or (@GLACCOUNT1ID is not null and GLACCOUNTID <> @GLACCOUNT1ID and @CHECKDEBITSIDE = 0 and TRANSACTIONTYPECODE = 0))
            if @BATTYPECODE in (16, 17)
                raiserror('ERR_DEBITACCOUNT_MUST_BE_SAME_AS_BANK.', 13, 1)
            else
                raiserror('ERR_DEBITACCOUNT_TRAN_MUST_BE_SAME_AS_BANK.', 13, 1)
        else if exists(select ID from @TempTbl where (GLACCOUNTID <> @GLACCOUNTID and @CHECKDEBITSIDE = 0 and TRANSACTIONTYPECODE = 1) or (@GLACCOUNT1ID is not null and GLACCOUNTID <> @GLACCOUNT1ID and @CHECKDEBITSIDE = 1 and TRANSACTIONTYPECODE = 1))
            if @BATTYPECODE in (16, 17)
                raiserror('ERR_CREDITACCOUNT_MUST_BE_SAME_AS_BANK.', 13, 1)
            else
                raiserror('ERR_CREDITACCOUNT_TRAN_MUST_BE_SAME_AS_BANK.', 13, 1)
    end
    else
    begin
        select @ACCOUNT = dbo.UFN_GLACCOUNT_GETDEFAULTACCOUNTSTRING_BYACCOUNTSYSTEM(@ACCOUNTCODEID,@PDACCOUNTSYSTEMID);
        select @GLACCOUNTID = ID from dbo.GLACCOUNT where ACCOUNTNUMBER = @ACCOUNT and PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID;
        if exists(select ID from @TempTbl where (GLACCOUNTID <> @GLACCOUNTID and @CHECKDEBITSIDE = 1 and TRANSACTIONTYPECODE = 0) or (@GLACCOUNT1ID is not null and GLACCOUNTID <> @GLACCOUNT1ID and @CHECKDEBITSIDE = 0 and TRANSACTIONTYPECODE = 0))
            if @BATTYPECODE in (16, 17)
                raiserror('ERR_DEBITACCOUNT_MUST_BE_SAME_AS_BANK.', 13, 1)
            else
                raiserror('ERR_DEBITACCOUNT_TRAN_MUST_BE_SAME_AS_BANK.', 13, 1)
        else if exists(select ID from @TempTbl where (GLACCOUNTID <> @GLACCOUNTID and @CHECKDEBITSIDE = 0 and TRANSACTIONTYPECODE = 1) or (@GLACCOUNT1ID is not null and GLACCOUNTID <> @GLACCOUNT1ID and @CHECKDEBITSIDE = 1 and TRANSACTIONTYPECODE = 1))
            if @BATTYPECODE in (16, 17)
                raiserror('ERR_CREDITACCOUNT_MUST_BE_SAME_AS_BANK.', 13, 1)
            else
                raiserror('ERR_CREDITACCOUNT_TRAN_MUST_BE_SAME_AS_BANK.', 13, 1)
    end

    update @TempTbl set ID = newid() where (ID is null) or (ID = '00000000-0000-0000-0000-000000000000');
    update @TempTbl set GLTRANSACTIONID = newid() where (GLTRANSACTIONID is null) or (GLTRANSACTIONID = '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 from the GLTRANSACTION table

    delete from dbo.GLTRANSACTION where SYSTEMDISTRIBUTION = 0 and ID in
      (select D.GLTRANSACTIONID from dbo.BANKACCOUNTTRANSACTIONGLDISTRIBUTION D where D.BANKACCOUNTTRANSACTIONID = @BANKACCOUNTTRANSACTIONID
       EXCEPT select T.GLTRANSACTIONID from @TempTbl T);

    select @e=@@error;

    -- reset CONTEXT_INFO to previous value

    if not @contextCache is null
      set CONTEXT_INFO @contextCache;

    if @e <> 0
      return 2;

    -- update the items that exist in the XML table and the db

    /* kwb Change to ANSI syntax
    update dbo.BANKACCOUNTTRANSACTIONGLDISTRIBUTION set
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ACCOUNT = T.ACCOUNT,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.AMOUNT = T.AMOUNT,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.PROJECT = T.PROJECT,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.REFERENCE = T.REFERENCE,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.TRANSACTIONTYPECODE = T.TRANSACTIONTYPECODE,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ORGANIZATIONAMOUNT = T.ORGANIZATIONAMOUNT,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.BASECURRENCYID = T.BASECURRENCYID,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.TRANSACTIONAMOUNT = T.TRANSACTIONAMOUNT,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.TRANSACTIONCURRENCYID = T.TRANSACTIONCURRENCYID,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.BASEEXCHANGERATEID = T.BASEEXCHANGERATEID,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ORGANIZATIONEXCHANGERATEID = T.ORGANIZATIONEXCHANGERATEID,
      --BANKACCOUNTTRANSACTIONGLDISTRIBUTION.GLTRANSACTIONID = T.GLTRANSACTIONID,    
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.CHANGEDBYID = @CHANGEAGENTID,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.DATECHANGED = @CHANGEDATE
    from dbo.BANKACCOUNTTRANSACTIONGLDISTRIBUTION
    inner join @TempTbl T on BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID = T.ID

    update dbo.GLTRANSACTION set
      GLTRANSACTION.ACCOUNT = T.ACCOUNT,
      GLTRANSACTION.GLACCOUNTID = T.GLACCOUNTID,
      GLTRANSACTION.AMOUNT = T.AMOUNT,
      GLTRANSACTION.PROJECT = T.PROJECT,
      GLTRANSACTION.REFERENCE = T.REFERENCE,
      GLTRANSACTION.TRANSACTIONTYPECODE = T.TRANSACTIONTYPECODE,
      GLTRANSACTION.ORGANIZATIONAMOUNT = T.ORGANIZATIONAMOUNT,
      GLTRANSACTION.BASECURRENCYID = T.BASECURRENCYID,
      GLTRANSACTION.TRANSACTIONAMOUNT = T.TRANSACTIONAMOUNT,
      GLTRANSACTION.TRANSACTIONCURRENCYID = T.TRANSACTIONCURRENCYID,
      GLTRANSACTION.BASEEXCHANGERATEID = T.BASEEXCHANGERATEID,
      GLTRANSACTION.ORGANIZATIONEXCHANGERATEID = T.ORGANIZATIONEXCHANGERATEID,
      GLTRANSACTION.CHANGEDBYID = @CHANGEAGENTID,
      GLTRANSACTION.DATECHANGED = @CHANGEDATE
    from dbo.GLTRANSACTION
    inner join @TempTbl T on GLTRANSACTION.ID = T.GLTRANSACTIONID
    */
    update dbo.BANKACCOUNTTRANSACTIONGLDISTRIBUTION
    set BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ACCOUNT = (select ACCOUNT from @TempTbl where ID = BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID),
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.AMOUNT = (select AMOUNT from @TempTbl where ID = BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID),
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.PROJECT = (select PROJECT from @TempTbl where ID = BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID),
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.REFERENCE = (select REFERENCE from @TempTbl where ID = BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID),
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.TRANSACTIONTYPECODE = (select TRANSACTIONTYPECODE from @TempTbl where ID = BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID),
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ORGANIZATIONAMOUNT = (select ORGANIZATIONAMOUNT from @TempTbl where ID = BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID),
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.BASECURRENCYID = (select BASECURRENCYID from @TempTbl where ID = BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID),
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.TRANSACTIONAMOUNT = (select TRANSACTIONAMOUNT from @TempTbl where ID = BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID),
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.TRANSACTIONCURRENCYID = (select TRANSACTIONCURRENCYID from @TempTbl where ID = BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID),
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.BASEEXCHANGERATEID = (select BASEEXCHANGERATEID from @TempTbl where ID = BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID),
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ORGANIZATIONEXCHANGERATEID = (select ORGANIZATIONEXCHANGERATEID from @TempTbl where ID = BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID),
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.CHANGEDBYID = @CHANGEAGENTID,
      BANKACCOUNTTRANSACTIONGLDISTRIBUTION.DATECHANGED = @CHANGEDATE
     where BANKACCOUNTTRANSACTIONGLDISTRIBUTION.ID in (select ID from @TempTbl)

    update dbo.GLTRANSACTION set
      GLTRANSACTION.ACCOUNT = (select ACCOUNT from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.GLACCOUNTID = (select GLACCOUNTID from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.AMOUNT = (select AMOUNT from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.PROJECT = (select PROJECT from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.REFERENCE = (select REFERENCE from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.TRANSACTIONTYPECODE = (select TRANSACTIONTYPECODE from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.ORGANIZATIONAMOUNT = (select ORGANIZATIONAMOUNT from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.BASECURRENCYID = (select BASECURRENCYID from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.TRANSACTIONAMOUNT = (select TRANSACTIONAMOUNT from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.TRANSACTIONCURRENCYID = (select TRANSACTIONCURRENCYID from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.BASEEXCHANGERATEID = (select BASEEXCHANGERATEID from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.ORGANIZATIONEXCHANGERATEID = (select ORGANIZATIONEXCHANGERATEID from @TempTbl where GLTransactionID = GLTRANSACTION.ID),
      GLTRANSACTION.CHANGEDBYID = @CHANGEAGENTID,
      GLTRANSACTION.DATECHANGED = @CHANGEDATE
      where ID in (select GLTRANSACTIONID from @TempTbl)

    if @@Error <> 0
      return 3;

    --insert new rows

    insert into dbo.GLTRANSACTION
    (
     ID, 
     TRANSACTIONTYPECODE, 
     ACCOUNT, 
     GLACCOUNTID, 
     AMOUNT, 
     PROJECT, 
     REFERENCE, 
     POSTDATE, 
     JOURNAL, 
     ORGANIZATIONAMOUNT,
     BASECURRENCYID,
     TRANSACTIONAMOUNT,
     TRANSACTIONCURRENCYID,
     BASEEXCHANGERATEID,
     ORGANIZATIONEXCHANGERATEID,
     ADDEDBYID, 
     CHANGEDBYID, 
     DATEADDED, 
     DATECHANGED
    )
    select
      GLTRANSACTIONID,
      TRANSACTIONTYPECODE,
      ACCOUNT,
      GLACCOUNTID,
      AMOUNT,
      PROJECT,
      REFERENCE,
      @POSTDATE,
      'Blackbaud Enterprise',
      ORGANIZATIONAMOUNT,
      BASECURRENCYID,
      TRANSACTIONAMOUNT,
      TRANSACTIONCURRENCYID,
      BASEEXCHANGERATEID,
      ORGANIZATIONEXCHANGERATEID,
      @CHANGEAGENTID,
      @CHANGEAGENTID,
      @CHANGEDATE,
      @CHANGEDATE
    from @TempTbl temp
    where not exists (select ID from dbo.GLTRANSACTION GL where GL.ID = temp.GLTRANSACTIONID);

    insert into dbo.BANKACCOUNTTRANSACTIONGLDISTRIBUTION
      (
       ID, 
       GLTRANSACTIONID, 
       BANKACCOUNTTRANSACTIONID, 
       PROJECT, 
       REFERENCE, 
       AMOUNT, 
       ACCOUNT, 
       TRANSACTIONTYPECODE, 
       ORGANIZATIONAMOUNT,
       BASECURRENCYID,
       TRANSACTIONAMOUNT,
       TRANSACTIONCURRENCYID,
       BASEEXCHANGERATEID,
       ORGANIZATIONEXCHANGERATEID,
       ADDEDBYID, 
       CHANGEDBYID, 
       DATEADDED, 
       DATECHANGED
      )
    select
      ID,
      GLTRANSACTIONID,
      @BANKACCOUNTTRANSACTIONID,
      PROJECT,
      REFERENCE,
      AMOUNT,
      ACCOUNT,
      TRANSACTIONTYPECODE,
      ORGANIZATIONAMOUNT,
      BASECURRENCYID,
      TRANSACTIONAMOUNT,
      TRANSACTIONCURRENCYID,
      BASEEXCHANGERATEID,
      ORGANIZATIONEXCHANGERATEID,
      @CHANGEAGENTID,
      @CHANGEAGENTID,
      @CHANGEDATE,
      @CHANGEDATE
    from @TempTbl temp
    where not exists (select ID from dbo.BANKACCOUNTTRANSACTIONGLDISTRIBUTION D where D.ID = temp.ID);

    if @@Error <> 0
      return 4;

    end try
    begin catch
        exec dbo.USP_RAISE_ERROR
        return 1
    end catch

  return 0;