USP_SALESORDER_CREATETOPDOWNDISTRIBUTIONS

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@SALESORDERID uniqueidentifier IN
@PDACCOUNTSYSTEMID uniqueidentifier IN
@ALLOWGLDISTRIBUTIONS bit IN
@CURRENTDATE datetime IN
@CHANGEAGENTID uniqueidentifier IN
@POSTPAYMENTID uniqueidentifier IN
@POSTPAYMENTAMOUNT money IN

Definition

Copy


CREATE procedure dbo.USP_SALESORDER_CREATETOPDOWNDISTRIBUTIONS
(
    @REVENUEID uniqueidentifier,
    @SALESORDERID uniqueidentifier,
    @PDACCOUNTSYSTEMID uniqueidentifier,
    @ALLOWGLDISTRIBUTIONS bit,
    @CURRENTDATE datetime,
    @CHANGEAGENTID uniqueidentifier,
    @POSTPAYMENTID uniqueidentifier = null, -- Only happens for payments for completed group sales orders

    @POSTPAYMENTAMOUNT money = null -- ditto with above 

)
as
    set nocount on;

    declare @POSTSTATUSCODE tinyint = 3;  -- Do not post

    declare @POSTDATE date = null;
    declare @ISVISIBLE bit = 0;

    declare @SALESORDERLINEITEMS table 
    (
        ORDERLINEITEMID uniqueidentifier, 
        ISPAID bit
        ITEMAMOUNTREMAINING money, 
        TYPECODE tinyint
        FINANCIALTRANSACTIONID uniqueidentifier
    )
    insert into @SALESORDERLINEITEMS
    select
        FINANCIALTRANSACTIONLINEITEM.ID as ORDERLINEITEMID,
        0 as ISPAID,
        FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT,
        REVENUESPLIT_EXT.TYPECODE,
        FINANCIALTRANSACTIONID
    from
        dbo.FINANCIALTRANSACTIONLINEITEM
    inner join 
        dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
    where
        FINANCIALTRANSACTIONID = @REVENUEID
        and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
        and REVENUESPLIT_EXT.TYPECODE in (1,2,5,6,7,10,11,14,16)    --1: event registration, 2: membership, 5: ticket, 6: fee, 7: tax, 10: supply resources, 11: staff resources, 14: facility, 16: merchandise    

    order by 
        REVENUESPLIT_EXT.TYPECODE desc;

    with ITEMDISCOUNT_CTE as
    (
        select
            ORDERLINEITEMID as ORDERLINEITEMID,
            ORDERLINEITEM.ITEMAMOUNTREMAINING - sum(isnull(ITEMDISCOUNT.BASEAMOUNT, 0)) REMAINING,
            ORDERLINEITEM.ITEMAMOUNTREMAINING TOTAL
        from
            @SALESORDERLINEITEMS ORDERLINEITEM
        left join
            dbo.FINANCIALTRANSACTIONLINEITEM ITEMDISCOUNT on ITEMDISCOUNT.SOURCELINEITEMID = ORDERLINEITEMID
        where
            ITEMDISCOUNT.TYPECODE = 5 --ONLY discounts

        group by 
            ORDERLINEITEMID, ITEMAMOUNTREMAINING
    )
    update @SALESORDERLINEITEMS
    set 
        ISPAID = case when (REMAINING <=0) then 1 else 0 end,
        ITEMAMOUNTREMAINING = REMAINING
    from 
        @SALESORDERLINEITEMS ORDERLINEITEMS
    inner join 
        ITEMDISCOUNT_CTE DISCOUNTS on DISCOUNTS.ORDERLINEITEMID = ORDERLINEITEMS.ORDERLINEITEMID;

    -- Adjust amounts remaining based on other (pre/post)payments

    with OTHERPAYMENT_CTE as
    (
        select
            ORDERLINEITEMID as ORDERLINEITEMID,
            ORDERLINEITEM.ITEMAMOUNTREMAINING - APPLIEDPAYMENTS.AMOUNT as REMAINING
        from
            @SALESORDERLINEITEMS ORDERLINEITEM
        outer apply (
            select
                isnull(sum(PAYMENTLI.BASEAMOUNT), 0) as AMOUNT
            from
                dbo.FINANCIALTRANSACTIONLINEITEM AS PAYMENTLI
            where
                PAYMENTLI.TYPECODE <> 5  -- Discount

                and PAYMENTLI.DELETEDON is null
                -- Editing GL on the GL Distribution tab can cause adjustments

                -- that point these records to the adjustment history line items.

                -- WARNING: this only works if the adjustment doesn't change the line item amounts

                -- which the user currently can't do.

                and (
                    PAYMENTLI.SOURCELINEITEMID = ORDERLINEITEM.ORDERLINEITEMID
                    or PAYMENTLI.SOURCELINEITEMID in (
                        select ADJUSTMENTHISTORYLI.ID
                        from dbo.FINANCIALTRANSACTIONLINEITEM as ADJUSTMENTHISTORYLI
                        where ADJUSTMENTHISTORYLI.REVERSEDLINEITEMID = ORDERLINEITEM.ORDERLINEITEMID
                    )
                )
        ) as APPLIEDPAYMENTS
    )
    update @SALESORDERLINEITEMS
    set 
        ISPAID = case when (REMAINING <=0) then 1 else 0 end,
        ITEMAMOUNTREMAINING = REMAINING
    from 
        @SALESORDERLINEITEMS ORDERLINEITEMS
    inner join 
        OTHERPAYMENT_CTE OTHERPAYMENT on OTHERPAYMENT.ORDERLINEITEMID = ORDERLINEITEMS.ORDERLINEITEMID;


    declare @TRANSACTIONDATE date = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEFROMUTC(getutcdate());

    declare @UNEARNEDLINEITEMID uniqueidentifier;
    declare @UNEARNEDAMOUNT money;

    if @POSTPAYMENTID is not null
    begin
        if @ALLOWGLDISTRIBUTIONS = 1 begin
            set @POSTSTATUSCODE = 1;  -- Not posted

            set @POSTDATE = @TRANSACTIONDATE;
        end

        select
            @UNEARNEDLINEITEMID = FTLI.ID,
            @UNEARNEDAMOUNT = FTLI.TRANSACTIONAMOUNT
        from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
        inner join dbo.REVENUESPLIT_EXT EXT on FTLI.ID = EXT.ID
        where FTLI.FINANCIALTRANSACTIONID = @POSTPAYMENTID
            and EXT.TYPECODE = 19
            and FTLI.POSTSTATUSCODE <> 2
            and DELETEDON is null

        set @ISVISIBLE = 1;

        declare @TOTALREMAINING money;
        select @TOTALREMAINING = coalesce(sum(ITEMAMOUNTREMAINING), 0)
        from @SALESORDERLINEITEMS;

        if @UNEARNEDLINEITEMID is not null
        begin
            if @POSTPAYMENTAMOUNT - @UNEARNEDAMOUNT > @TOTALREMAINING
            begin
                --Increase the value of the UR line item.

                set @UNEARNEDAMOUNT = @POSTPAYMENTAMOUNT - @TOTALREMAINING;

                update dbo.FINANCIALTRANSACTIONLINEITEM
                set TRANSACTIONAMOUNT = @UNEARNEDAMOUNT,
                    BASEAMOUNT = @UNEARNEDAMOUNT,
                    ORGAMOUNT = @UNEARNEDAMOUNT,
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE
                where ID = @UNEARNEDLINEITEMID;
            end
            else if @POSTPAYMENTAMOUNT - @UNEARNEDAMOUNT < @TOTALREMAINING
            begin
                --Decrease the value of the UR line item, if possible.

                --The smallest our UR can be is max(paymentamount - totalremaining, refundedamount, 0)


                --TODO: Revisit. I'm seeing refunds linked to the wrong unearned revenue LI.

                declare @REFUNDEDAMOUNT money = 0;
                select @REFUNDEDAMOUNT = coalesce((
                    select sum(REFUNDLI.TRANSACTIONAMOUNT)
                    from dbo.FINANCIALTRANSACTION FT
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM REFUNDLI on FT.ID = REFUNDLI.FINANCIALTRANSACTIONID
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM PAYMENTLI on REFUNDLI.SOURCELINEITEMID = PAYMENTLI.ID
                    where FT.TYPECODE = 23
                        and PAYMENTLI.FINANCIALTRANSACTIONID = @POSTPAYMENTID
                ), 0);

                declare @TARGETUNEARNEDMOUNT money = @POSTPAYMENTAMOUNT - @TOTALREMAINING;

                if @TARGETUNEARNEDMOUNT < @REFUNDEDAMOUNT
                    set @TARGETUNEARNEDMOUNT = @REFUNDEDAMOUNT;

                if @TARGETUNEARNEDMOUNT < @UNEARNEDAMOUNT
                begin
                    if @TARGETUNEARNEDMOUNT = 0
                    begin
                        update dbo.FINANCIALTRANSACTIONLINEITEM
                        set REVERSEDLINEITEMID = null,
                            CHANGEDBYID = @CHANGEAGENTID,
                            DATECHANGED = @CURRENTDATE
                        where REVERSEDLINEITEMID = @UNEARNEDLINEITEMID;

                        delete from dbo.FINANCIALTRANSACTIONLINEITEM
                        where ID = @UNEARNEDLINEITEMID;

                        set @UNEARNEDLINEITEMID = null;
                    end
                    else begin
                        update dbo.FINANCIALTRANSACTIONLINEITEM
                        set TRANSACTIONAMOUNT = @TARGETUNEARNEDMOUNT,
                            BASEAMOUNT = @TARGETUNEARNEDMOUNT,
                            ORGAMOUNT = @TARGETUNEARNEDMOUNT,
                            CHANGEDBYID = @CHANGEAGENTID,
                            DATECHANGED = @CURRENTDATE
                        where ID = @UNEARNEDLINEITEMID;
                    end
                end
            end
        end
        else if @UNEARNEDLINEITEMID is null and @POSTPAYMENTAMOUNT > @TOTALREMAINING
        begin
            set @UNEARNEDLINEITEMID = newid();
            set @UNEARNEDAMOUNT = @POSTPAYMENTAMOUNT - @TOTALREMAINING;

            insert into dbo.FINANCIALTRANSACTIONLINEITEM 
            (
                ID,
                FINANCIALTRANSACTIONID,
                TYPECODE,
                BASEAMOUNT,
                TRANSACTIONAMOUNT,
                ORGAMOUNT,
                POSTDATE,
                POSTSTATUSCODE,
                SOURCELINEITEMID,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            ) 
            values 
            (
                @UNEARNEDLINEITEMID,
                @POSTPAYMENTID,
                0,  -- Standard

                @UNEARNEDAMOUNT,
                @UNEARNEDAMOUNT,
                @UNEARNEDAMOUNT,
                @POSTDATE,
                @POSTSTATUSCODE,
                null,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            );

            insert into dbo.REVENUESPLIT_EXT
            (
                ID,                     
                APPLICATIONCODE,       
                TYPECODE,              
                DESIGNATIONID, 
                ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED                
            )
            select
                @UNEARNEDLINEITEMID,
                10,  -- Order

                19,  -- Unearned revenue

                null,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE;
        end
    end

    declare @PAYMENTID uniqueidentifier;
    declare @PAYMENTAMOUNT money;
    declare @PAYMENTRUNNINGAMOUNT money;

    --If we have no @POSTPAYMENTID, we only want our cursor to only include payments made before checkin.

    declare @RESERVATIONCOMPLETETIME datetimeoffset = coalesce((
        select STATUSDATEWITHOFFSET
        from dbo.RESERVATIONSTATUSHISTORY
        where RESERVATIONID = @SALESORDERID
            and STATUSCODE = 1        -- Completion date

    ), sysdatetimeoffset())

    declare PAYMENTS_CURSOR cursor local static for
    select
        SALESORDERPAYMENT.PAYMENTID,
        SALESORDERPAYMENT.AMOUNT
            - (
                select isnull(sum(CREDITPAYMENT.AMOUNT), 0)
                from dbo.CREDITPAYMENT
                where CREDITPAYMENT.REVENUEID = SALESORDERPAYMENT.PAYMENTID
            ) as AMOUNT
    from 
        dbo.SALESORDERPAYMENT with (nolock)
    where
        SALESORDERPAYMENT.PAYMENTID = @POSTPAYMENTID  -- For after check in payments, only bring back that payment to distribute

        or (  -- This should grab payments that need to be distributed at check in

            @POSTPAYMENTID is null
            and SALESORDERPAYMENT.SALESORDERID = @SALESORDERID
            and SALESORDERPAYMENT.PAYMENTDATEWITHTIMEOFFSET < @RESERVATIONCOMPLETETIME
        )
    order by SALESORDERPAYMENT.DATEADDED asc;

    open PAYMENTS_CURSOR
    fetch next from PAYMENTS_CURSOR into @PAYMENTID, @PAYMENTAMOUNT
    while @@FETCH_STATUS = 0
    begin
        if @PAYMENTAMOUNT > 0
        begin
            set @PAYMENTRUNNINGAMOUNT = @PAYMENTAMOUNT

            declare ITEMS_CURSOR cursor local static for
            select
                ORDERLINEITEMID, 
                ITEMAMOUNTREMAINING,
                TYPECODE,
                FINANCIALTRANSACTIONID
            from 
                @SALESORDERLINEITEMS
            where 
                ISPAID <> 1;

            declare @ORDERLINEITEMID uniqueidentifier;
            declare @ITEMAMOUNTREMAINING money;
            declare @AMOUNTPAID money;
            declare @TYPECODE tinyint;
            declare @FINANCIALTRANSACTIONID uniqueidentifier;

            open ITEMS_CURSOR
            fetch next from ITEMS_CURSOR into @ORDERLINEITEMID, @ITEMAMOUNTREMAINING, @TYPECODE, @FINANCIALTRANSACTIONID

            while @@fetch_status = 0
            begin
                if @PAYMENTRUNNINGAMOUNT >= @ITEMAMOUNTREMAINING
                begin
                    update @SALESORDERLINEITEMS
                        set    ISPAID = 1,
                            ITEMAMOUNTREMAINING = 0
                    where 
                        ORDERLINEITEMID = @ORDERLINEITEMID

                    set @PAYMENTRUNNINGAMOUNT = @PAYMENTRUNNINGAMOUNT - @ITEMAMOUNTREMAINING        
                    set @AMOUNTPAID = @ITEMAMOUNTREMAINING
                end
                else
                begin
                    update @SALESORDERLINEITEMS
                        set ITEMAMOUNTREMAINING = ITEMAMOUNTREMAINING - @PAYMENTRUNNINGAMOUNT
                    where
                        ORDERLINEITEMID = @ORDERLINEITEMID

                    set @AMOUNTPAID = @PAYMENTRUNNINGAMOUNT
                    set @PAYMENTRUNNINGAMOUNT = 0
                end

                declare @FTLIID as uniqueidentifier = newid();
                insert into dbo.FINANCIALTRANSACTIONLINEITEM 
                (
                    ID,
                    FINANCIALTRANSACTIONID,
                    TYPECODE,
                    BASEAMOUNT,
                    TRANSACTIONAMOUNT,
                    ORGAMOUNT,
                    POSTDATE,
                    POSTSTATUSCODE,
                    SOURCELINEITEMID,
                    VISIBLE,
                    ADDEDBYID,
                    CHANGEDBYID,
                    DATEADDED,
                    DATECHANGED
                ) 
                values 
                (
                    @FTLIID,
                    @PAYMENTID,
                    0,
                    @AMOUNTPAID,
                    @AMOUNTPAID,
                    @AMOUNTPAID,
                    @POSTDATE,
                    @POSTSTATUSCODE,
                    @ORDERLINEITEMID,
                    @ISVISIBLE,
                    @CHANGEAGENTID,
                    @CHANGEAGENTID,
                    @CURRENTDATE,
                    @CURRENTDATE
                );

                insert into dbo.REVENUESPLIT_EXT
                (
                    ID,                     
                    APPLICATIONCODE,       
                    TYPECODE,              
                    DESIGNATIONID, 
                    ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED                
                )
                select
                    @FTLIID,
                    10,
                    @TYPECODE,
                    null,
                    @CHANGEAGENTID,
                    @CHANGEAGENTID,
                    @CURRENTDATE,
                    @CURRENTDATE

                insert into dbo.REVENUESPLITORDER
                (
                    ID, 
                    PROGRAMID, 
                    EVENTID, 
                    FEEID, 
                    TAXID, 
                    RESOURCEID, 
                    VOLUNTEERTYPEID, 
                    EVENTLOCATIONID, 
                    ADDEDBYID, 
                    CHANGEDBYID, 
                    DATEADDED, 
                    DATECHANGED
                )
                select 
                    @FTLIID
                    PROGRAMID,
                    EVENTID,
                    FEEID,
                    TAXID,
                    RESOURCEID,
                    VOLUNTEERTYPEID,
                    EVENTLOCATIONID,
                    @CHANGEAGENTID,
                    @CHANGEAGENTID,
                    @CURRENTDATE,
                    @CURRENTDATE
                from dbo.REVENUESPLITORDER
                where ID = @FINANCIALTRANSACTIONID;

                if @PAYMENTRUNNINGAMOUNT <=0 
                    break;

                fetch next from ITEMS_CURSOR into @ORDERLINEITEMID, @ITEMAMOUNTREMAINING, @TYPECODE, @FINANCIALTRANSACTIONID;
            end;

            close ITEMS_CURSOR;
            deallocate ITEMS_CURSOR;

            exec dbo.USP_PDACCOUNTSYSTEM_LINKTOREVENUE 
                @ID = @PAYMENTID
                @PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID
                @CHANGEDATE = @TRANSACTIONDATE
                @CHANGEAGENTID = @CHANGEAGENTID;
        end

        fetch next from PAYMENTS_CURSOR into @PAYMENTID, @PAYMENTAMOUNT
    end

    close PAYMENTS_CURSOR
    deallocate PAYMENTS_CURSOR

    -- Only do the following for payments made before check in

    if @POSTPAYMENTID is null begin
        declare @ARDEBITS table (ID uniqueidentifier not null, LINEITEMID uniqueidentifier not null)
        insert into @ARDEBITS
            (ID, LINEITEMID)
        select ARDEBITS.ID, LI.ID
        from @SALESORDERLINEITEMS SOLI
            inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = SOLI.ORDERLINEITEMID
            inner join dbo.JOURNALENTRY ARDEBITS on ARDEBITS.FINANCIALTRANSACTIONLINEITEMID = LI.ID
        where ARDEBITS.TRANSACTIONTYPECODE = 0

        declare @LIABILITYDEBITS table 
        (
            ID uniqueidentifier,
            ARDEBITID uniqueidentifier,
            TRANSACTIONAMOUNT money,
            BASEAMOUNT money,
            ORGAMOUNT money,
            GLACCOUNTID uniqueidentifier,
            TYPEMAPPINGID uniqueidentifier
        )
        insert into @LIABILITYDEBITS
            (ID,ARDEBITID,TRANSACTIONAMOUNT,BASEAMOUNT,ORGAMOUNT,GLACCOUNTID,TYPEMAPPINGID)
        select
            NEWID(),ARD.ID,APPLICATIONLINEITEM.TRANSACTIONAMOUNT,APPLICATIONLINEITEM.BASEAMOUNT,APPLICATIONLINEITEM.ORGAMOUNT,
            PAYMENTCREDIT.GLACCOUNTID,PAYMENTCREDIT_EXT.GLPAYMENTMETHODREVENUETYPEMAPPINGID
        from @ARDEBITS ARD
            inner join dbo.FINANCIALTRANSACTIONLINEITEM APPLICATIONLINEITEM on APPLICATIONLINEITEM.SOURCELINEITEMID = ARD.LINEITEMID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM PAYMENTLINEITEM on PAYMENTLINEITEM.FINANCIALTRANSACTIONID = APPLICATIONLINEITEM.FINANCIALTRANSACTIONID
            inner join dbo.REVENUESPLIT_EXT RSX on RSX.ID = PAYMENTLINEITEM.ID
            inner join dbo.JOURNALENTRY PAYMENTCREDIT on PAYMENTCREDIT.FINANCIALTRANSACTIONLINEITEMID = PAYMENTLINEITEM.ID
            inner join dbo.JOURNALENTRY_EXT PAYMENTCREDIT_EXT on PAYMENTCREDIT.ID = PAYMENTCREDIT_EXT.ID
        where
            RSX.TYPECODE = 19
            and PAYMENTLINEITEM.DELETEDON is null
            and PAYMENTLINEITEM.TYPECODE = 0  -- Standard

            and PAYMENTLINEITEM.POSTSTATUSCODE <> 3 --ignore existing do no post credits

            and PAYMENTCREDIT.TRANSACTIONTYPECODE = 1

        --insert liability debits for order line items

        insert into dbo.JOURNALENTRY
            (ID, FINANCIALTRANSACTIONLINEITEMID, TRANSACTIONTYPECODE, SUBLEDGERTYPECODE,
            TRANSACTIONAMOUNT, BASEAMOUNT, ORGAMOUNT, COMMENT, POSTDATE,
            FINANCIALBATCHID, GLACCOUNTID, TRANSACTIONCURRENCYID, TYPECODE, 
            DATEADDED, DATECHANGED, ADDEDBYID, CHANGEDBYID)
        select
            LD.ID, ARD.FINANCIALTRANSACTIONLINEITEMID, 0, 0,
            LD.TRANSACTIONAMOUNT, LD.BASEAMOUNT, LD.ORGAMOUNT, ARD.COMMENT, ARD.POSTDATE,
            ARD.FINANCIALBATCHID, LD.GLACCOUNTID, ARD.TRANSACTIONCURRENCYID, ARD.TYPECODE, 
            @CURRENTDATE, @CURRENTDATE, @CHANGEAGENTID, @CHANGEAGENTID
        from @LIABILITYDEBITS LD
            inner join dbo.JOURNALENTRY ARD on ARD.ID = LD.ARDEBITID

        insert into dbo.JOURNALENTRY_EXT
            (ID, PROJECT, JOURNAL, TABLENAMECODE, BATCHID, REVERSEDGLTRANSACTIONID, REVERSEDATE, 
            DISTRIBUTIONTABLEID, REVENUEID, GLPAYMENTMETHODREVENUETYPEMAPPINGID, OUTDATED, 
            PAYMENTMETHODCODE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, 
            LOGICALREVENUEID, ACCOUNT, PRECALCPOSTSTATUSCODE, BENEFITTYPECODE)
        select
            LD.ID, ODX.PROJECT, ODX.JOURNAL, ODX.TABLENAMECODE, ODX.BATCHID, ODX.REVERSEDGLTRANSACTIONID, ODX.REVERSEDATE, 
            ODX.DISTRIBUTIONTABLEID, ODX.REVENUEID, LD.TYPEMAPPINGID, ODX.OUTDATED, 
            ODX.PAYMENTMETHODCODE, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
            ODX.LOGICALREVENUEID, GL.ACCOUNTNUMBER, ODX.PRECALCPOSTSTATUSCODE, ODX.BENEFITTYPECODE
        from @LIABILITYDEBITS LD
            inner join @ARDEBITS ARD on ARD.ID = LD.ARDEBITID
            inner join dbo.JOURNALENTRY_EXT ODX on ODX.ID = ARD.ID
            inner join dbo.GLACCOUNT GL on GL.ID = LD.GLACCOUNTID

        --delete AR debits for fully paid order line items

        --update AR balance for underpaid order line items

        merge dbo.JOURNALENTRY as target
        using (
            select
                ARD.ID,
                REVENUECREDIT.TRANSACTIONAMOUNT - sum(LIABILITYDEBIT.TRANSACTIONAMOUNT) as TRANSACTIONAMOUNT,
                REVENUECREDIT.BASEAMOUNT - sum(LIABILITYDEBIT.BASEAMOUNT) as BASEAMOUNT,
                REVENUECREDIT.ORGAMOUNT - sum(LIABILITYDEBIT.ORGAMOUNT) as ORGAMOUNT
            from 
                @ARDEBITS ARD
                inner join dbo.FINANCIALTRANSACTIONLINEITEM ORDERLINEITEM on ORDERLINEITEM.ID = ARD.LINEITEMID
                inner join dbo.JOURNALENTRY REVENUECREDIT on REVENUECREDIT.FINANCIALTRANSACTIONLINEITEMID = ORDERLINEITEM.ID
                inner join @LIABILITYDEBITS LIABILITYDEBIT on LIABILITYDEBIT.ARDEBITID = ARD.ID
            where
                REVENUECREDIT.TRANSACTIONTYPECODE = 1
            group by ARD.ID, REVENUECREDIT.TRANSACTIONAMOUNT, REVENUECREDIT.BASEAMOUNT, REVENUECREDIT.ORGAMOUNT
            ) as source (ID, TRANSACTIONAMOUNT, BASEAMOUNT, ORGAMOUNT)
        on (target.ID = source.ID)
        when matched and source.BASEAMOUNT <= 0
            then delete
        when matched
            then update set 
                target.TRANSACTIONAMOUNT = source.TRANSACTIONAMOUNT,
                target.BASEAMOUNT = source.BASEAMOUNT,
                target.ORGAMOUNT = source.ORGAMOUNT,
                target.DATECHANGED = @CURRENTDATE,
                target.CHANGEDBYID = @CHANGEAGENTID;
    end
    else if @ALLOWGLDISTRIBUTIONS = 1 begin
        exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @POSTPAYMENTID, @CHANGEAGENTID, @CURRENTDATE
    end

    return 0;