Generated schema reference. Regenerate this page from the SQL unload; keep hand-maintained business notes in the narrative namespace.
CREATE FUNCTION "pears"."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