UFN_SALESORDER_TOTALS

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@SALESORDERID uniqueidentifier IN

Definition

Copy


CREATE function dbo.UFN_SALESORDER_TOTALS(@SALESORDERID uniqueidentifier)
returns table
as return (
    with SALESORDERITEM_CTE as (
        select
            ID,
            TYPECODE,
            PRICINGSTRUCTURECODE,
            TOTAL
        from
            dbo.SALESORDERITEM
        where
            SALESORDERID = @SALESORDERID
    ),
    PAYMENTS_CTE as (
        select
            isnull(sum(AMOUNTTENDERED), 0) as AMOUNTTENDERED,
            isnull(sum(AMOUNT), 0) as AMOUNTPAID,
            isnull(sum(CHANGEDUE), 0) as CHANGEDUE,
            count(*) as NUMBEROFPAYMENTS
        from dbo.SALESORDERPAYMENT
        where SALESORDERID = @SALESORDERID
    ),
    SECURITYDEPOSIPAYMENTS_CTE as (
        select isnull(sum(AMOUNT), 0) as SECURITYDEPOSITAMOUNTPAID
        from dbo.RESERVATIONSECURITYDEPOSITPAYMENT
        where RESERVATIONID = @SALESORDERID
    ),
    TOTALS_CTE as (
        select
            isnull(sum(
                case SALESORDERITEM_CTE.TYPECODE
                    when 5 then  -- Discount

                        -SALESORDERITEM_CTE.TOTAL
                    else
                        SALESORDERITEM_CTE.TOTAL
                end

                - ITEMDISCOUNTTOTAL.AMOUNT - MEMBERSHIPPROMOANDAPPLIEDTICKETSTOTAL.APPLIEDAMOUNT - MEMBERSHIPPROMOANDAPPLIEDTICKETSTOTAL.PROMOAMOUNT
            ), 0) as TOTAL,
            isnull(sum(case when SALESORDERITEM_CTE.TYPECODE = 4 then SALESORDERITEM_CTE.TOTAL else 0 end), 0) as TAXES,
            isnull(sum(case when SALESORDERITEM_CTE.TYPECODE = 3 then SALESORDERITEM_CTE.TOTAL else 0 end), 0) as FEES,
            isnull(sum(case when SALESORDERITEM_CTE.TYPECODE = 5 then SALESORDERITEM_CTE.TOTAL else 0 end), 0) as ORDERDISCOUNTS,
            isnull(sum(ITEMDISCOUNTTOTAL.AMOUNT), 0) as ITEMDISCOUNTS,
            isnull(sum(MEMBERSHIPPROMOANDAPPLIEDTICKETSTOTAL.APPLIEDAMOUNT), 0) as APPLIEDTICKETS,
            isnull(sum(MEMBERSHIPPROMOANDAPPLIEDTICKETSTOTAL.PROMOAMOUNT), 0) as MEMBERSHIPPROMOTIONS,
            isnull(sum(case when SALESORDERITEM_CTE.PRICINGSTRUCTURECODE = 1 then SALESORDERITEM_CTE.TOTAL else 0 end), 0) as FLATRATEAPPLIEDAMOUNT
        from
            SALESORDERITEM_CTE
        outer apply (
            select isnull(sum(SALESORDERITEMITEMDISCOUNT.AMOUNT), 0) as AMOUNT
            from dbo.SALESORDERITEMITEMDISCOUNT
            where SALESORDERITEMITEMDISCOUNT.SALESORDERITEMID = SALESORDERITEM_CTE.ID
        ) as ITEMDISCOUNTTOTAL
        outer apply (
            select
                isnull(sum(case when SALESORDERITEMMEMBERSHIPITEMPROMOTION.MEMBERSHIPPROMOID is null then SALESORDERITEMMEMBERSHIPITEMPROMOTION.AMOUNT else 0 end), 0) as APPLIEDAMOUNT,
                isnull(sum(case when SALESORDERITEMMEMBERSHIPITEMPROMOTION.MEMBERSHIPPROMOID is not null then SALESORDERITEMMEMBERSHIPITEMPROMOTION.AMOUNT else 0 end), 0) as PROMOAMOUNT
            from dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION
            where SALESORDERITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMID = SALESORDERITEM_CTE.ID
        ) as MEMBERSHIPPROMOANDAPPLIEDTICKETSTOTAL
    ),
    SALESORDERINDIVIDUALTOTALS_CTE as (
        select
            (
                select AMOUNT
                from dbo.RESERVATIONRATESCALEPRICE
                where RESERVATIONRATESCALEID = @SALESORDERID and INUSE = 1
            ) as FLATRATEAMOUNT,
            isnull((
                select sum(CREDITPAYMENT.AMOUNT)
                from dbo.CREDITPAYMENT
                inner join dbo.SALESORDERPAYMENT on SALESORDERPAYMENT.PAYMENTID = CREDITPAYMENT.REVENUEID
                where SALESORDERPAYMENT.SALESORDERID = @SALESORDERID
            ), 0) as REFUNDS
    ),
    SALESORDERITEMTOTALS_CTE as (
        select
            (
                TOTAL
                +
                case
                    when FLATRATEAMOUNT is null then
                        0
                    else
                        case
                            when FLATRATEAMOUNT <> FLATRATEAPPLIEDAMOUNT then
                                (FLATRATEAMOUNT - FLATRATEAPPLIEDAMOUNT)
                            else
                                0
                        end
                end
                - TAXES
            ) as SUBTOTAL,
            TAXES,
            ORDERDISCOUNTS,
            ITEMDISCOUNTS,
            APPLIEDTICKETS,
            MEMBERSHIPPROMOTIONS,
            (ORDERDISCOUNTS + ITEMDISCOUNTS + APPLIEDTICKETS + MEMBERSHIPPROMOTIONS) as TOTALDISCOUNTS,
            REFUNDS,
            (
                TOTAL
                +
                case
                    when FLATRATEAMOUNT is null then
                        0
                    else
                        case
                            when FLATRATEAMOUNT <> FLATRATEAPPLIEDAMOUNT then
                                (FLATRATEAMOUNT - FLATRATEAPPLIEDAMOUNT)
                            else
                                0
                        end
                end
            ) as TOTAL
        from
            TOTALS_CTE
        outer apply
            SALESORDERINDIVIDUALTOTALS_CTE
    )
    select
        SALESORDERITEMTOTALS_CTE.SUBTOTAL,
        SALESORDERITEMTOTALS_CTE.TAXES,
        SALESORDERITEMTOTALS_CTE.ORDERDISCOUNTS,
        SALESORDERITEMTOTALS_CTE.ITEMDISCOUNTS,
        SALESORDERITEMTOTALS_CTE.APPLIEDTICKETS,
        SALESORDERITEMTOTALS_CTE.MEMBERSHIPPROMOTIONS,
        SALESORDERITEMTOTALS_CTE.TOTALDISCOUNTS,
        SALESORDERITEMTOTALS_CTE.REFUNDS,
        SALESORDERITEMTOTALS_CTE.TOTAL,
        PAYMENTS_CTE.AMOUNTTENDERED,
        case
            when SALESORDER.SALESMETHODTYPECODE = 3 then  -- Group Sales should never have change due

                cast(0 as money)
            when SALESORDER.STATUSCODE <> 1 then  -- Incomplete orders may have payments where the change due field needs to be updated

                PAYMENTS_CTE.AMOUNTTENDERED - SALESORDERITEMTOTALS_CTE.TOTAL
            else
                PAYMENTS_CTE.CHANGEDUE
        end as CHANGEDUE,
        PAYMENTS_CTE.AMOUNTPAID,
        PAYMENTS_CTE.NUMBEROFPAYMENTS,
        (
            SALESORDERITEMTOTALS_CTE.TOTAL
            -
                case
                    -- Depending on how things are added/removed to the card

                    -- the AMOUNTPAID can be off so it's best to use tendered until complete

                    when SALESORDER.STATUSCODE <> 1 then  -- Complete

                        PAYMENTS_CTE.AMOUNTTENDERED
                    else
                        PAYMENTS_CTE.AMOUNTPAID
                end
            +
                case
                    when SALESORDER.SALESMETHODTYPECODE = 3 then  -- Group Sales

                        SALESORDERITEMTOTALS_CTE.REFUNDS + OVERAGEKEPT.AMOUNT
                    else
                        0
                end
        ) as BALANCE,
        SECURITYDEPOSIPAYMENTS_CTE.SECURITYDEPOSITAMOUNTPAID,
        OVERAGEKEPT.AMOUNT as OVERAGEKEPT
    from
        dbo.SALESORDER
    outer apply
        SALESORDERITEMTOTALS_CTE
    outer apply
        PAYMENTS_CTE
    outer apply
        SECURITYDEPOSIPAYMENTS_CTE
    outer apply (
        select isnull(sum(LI.BASEAMOUNT), 0) as AMOUNT
        from dbo.FINANCIALTRANSACTIONLINEITEM as LI
        inner join dbo.REVENUESPLIT_EXT as EXT on EXT.ID = LI.ID
        where
            LI.FINANCIALTRANSACTIONID = SALESORDER.REVENUEID
            and EXT.TYPECODE = 20  -- Overage

            and LI.DELETEDON is null
            and LI.TYPECODE = 0  -- Standard

    ) as OVERAGEKEPT
    where
        SALESORDER.ID = @SALESORDERID
)