UFN_SALESMETHOD_AVAILABLEDISCOUNTS

Returns a table of current available discounts for a given sales method.

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@SALESMETHODID uniqueidentifier IN
@APPLIESTOCODE tinyint IN

Definition

Copy


CREATE function dbo.UFN_SALESMETHOD_AVAILABLEDISCOUNTS (
    @SALESMETHODID uniqueidentifier,
    @APPLIESTOCODE tinyint
)
returns @AVAILABLEDISCOUNTS table (
    ID uniqueidentifier,
    APPLICATIONTYPECODE tinyint,
    APPLIESTOCODE tinyint,
    CALCULATIONTYPECODE tinyint,
    AMOUNT money,
    [PERCENT] decimal(5,2),
    APPLIESTOMERCHANDISE bit,
    APPLIESTOTICKETS bit
)
as begin
    declare @CURRENTUTCDATETIME datetime;
    declare @CURRENTUTCTIME time(0);

    set @CURRENTUTCDATETIME = getutcdate();
    set @CURRENTUTCTIME = @CURRENTUTCDATETIME;

    declare @CURRENTSYSTEMDEFAULTDATE date;
    declare @TIMEZONEENTRYID uniqueidentifier;
    declare @UTCOFFSET integer;

    set @TIMEZONEENTRYID = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULT();
    set @UTCOFFSET = dbo.UFN_TIMEZONEENTRY_GETTIMEZONEOFFSETFROMUTC(@TIMEZONEENTRYID, @CURRENTUTCDATETIME, 1);
    set @CURRENTSYSTEMDEFAULTDATE = dateadd(minute, @UTCOFFSET, @CURRENTUTCDATETIME);
    set @UTCOFFSET = -@UTCOFFSET;

    -- Bug 174017 MDC

    declare @VALIDTIMESTABLE table (
        DISCOUNTAVAILABILITYID uniqueidentifier, 
        [FROM] time(0), 
        [TO] time(0), 
        GMTDAYSPAN bit 
    )

    insert into @VALIDTIMESTABLE (
        DISCOUNTAVAILABILITYID,
        [FROM],
        [TO],
        [GMTDAYSPAN]
    )
    select
        DA.ID,
        case
            when DA.ALLOWDISCOUNTTIMEFROM = '' then
                dateadd(minute, @UTCOFFSET, cast('0:00' as time(0)))
            else
                dateadd(minute, @UTCOFFSET, cast(left(DA.ALLOWDISCOUNTTIMEFROM, 2) + ':' + right(DA.ALLOWDISCOUNTTIMEFROM, 2) as time(0)))
        end,
        case
            when DA.ALLOWDISCOUNTTIMETO = '' then
                dateadd(minute, @UTCOFFSET, cast('23:59' as time(0)))
            else
                dateadd(minute, @UTCOFFSET, cast(left(DA.ALLOWDISCOUNTTIMETO, 2) + ':' + right(DA.ALLOWDISCOUNTTIMETO, 2) as time(0)))
        end,
        0
    from dbo.DISCOUNTAVAILABILITY DA
    inner join dbo.DISCOUNTAVAILABILITYSALESMETHOD DASM on DASM.DISCOUNTAVAILABILITYID = DA.ID
    where DASM.SALESMETHODID = @SALESMETHODID

    update @VALIDTIMESTABLE
    set GMTDAYSPAN = 1
    where [TO] < [FROM]    

    declare @CURRENTDAY tinyint;
    set @CURRENTDAY = (@@datefirst + datepart(dw, @CURRENTSYSTEMDEFAULTDATE)) % 7;

    insert into @AVAILABLEDISCOUNTS (
        ID,
        APPLICATIONTYPECODE,
        APPLIESTOCODE,
        CALCULATIONTYPECODE,
        AMOUNT,
        [PERCENT],
        APPLIESTOMERCHANDISE,
        APPLIESTOTICKETS
    )
    select
        DISCOUNT.ID,
        DISCOUNT.APPLICATIONTYPECODE,
        DISCOUNT.APPLIESTOCODE,
        DISCOUNT.CALCULATIONTYPECODE,
        DISCOUNT.AMOUNT,
        DISCOUNT.[PERCENT],
        DISCOUNT.APPLIESTOMERCHANDISE,
        DISCOUNT.APPLIESTOTICKETS
    from
        dbo.DISCOUNT
    inner join
        dbo.DISCOUNTAVAILABILITY DA on DA.DISCOUNTID = DISCOUNT.ID
    inner join
        dbo.DISCOUNTAVAILABILITYSALESMETHOD DASM on DASM.DISCOUNTAVAILABILITYID = DA.ID
    inner join
        @VALIDTIMESTABLE on [@VALIDTIMESTABLE].DISCOUNTAVAILABILITYID = DA.ID
    where
        DISCOUNT.ISACTIVE = 1
        and DISCOUNT.APPLIESTOCODE = @APPLIESTOCODE
        and DASM.SALESMETHODID = @SALESMETHODID
        and
            case @CURRENTDAY
                when 1 then DA.ALLOWSUNDAY
                when 2 then DA.ALLOWMONDAY
                when 3 then DA.ALLOWTUESDAY
                when 4 then DA.ALLOWWEDNESDAY
                when 5 then DA.ALLOWTHURSDAY
                when 6 then DA.ALLOWFRIDAY
                when 0 then DA.ALLOWSATURDAY
            end = 1
        and (DA.ALLOWDISCOUNTDATEFROM is null or @CURRENTSYSTEMDEFAULTDATE >= DA.ALLOWDISCOUNTDATEFROM) 
        and (DA.ALLOWDISCOUNTDATETO is null or @CURRENTSYSTEMDEFAULTDATE <= DA.ALLOWDISCOUNTDATETO) 
        and (
            ([@VALIDTIMESTABLE].GMTDAYSPAN = 1 and (@CURRENTUTCTIME >= [@VALIDTIMESTABLE].[FROM] or @CURRENTUTCTIME <= [@VALIDTIMESTABLE].[TO])) or 
            ([@VALIDTIMESTABLE].GMTDAYSPAN = 0 and @CURRENTUTCTIME between [@VALIDTIMESTABLE].[FROM] and [@VALIDTIMESTABLE].[TO]) or
            ([@VALIDTIMESTABLE].[FROM] = [@VALIDTIMESTABLE].[TO])
        )

    return;
end