database:procedures:pears_wtd_holiday_stat



pears.wtd_holiday_stat

Generated schema reference. Regenerate this page from the SQL unload; keep hand-maintained business notes in the narrative namespace.

COMMENT TO PRESERVE FORMAT ON PROCEDURE "pears"."wtd_holiday_stat" IS 
{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 WHERE -- Wks hol taken in last 12 wks
      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
    END IF
  ELSE -- Not Qualified but still want wksholtaken and wksholoutst in case of negative balances
    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 WHERE -- Weeks hol taken this hol year
    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
}
  • database/procedures/pears_wtd_holiday_stat.txt
  • Last modified: 2026/08/07 19:24
  • by 127.0.0.1