namespace TMSDAL.Query.TrainerProfile
{
///
/// Required Indexes:
/// IX_MTRAINERPROFILE_TENANTID
/// IX_MTRAINERPROFILE_ISACTIVE_TENANTID
///
public static class TrainerProfileQB
{
public const string GET_TRAINER = @"
SELECT
tp.TRAINERID AS TrainerId,
tp.TRAINERCODE AS TrainerCode,
tp.TRAINERNAME AS TrainerName,
tp.TRAINERFULLNAME AS TrainerFullName,
tp.TRAINERTYPE AS TrainerType,
tp.EMPLOYEEID AS EmployeeId,
tp.EXTERNALVENDORID AS ExternalVendorId,
EV.VENDORNAME AS VendorName,
EV.VENDORCODE AS VendorCode,
tp.SPECIALISATIONS AS Specialisations,
tp.QUALIFIEDPROGRAMMEIDS AS QualifiedProgrammeIds,
Prog.ProgrammeCodes AS ProgrammeCode,
Prog.ProgrammeTitles AS ProgrammeTitle,
tp.MAXSESSIONSPERMONTH AS MaxSessionsPerMonth,
tp.EMAIL AS Email,
tp.PHONE AS Phone,
tp.ISACTIVE AS IsActive,
tp.REMARKS AS Remarks,
tp.VERSION AS Version,
tp.STATUS AS Status,
tp.SORTORDER AS SortOrder,
tp.CREATEDBYID AS CreatedById,
tp.CREATEDON AS CreatedOn,
tp.MODIFIEDBYID AS ModifiedById,
tp.MODIFIEDON AS ModifiedOn,
tp.SOURCETYPE AS SourceType,
tp.TENANTID AS TenantId,
tp.CONTACTID AS ContactId,
c.NAME AS ContactName
FROM DBO.MTRAINERPROFILE tp
LEFT JOIN MEXTERNALVENDOR EV
ON EV.VENDORID = tp.EXTERNALVENDORID
LEFT JOIN DBO.MCONTACT c
ON c.CONTACTID = tp.CONTACTID
OUTER APPLY
(
SELECT
STUFF((
SELECT ', ' + TE.PROGRAMMECODE
FROM (
SELECT TRY_CAST(T.N.value('.', 'NVARCHAR(50)') AS INT) AS ProgrammeId
FROM (
SELECT CAST('' + REPLACE(REPLACE(REPLACE(tp.QUALIFIEDPROGRAMMEIDS,'[',''),']',''),',','') + '' AS XML) AS X
WHERE tp.QUALIFIEDPROGRAMMEIDS IS NOT NULL AND tp.QUALIFIEDPROGRAMMEIDS NOT IN ('[]','null','')
) XmlData
CROSS APPLY XmlData.X.nodes('/r/v') AS T(N)
) Ids
LEFT JOIN MTRAININGPROGRAMME TE ON TE.PROGRAMMEID = Ids.ProgrammeId
WHERE TE.PROGRAMMECODE IS NOT NULL
FOR XML PATH('')
), 1, 2, '') AS ProgrammeCodes,
STUFF((
SELECT ', ' + TE.PROGRAMMETITLE
FROM (
SELECT TRY_CAST(T.N.value('.', 'NVARCHAR(50)') AS INT) AS ProgrammeId
FROM (
SELECT CAST('' + REPLACE(REPLACE(REPLACE(tp.QUALIFIEDPROGRAMMEIDS,'[',''),']',''),',','') + '' AS XML) AS X
WHERE tp.QUALIFIEDPROGRAMMEIDS IS NOT NULL AND tp.QUALIFIEDPROGRAMMEIDS NOT IN ('[]','null','')
) XmlData
CROSS APPLY XmlData.X.nodes('/r/v') AS T(N)
) Ids
LEFT JOIN MTRAININGPROGRAMME TE ON TE.PROGRAMMEID = Ids.ProgrammeId
WHERE TE.PROGRAMMETITLE IS NOT NULL
FOR XML PATH('')
), 1, 2, '') AS ProgrammeTitles
) Prog
WHERE tp.TRAINERID = @TrainerId
AND tp.TENANTID = @TenantId;";
public const string SAVE_TRAINER = @"
INSERT INTO DBO.MTRAINERPROFILE
(
TRAINERID,
TRAINERCODE,
TRAINERNAME,
TRAINERFULLNAME,
TRAINERTYPE,
EMPLOYEEID,
EXTERNALVENDORID,
SPECIALISATIONS,
QUALIFIEDPROGRAMMEIDS,
MAXSESSIONSPERMONTH,
EMAIL,
PHONE,
ISACTIVE,
REMARKS,
VERSION,
STATUS,
SORTORDER,
CREATEDBYID,
CREATEDON,
MODIFIEDBYID,
MODIFIEDON,
CONTACTID,
SOURCETYPE,
TENANTID
)
VALUES
(
@TrainerId,
@TrainerCode,
@TrainerName,
@TrainerFullName,
@TrainerType,
@EmployeeId, -- -1 when TrainerType = 1 (External)
@ExternalVendorId, -- -1 when TrainerType = 0 (Internal)
@Specialisations,
@QualifiedProgrammeIds,
@MaxSessionsPerMonth,
@Email,
@Phone,
@IsActive,
@Remarks,
0, -- VERSION always starts at 0 on insert
@Status,
@SortOrder,
@CreatedById,
@CreatedOn,
@ModifiedById,
@ModifiedOn,
@ContactId,
5, -- SOURCETYPE always 5 per table default
@TenantId
)";
public const string UPDATE_TRAINER = @"
UPDATE DBO.MTRAINERPROFILE
SET
TRAINERCODE = @TrainerCode,
TRAINERNAME = @TrainerName,
TRAINERFULLNAME = @TrainerFullName,
TRAINERTYPE = @TrainerType,
EMPLOYEEID = @EmployeeId, -- -1 when TrainerType = 1 (External)
EXTERNALVENDORID = @ExternalVendorId, -- -1 when TrainerType = 0 (Internal)
SPECIALISATIONS = @Specialisations,
QUALIFIEDPROGRAMMEIDS = @QualifiedProgrammeIds,
MAXSESSIONSPERMONTH = @MaxSessionsPerMonth,
EMAIL = @Email,
PHONE = @Phone,
ISACTIVE = @IsActive,
REMARKS = @Remarks,
STATUS = @Status,
SORTORDER = @SortOrder,
CONTACTID = @ContactId,
VERSION = VERSION + 1, -- FIX: increment optimistic concurrency version
MODIFIEDBYID = @ModifiedById,
MODIFIEDON = @ModifiedOn
WHERE TRAINERID = @TrainerId
AND TENANTID = @TenantId";
public const string DELETE_TRAINER = @"
DELETE FROM DBO.MTRAINERPROFILE
WHERE TRAINERID = @TrainerId
AND TENANTID = @TenantId;";
public const string GET_SELECTLIST_TRAINER = @"
SELECT
TRAINERID AS TrainerId,
TRAINERCODE AS TrainerCode,
TRAINERNAME AS TrainerName,
TRAINERFULLNAME AS TrainerFullName
FROM DBO.MTRAINERPROFILE
WHERE ISACTIVE = 0
AND TENANTID = @TenantId
ORDER BY TRAINERFULLNAME;";
// Resolves the logged-in employee's own TrainerId for self-service screens (Trainer Portal) --
// MTRAINERPROFILE.TRAINERID is the ID every TrainerDashboard/TrainerPortal query keys off of,
// NOT the same value space as MEMPLOYEE.EMPLOYEEID, so this lookup is required rather than
// passing login.UserId straight through.
public const string GET_TRAINERID_BY_EMPLOYEEID = @"
SELECT TOP 1 TRAINERID
FROM DBO.MTRAINERPROFILE
WHERE EMPLOYEEID = @EmployeeId
AND ISACTIVE = 0
AND TENANTID = @TenantId;";
public const string GET_TRAINER_LIST = @"
SELECT
tp.TRAINERID AS TrainerId,
tp.TRAINERCODE AS TrainerCode,
tp.TRAINERNAME AS TrainerName,
tp.TRAINERFULLNAME AS TrainerFullName,
tp.TRAINERTYPE AS TrainerType,
tp.EMPLOYEEID AS EmployeeId,
tp.EXTERNALVENDORID AS ExternalVendorId,
EV.VENDORNAME AS VendorName,
EV.VENDORCODE AS VendorCode,
tp.SPECIALISATIONS AS Specialisations,
tp.QUALIFIEDPROGRAMMEIDS AS QualifiedProgrammeIds,
Prog.ProgrammeCodes AS ProgrammeCode,
Prog.ProgrammeTitles AS ProgrammeTitle,
tp.MAXSESSIONSPERMONTH AS MaxSessionsPerMonth,
tp.EMAIL AS Email,
tp.PHONE AS Phone,
tp.ISACTIVE AS IsActive,
tp.REMARKS AS Remarks,
tp.VERSION AS Version,
tp.STATUS AS Status,
tp.SORTORDER AS SortOrder,
tp.CREATEDBYID AS CreatedById,
tp.CREATEDON AS CreatedOn,
tp.MODIFIEDBYID AS ModifiedById,
tp.MODIFIEDON AS ModifiedOn,
tp.SOURCETYPE AS SourceType,
tp.TENANTID AS TenantId,
tp.CONTACTID AS ContactId,
c.NAME AS ContactName
FROM DBO.MTRAINERPROFILE tp
LEFT JOIN MEXTERNALVENDOR EV
ON EV.VENDORID = tp.EXTERNALVENDORID
LEFT JOIN DBO.MCONTACT c
ON c.CONTACTID = tp.CONTACTID
OUTER APPLY
(
SELECT
STUFF((
SELECT ', ' + TE.PROGRAMMECODE
FROM (
SELECT TRY_CAST(T.N.value('.', 'NVARCHAR(50)') AS INT) AS ProgrammeId
FROM (
SELECT CAST('' + REPLACE(REPLACE(REPLACE(tp.QUALIFIEDPROGRAMMEIDS,'[',''),']',''),',','') + '' AS XML) AS X
WHERE tp.QUALIFIEDPROGRAMMEIDS IS NOT NULL AND tp.QUALIFIEDPROGRAMMEIDS NOT IN ('[]','null','')
) XmlData
CROSS APPLY XmlData.X.nodes('/r/v') AS T(N)
) Ids
LEFT JOIN MTRAININGPROGRAMME TE ON TE.PROGRAMMEID = Ids.ProgrammeId
WHERE TE.PROGRAMMECODE IS NOT NULL
FOR XML PATH('')
), 1, 2, '') AS ProgrammeCodes,
STUFF((
SELECT ', ' + TE.PROGRAMMETITLE
FROM (
SELECT TRY_CAST(T.N.value('.', 'NVARCHAR(50)') AS INT) AS ProgrammeId
FROM (
SELECT CAST('' + REPLACE(REPLACE(REPLACE(tp.QUALIFIEDPROGRAMMEIDS,'[',''),']',''),',','') + '' AS XML) AS X
WHERE tp.QUALIFIEDPROGRAMMEIDS IS NOT NULL AND tp.QUALIFIEDPROGRAMMEIDS NOT IN ('[]','null','')
) XmlData
CROSS APPLY XmlData.X.nodes('/r/v') AS T(N)
) Ids
LEFT JOIN MTRAININGPROGRAMME TE ON TE.PROGRAMMEID = Ids.ProgrammeId
WHERE TE.PROGRAMMETITLE IS NOT NULL
FOR XML PATH('')
), 1, 2, '') AS ProgrammeTitles
) Prog
WHERE tp.TENANTID = @TenantId;";
public const string CHECK_DUPLICATE_TRAINER_CODE = @"
SELECT COUNT(1)
FROM DBO.MTRAINERPROFILE
WHERE TRAINERCODE = @TrainerCode
AND TENANTID = @TenantId
AND TRAINERID <> @TrainerId;";
}
}