USP_GETTREASURY_GAINLOSSDISTRIBUTIONS

Get the gain loss distribution based on the treasury mapping

Parameters

Parameter Parameter Type Mode Description
@BASEAMOUNT1 money IN
@BASEAMOUNT2 money IN
@ORGANIZATIONAMOUNT1 money IN
@ORGANIZATIONAMOUNT2 money IN
@TRANSACTIONCURRENCYID uniqueidentifier IN
@PDACCOUNTSYSTEMID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_GETTREASURY_GAINLOSSDISTRIBUTIONS
(
  @BASEAMOUNT1 money
  ,@BASEAMOUNT2 money
  ,@ORGANIZATIONAMOUNT1 money
  ,@ORGANIZATIONAMOUNT2 money
  ,@TRANSACTIONCURRENCYID uniqueidentifier
  ,@PDACCOUNTSYSTEMID uniqueidentifier
)
as 
begin
    declare @DISTRIBUTION TABLE
    (
        GLTRANSACTIONID uniqueidentifier
        ,ACCOUNT nvarchar(100)
        ,GLACCOUNTID uniqueidentifier
        ,TRANSACTIONTYPECODE tinyint
        ,BASEAMOUNT money
        ,ORGANIZATIONAMOUNT money
        ,REFERENCE nvarchar(100)
    )

    if @BASEAMOUNT1 <> @BASEAMOUNT2
    begin
        declare @BASEGLACCOUNTID uniqueidentifier;
        declare @BASEGLACCOUNT nvarchar(100);
        declare @BASEPDACCOUNTSEGMENTVALUEID uniqueidentifier;
        select @BASEPDACCOUNTSEGMENTVALUEID = M.CREDITPDACCOUNTSEGMENTVALUEID, @BASEGLACCOUNTID = M.CREDITGLACCOUNTID
        from dbo.PDACCOUNTCODEMAPPING M
        inner join dbo.PDACCOUNTCODEMAPPINGSUBTYPE ST on M.ID = ST.PDACCOUNTCODEMAPPINGID
        where M.OFFICEID = 16 
            and (M.PAYMENTMETHOD & 
                CASE
                    WHEN @BASEAMOUNT1 < @BASEAMOUNT2 THEN 1
                    WHEN @BASEAMOUNT1 > @BASEAMOUNT2 THEN 2
                END) > 0
            and (ST.SUBTYPEID = '99999999-9999-9999-9999-999999999999'
                or ST.SUBTYPEID = @TRANSACTIONCURRENCYID)

        declare @GAINLOSS nvarchar(100);
        select @GAINLOSS = TYPENAME from dbo.PDACCOUNTCODEMAPPAYMENTMETHODTYPE where OFFICEID = 16 and NAMEID = 
            CASE
                WHEN @BASEAMOUNT1 < @BASEAMOUNT2 THEN 1
                WHEN @BASEAMOUNT1 > @BASEAMOUNT2 THEN 2
            END

        if @BASEGLACCOUNTID is null and @BASEPDACCOUNTSEGMENTVALUEID is null
        begin
            declare @CURRENCYNAME nvarchar(100);
            declare @OFFICENAME nvarchar(100);
            select @OFFICENAME = NAME from dbo.PDACCOUNTCODEMAPOFFICE where OFFICEID = 16;
            select @CURRENCYNAME = NAME from dbo.CURRENCY where ID = @TRANSACTIONCURRENCYID;
            raiserror('An account code has not been defined for this mapping of Office: %s, %s, Currency: %s', 13, 1, @OFFICENAME, @GAINLOSS, @CURRENCYNAME)
        end
        if @BASEGLACCOUNTID is null
        begin
            select @BASEGLACCOUNT = dbo.UFN_GLACCOUNT_GETDEFAULTACCOUNTSTRING_BYACCOUNTSYSTEM(@BASEPDACCOUNTSEGMENTVALUEID,@PDACCOUNTSYSTEMID);
            select @BASEGLACCOUNTID = ID from GLACCOUNT where ACCOUNTNUMBER = @BASEGLACCOUNT;
            if @BASEGLACCOUNTID is null
                raiserror('The account %s does not exist. The action could not be completed. ', 13, 1, @BASEGLACCOUNT);
        end
        else
            select @BASEGLACCOUNT = ACCOUNTNUMBER from GLACCOUNT where ID = @BASEGLACCOUNTID;

        insert into @DISTRIBUTION
            (GLTRANSACTIONID
            ,ACCOUNT
            ,GLACCOUNTID 
            ,TRANSACTIONTYPECODE 
            ,BASEAMOUNT 
            ,ORGANIZATIONAMOUNT
            ,REFERENCE)
        values
            (NEWID()
            ,@BASEGLACCOUNT
            ,@BASEGLACCOUNTID
            ,CASE
                WHEN @BASEAMOUNT1 < @BASEAMOUNT2 THEN 0
                WHEN @BASEAMOUNT1 > @BASEAMOUNT2 THEN 1
            END
            ,ABS(@BASEAMOUNT1 - @BASEAMOUNT2)
            ,0
            ,@GAINLOSS)
    end
    if @ORGANIZATIONAMOUNT1 <> @ORGANIZATIONAMOUNT2
    begin
        declare @ORGGLACCOUNTID uniqueidentifier;
        declare @ORGGLACCOUNT nvarchar(100);
        declare @ORGPDACCOUNTSEGMENTVALUEID uniqueidentifier;
        select @ORGPDACCOUNTSEGMENTVALUEID = M.CREDITPDACCOUNTSEGMENTVALUEID, @ORGGLACCOUNTID = M.CREDITGLACCOUNTID
        from dbo.PDACCOUNTCODEMAPPING M
        inner join dbo.PDACCOUNTCODEMAPPINGSUBTYPE ST on M.ID = ST.PDACCOUNTCODEMAPPINGID
        where M.OFFICEID = 16 
            and (M.PAYMENTMETHOD & 
                CASE
                    WHEN @ORGANIZATIONAMOUNT1 < @ORGANIZATIONAMOUNT2 THEN 1
                    WHEN @ORGANIZATIONAMOUNT1 > @ORGANIZATIONAMOUNT2 THEN 2
                END) > 0
            and (ST.SUBTYPEID = '99999999-9999-9999-9999-999999999999'
                or ST.SUBTYPEID = @TRANSACTIONCURRENCYID)

        select @GAINLOSS = TYPENAME from dbo.PDACCOUNTCODEMAPPAYMENTMETHODTYPE where OFFICEID = 16 and NAMEID = 
            CASE
                WHEN @ORGANIZATIONAMOUNT1 < @ORGANIZATIONAMOUNT2 THEN 1
                WHEN @ORGANIZATIONAMOUNT1 > @ORGANIZATIONAMOUNT2 THEN 2
            END
        if @ORGGLACCOUNTID is null and @ORGPDACCOUNTSEGMENTVALUEID is null
        begin
            select @OFFICENAME = NAME from dbo.PDACCOUNTCODEMAPOFFICE where OFFICEID = 16;
            select @CURRENCYNAME = NAME from dbo.CURRENCY where ID = @TRANSACTIONCURRENCYID;
            raiserror('An account code has not been defined for this mapping of Office: %s, %s, Currency: %s', 13, 1, @OFFICENAME, @GAINLOSS, @CURRENCYNAME)
        end
        if @ORGGLACCOUNTID is null
        begin
            select @ORGGLACCOUNT = dbo.UFN_GLACCOUNT_GETDEFAULTACCOUNTSTRING_BYACCOUNTSYSTEM(@ORGPDACCOUNTSEGMENTVALUEID,@PDACCOUNTSYSTEMID);
            select @ORGGLACCOUNTID = ID from GLACCOUNT where ACCOUNTNUMBER = @ORGGLACCOUNT;
            if @ORGGLACCOUNTID is null
                raiserror('The account %s does not exist. The action could not be completed. ', 13, 1, @ORGGLACCOUNT);
        end
        else
            select @ORGGLACCOUNT = ACCOUNTNUMBER from GLACCOUNT where ID = @ORGGLACCOUNTID;

        declare @TRANSACTIONTYPECODE tinyint;
        set @TRANSACTIONTYPECODE = 
            CASE
                WHEN @ORGANIZATIONAMOUNT1 < @ORGANIZATIONAMOUNT2 THEN 0
                WHEN @ORGANIZATIONAMOUNT1 > @ORGANIZATIONAMOUNT2 THEN 1
            END 

        if exists(select GLTRANSACTIONID from @DISTRIBUTION where GLACCOUNTID = @ORGGLACCOUNTID and TRANSACTIONTYPECODE = @TRANSACTIONTYPECODE)
            update @DISTRIBUTION
                set ORGANIZATIONAMOUNT = ABS(@ORGANIZATIONAMOUNT1 - @ORGANIZATIONAMOUNT2)
            where GLACCOUNTID = @ORGGLACCOUNTID and TRANSACTIONTYPECODE = @TRANSACTIONTYPECODE;
        else
            insert into @DISTRIBUTION
                (GLTRANSACTIONID
                ,ACCOUNT
                ,GLACCOUNTID 
                ,TRANSACTIONTYPECODE 
                ,BASEAMOUNT 
                ,ORGANIZATIONAMOUNT
                ,REFERENCE)
            values
                (NEWID()
                ,@ORGGLACCOUNT
                ,@ORGGLACCOUNTID
                ,@TRANSACTIONTYPECODE
                ,0
                ,ABS(@ORGANIZATIONAMOUNT1 - @ORGANIZATIONAMOUNT2)
                ,@GAINLOSS)
    end

    select GLTRANSACTIONID, ACCOUNT, GLACCOUNTID, TRANSACTIONTYPECODE, BASEAMOUNT, ORGANIZATIONAMOUNT, REFERENCE
    from @DISTRIBUTION
end