====== pears.AWRWeeks ======
Generated schema reference. Regenerate this page from the SQL unload; keep hand-maintained business notes in the narrative namespace.
===== Original SQL =====
create function "pears"."AWRWeeks"(
/* Application Maintained Function / Procedure - DO NOT EDIT*/
in @JobMasterID char(20),in @WeekNo integer,in @VacID char(20),in @PersID char(20),in @PlacID char(20),in @ShiftID char(20) )
returns integer
begin
declare @AWRStat integer;
declare @AWRLink char(20);
declare @PersonID char(20);
declare @DirectlyEmployed smallint;
declare @AWRStartPeriod integer;
declare @WkCount integer;
declare @GapCount smallint;
declare @FunctionTimeStamp "datetime";
declare @LastPeriod integer;
declare @OverRide smallint;
declare @OverRideDate date;
declare @ThisPeriodGap smallint;
declare @FirstOne smallint;
-- parameters @VacID, @PersID, @PlacID, @ShiftID not currently used
-- check override AWR start date not set (mainly a testing facility)
if "varexists"('AWRStartPeriod') = 1 then
set @AWRStartPeriod = "AWRStartPeriod"
else set @AWRStartPeriod = "isnull"("weekcontaining"("dateadd"("year",-5,current date)),(select "min"("period") from "payrollcalendar"))
end if;
set @WkCount = 0;
-- check role qualified
if "nullif"(@JobMasterID,'') is not null then
select "AWRStatus","AWRLinkCode","personid","isnull"("OverrideSystem",1),"OverrideDate",
(if exists(select * from "person" as "p" where "p"."personid" = "AWRJobMaster"."Personid" and "isnull"("directlyemployed",0) >= 1) then 1 else 0 endif)
into @AWRStat,@AWRLink,@PersonID,@OverRide,@OverRideDate,@DirectlyEmployed
from "AWRJobMaster" where "AWRJobMasterID" = @JobMasterID;
-- finish if role not qualified or Directly Employed
if @AWRStat = 3 or @DirectlyEmployed = 1 then
return 0
end if;
-- look for override
if @OverRideDate is not null then // nested ifs for performance - prevents function call if not necessary
if @WeekNo >= "weekcontaining"(@OverRideDate) then
if @OverRide = 3 then return 0
elseif @OverRide = 2 then return 15
end if end if end if;
-- count weeks since 6 week gap add 1 for continue 0 for pause stop at 15
set @FunctionTimeStamp = current timestamp;
set @WkCount = 0;
set @GapCount = 0;
set @LastPeriod = @WeekNo;
set @ThisPeriodGap = 0;
set @FirstOne = 1;
-- populate temporary table
insert into "AWRWeekFind"( "AWRJobMasterID","DataGenerated","ThisPeriod","Qual" )
select @JobMasterID,@FunctionTimeStamp,"period","isnull"("qualtype",0)
from "AWRWeeklyDetail"
where "AWRJobmasterid" = any(select "AWRJobMasterID" from "AWRJobMaster" where "AWRLinkCode" = @AWRLink)
and("disregard" = 0 or "disregard" is null) and "period" between @AWRStartPeriod and @WeekNo union all
select @JobMasterID,@FunctionTimeStamp,"period","isnull"("qualtype",0)
from "AWRWeeklyDetail"
where "personid" = @PersonID and("disregard" = 0 or "disregard" is null) and "period" between @AWRStartPeriod and @WeekNo union all
select @JobMasterID,@FunctionTimeStamp,"period","isnull"("qualtype",0)
from "AWRWeeklyDetail"
where "companyid" = any(select "companyid" from "AWRJobMaster" key join "vacancy" key join "employment" where "AWRLinkCode" = @AWRLink) and("disregard" = 0 or "disregard" is null) and "period" between @AWRStartPeriod and @WeekNo;
-- now check results
for "forlab" as "curs" no scroll cursor for
select "ThisPeriod","Qual"
from "AWRWeekFind" where "AWRJobMasterID" = @JobMasterID and "DataGenerated" = @FunctionTimeStamp
order by "ThisPeriod" desc,"Qual" desc for read only
do -- check if we have moved on to a new period, if not we can skip to next record
if "ThisPeriod" <> @LastPeriod or @FirstOne = 1 then
-- Work out the gap since the last record
if "truncnum"(@LastPeriod,-2)/100 = "truncnum"("ThisPeriod",-2)/100 then //same year
set @ThisPeriodGap = @LastPeriod-"ThisPeriod"-1
else //different year
set @ThisPeriodGap = ("datediff"("day","weekmonthenddate"("ThisPeriod",'W'),"weekmonthenddate"(@LastPeriod,'W'))/7)-1
end if;
-- check for 6 week gap since last record and finish if exceeded
if @FirstOne = 1 then
set @ThisPeriodGap = @ThisPeriodGap+1;
set @FirstOne = 0
end if;
if(@GapCount+@ThisPeriodGap >= 6) then
delete from "AWRWeekFind" where "DataGenerated" = @FunctionTimeStamp;
return @WkCount
end if;
-- check the record status
if "Qual" = 2 then //timesheet, other agency work or other continue record found
set @WkCount = @WkCount+1;
set @GapCount = 0
elseif "Qual" = 1 then //pause record found
set @GapCount = @GapCount+@ThisPeriodGap
end if;
-- check for 6 week gap and finish if exceeded
if @GapCount >= 6 then
delete from "AWRWeekFind" where "DataGenerated" = @FunctionTimeStamp;
return @WkCount
end if;
-- stop counting at 15 weeks since qualification
if @WkCount >= 15 then
delete from "AWRWeekFind" where "DataGenerated" = @FunctionTimeStamp;
return @WkCount
end if;
-- set the @lastPeriod ready for moving to next row
set @LastPeriod = "ThisPeriod"
end if end for end if;
delete from "AWRWeekFind" where "DataGenerated" = @FunctionTimeStamp;
return @WkCount
end