UFN_DISCOUNT_AVAILABLEFORORDER
Checks a discount's availability against a given order
Return
Return Type |
---|
bit |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@DISCOUNTID | uniqueidentifier | IN | |
@SALESORDERID | uniqueidentifier | IN |
Definition
Copy
CREATE function dbo.UFN_DISCOUNT_AVAILABLEFORORDER
(
@DISCOUNTID uniqueidentifier,
@SALESORDERID uniqueidentifier
)
returns bit
with execute as caller
as begin
if (select ISACTIVE from dbo.DISCOUNT where ID = @DISCOUNTID) = 0
begin
return 0
end
else
begin
declare @SALESMETHODID uniqueidentifier
select @SALESMETHODID = ID
from dbo.SALESMETHOD
where TYPECODE = (select SALESMETHODTYPECODE from dbo.SALESORDER where ID = @SALESORDERID)
declare @CURRENTUTCTIME time
set @CURRENTUTCTIME = getutcdate()
declare @CURRENTSYSTEMDEFAULTDATE datetime
set @CURRENTSYSTEMDEFAULTDATE = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEFROMUTC(getutcdate())
declare @TIMEZONEENTRYID uniqueidentifier
declare @UTCOFFSET integer
set @TIMEZONEENTRYID = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULT()
set @UTCOFFSET = -1 * dbo.UFN_TIMEZONEENTRY_GETTIMEZONEOFFSETFROMUTC(@TIMEZONEENTRYID, getutcdate(), 1)
declare @VALIDTIMESTABLE table
(
DISCOUNTAVAILABILITYID uniqueidentifier,
[FROM] time,
[TO] time,
GMTDAYSPAN bit
)
insert into @VALIDTIMESTABLE
(
DISCOUNTAVAILABILITYID,
[FROM],
[TO],
[GMTDAYSPAN]
)
select
DA.ID,
case when DA.ALLOWDISCOUNTDATEFROM = ''
then
dateadd(minute, @UTCOFFSET, cast(dbo.UFN_HOURMINUTE_DISPLAYTIME('0000') as time))
else
dateadd(minute, @UTCOFFSET, cast(dbo.UFN_HOURMINUTE_DISPLAYTIME(DA.ALLOWDISCOUNTTIMEFROM) as time))
end,
case when DA.ALLOWDISCOUNTDATETO = ''
then
dateadd(minute, @UTCOFFSET, cast(dbo.UFN_HOURMINUTE_DISPLAYTIME('2359') as time))
else
dateadd(minute, @UTCOFFSET, cast(dbo.UFN_HOURMINUTE_DISPLAYTIME(DA.ALLOWDISCOUNTTIMETO) as time))
end,
0
from dbo.DISCOUNTAVAILABILITY DA
inner join dbo.DISCOUNTAVAILABILITYSALESMETHOD DASM on DASM.DISCOUNTAVAILABILITYID = DA.ID
where
DA.DISCOUNTID = @DISCOUNTID and
DASM.SALESMETHODID = @SALESMETHODID
update @VALIDTIMESTABLE
set GMTDAYSPAN = 1
where [TO] < [FROM]
if exists
(
select DA.ID
from dbo.DISCOUNTAVAILABILITY DA
inner join dbo.DISCOUNTAVAILABILITYSALESMETHOD DASM on DASM.DISCOUNTAVAILABILITYID = DA.ID
inner join @VALIDTIMESTABLE on [@VALIDTIMESTABLE].DISCOUNTAVAILABILITYID = DA.ID
where
DA.DISCOUNTID = @DISCOUNTID and
DASM.SALESMETHODID = @SALESMETHODID and
case (@@datefirst + datepart(dw, @CURRENTSYSTEMDEFAULTDATE)) % 7
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 7 then DA.ALLOWSATURDAY
when 0 then DA.ALLOWSATURDAY
end = 1 and
(DA.ALLOWDISCOUNTDATEFROM is null or @CURRENTSYSTEMDEFAULTDATE >= DA.ALLOWDISCOUNTDATEFROM) and
(DA.ALLOWDISCOUNTDATETO is null or cast(@CURRENTSYSTEMDEFAULTDATE as date) <= 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])
)
)
begin
return 1
end
return 0
end
return 0
end