UFN_DELIVERYMETHOD_VALIDFORORDER

Checks the block time on a delivery method against an order's events

Return

Return Type
bit

Parameters

Parameter Parameter Type Mode Description
@DELIVERYMETHODID uniqueidentifier IN
@ORDERID uniqueidentifier IN

Definition

Copy


CREATE function dbo.UFN_DELIVERYMETHOD_VALIDFORORDER
(
    @DELIVERYMETHODID uniqueidentifier,
    @ORDERID uniqueidentifier
)
returns bit
with execute as caller
as begin

    declare @ISOKAY bit;
    set @ISOKAY = 0;

    declare @BLOCKDELIVERY bit;
    declare @TIMEVALUE smallint;
    declare @TIMEUNIT tinyint;
    declare @EARLIESTEVENTDATETIMEWITHOFFSET datetimeoffset;

    declare @SALESMETHODID uniqueidentifier
    select @SALESMETHODID = dbo.UFN_SALESMETHOD_GETIDFROMTYPECODE(SALESMETHODTYPECODE)
    from dbo.SALESORDER
    where ID = @ORDERID;

    select
        @BLOCKDELIVERY = BLOCKDELIVERY,
        @TIMEVALUE = BLOCKTIMEVALUE,
        @TIMEUNIT = BLOCKTIMEUNITCODE
    from
        dbo.DELIVERYMETHOD
    where
        ID = @DELIVERYMETHODID;

    select @EARLIESTEVENTDATETIMEWITHOFFSET = EVENT.STARTDATETIMEWITHOFFSET
    from dbo.EVENT
    where
        ID = (
            select top(1) E.ID
            from dbo.SALESORDERITEM as SOI
            inner join dbo.SALESORDERITEMTICKET as SOIT on SOIT.ID = SOI.ID
            inner join dbo.EVENT as E on SOIT.EVENTID = E.ID
            where SOI.SALESORDERID = @ORDERID
            order by E.STARTDATETIME asc
        )

    if not exists(
        select 1 
        from dbo.SALESMETHODDELIVERYMETHOD 
        inner join dbo.DELIVERYMETHOD
            on SALESMETHODDELIVERYMETHOD.DELIVERYMETHODID = DELIVERYMETHOD.ID
        where 
            SALESMETHODID = @SALESMETHODID and 
            DELIVERYMETHODID = @DELIVERYMETHODID and
            DELIVERYMETHOD.ISACTIVE = 1
    )
        set @ISOKAY = 0
    else if @BLOCKDELIVERY = 0
        set @ISOKAY = 1;
    else begin
        declare @CALCULATEDBLOCKDATETIMEWITHOFFSET datetimeoffset;
        declare @CURRENTDATETIMEOFFSET datetimeoffset = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(sysutcdatetime(), 1);

        set @CALCULATEDBLOCKDATETIMEWITHOFFSET = case @TIMEUNIT
            when 0 then dateadd(hh, @TIMEVALUE, @CURRENTDATETIMEOFFSET)
            when 1 then dateadd(dd, @TIMEVALUE, @CURRENTDATETIMEOFFSET)
        end

        set @ISOKAY = case
            when @EARLIESTEVENTDATETIMEWITHOFFSET is null then 1
            when @CALCULATEDBLOCKDATETIMEWITHOFFSET < @EARLIESTEVENTDATETIMEWITHOFFSET then 1
            else 0
        end
    end

    return @ISOKAY;
end