====== pears.wtd_holiday_stat ====== Generated schema reference. Regenerate this page from the SQL unload; keep hand-maintained business notes in the narrative namespace. ===== Original SQL ===== create function "pears"."wtd_holiday_stat"( in "pid" char(20),in "yr" integer,in "wk" integer,in "Stat" integer ) returns real /* Stat parameter values- 0: 1=qualifies for hol pay (i.e. Stat 1 >= 13), 0=does not qualify 1: Weeks worked this holiday year (if still working or stopped >= last week) 2: As 1 but pre 23/11/99 (3 weeks holiday allowed per annum) 3: As 1 but post 23/11/99 (4 weeks holiday allowed per annum) 11: Average hours worked in last 12 weeks 12: Average weekly pay in last 12 weeks 21: Weeks holiday earned 22: Weeks holiday taken 23: Weeks holiday outstanding 24: Pay in lieu outstanding */ begin declare "sdate" date; declare "wedate" date; declare "wksworked" real; declare "qualifyingwksworked" real; declare "wksworkedpre1199" real; declare "wksworkedpost1199" real; declare "lastweek" integer; declare "twelveweeks" integer; declare "begyrweek" integer; declare "avgpay" real; declare "avghrs" real; declare "wksholearned" real; declare "wksholtaken" real; declare "wksholoutst" real; declare "payinlieu" real; declare "wksholintwelvewks" real; declare "i" integer; declare "d" date; declare "qualified" smallint; set "wedate" = "date"("weekenddate"("yr","wk")); if "wedate" is null then -- Off the range of known weeks return 0 end if; select "min"("startdate") into "sdate" from "pay_employment" where "personid" = "pid" and("enddate" is null or "enddate" >= "wedate"-13); --(still working or stopped >= last week) if "sdate" is null then return 0 end if; set "qualifyingwksworked" = "ceiling"((("wedate"-6)-"sdate")/7); set "sdate" = "getholidayyear"("sdate","wedate"-7); --Does 1/10/1998 threshold, and rolls forward if > 1 year ago set "wksworked" = "ceiling"((("wedate"-6)-"sdate")/7); if "wksworked" <= 0 then return 0 end if; if "qualifyingwksworked" >= 13 then set "qualified" = 1 else set "qualified" = 0 end if; if "stat" = 0 then return "qualified" end if; if "stat" = 1 then return "wksworked" end if; set "d" = "wedate"-6; if "d" > "date"('1999-11-20') then set "d" = "date"('1999-11-20') end if; set "wksworkedpre1199" = "ceiling"(("d"-"sdate")/7); if "wksworkedpre1199" < 0 then set "wksworkedpre1199" = 0 end if; set "wksworkedpost1199" = "wksworked"-"wksworkedpre1199"; if "stat" = 2 then return "wksworkedpre1199" end if; if "stat" = 3 then return "wksworkedpost1199" end if; set "lastweek" = "tempgetweekago"("yr","wk",1); set "twelveweeks" = "tempgetweekago"("yr","wk",12); if "qualified" = 1 then -- Lots of stuff irrelevant if not past the 13 week threshold select "isnull"("sum"("weekstaken"),0) into "wksholintwelvewks" from "pay_holiday" -- Wks hol taken in last 12 wks where "personid" = "pid" and "yearnumber"*100+"weeknumber" between "twelveweeks" and "lastweek"; if "wksholintwelvewks" > 11 then -- Cannot do the 12 week averaging so give up return 0 end if; select "sum"("isnull"("hours",0)+"isnull"("nighthours",0)+"isnull"("othours",0))/(12-"wksholintwelvewks") into "avghrs" from "tempslot" where "personid" = "pid" and "yearnumber"*100+"weeknumber" between "twelveweeks" and "lastweek"; set "avghrs" = "isnull"("avghrs",0); if "stat" = 11 then return "avghrs" end if; select "sum"("isnull"("hours"*"pay",0)+"isnull"("nighthours"*"nightpay",0)+"isnull"("othours"*"otpay",0))/(12-"wksholintwelvewks") into "avgpay" from "tempslot" where "personid" = "pid" and "yearnumber"*100+"weeknumber" between "twelveweeks" and "lastweek"; set "avgpay" = "isnull"("avgpay",0); if "stat" = 12 then return "avgpay" end if; set "wksholearned" = 3*"wksworkedpre1199"/52+4*"wksworkedpost1199"/52; if "stat" = 21 then return "wksholearned" -- Not Qualified but still want wksholtaken and wksholoutst in case of negative balances end if else set "wksholearned" = 0; set "avghrs" = 0; set "avgpay" = 0 end if; select "max"("yearnumber") into "i" from "payrollyear" where("week1friday"-6) <= "sdate"; select "week1friday"-6 into "d" from "payrollyear" where "yearnumber" = "i"; set "begyrweek" = "i"*100+"mod"("sdate"-"d",7)+1; -- The temp week no of the start of this temp''s hol year select "isnull"("sum"("weekstaken"),0) into "wksholtaken" from "pay_holiday" -- Weeks hol taken this hol year where "personid" = "pid" and "yearnumber"*100+"weeknumber" between "begyrweek" and "lastweek"; if "stat" = 22 then return "wksholtaken" end if; set "wksholoutst" = "wksholearned"-"wksholtaken"; if "stat" = 23 then return "wksholoutst" end if; set "payinlieu" = "wksholoutst"*"avgpay"; if "stat" = 24 then return "payinlieu" end if; return 0 end