USP_RESERVATION_ADJUSTCOMPLETEDORDER

Parameters

Parameter Parameter Type Mode Description
@ORDERID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTDATE datetime IN

Definition

Copy


CREATE procedure dbo.USP_RESERVATION_ADJUSTCOMPLETEDORDER
(
    @ORDERID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier,
    @CURRENTDATE datetime
)
as
begin
    declare @ORDERADJUSTMENTID uniqueidentifier;
    declare @PAYMENTS table (ID uniqueidentifier, POSTSTATUSCODE tinyint, PAYMENTTIME datetime, PAYMENTDEPOSITID uniqueidentifier);
    declare @ORDERLINEITEMS table (ID uniqueidentifier, POSTSTATUSCODE tinyint, REVENUEID uniqueidentifier, CONSTITUENTID uniqueidentifier);
    declare @ORDERREVENUEID uniqueidentifier;
    declare @TRANSACTIONDATE datetime;
    declare @TRANSACTIONPOSTDATE date;
    declare @CONSTITUENTID uniqueidentifier;
    declare @ALLOWGLDISTRIBUTIONS bit;
    declare @ORDERPOSTSTATUSCODE tinyint;

    -- Set order line items' post dates to be the order's arrival date until the order is posted; thereafter, use current date.

    select
        @TRANSACTIONDATE = SALESORDER.TRANSACTIONDATE,
        @ORDERPOSTSTATUSCODE = coalesce(FINANCIALTRANSACTION.POSTSTATUSCODE, 1),
        @ORDERREVENUEID = SALESORDER.REVENUEID,
        @CONSTITUENTID = SALESORDER.CONSTITUENTID
    from dbo.SALESORDER
        left join dbo.FINANCIALTRANSACTION on SALESORDER.REVENUEID = FINANCIALTRANSACTION.ID
    where SALESORDER.ID = @ORDERID;

    if @ORDERPOSTSTATUSCODE = 2
    set @TRANSACTIONDATE = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEFROMUTC(getutcdate());

    set @TRANSACTIONPOSTDATE = cast(@TRANSACTIONDATE as date);

    declare @RESERVATIONCOMPLETETIME datetime = (
        select STATUSDATE
        from dbo.RESERVATIONSTATUSHISTORY
        where RESERVATIONID = @ORDERID
            and STATUSCODE = 1        -- Completion date

    )

    insert into @PAYMENTS
    select
        FINANCIALTRANSACTION.ID,
        FINANCIALTRANSACTION.POSTSTATUSCODE,
        cast(SALESORDERPAYMENT.PAYMENTDATEWITHTIMEOFFSET as datetime),
        BANKACCOUNTDEPOSITPAYMENT.DEPOSITID
    from
        dbo.FINANCIALTRANSACTION
    inner join
        dbo.SALESORDERPAYMENT on SALESORDERPAYMENT.PAYMENTID = FINANCIALTRANSACTION.ID
    left join
        dbo.BANKACCOUNTDEPOSITPAYMENT on BANKACCOUNTDEPOSITPAYMENT.ID = FINANCIALTRANSACTION.ID
    where
        SALESORDERPAYMENT.SALESORDERID = @ORDERID
    order by DATE;

    insert into @ORDERLINEITEMS
    select
        FINANCIALTRANSACTIONLINEITEM.ID,
        FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE,
        SALESORDER.REVENUEID,
        SALESORDER.CONSTITUENTID
    from 
        dbo.FINANCIALTRANSACTIONLINEITEM
    right join 
        dbo.SALESORDER on SALESORDER.REVENUEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
    where 
        SALESORDER.ID = @ORDERID
        and DELETEDON is null;

    select
        @ALLOWGLDISTRIBUTIONS = PD.ALLOWGLDISTRIBUTIONS
    from
        dbo.UFN_PDACCOUNTSYSTEM_DEFAULTORSYSTEM() as PD

    -- Make sure the amounts are in sync.

    update dbo.FINANCIALTRANSACTION
    set 
        TRANSACTIONAMOUNT = SALESORDER.AMOUNT,
        BASEAMOUNT = SALESORDER.AMOUNT,
        ORGAMOUNT = SALESORDER.AMOUNT,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from
        dbo.FINANCIALTRANSACTION
    inner join
        dbo.SALESORDER on SALESORDER.REVENUEID = FINANCIALTRANSACTION.ID
    where
        SALESORDER.ID = @ORDERID

    declare @ISCOMPLETEDORDEREDITWITHNOADJUSTMENT bit = 0

    -- update all source line item ids that point to order line items to null so we can just do a straight delete from the FTLI table...

    update dbo.FINANCIALTRANSACTIONLINEITEM
    set SOURCELINEITEMID = null,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE            
    where
        SOURCELINEITEMID in
            (
                select 
                    ID
                from @ORDERLINEITEMS
            );

    -- Order Revenue

    if exists
        (
            select 
                1
            from 
                @ORDERLINEITEMS
            where
                POSTSTATUSCODE = 2 -- posted

        )
    begin

        -- Delete unposted overage. USP_SAVE_ADJUSTMENT will mark it as Posted if we don't (not what we want).

        delete FTLI
        from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
            inner join @ORDERLINEITEMS OLI on FTLI.ID = OLI.ID
            inner join dbo.REVENUESPLIT_EXT EXT on FTLI.ID = EXT.ID
        where FTLI.POSTSTATUSCODE = 1
            and EXT.TYPECODE = 20;

        -- Find the Discount line items to reverse separately, because USP_SAVE_ADJUSTMENT does not handle them at this time.

        declare @DISCOUNTLINEITEMIDS UDT_GENERICID;

        insert into @DISCOUNTLINEITEMIDS
        select LI.ID
        from dbo.FINANCIALTRANSACTIONLINEITEM LI
        where LI.FINANCIALTRANSACTIONID = @ORDERREVENUEID
            and LI.TYPECODE = 5
            and LI.POSTSTATUSCODE = 2
            and LI.DELETEDON is null;

        exec dbo.USP_SAVE_ADJUSTMENT @ORDERREVENUEID, @ORDERADJUSTMENTID output, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @TRANSACTIONPOSTDATE, 'Group Sales Order Edit';

        -- Discounts only

        exec dbo.USP_SAVE_REVERSAL_LINEITEM @DISCOUNTLINEITEMIDS, @ORDERADJUSTMENTID, @CHANGEAGENTID, @CURRENTDATE, @TRANSACTIONPOSTDATE, 1
        exec dbo.USP_SAVE_HISTORICAL_LINEITEM @DISCOUNTLINEITEMIDS, @ORDERADJUSTMENTID, @CHANGEAGENTID, @CURRENTDATE, @TRANSACTIONPOSTDATE, 1

        update dbo.FINANCIALTRANSACTIONLINEITEM
            set DELETEDON = @CURRENTDATE,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
        where
            ID in
            (
                select ID from @ORDERLINEITEMS
            )

    end
    else
    begin
        -- Get the adjustment ID if one already exists.

        -- Doesn't matter if we take it from the Standard or Reversal item, as long as it's not already marked as deleted.

        set @ORDERADJUSTMENTID = (
            select top 1 FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
            from dbo.FINANCIALTRANSACTIONLINEITEM
            where FINANCIALTRANSACTIONID = @ORDERREVENUEID
                and POSTSTATUSCODE = 1
                and DELETEDON is null
        );

        declare @contextCache varbinary(128);
        declare @e int;

        set @contextCache = CONTEXT_INFO();

        /* set CONTEXT_INFO to @CHANGEAGENTID */
        if not @CHANGEAGENTID is null
            set CONTEXT_INFO @CHANGEAGENTID;

        -- Mark adjustment line items we didn't create as deleted to avoid hitting same table reference constraint when actually deleting below

        update ORDERLI
        set DELETEDON = @CURRENTDATE,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        from dbo.FINANCIALTRANSACTIONLINEITEM ORDERLI
            inner join dbo.FINANCIALTRANSACTIONLINEITEM ADJUSTMENTLI on ADJUSTMENTLI.REVERSEDLINEITEMID = ORDERLI.ID
        where
            ORDERLI.FINANCIALTRANSACTIONID = @ORDERREVENUEID
            and ORDERLI.POSTSTATUSCODE <> 2
            and ORDERLI.TYPECODE <> 1        -- Not reversal

            and ORDERLI.DELETEDON is null;

        delete from dbo.FINANCIALTRANSACTIONLINEITEM
        where
            FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ORDERREVENUEID
            and FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE <> 2
            and TYPECODE <> 1        -- Not reversal

            and DELETEDON is null;

        select @e=@@error;

        /* reset CONTEXT_INFO to previous value  */
        if not @contextCache is null
            set CONTEXT_INFO @contextCache;

        if @e <> 0
            return 2;

        if @ORDERADJUSTMENTID is null
            set @ISCOMPLETEDORDEREDITWITHNOADJUSTMENT = 1;
    end

    -- Add order revenue and discount credits

    if @ORDERREVENUEID is not null
        exec dbo.USP_SALESORDER_ADDREVENUE @ORDERID, @ORDERREVENUEID, @TRANSACTIONDATE, @CONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE, @ISCOMPLETEDORDEREDITWITHNOADJUSTMENT, @ORDERADJUSTMENTID;
    else
     begin
        if dbo.UFN_SALESORDER_TOTAL(@ORDERID)= convert(money, 0.00)
        begin
         exec dbo.USP_SALESORDER_GENERATETICKETS @ORDERID, @CHANGEAGENTID, @CURRENTDATE, 1;
         return;
        end
        else
        begin
         set @ORDERREVENUEID = NEWID();
         exec dbo.USP_SALESORDER_ADDREVENUE @ORDERID, @ORDERREVENUEID, @TRANSACTIONDATE, @CONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;
        end
     end

    exec dbo.USP_SALESORDER_ADDDISCOUNTCREDITS @ORDERID, @CHANGEAGENTID, @CURRENTDATE, @TRANSACTIONDATE, @ORDERADJUSTMENTID;


    -- Now handle payments.


    -- First delete FTLIs for all payments made before checkin; they stay fully UR, but we still need to redistribute the UR.

    delete FTLI
    from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
        inner join @PAYMENTS PAYMENTS on FTLI.FINANCIALTRANSACTIONID = PAYMENTS.ID
        left join dbo.REVENUESPLIT_EXT EXT on FTLI.ID = EXT.ID
    where PAYMENTS.PAYMENTTIME < @RESERVATIONCOMPLETETIME
        and FTLI.POSTSTATUSCODE = 3
        and coalesce(EXT.TYPECODE, 0) <> 19;

    -- This needs to be called once for all prepayments before it is called for any postpayment,

    -- because it seems that the order is drawing its GL from UR even when a postpayment is directly applied.

    exec dbo.USP_SALESORDER_ADDPAYMENTREVENUE @ORDERID, @ORDERREVENUEID, @CHANGEAGENTID, @CURRENTDATE;

    -- Open up cursor and loop through payments so we can update the payments that are posted and not posted.    

    declare @PAYMENTID uniqueidentifier;
    declare @PAYMENTPOSTSTATUS tinyint;
    declare @PAYMENTDEPOSITID uniqueidentifier;

    -- Now recreate GL for all prepayments.

    if @ALLOWGLDISTRIBUTIONS = 1 begin
        declare PREPAYMENTS_CURSOR cursor local fast_forward for 
        select ID, PAYMENTDEPOSITID
        from @PAYMENTS
        where PAYMENTTIME < @RESERVATIONCOMPLETETIME;

        open PREPAYMENTS_CURSOR
        fetch next from PREPAYMENTS_CURSOR
        into @PAYMENTID, @PAYMENTDEPOSITID

        while @@FETCH_STATUS = 0 begin
            exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION    @PAYMENTID, @CHANGEAGENTID, @CURRENTDATE;

            -- Fix debit GL distributions (need to be Bank rather than Cash if the payment has been deposited)

            if @PAYMENTDEPOSITID is not null
                exec dbo.USP_BANKACCOUNTDEPOSIT_OVERWRITEPAYMENTDEBITACCOUNTS @PAYMENTID, @PAYMENTDEPOSITID;

            fetch next from PREPAYMENTS_CURSOR
            into @PAYMENTID, @PAYMENTDEPOSITID;
        end

        close PREPAYMENTS_CURSOR;
        deallocate PREPAYMENTS_CURSOR;
    end;

    declare POSTPAYMENTS_CURSOR cursor local fast_forward for 
    select ID, POSTSTATUSCODE, PAYMENTDEPOSITID
    from @PAYMENTS
    where PAYMENTTIME >= @RESERVATIONCOMPLETETIME;

    open POSTPAYMENTS_CURSOR
    fetch next from POSTPAYMENTS_CURSOR
    into @PAYMENTID, @PAYMENTPOSTSTATUS, @PAYMENTDEPOSITID

    while @@FETCH_STATUS = 0 begin

        declare @PAYMENTADJUSTMENTID uniqueidentifier = null;

        -- Since the payment was made after checkin, adjust if necessary and redistribute.

        if @PAYMENTPOSTSTATUS = 2
        begin
            -- Get the adjustment ID if one already exists. If not, we haven't adjusted yet.

            set @PAYMENTADJUSTMENTID = (
                select top 1 FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
                from dbo.FINANCIALTRANSACTIONLINEITEM
                where FINANCIALTRANSACTIONID = @PAYMENTID
                and POSTSTATUSCODE = 1
            )

            -- If the payment is posted and the order revenue is not, then their transaction dates will differ.

            declare @CURRENTDATEWITHOUTTIME date = cast(@CURRENTDATE as date);
            if @PAYMENTADJUSTMENTID is null
                exec dbo.USP_SAVE_ADJUSTMENT @PAYMENTID, @PAYMENTADJUSTMENTID output, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @CURRENTDATEWITHOUTTIME, 'Group Sales Payment Edit';
        end

        -- Delete all not-posted line items except for UR.

        declare @UNEARNEDLINEITEMID uniqueidentifier = (
            select FTLI.ID
            from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
                inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FTLI.ID
            where FTLI.FINANCIALTRANSACTIONID = @PAYMENTID
                and REVENUESPLIT_EXT.TYPECODE = 19 -- unearned revenue

                and FTLI.POSTSTATUSCODE <> 2
        );

        update dbo.FINANCIALTRANSACTIONLINEITEM
        set SOURCELINEITEMID = null,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        where SOURCELINEITEMID in (
            select ID from dbo.FINANCIALTRANSACTIONLINEITEM
            where FINANCIALTRANSACTIONID = @PAYMENTID
                and POSTSTATUSCODE <> 2
                and (ID <> @UNEARNEDLINEITEMID or @UNEARNEDLINEITEMID is null)
        )

        -- Store types of reversed items so we can restore the links later (only matters when posted)

        declare @ADJUSTMENTLINEITEMS table(ID uniqueidentifier, TYPECODE tinyint)
        insert into @ADJUSTMENTLINEITEMS
        select FTLI.ID,
            EXT.TYPECODE
        from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
            inner join dbo.REVENUESPLIT_EXT EXT on FTLI.REVERSEDLINEITEMID = EXT.ID
        where FTLI.FINANCIALTRANSACTIONID = @PAYMENTID;

        update dbo.FINANCIALTRANSACTIONLINEITEM
        set REVERSEDLINEITEMID = null,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        where REVERSEDLINEITEMID in (
            select ID from dbo.FINANCIALTRANSACTIONLINEITEM
            where FINANCIALTRANSACTIONID = @PAYMENTID
                and POSTSTATUSCODE <> 2
        );

        declare @contextCache2 varbinary(128);
        declare @e2 int;

        set @contextCache2 = CONTEXT_INFO();

        /* set CONTEXT_INFO to @CHANGEAGENTID */
        if not @CHANGEAGENTID is null
            set CONTEXT_INFO @CHANGEAGENTID;

        -- Make sure all GL for the payment is also deleted, including UR, or else none of it will be be re-created.

        delete JE from dbo.JOURNALENTRY JE
        inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.ID = JE.FINANCIALTRANSACTIONLINEITEMID
        where FTLI.FINANCIALTRANSACTIONID = @PAYMENTID
            and FTLI.DELETEDON is null
            and FTLI.POSTSTATUSCODE <> 2
            and FTLI.TYPECODE <> 1    -- not deleted, not a reversal


        delete from dbo.FINANCIALTRANSACTIONLINEITEM
        where FINANCIALTRANSACTIONID = @PAYMENTID
            and DELETEDON is null
            and POSTSTATUSCODE <> 2
            and TYPECODE <> 1    -- Not reversal

            and (ID <> @UNEARNEDLINEITEMID or @UNEARNEDLINEITEMID is null)

        select @e=@@error;

        /* reset CONTEXT_INFO to previous value  */
        if not @contextCache2 is null
            set CONTEXT_INFO @contextCache2;

        if @e2 <> 0
            return 2;

        -- Since the payment was made after checkin, we need to redistribute.

        exec dbo.USP_SALESORDER_ADDPAYMENTREVENUE @ORDERID, @ORDERREVENUEID, @CHANGEAGENTID, @CURRENTDATE, @PAYMENTID;

        -- Fix debit GL distributions (need to be Bank rather than Cash if the payment has been deposited)

        if @PAYMENTDEPOSITID is not null
            exec dbo.USP_BANKACCOUNTDEPOSIT_OVERWRITEPAYMENTDEBITACCOUNTS @PAYMENTID, @PAYMENTDEPOSITID;

        -- Now relink the reversed line items.

        if @PAYMENTPOSTSTATUS = 2
        begin
            --Set the correct adjustment and reversedlineitem ID's on the new line items for UI grouping.

            update dbo.FINANCIALTRANSACTIONLINEITEM
            set FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = @PAYMENTADJUSTMENTID
            where FINANCIALTRANSACTIONID = @PAYMENTID
                and POSTSTATUSCODE = 1
                and FINANCIALTRANSACTIONLINEITEMADJUSTMENTID is null;

            with NEWLINEITEMS_CTE as
            (
                select FTLI.ID, EXT.TYPECODE
                from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
                    inner join dbo.REVENUESPLIT_EXT EXT on FTLI.ID = EXT.ID
                where FTLI.FINANCIALTRANSACTIONID = @PAYMENTID
                    and FTLI.POSTSTATUSCODE = 1
                    and FTLI.TYPECODE <> 1
            )
            update dbo.FINANCIALTRANSACTIONLINEITEM
            set REVERSEDLINEITEMID = NEWLINEITEMS_CTE.ID
            from dbo.FINANCIALTRANSACTIONLINEITEM FTLI
                inner join @ADJUSTMENTLINEITEMS ADJ on FTLI.ID = ADJ.ID
                inner join NEWLINEITEMS_CTE on NEWLINEITEMS_CTE.TYPECODE = ADJ.TYPECODE
            where REVERSEDLINEITEMID is null;
        end

        fetch next from POSTPAYMENTS_CURSOR
        into @PAYMENTID, @PAYMENTPOSTSTATUS, @PAYMENTDEPOSITID;
    end;

    close POSTPAYMENTS_CURSOR;
    deallocate POSTPAYMENTS_CURSOR;

    exec dbo.USP_SALESORDER_GENERATETICKETS @ORDERID, @CHANGEAGENTID, @CURRENTDATE, 1

end