pears.NetProvTimesheetShiftAdd

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

Original SQL

CREATE PROCEDURE "pears"."NetProvTimesheetShiftAdd"( IN "pWebUserID" CHAR(20),IN "pTempProvTimesheetID" CHAR(20),IN "pshiftdate" CHAR(250),IN "ptimefrom" CHAR(250),IN "ptimeto" CHAR(250),IN "pbreakminutes" CHAR(250) DEFAULT '0',IN "preferencecode" CHAR(20) DEFAULT NULL,IN "ptempshifttypeid" CHAR(2) DEFAULT NULL ) 
RESULT( "pResult" CHAR(250) ) 
// IQXWeb
BEGIN
  DECLARE "newshiftid" CHAR(20);
  DECLARE "userClass" CHAR(20);
  DECLARE "svacancyid" CHAR(20);
  DECLARE "spersonid" CHAR(20);
  DECLARE "splacementid" CHAR(20);
  DECLARE "xdate" DATE;
  DECLARE "xtimefrom" TIME;
  DECLARE "xtimeto" TIME;
  DECLARE "checkstart" DATE;
  DECLARE "checkend" DATE;
  DECLARE LOCAL TEMPORARY TABLE "IDs"(
    "ID" CHAR(20) NULL,
    ) NOT transactional;
  SET "xdate" = "iqxnetstringtodate"("pshiftdate");
  SET "xtimefrom" = "iqxnetstringtotime"("ptimefrom");
  SET "xtimeto" = "iqxnetstringtotime"("ptimeto");
  IF "xdate" IS NULL OR "xtimefrom" IS NULL OR "xtimeto" IS NULL THEN
    SELECT '101:~Missing or invalid date or times';
    RETURN
  END IF;
  IF "trim"("pbreakminutes") = '' THEN
    SET "pbreakminutes" = '0'
  END IF;
  SET "preferencecode" = "nullif"("trim"("ucase"("preferencecode")),'');
  SET "ptempshifttypeid" = "nullif"("trim"("ptempshifttypeid"),'');
  SET "userClass" = (SELECT FIRST "iqxnetuserclassid" FROM "iqxnetuser" WHERE "iqxnetuserid" = "pWebUserID");
  IF "userClass" = 'OWNER' THEN
    INSERT INTO "IDs"( "ID" ) 
      SELECT DISTINCT "s"."divisionid" FROM "iqxnetuser" AS "i" KEY JOIN "staff" AS "s" WHERE "i"."iqxnetuserid" = "pwebuserid";
    IF NOT "ptempprovtimesheetid" = any(SELECT "t"."tempprovtimesheetid" FROM "tempprovtimesheet" AS "t" KEY JOIN "person" AS "p" JOIN "IDs" ON "p"."divisionid" = "IDs"."ID") THEN
      SELECT '99:~Permission denied';
      RETURN
    END IF
  ELSE IF NOT "ptempprovtimesheetid" = any(SELECT "t"."tempprovtimesheetid"
        FROM "tempprovtimesheet" AS "t" KEY JOIN "person" KEY JOIN "pay_employee" KEY JOIN "company" AS "agcomp" KEY JOIN "employment" AS "agemp" KEY JOIN "iqxnetuserlink"
        WHERE "iqxnetuserlink"."iqxnetuserid" = "pwebuserid" UNION
      SELECT "t"."tempprovtimesheetid"
        FROM "tempprovtimesheet" AS "t" KEY JOIN "person" KEY JOIN "iqxnetuserlink"
        WHERE "iqxnetuserlink"."iqxnetuserid" = "pwebuserid" UNION
      SELECT "t"."tempprovtimesheetid" FROM "tempprovtimesheet" AS "t" KEY JOIN "vacancy" KEY JOIN "employment" AS "vacemp" KEY JOIN "company" KEY JOIN "employment" KEY JOIN "iqxnetuserlink"
        WHERE "iqxnetuserlink"."iqxnetuserid" = "pwebuserid") THEN
      SELECT '99:~Permission denied';
      RETURN
    END IF END IF;
  SELECT "vacancyid","personid","placementid","weekmonthstartdate"("period","periodlength"),"weekmonthenddate"("period","periodlength") INTO "svacancyid","spersonid","splacementid","checkstart","checkend" FROM "tempprovtimesheet" WHERE "tempprovtimesheetid" = "ptempprovtimesheetid";
  IF "xdate" < "checkstart" OR "xdate" > "checkend" THEN
    SELECT '102:~Date must be between '+"dateformat"("checkstart",'dd/mm/yyyy')+' and '+"dateformat"("checkend",'dd/mm/yyyy');
    RETURN
  END IF;
  IF "isnull"("IQXNetSwitchValue"("pwebuserid",'SHIFTDATELIMIT'),0) = 1 THEN
    SELECT "p"."vacancyid","e"."personid","p"."placementid","e"."startdate","dateformat"("isnull"("e"."leavedate","dateadd"("year",1,"today"())),'yyyy-mm-dd') INTO "svacancyid","spersonid","splacementid","checkstart","checkend" FROM "tempprovtimesheet" KEY JOIN "placement" AS "p" KEY JOIN "employment" AS "e" WHERE "tempprovtimesheetid" = "ptempprovtimesheetid";
    IF "xdate" NOT BETWEEN "checkstart" AND "checkend" THEN
      SELECT '103:~Date must be between '+"dateformat"("checkstart",'dd/mm/yyyy')+' and '+"dateformat"("checkend",'dd/mm/yyyy');
      RETURN
    END IF END IF;
  SET "newshiftid" = "uniquekey"('');
  INSERT INTO "tempshiftplan"( "TempShiftPlanID","VacancyID","ShiftDate","TimeFrom","TimeTo","BreakMinutes","Description","ReferenceCode",
    "TempShiftTypeID" ) VALUES
    ( "newshiftid","sVacancyID","xdate","xtimefrom","xtimeto","iqxnetstringtointeger"("pbreakminutes"),'Self-booked',"preferencecode","ptempshifttypeid" ) ;
  INSERT INTO "tempshift"( "TempShiftID","VacancyID","PersonID","PlacementID","ShiftDate","TimeFrom","TimeTo","BreakMinutes","State","TempShiftPlanID","ReferenceCode","ClientConfirmed","TempConfirmed","TempShiftTypeID" ) VALUES
    ( "newshiftid","sVacancyID","sPersonID","sPlacementID","xdate","xtimefrom","xtimeto","iqxnetstringtointeger"("pbreakminutes"),'B',"newshiftid","preferencecode",1,1,"ptempshifttypeid" ) ;
  SELECT '0:'+"newshiftid"+'~Success'
END /* DOC
2017-04-03 MHS new proc with tests
2018-02-26 PC IW-381 check shift date between employment start and end dates
2018-07-26 PC include improved error handler
2018-09-05 ET changed back to old way of returning errors, updated error number so that system errors are < 100 and user errors >= 100
2018-10-11 PC IW-705 reverse IW-381
 
Tests:
invalid pWebUserID
valid pWebUserID, pTempProvTimesheetID, invalid dates and times
valid pWebUserID, invalid pTempProvTimesheetID as owner
valid pWebUserID, invalid pTempProvTimesheetID as client
valid pWebUserID, pTempProvTimesheetID, new shift as candidate
 
*/
/* TEST
call NetTestSetup('');
select * from NetProvTimesheetShiftAdd('TEST.CANDIDATE','TEST', '', '' ,'' ,'', 'ref');
expect 101*;
select * from NetProvTimesheetShiftAdd('TEST.OWNER','zzzzzzz', '25/12/2012', '09:00' ,'17:00' ,'', 'ref');
expect 99*;
select * from NetProvTimesheetShiftAdd('TEST.CLIENT','zzzzzzz', '25/12/2012', '09:00' ,'17:00' ,'', 'ref');
expect 99*;
select * from NetProvTimesheetShiftAdd('TEST.CANDIDATE','TEST', '25/12/2012', '09:00' ,'17:00' ,'53', 'testRefXYZ');
expect pResult=102:~Date*;
select shiftdate,timefrom,timeto,breakminutes from tempshiftplan where vacancyid='TEST' and referencecode='testRefXYZ';
expect EOF;
select shiftdate,timefrom,timeto,breakminutes,personid,placementid from tempshift where vacancyid='TEST' and referencecode='testRefXYZ';
expect EOF;
*/
GO
 
COMMENT TO PRESERVE FORMAT ON PROCEDURE "pears"."NetProvTimesheetShiftAdd" IS 
{CREATE PROCEDURE pears."NetProvTimesheetShiftAdd"(IN pWebUserID CHAR(20),IN pTempProvTimesheetID CHAR(20), IN pshiftdate CHAR(250), IN ptimefrom CHAR(250) ,IN ptimeto CHAR(250) ,IN pbreakminutes CHAR(250) DEFAULT '0', IN preferencecode CHAR(20) DEFAULT NULL, IN ptempshifttypeid CHAR(2) DEFAULT NULL)
RESULT(pResult CHAR(250))
// IQXWeb
BEGIN
  DECLARE newshiftid CHAR(20);
  DECLARE userClass CHAR(20);
  DECLARE svacancyid CHAR(20);
  DECLARE spersonid CHAR(20);
  DECLARE splacementid CHAR(20);
  DECLARE xdate DATE;
  DECLARE xtimefrom TIME;
  DECLARE xtimeto TIME;
  DECLARE checkstart DATE;
  DECLARE checkend DATE;
  DECLARE LOCAL TEMPORARY TABLE IDs(
    ID CHAR(20) NULL,
    ) NOT transactional;
  SET xdate=iqxnetstringtodate(pshiftdate);
  SET xtimefrom=iqxnetstringtotime(ptimefrom);
  SET xtimeto=iqxnetstringtotime(ptimeto);
  IF xdate IS NULL OR xtimefrom IS NULL OR xtimeto IS NULL THEN
    SELECT '101:~Missing or invalid date or times';
    RETURN;
  END IF;
  IF TRIM(pbreakminutes) = '' THEN
    SET pbreakminutes='0'
  END IF;
  SET preferencecode=NULLIF(TRIM(ucase(preferencecode)),'');
  SET ptempshifttypeid=NULLIF(TRIM(ptempshifttypeid),'');
  SET userClass=(SELECT FIRST iqxnetuserclassid FROM iqxnetuser WHERE iqxnetuserid = pWebUserID);
  IF userClass = 'OWNER' THEN
    INSERT INTO IDs( ID) 
      SELECT DISTINCT s.divisionid FROM iqxnetuser AS i KEY JOIN staff AS s WHERE i.iqxnetuserid = pwebuserid;
    IF NOT ptempprovtimesheetid = any(SELECT t.tempprovtimesheetid FROM tempprovtimesheet AS t KEY JOIN person AS p JOIN IDs ON p.divisionid = IDs.ID) THEN
        SELECT '99:~Permission denied';
      RETURN
    END IF
  ELSE
    IF NOT ptempprovtimesheetid = any(SELECT t.tempprovtimesheetid
        FROM tempprovtimesheet AS t KEY JOIN person KEY JOIN pay_employee KEY JOIN company AS agcomp KEY JOIN employment AS agemp KEY JOIN iqxnetuserlink
        WHERE iqxnetuserlink.iqxnetuserid = pwebuserid UNION
      SELECT t.tempprovtimesheetid
        FROM tempprovtimesheet AS t KEY JOIN person KEY JOIN iqxnetuserlink
        WHERE iqxnetuserlink.iqxnetuserid = pwebuserid UNION
      SELECT t.tempprovtimesheetid FROM tempprovtimesheet AS t KEY JOIN vacancy KEY JOIN employment AS vacemp KEY JOIN company KEY JOIN employment KEY JOIN iqxnetuserlink
        WHERE iqxnetuserlink.iqxnetuserid = pwebuserid) THEN
        SELECT '99:~Permission denied';
      RETURN
    END IF
  END IF;
  SELECT vacancyid,personid,placementid,weekmonthstartdate(period,periodlength),weekmonthenddate(period,periodlength) INTO svacancyid,spersonid,splacementid,checkstart,checkend FROM tempprovtimesheet WHERE tempprovtimesheetid=ptempprovtimesheetid;
  IF xdate<checkstart OR xdate>checkend THEN
      SELECT '102:~Date must be between '+dateformat(checkstart,'dd/mm/yyyy')+' and '+dateformat(checkend,'dd/mm/yyyy');
    RETURN
  END IF;
  IF isnull(IQXNetSwitchValue(pwebuserid,'SHIFTDATELIMIT'),0) = 1 THEN
    SELECT p.vacancyid,e.personid,p.placementid,e.startdate, dateformat(isnull(e.leavedate,dateadd(YEAR,1,today(*))),'yyyy-mm-dd') INTO svacancyid,spersonid,splacementid,checkstart,checkend FROM tempprovtimesheet KEY JOIN placement p KEY JOIN  employment e WHERE tempprovtimesheetid=ptempprovtimesheetid;
    IF xdate NOT BETWEEN checkstart AND checkend THEN
      SELECT '103:~Date must be between '+dateformat(checkstart,'dd/mm/yyyy')+' and '+dateformat(checkend,'dd/mm/yyyy');
      RETURN
    END IF;
  END IF;
  SET newshiftid=uniquekey('');
  INSERT INTO tempshiftplan( TempShiftPlanID,VacancyID,ShiftDate,TimeFrom,TimeTo,BreakMinutes,Description,ReferenceCode,
    TempShiftTypeID) VALUES
    (newshiftid,sVacancyID,xdate,xtimefrom,xtimeto,iqxnetstringtointeger(pbreakminutes),'Self-booked',preferencecode,ptempshifttypeid);
  INSERT INTO tempshift( TempShiftID,VacancyID,PersonID,PlacementID,ShiftDate,TimeFrom,TimeTo,BreakMinutes,State,TempShiftPlanID,ReferenceCode,ClientConfirmed,TempConfirmed,TempShiftTypeID) VALUES 
  (newshiftid,sVacancyID,sPersonID,sPlacementID,xdate,xtimefrom,xtimeto,iqxnetstringtointeger(pbreakminutes),'B',newshiftid,preferencecode,1,1,ptempshifttypeid); 
  SELECT '0:'+newshiftid+'~Success'
END
 
/* DOC
2017-04-03 MHS new proc with tests
2018-02-26 PC IW-381 check shift date between employment start and end dates
2018-07-26 PC include improved error handler
2018-09-05 ET changed back to old way of returning errors, updated error number so that system errors are < 100 and user errors >= 100
2018-10-11 PC IW-705 reverse IW-381
 
Tests:
    invalid pWebUserID
    valid pWebUserID, pTempProvTimesheetID, invalid dates and times
    valid pWebUserID, invalid pTempProvTimesheetID as owner
    valid pWebUserID, invalid pTempProvTimesheetID as client
    valid pWebUserID, pTempProvTimesheetID, new shift as candidate
 
*/
 
/* TEST
call NetTestSetup('');
select * from NetProvTimesheetShiftAdd('TEST.CANDIDATE','TEST', '', '' ,'' ,'', 'ref');
expect 101*;
select * from NetProvTimesheetShiftAdd('TEST.OWNER','zzzzzzz', '25/12/2012', '09:00' ,'17:00' ,'', 'ref');
expect 99*;
select * from NetProvTimesheetShiftAdd('TEST.CLIENT','zzzzzzz', '25/12/2012', '09:00' ,'17:00' ,'', 'ref');
expect 99*;
select * from NetProvTimesheetShiftAdd('TEST.CANDIDATE','TEST', '25/12/2012', '09:00' ,'17:00' ,'53', 'testRefXYZ');
expect pResult=102:~Date*;
select shiftdate,timefrom,timeto,breakminutes from tempshiftplan where vacancyid='TEST' and referencecode='testRefXYZ';
expect EOF;
select shiftdate,timefrom,timeto,breakminutes,personid,placementid from tempshift where vacancyid='TEST' and referencecode='testRefXYZ';
expect EOF;
*/
}