namespace FrameworkDAL.Query.MessageHub
{
///
/// QueryBuilder for MessageHub
/// Handles MessageHub template resolution
/// EntityId may be positive (business entity)
/// or negative (system/framework entity logic)
///
public static class MessageHubGeneratorQB
{
///
/// Get all active templates + actions for a given EntityId.
/// Handles both positive and negative IDs using MENTITY only.
///
public const string GET_TEMPLATES_BY_ENTITYID = @"SELECT
E.ENTITYID AS EntityId,
E.ENTITYCODE AS EntityCode,
E.ENTITYNAME AS EntityName,
ET.EVENTTYPEID AS EventTypeId,
ET.EVENTTYPECODE AS EventTypeCode,
ET.EVENTTYPENAME AS EventTypeName,
MT.MAILTEMPLATEID AS MailTemplateId,
MT.MAILTEMPLATECODE AS MailTemplateCode,
MT.MAILTEMPLATENAME AS MailTemplateName,
MT.SUBJECT AS Subject,
MT.BODY AS BodyHtml,
A.ACTIONID AS ActionId,
A.ACTIONTYPE AS ActionType,
ETAD.EVENTTYPEACTIONDETAILID AS EventTypeActionDetailId,
ETAD.ISDIRECTCALL AS IsDirectCall,
ETAD.ISSCHEDULERCALL AS IsSchedulerCall
FROM MEVENTTYPE ET
INNER JOIN MENTITY E
ON ET.ENTITYID = E.ENTITYID
AND E.STATUS = 1
INNER JOIN MMAILTEMPLATE MT
ON MT.EVENTTYPEID = ET.EVENTTYPEID
AND MT.STATUS = 1
INNER JOIN MACTION A
ON A.TEMPLATEID = MT.MAILTEMPLATEID
AND A.EVENTTYPEID = ET.EVENTTYPEID
AND A.STATUS = 1
INNER JOIN MEVENTTYPEACTION ETA
ON ETA.EVENTTYPEID = ET.EVENTTYPEID
AND ETA.STATUS = 1
INNER JOIN MEVENTTYPEACTIONDETAIL ETAD
ON ETAD.EVENTTYPEACTIONID = ETA.EVENTTYPEACTIONID
AND ETAD.ACTIONID = A.ACTIONID
AND ETAD.ISACTIVE = 1
WHERE ET.ENTITYID = @EntityId
ORDER BY MT.MAILTEMPLATEID, A.ACTIONID;
";
///
/// Insert message into TMESSAGEHUB
///
public const string INSERT_MESSAGEHUB = @"
INSERT INTO TMESSAGEHUB
(
MESSAGEHUBID,
ACTIONID,
ACTIONTYPE,
MAILTEMPLATEID,
RECIPIENT,
MESSAGETEXT,
DELIVERYSTATUS,
SORTORDER,
STATUS,
VERSION,
SOURCETYPE,
TENANTID,
CREATEDBYID,
CREATEDON,
MODIFIEDBYID,
MODIFIEDON
)
VALUES
(
@MessageHubId,
@ActionId,
@ActionType,
@MailTemplateId,
@Recipient,
@MessageText,
0,
@SortOrder,
1,
1,
@SourceType,
@TenantId,
@CreatedById,
GETDATE(),
@ModifiedById,
GETDATE()
);
";
///
/// Common patch query.
/// Column aliases MUST match template placeholders.
///
public const string GET_MESSAGE_HUB_PATCH_QUERY = @"
SELECT
/* =========================
MUSER
========================= */
U.USERID AS UserId,
U.USERCODE AS UserCode,
U.USERNAME AS UserName,
U.USERLOGINNAME AS UserLoginName,
U.DOB AS UserDateOfBirth,
U.USERTYPE AS UserType,
U.NATURE AS UserNature,
U.SECURITYLEVEL AS UserSecurityLevel,
U.PRIMARYMAIL AS UserPrimaryMail,
U.PRIMARYMOBILE AS UserPrimaryMobile,
U.PRIMARYPHONE AS UserPrimaryPhone,
U.WORKOUID AS UserWorkOUId,
U.WORKPERIODID AS UserWorkPeriodId,
U.WORKPARTYBRANCHID AS UserWorkPartyBranchId,
U.WORKDATE AS UserWorkDate,
U.LASTSUCCESSLOGINON AS UserLastSuccessLoginOn,
U.LASTFAILUREATTEMPTON AS UserLastFailureAttemptOn,
U.TIMEZONEID AS TimeZoneId,
U.LANGUAGEID AS LanguageId,
U.TENANTID AS TenantId,
U.STATUS AS UserStatus,
U.THUMBNAIL AS UserThumbnail,
/* =========================
MEMPLOYEE
========================= */
E.EMPLOYEEID AS EmployeeId,
E.EMPLOYEECODE AS EmployeeCode,
E.EMPLOYEENAME AS EmployeeName,
E.FIRSTNAME AS EmployeeFirstName,
E.MIDDLENAME AS EmployeeMiddleName,
E.LASTNAME AS EmployeeLastName,
E.DEPARTMENTID AS EmployeeDepartmentId,
E.DESIGNATIONID AS EmployeeDesignationId,
E.EMPLOYEETYPEID AS EmployeeTypeId,
E.DATEOFBIRTH AS EmployeeDateOfBirth,
E.DATEOFJOINING AS EmployeeDateOfJoining,
E.PRIMARYEMAILID AS EmployeePrimaryEmail,
E.PRIMARYMOBILE AS EmployeePrimaryMobile,
E.REPORTINGTOEMPLOYEEID AS ReportingToEmployeeId,
E.WORKOUID AS EmployeeWorkOUId,
E.CONTACTID AS EmployeeContactId,
E.STATUS AS EmployeeStatus,
/* =========================
MCONTACT
========================= */
MC.CONTACTID AS ContactId,
MC.NAME AS ContactName,
MC.MAILID AS ContactMailId,
MC.MOBILENO AS ContactMobileNo,
MC.PHONENO AS ContactPhoneNo,
/* =========================
ORGANIZATION UNIT
========================= */
OU.OUID AS OUId,
OU.ORGANIZATIONUNITCODE AS OUCode,
OU.ORGANIZATIONUNITNAME AS OUName,
OU.ORGANIZATIONUNITSHORTNAME AS OUShortName,
OU.COMPANYID AS OUCompanyId,
OU.BRANCHID AS OUBranchId,
OU.DIVISIONID AS OUDivisionId,
OU.CURRENCYID AS OUCurrencyId,
OU.COLORID AS OUColorId,
OU.CALENDARID AS OUCalendarId,
OU.DEFAULTADDRESSID AS OUDefaultAddressId,
OU.STATUS AS OUStatus,
/* =========================
ORGANIZATION GROUP
========================= */
OG.ORGANIZATIONGROUPID AS OrganizationGroupId,
OG.ORGANIZATIONGROUPCODE AS OrganizationGroupCode,
OG.ORGANIZATIONGROUPNAME AS OrganizationGroupName,
OG.STATUS AS OrganizationGroupStatus,
/* =========================
PARTY
========================= */
P.PARTYID AS PartyId,
P.PARTYCODE AS PartyCode,
P.PARTYNAME AS PartyName,
P.PARTYSHORTNAME AS PartyShortName,
P.ISVENDOR AS IsVendor,
P.ISCUSTOMER AS IsCustomer,
P.ISACCOUNT AS IsAccount,
P.CURRENCYID AS PartyCurrencyId,
P.STATUS AS PartyStatus,
/* =========================
PARTY BRANCH
========================= */
PB.PARTYBRANCHID AS PartyBranchId,
PB.PARTYBRANCHCODE AS PartyBranchCode,
PB.PARTYBRANCHNAME AS PartyBranchName,
PB.PARTYBRANCHSHORTNAME AS PartyBranchShortName,
PB.PARTYBRANCHTYPE AS PartyBranchType,
PB.CURRENCYID AS PartyBranchCurrencyId,
PB.CREDITDAYS AS PartyBranchCreditDays,
PB.NOOFBILLS AS PartyBranchNoOfBills,
PB.DEFAULTADDRESSID AS PartyBranchDefaultAddressId,
PB.STATUS AS PartyBranchStatus,
/* =========================
PERIOD
========================= */
PER.PERIODID AS PeriodId,
PER.PERIODCODE AS PeriodCode,
PER.PERIODNAME AS PeriodName,
PER.FROMDATE AS PeriodFromDate,
PER.TODATE AS PeriodToDate,
PER.STATUS AS PeriodStatus,
/* =========================
ADDRESS
========================= */
A.ADDRESSID AS AddressId,
A.ADDRESSLINE1 AS AddressLine1,
A.ADDRESSLINE2 AS AddressLine2,
A.ADDRESSLINE3 AS AddressLine3,
A.ZIPCODE AS ZipCode,
A.PHONE AS AddressPhone,
A.MOBILE AS AddressMobile,
A.GSTIN AS AddressGSTIN,
A.PAN AS AddressPAN,
A.GEOLOCATION AS AddressGeoLocation,
/* =========================
LOCATION
========================= */
L.LOCATIONID AS LocationId,
L.LOCATIONCODE AS LocationCode,
L.LOCATIONNAME AS LocationName,
L.GEOCODE AS LocationGeoCode,
L.GEOLOCATION.STAsText() AS LocationGeoLocation,
L.SHAPETYPE AS LocationShapeType,
L.RADIUS AS LocationRadius,
/* =========================
CITY / STATE / COUNTRY
========================= */
CI.CITYID AS CityId,
CI.CITYCODE AS CityCode,
CI.CITYNAME AS CityName,
S.STATEID AS StateId,
S.STATECODE AS StateCode,
S.STATENAME AS StateName,
CO.COUNTRYID AS CountryId,
CO.COUNTRYCODE AS CountryCode,
CO.COUNTRYNAME AS CountryName,
CO.ISDCODE AS CountryISDCode,
CO.GSTCOUNTRYCODE AS CountryGSTCountryCode,
/* =========================
LATEST CALL (EXTENDED)
========================= */
C.OUID AS CallOUId,
C.BIZTRANSACTIONTYPEID AS CallBizTransactionTypeId,
C.PERIODID AS CallPeriodId,
C.REFERENCENUMBER AS CallReferenceNumber,
C.REFERENCEDATE AS CallReferenceDate,
C.OBJECTTYPEID AS CallObjectTypeId,
C.OBJECTID AS CallObjectId,
C.PARTYID AS CallPartyId,
C.PARTYBRANCHID AS CallPartyBranchId,
C.EMPLOYEEID AS CallEmployeeId,
C.CONTACTID AS CallContactId,
C.ADDRESSID AS CallAddressId,
C.REPORTEDBY AS CallReportedBy,
C.REPORTEDBYID AS CallReportedById,
C.RECEIVEDBYID AS CallReceivedById,
C.CALLRECEIVEDMODE AS CallReceivedMode,
C.CALLTYPEID AS CallTypeId,
C.CALLGENERATIONTYPE AS CallGenerationType,
C.CONTRACTID AS CallContractId,
C.CONTRACTCYCLENUMBER AS CallContractCycleNumber,
C.CALLNATUREID AS CallNatureId,
C.CALLPRIORITYID AS CallPriorityId,
C.PROBLEMDATE AS CallProblemDate,
C.PROBLEMTIME AS CallProblemTime,
C.PROMISSEDDATE AS CallPromisedDate,
C.ALLOTEDTOTYPE AS CallAllotedToType,
C.ALLOTEDTOEMPLOYEEID AS CallAllotedToEmployeeId,
C.ALLOTEDTOCONTACTID AS CallAllotedToContactId,
C.ALLOTEDTOPARTYID AS CallAllotedToPartyId,
C.CALLONOBJECTTYPEID AS CallOnObjectTypeId,
C.CALLONOBJECTID AS CallOnObjectId,
C.CALLONNAME AS CallOnName,
C.COVERAGESTATUS AS CallCoverageStatus,
C.REPORTEDPROBLEM AS CallReportedProblem,
C.ACTIONTAKEN AS CallActionTaken,
C.CUSTOMERREMARKS AS CallCustomerRemarks,
C.PROBLEMNATUREID AS CallProblemNatureId,
C.PLANDATE AS CallPlanDate,
C.POSSIBLEDATE AS CallPossibleDate,
C.ESTIMATEDLABOURAMOUNT AS CallEstimatedLabourAmount,
C.ESTIMATEDSPARESAMOUNT AS CallEstimatedSparesAmount,
C.ESTIMATEDOTHERSAMOUNT AS CallEstimatedOthersAmount,
C.ESTIMATEDTOTALAMOUNT AS CallEstimatedTotalAmount,
C.ESTIMATEDBYID AS CallEstimatedById,
C.LABOURAMOUNT AS CallLabourAmount,
C.SPARESAMOUNT AS CallSpareAmount,
C.OTHERAMOUNT AS CallOtherAmount,
C.TOTALAMOUNT AS CallTotalAmount,
C.PERSONID AS CallPersonId,
C.INDOOROUTDOOR AS CallIndoorOutdoor,
C.ISITEMRECEIVED AS CallIsItemReceived,
C.ITEMRECEIVEDREMARKS AS CallItemReceivedRemarks,
C.ISSTANDBYGIVEN AS CallIsStandbyGiven,
C.STANDBYITEMID AS CallStandbyItemId,
C.STANDBYREMARKS AS CallStandbyRemarks,
C.COMPLETEDBYID AS CallCompletedById,
C.COMPLETEDONTIME AS CallCompletedOnTime,
C.CUSTOMERFEEDBACK AS CallCustomerFeedback,
C.CLOSEDBYID AS CallClosedById,
C.CLOSEDON AS CallClosedOn,
C.CLOSEDONTIME AS CallClosedOnTime,
C.REASONID AS CallReasonId,
C.ISACCOUNTED AS CallIsAccounted,
C.STATUS AS CallRecordStatus,
C.VERSION AS CallVersion,
C.CREATEDBYID AS CallCreatedById,
C.CREATEDON AS CallCreatedOn,
C.MODIFIEDBYID AS CallModifiedById,
C.MODIFIEDON AS CallModifiedOn,
C.ALLOCATIONID AS CallAllocationId,
C.ROOTCAUSEID AS CallRootCauseId,
C.ROOTCAUSEDESCRIPTION AS CallRootCauseDescription,
C.CALLONOBJECTSTATUS AS CallOnObjectStatus,
C.MANUFACTURERSLNO AS CallManufacturerSlNo,
C.ALLOTEDMODE AS CallAllotedMode,
C.ALLOTEDTONUMBER AS CallAllotedToNumber,
C.TEMPLATEDATA AS CallTemplateData,
/* =========================
LATEST VISITOR PASS
========================= */
VP.VISITORPASSID AS VisitorPassId,
VP.PASSNUMBER AS VisitorPassNumber,
VP.PASSDATE AS VisitorPassDate,
VP.VISITORNAME AS VisitorName,
PUNCH.PUNCHINDATE AS VisitorPunchInDate,
PUNCH.PUNCHOUTDATE AS VisitorPunchOutDate
FROM MUSER U
LEFT JOIN MEMPLOYEE E
ON E.EMPLOYEEID = U.USERID
AND E.TENANTID = U.TENANTID
LEFT JOIN MCONTACT MC
ON MC.CONTACTID = E.CONTACTID
LEFT JOIN MORGANIZATIONUNIT OU
ON OU.OUID = E.WORKOUID
LEFT JOIN MORGANIZATIONGROUP OG
ON OG.ORGANIZATIONGROUPID = OU.PERIODGROUP
LEFT JOIN MPARTYBRANCH PB
ON PB.PARTYBRANCHID = U.WORKPARTYBRANCHID
LEFT JOIN MPARTY P
ON P.PARTYID = PB.PARTYID
LEFT JOIN MPERIOD PER
ON PER.PERIODID = U.WORKPERIODID
LEFT JOIN MADDRESS A
ON A.ADDRESSID = PB.DEFAULTADDRESSID
LEFT JOIN MLOCATION L
ON L.LOCATIONID = A.LOCATIONID
LEFT JOIN MCITY CI
ON CI.CITYID = A.CITYID
LEFT JOIN MSTATE S
ON S.STATEID = CI.STATEID
LEFT JOIN MCOUNTRY CO
ON CO.COUNTRYID = CI.COUNTRYID
OUTER APPLY (
SELECT TOP 1 *
FROM TCALL C
WHERE C.EMPLOYEEID = E.EMPLOYEEID
ORDER BY C.CALLDATE DESC
) C
OUTER APPLY (
SELECT TOP 1 *
FROM TVISITORPASS VP
WHERE VP.EMPLOYEEID = E.EMPLOYEEID
ORDER BY VP.PASSDATE DESC
) VP
OUTER APPLY (
SELECT TOP 1 *
FROM TVISITORPUNCH PUNCH
WHERE PUNCH.VISITORPASSID = VP.VISITORPASSID
ORDER BY PUNCH.PUNCHINDATE DESC
) PUNCH
WHERE U.USERID = @userid;
";
}
}