pears.PersonAvailableforPlan

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"."PersonAvailableforPlan" IS 
{CREATE FUNCTION PersonAvailableforPlan 
 
/* Application Maintained Function / Procedure - DO NOT EDIT*/
 
( 
  IN sPersonid CHAR(20),IN dShiftDate DATE,IN tShiftFrom TIME,IN tShiftTo TIME,IN iRecovery SMALLINT,IN iMinutes SMALLINT,
  IN iCheckExplicitlyAvailable SMALLINT,IN departmentid CHAR(2),IN EssentialSkill CHAR(15),IN EssentialSkillGradeID CHAR(10),IN EssentialSkillChoiceList CHAR(100),IN MovingShiftID CHAR(20) ) 
RETURNS CHAR(20)
BEGIN
  DECLARE foundState CHAR(20);
  DECLARE founddigit CHAR(1);
  DECLARE slotfound tinyint;
  DECLARE MustBeKnownAvailable tinyint;
  DECLARE RequiredGradeValue INTEGER;
  DECLARE UpperGradeValue INTEGER;
  DECLARE bExactGrade INTEGER;
  DECLARE MaxGradeValue INTEGER;
  DECLARE checktime TIME;
  DECLARE tloc CHAR(3);
  DECLARE tid CHAR(3);
  DECLARE gtid CHAR(3);
  DECLARE tcid CHAR(4);
  DECLARE i INTEGER;
  SET foundstate = NULL;
  IF spersonid IS NULL THEN
    RETURN NULL
  END IF;
  SET maxgradevalue = 1000000000; -- 1 billion should be safe
  IF "left"(essentialskillgradeid,2) = '==' THEN
    SET bExactGrade = 1;
    SET essentialskillgradeid = SUBSTRING(essentialskillgradeid,3)
  ELSE
    SET bExactGrade = 0
  END IF;
  IF icheckexplicitlyavailable < 0 THEN
    SET mustbeknownavailable = 0;
    IF icheckexplicitlyavailable = -1 THEN
      SET icheckexplicitlyavailable = 1
    ELSE
      SET icheckexplicitlyavailable = 0
    END IF
  ELSE SELECT onlymatchifknownavailable INTO mustbeknownavailable FROM person WHERE personid = spersonid;
    SET mustbeknownavailable = isnull(mustbeknownavailable,0);
    IF mustbeknownavailable = 1 THEN
      SET icheckexplicitlyavailable = 1
    END IF END IF;
  IF LENGTH(isnull(essentialskill,'')) > 2 THEN
    SET i = charindex(';',essentialskill);
    IF i > 0 THEN
      SET tloc = "left"(essentialskill,i-1);
      SET essentialskill = "right"(essentialskill,LENGTH(essentialskill)-i)
    END IF;
    SET i = charindex(';',essentialskill);
    IF i > 0 THEN
      SET tid = "left"(essentialskill,i-1);
      SET essentialskill = "right"(essentialskill,LENGTH(essentialskill)-i)
    END IF;
    SET i = charindex(';',essentialskill);
    IF i > 0 THEN
      SET tcid = "left"(essentialskill,i-1);
      SET gtid = "right"(essentialskill,LENGTH(essentialskill)-i);
      IF TRIM(gtid) = '' THEN
        SET gtid = tid
      END IF
    ELSE SET tcid = essentialskill;
      SET gtid = tid
    END IF;
    IF tloc = 'A' THEN
      SET tloc = string('A',departmentid)
    END IF;
    IF gtid <> tid THEN // gtid contains a single SELECT grade question. The choice VALUE (OR sortorder IF VALUE IS NULL) IS used TO rate the grade
      SELECT isnull(VALUE,sortorder) INTO requiredgradevalue FROM tagchoice WHERE taglocation = tloc AND tagid = gtid AND tagchoiceid = essentialskillgradeid AND isnull(subchoice,0) = 0;
      IF requiredgradevalue IS NULL THEN
        SET requiredgradevalue = 1;
        SET uppergradevalue = maxgradevalue
      ELSE
        IF bExactGrade = 1 THEN
          SET uppergradevalue = requiredgradevalue
        ELSE
          SET uppergradevalue = maxgradevalue
        END IF
      END IF;
      IF NOT EXISTS(SELECT * FROM tagvalue AS v KEY JOIN tagchoice AS c WHERE v.taglocation = tloc AND v.tagid = gtid AND v.id = spersonid AND isnull(c.value,c.sortorder) BETWEEN requiredgradevalue AND uppergradevalue) THEN
        RETURN('Q') // NOT qualified
      END IF;
      SET requiredgradevalue = 1; // Grade CHECK done. The skill selection may be multiple choice - any positive VALUE will do
      SET uppergradevalue = maxgradevalue
    ELSE
      SELECT VALUE INTO requiredgradevalue FROM tagchoice WHERE taglocation = tloc AND tagid = tid AND tagchoiceid = essentialskillgradeid AND subchoice = 1;
      IF requiredgradevalue IS NULL THEN
        SET requiredgradevalue = 1;
        SET uppergradevalue = maxgradevalue
      ELSE
        IF bExactGrade = 1 THEN
          SET uppergradevalue = requiredgradevalue
        ELSE
          SET uppergradevalue = maxgradevalue
        END IF
      END IF
    END IF;
    IF tcid <> '' THEN
      SET essentialskillchoicelist = tcid
    ELSE
      SET essentialskillchoicelist = isnull(essentialskillchoicelist,'')
    END IF;
    while essentialskillchoicelist <> '' loop
      SET i = charindex(';',essentialskillchoicelist);
      IF i = 0 THEN
        SET tcid = essentialskillchoicelist;
        SET essentialskillchoicelist = ''
      ELSE
        SET tcid = "left"(essentialskillchoicelist,i-1);
        SET essentialskillchoicelist = "right"(essentialskillchoicelist,LENGTH(essentialskillchoicelist)-i)
      END IF;
      IF NOT EXISTS(SELECT * FROM tagvalue WHERE taglocation = tloc AND tagid = tid AND tagchoiceid LIKE tcid
          AND id = spersonid AND VALUE BETWEEN requiredgradevalue AND uppergradevalue) THEN
        RETURN('Q') // NOT qualified
      END IF
    END loop END IF;
  SET movingshiftid = isnull(movingshiftid,'');
  // FIRST CHECK FOR ALL DAY unavailability
  SELECT FIRST state INTO foundstate FROM tempshift WHERE state NOT IN( 'A','C' ) AND personid = spersonid AND tempshiftid <> movingshiftid AND shiftdate = dshiftdate AND(timefrom IS NULL OR timeto IS NULL);
  IF foundstate IS NULL THEN // Look FOR non-concurrent employments
    SELECT FIRST 'W' INTO foundstate FROM employment WHERE isnull(concurrent,0) = 0 AND personid = spersonid AND startdate <= dshiftdate AND(leavedate IS NULL OR leavedate >= dshiftdate)
  END IF;
  IF foundstate IS NULL THEN
    IF isnull(iminutes,0) = 0 OR iminutes > 480 OR tshiftto <= tshiftfrom THEN // Do NOT do iterative MATCH FOR overnight shifts
      SET foundstate = personavailableforplaniterate(spersonid,dshiftdate,tshiftfrom,tshiftto,icheckexplicitlyavailable,movingshiftid);
      SET foundstate = personavailableforrecovery(foundstate,sPersonid,dShiftDate,tShiftFrom,tShiftTo,iRecovery,MovingShiftID)
    ELSE
      SET slotfound = 0;
      SET checktime = tshiftto;
      SET tshiftto = CAST(dateadd(MINUTE,iminutes,tshiftfrom) AS TIME);
      iterator: loop
        SET founddigit = personavailableforplaniterate(spersonid,dshiftdate,tshiftfrom,tshiftto,icheckexplicitlyavailable,movingshiftid);
        SET founddigit = personavailableforrecovery(founddigit,sPersonid,dShiftDate,tShiftFrom,tShiftTo,iRecovery,MovingShiftID);
        IF founddigit IS NULL AND slotfound = 0 THEN
          SET foundstate = string('M',dateformat(dshiftdate,'yyyymmdd'),dateformat(tshiftfrom,'hhnn'),dateformat(tshiftto,'hhnn'));
          SET slotfound = 1;
          IF icheckexplicitlyavailable = 0 THEN
            leave iterator
          END IF
        ELSE IF founddigit = 'A' THEN
            SET foundstate = string('A',dateformat(dshiftdate,'yyyymmdd'),dateformat(tshiftfrom,'hhnn'),dateformat(tshiftto,'hhnn'));
            leave iterator
          ELSE IF foundstate IS NULL AND founddigit IN( 'H','U','P','B','W' ) THEN
              SET foundstate = founddigit
            END IF
          END IF END IF;
        SET tshiftfrom = CAST(dateadd(MINUTE,30,tshiftfrom) AS TIME);
        SET tshiftto = CAST(dateadd(MINUTE,30,tshiftto) AS TIME);
        IF tshiftto > checktime OR tshiftto <= tshiftfrom THEN
          leave iterator
        END IF
      END loop iterator
    END IF END IF;
  IF(foundstate IS NULL OR foundstate LIKE 'M%') AND mustbeknownavailable = 1 THEN
    SET foundstate = 'U'
  END IF;
  RETURN foundstate
END
}
  • database/procedures/pears_personavailableforplan.txt
  • Last modified: 2026/08/07 19:24
  • by 127.0.0.1