USP_SAVE_UNREALIZEDGAINLOSSGLDISTRIBUTION

Saves unrealized gain/loss GL distributions for a revenue record.

Parameters

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

Definition

Copy


    CREATE procedure dbo.USP_SAVE_UNREALIZEDGAINLOSSGLDISTRIBUTION
    (
        @REVENUEID uniqueidentifier,
        @CHANGEAGENTID uniqueidentifier = null,
        @CHANGEDATE datetime = null,
        @POSTDATE datetime = null
    )
    as
        set nocount on;

        if exists(select 1 from dbo.REVENUECOMMITMENTREVALUATION where REVENUEID = @REVENUEID)
        begin

            if @CHANGEAGENTID is null
                exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

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

            if @POSTDATE is null
                set @POSTDATE = @CHANGEDATE;

            declare @CUSTOMIZED integer = 0;
            exec  @CUSTOMIZED = dbo.USP_SAVE_UNREALIZEDGAINLOSSGLDISTRIBUTION_CUSTOMIZE @REVENUEID,@CHANGEAGENTID,@CHANGEDATE,@POSTDATE

            if @CUSTOMIZED = 0
            begin

                declare @JOURNAL nvarchar(50);
                set @JOURNAL = 'Blackbaud Enterprise';

                declare @DISTRIBUTIONS table(
                    GLTRANSACTIONID uniqueidentifier,
                    ACCOUNT nvarchar(100),
                    AMOUNT money,
                    PROJECT nvarchar(100),
                    REFERENCE nvarchar(255),
                    TRANSACTIONTYPECODE tinyint,
                    POSTDATE datetime,
                    ACCOUNTID uniqueidentifier,
                    ERRORMESSAGE nvarchar(max),
                    REVENUESPLITID uniqueidentifier,
                    REVENUEGLDISTRIBUTIONID uniqueidentifier,
                    BASECURRENCYID uniqueidentifier,
                    ORGANIZATIONAMOUNT money,
                    SYSTEMDISTRIBUTION bit default 0,
                    MAPPEDVALUES xml            
                );

                insert into @DISTRIBUTIONS
                (
                    GLTRANSACTIONID, 
                    ACCOUNT, 
                    AMOUNT, 
                    PROJECT, 
                    REFERENCE, 
                    TRANSACTIONTYPECODE, 
                    POSTDATE, 
                    ACCOUNTID,
                    ERRORMESSAGE,
                    REVENUESPLITID,
                    REVENUEGLDISTRIBUTIONID,
                    BASECURRENCYID, 
                    ORGANIZATIONAMOUNT, 
                    SYSTEMDISTRIBUTION,
                    MAPPEDVALUES
                )
                select 
                    newid(),
                    GAINLOSSDISTRIBUTIONS.ACCOUNTSTRING,
                    GAINLOSSDISTRIBUTIONS.AMOUNT,
                    GAINLOSSDISTRIBUTIONS.PROJECT,
                    GAINLOSSDISTRIBUTIONS.REFERENCE, 
                    GAINLOSSDISTRIBUTIONS.TRANSACTIONTYPECODE,
                    GAINLOSSDISTRIBUTIONS.POSTDATE,
                    GAINLOSSDISTRIBUTIONS.ACCOUNTID,
                    GAINLOSSDISTRIBUTIONS.ERRORMESSAGE,
                    GAINLOSSDISTRIBUTIONS.REVENUESPLITID,
                    newid(),
                    GAINLOSSDISTRIBUTIONS.BASECURRENCYID,
                    GAINLOSSDISTRIBUTIONS.ORGANIZATIONAMOUNT,
                    1,
                    GAINLOSSDISTRIBUTIONS.MAPPEDVALUES
                from 
                    dbo.UFN_REVENUE_GENERATEUNREALIZEDGAINLOSSGLDISTRIBUTION(@REVENUEID,@POSTDATE) as GAINLOSSDISTRIBUTIONS 
                where 
                    not exists(
                        select ID 
                        from dbo.UNREALIZEDGAINLOSSGLDISTRIBUTION with (nolock) 
                        where UNREALIZEDGAINLOSSGLDISTRIBUTION.REVENUEID = GAINLOSSDISTRIBUTIONS.REVENUEID 
                            and UNREALIZEDGAINLOSSGLDISTRIBUTION.OUTDATED = 0
                    )
                    and GAINLOSSDISTRIBUTIONS.POSTSTATUSCODE > 0

                declare @ERRORMESSAGE nvarchar(max);
                select top 1 @ERRORMESSAGE = ERRORMESSAGE from @DISTRIBUTIONS where nullif(ERRORMESSAGE,'') is not null and ACCOUNTID is null

                if @ERRORMESSAGE <> ''
                begin
                    raiserror('%s', 13, 1, @ERRORMESSAGE);
                    return 1;
                end
                else
                    --Trap the error when a holding account exists so we can show it to the user later.

                    insert into dbo.GLACCOUNTMAPPINGERROR (
                        [TRANSACTIONID]
                        ,[TRANSACTIONTYPECODE]
                        ,[ERRORMESSAGE]
                        ,[MAPPEDVALUES]
                        ,[ADDEDBYID]
                        ,[CHANGEDBYID]
                        ,[DATEADDED]
                        ,[DATECHANGED])
                    select distinct
                        @REVENUEID
                        ,(select TRANSACTIONTYPECODE from dbo.REVENUE where ID = @REVENUEID)
                        ,D.ERRORMESSAGE
                        ,convert(varchar(max),D.MAPPEDVALUES)
                        ,@CHANGEAGENTID
                        ,@CHANGEAGENTID
                        ,@CHANGEDATE
                        ,@CHANGEDATE
                    from @DISTRIBUTIONS
                    where nullif(D.ERRORMESSAGE,'') is not null 
                        and D.ERRORMESSAGE not in (select ERRORMESSAGE from dbo.GLACCOUNTMAPPINGERROR where TRANSACTIONID = @REVENUEID and DELETED = 0)

                --Bug 70136 - Need adjustment post status code to determine if date should be checked. Will be null if DNP.

                --Check to see if there is an adjustment, if so, use adjustment poststatuscode

                declare @ADJUSTMENTPOSTSTATUSCODE tinyint
                -- Bug 82359 ~ No need to check post date if Revenue record is Do Not Post unless Adjustment needs posting.

                declare @DONOTPOST tinyint
                select @DONOTPOST = DONOTPOST from REVENUE with (nolock) where ID = @REVENUEID
                if @DONOTPOST = 1
                    set @ADJUSTMENTPOSTSTATUSCODE = 2
                else
                    set @ADJUSTMENTPOSTSTATUSCODE = 1        

                if exists (select ID from dbo.UNREALIZEDGAINLOSSADJUSTMENT with (nolock) where REVENUEID = @REVENUEID)
                begin
                    select @ADJUSTMENTPOSTSTATUSCODE = POSTSTATUSCODE from dbo.UNREALIZEDGAINLOSSADJUSTMENT with (nolock) where REVENUEID = @REVENUEID
                end

                if exists(select * from @DISTRIBUTIONS) and @ADJUSTMENTPOSTSTATUSCODE <> 2
                    set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE((select top 1 POSTDATE from @DISTRIBUTIONS));

                if @ERRORMESSAGE <> ''
                begin
                    raiserror(@ERRORMESSAGE, 13, 1);          
                    return 1;
                end

              declare @Cache table (HashCode uniqueidentifier, ErrorMessage nvarchar(max), GLAccountID uniqueidentifier, TransactionTypeCode tinyint, ErrorNumber tinyint, MappedValues nvarchar(max), PDAccountSystemID uniqueidentifier)
              insert into @Cache(HashCode, ErrorMessage, GLAccountID, TransactionTypeCode, ErrorNumber, MappedValues, PDAccountSystemID)
              select
                  v.MD5HASHCODE
                ,d.ERRORMESSAGE
                ,d.ACCOUNTID
                ,d.TRANSACTIONTYPECODE
                ,v.ERRORCODE
                ,v.MAPPEDVALUES
                ,v.PDACCOUNTSYSTEMID
              from @DISTRIBUTIONS d
              cross apply dbo.UFN_PDACCOUNTLOOKUPCACHE_PARSE_MAPPEDVALUES(MAPPEDVALUES) v
              where v.MD5HASHCODE is not null

              insert into dbo.PDACCOUNTLOOKUPCACHE (MD5HASHCODE, ERRORMESSAGE, GLACCOUNTID, TRANSACTIONTYPECODE, ERRORNUMBER, MAPPEDVALUES, PDACCOUNTSYSTEMID)
              select HashCode, ErrorMessage, GLAccountID, TransactionTypeCode, ErrorNumber, MappedValues, PDAccountSystemID
              from @Cache tt
              where not exists (select MD5HASHCODE from dbo.PDACCOUNTLOOKUPCACHE with (NOLOCK) where MD5HASHCODE = tt.HashCode and TRANSACTIONTYPECODE = tt.TransactionTypeCode and MAPPEDVALUES = tt.MappedValues)

                -- Insert rows in GLTRANSACTION table

                insert into dbo.GLTRANSACTION
                (
                    ID, 
                    TRANSACTIONTYPECODE, 
                    ACCOUNT, 
                    AMOUNT, 
                    PROJECT, 
                    REFERENCE, 
                    POSTDATE, 
                    JOURNAL, 
                    ADDEDBYID, 
                    CHANGEDBYID, 
                    DATEADDED, 
                    DATECHANGED,
                    GLACCOUNTID, 
                    POSTSTATUSCODE,
                    BASECURRENCYID, 
                    ORGANIZATIONAMOUNT, 
                    SYSTEMDISTRIBUTION
                )
                select
                    GLTRANSACTIONID,
                    TRANSACTIONTYPECODE,
                    ACCOUNT,
                    AMOUNT,
                    PROJECT,
                    REFERENCE,
                    POSTDATE,
                    @JOURNAL,
                    @CHANGEAGENTID,
                    @CHANGEAGENTID,
                    @CHANGEDATE,
                    @CHANGEDATE,
                    ACCOUNTID,
                    @ADJUSTMENTPOSTSTATUSCODE,
                    BASECURRENCYID,
                    ORGANIZATIONAMOUNT,
                    SYSTEMDISTRIBUTION
                from 
                    @DISTRIBUTIONS;

                -- Insert rows in UNREALIZEDGAINLOSSGLDISTRIBUTION table

                insert into dbo.UNREALIZEDGAINLOSSGLDISTRIBUTION
                    (ID, REVENUEID, PROJECT, REFERENCE, AMOUNT, ACCOUNT, TRANSACTIONTYPECODE, 
                        GLTRANSACTIONID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, BASECURRENCYID, 
                        ORGANIZATIONAMOUNT)
                select
                    REVENUEGLDISTRIBUTIONID,
                    @REVENUEID,
                    PROJECT,
                    REFERENCE, 
                    AMOUNT,
                    ACCOUNT,
                    TRANSACTIONTYPECODE,
                    GLTRANSACTIONID,
                    @CHANGEAGENTID,
                    @CHANGEAGENTID,
                    @CHANGEDATE,
                    @CHANGEDATE,
                    BASECURRENCYID,
                    ORGANIZATIONAMOUNT
                from 
                    @DISTRIBUTIONS;    
            end
        end