USP_SALESORDER_CREATEDISCOUNTGLDISTRIBUTION

Generates the GL distribution for a discount on a sales order.

Parameters

Parameter Parameter Type Mode Description
@CREDITID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN

Definition

Copy


        CREATE procedure [dbo].[USP_SALESORDER_CREATEDISCOUNTGLDISTRIBUTION]
            (@CREDITID uniqueidentifier,
             @CHANGEAGENTID uniqueidentifier = null,
             @CHANGEDATE datetime = null)
        as
        begin
            set nocount on;

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

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

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

            declare @REFERENCE nvarchar(255);
            declare @CURRENCYID uniqueidentifier;
            select top 1
                @REFERENCE = 'Discount-Order-' + convert(nvarchar(50), SALESORDER.SEQUENCEID)
                ,@CURRENCYID = FT.TRANSACTIONCURRENCYID
            from dbo.CREDITITEM_EXT EXT
            inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = EXT.ID
            inner join dbo.FINANCIALTRANSACTION FT on FT.ID = LI.FINANCIALTRANSACTIONID
            cross apply (  -- Keeps from scanning the SALESORDER table

                select SALESORDER.SEQUENCEID
                from dbo.SALESORDER
                where SALESORDER.REVENUEID = FT.ID

                union
                select SALESORDER.SEQUENCEID
                from dbo.SALESORDER
                where SALESORDER.ID = EXT.SALESORDERID
            ) as SALESORDER
            where EXT.CREDITID = @CREDITID and LI.TYPECODE = 5;

            declare @DISTRIBUTIONS table(
                CREDITITEMID uniqueidentifier,
                REVENUEID uniqueidentifier,
                GLTRANSACTIONID uniqueidentifier,
                ACCOUNT nvarchar(100),
                AMOUNT money,
                PROJECT nvarchar(100),
                TRANSACTIONTYPECODE tinyint,
                POSTDATE datetime,
                GLPAYMENTMETHODREVENUETYPEMAPPINGID uniqueidentifier,
                ACCOUNTID uniqueidentifier,
                POSTSTATUSCODE tinyint,
                ERRORMESSAGE nvarchar(max),
                MAPPEDVALUES xml
            );

            -- Generate GL distributions for the discount record.

            insert into @DISTRIBUTIONS(GLTRANSACTIONID, CREDITITEMID, REVENUEID, ACCOUNT, AMOUNT, PROJECT, TRANSACTIONTYPECODE, POSTDATE, GLPAYMENTMETHODREVENUETYPEMAPPINGID,ACCOUNTID,POSTSTATUSCODE,ERRORMESSAGE,MAPPEDVALUES)
            select 
                newid(),
                DISCOUNTDISTRIBUTIONS.CREDITITEMID,
                DISCOUNTDISTRIBUTIONS.REVENUEID,
                DISCOUNTDISTRIBUTIONS.ACCOUNTSTRING,
                DISCOUNTDISTRIBUTIONS.AMOUNT,
                DISCOUNTDISTRIBUTIONS.PROJECT,
                DISCOUNTDISTRIBUTIONS.TRANSACTIONTYPECODE,
                DISCOUNTDISTRIBUTIONS.POSTDATE,
                DISCOUNTDISTRIBUTIONS.GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                DISCOUNTDISTRIBUTIONS.ACCOUNTID,
                DISCOUNTDISTRIBUTIONS.POSTSTATUSCODE,
                DISCOUNTDISTRIBUTIONS.ERRORMESSAGE,
                DISCOUNTDISTRIBUTIONS.MAPPEDVALUES
            from 
                dbo.UFN_CREDIT_GENERATEDISCOUNTGLDISTRIBUTION(@CREDITID) as DISCOUNTDISTRIBUTIONS
            where not exists
                (select ID from dbo.JOURNALENTRY_EXT where JOURNALENTRY_EXT.CREDITITEMID = DISCOUNTDISTRIBUTIONS.CREDITITEMID and JOURNALENTRY_EXT.OUTDATED = 0)

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

            if nullif(@ERRORMESSAGE,'') is not null
                raiserror('%s', 13, 1, @ERRORMESSAGE);
            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
                    isnull(S.ID, R.ID)
                    ,R.TYPECODE
                    ,D.ERRORMESSAGE
                    ,convert(varchar(max),D.MAPPEDVALUES)
                    ,@CHANGEAGENTID
                    ,@CHANGEAGENTID
                    ,@CHANGEDATE
                    ,@CHANGEDATE
                from @DISTRIBUTIONS
                inner join dbo.FINANCIALTRANSACTION R on R.ID = D.REVENUEID
                left join dbo.SALESORDER S on S.REVENUEID = R.ID
                where nullif(D.ERRORMESSAGE,'') is not null 
                    and D.ERRORMESSAGE not in (select ERRORMESSAGE from dbo.GLACCOUNTMAPPINGERROR where TRANSACTIONID = isnull(S.ID, R.ID) and DELETED = 0)                        

            delete from @DISTRIBUTIONS where POSTSTATUSCODE <> 1

            if @@rowcount > 0      
                set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE((select top 1 POSTDATE from @DISTRIBUTIONS));

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

      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 into dbo.JOURNALENTRY (ID, FINANCIALTRANSACTIONLINEITEMID, TRANSACTIONTYPECODE, BASEAMOUNT, TRANSACTIONAMOUNT, ORGAMOUNT, POSTDATE, COMMENT, GLACCOUNTID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED,TRANSACTIONCURRENCYID)
select DIST.GLTRANSACTIONID, DIST.CREDITITEMID, DIST.TRANSACTIONTYPECODE, DIST.AMOUNT, DIST.AMOUNT, DIST.AMOUNT, DIST.POSTDATE, @REFERENCE, DIST.ACCOUNTID, @CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE, @CURRENCYID
from @DISTRIBUTIONS as DIST 

insert into dbo.JOURNALENTRY_EXT (ID, TABLENAMECODE, JOURNAL, CREDITITEMID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select DIST.GLTRANSACTIONID, 6, @JOURNAL, DIST.CREDITITEMID, @CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE
from @DISTRIBUTIONS as DIST

        end