diff --git a/.changeset/little-ligers-hug.md b/.changeset/little-ligers-hug.md new file mode 100644 index 000000000000..043b234f67f0 --- /dev/null +++ b/.changeset/little-ligers-hug.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/model-typings": patch +--- + +fix: Dept w/o any BH config do not adhere to the default BH rules. diff --git a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Helper.ts b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Helper.ts index bd7ffdfedd43..b2e748356174 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Helper.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Helper.ts @@ -21,9 +21,31 @@ const getAllAgentIdsWithoutDepartment = async (): Promise => { return agentIdsWithoutDepartment; }; +const getAllAgentIdsWithDepartmentNotConnectedToBusinessHour = async (): Promise => { + const activeDepartmentsWithoutBusinessHour = ( + await LivechatDepartment.findActiveDepartmentsWithoutBusinessHour({ + projection: { _id: 1 }, + }).toArray() + ).map((dept) => dept._id); + + const agentIdsWithDepartmentNotConnectedToBusinessHour = await LivechatDepartmentAgents.findAllAgentsConnectedToListOfDepartments( + activeDepartmentsWithoutBusinessHour, + ); + return agentIdsWithDepartmentNotConnectedToBusinessHour; +}; + +const getAllAgentIdsForDefaultBusinessHour = async (): Promise => { + const [withoutDepartment, withDepartmentNotConnectedToBusinessHour] = await Promise.all([ + getAllAgentIdsWithoutDepartment(), + getAllAgentIdsWithDepartmentNotConnectedToBusinessHour(), + ]); + + return [...new Set([...withoutDepartment, ...withDepartmentNotConnectedToBusinessHour])]; +}; + const getAgentIdsToHandle = async (businessHour: Record): Promise => { if (businessHour.type === LivechatBusinessHourTypes.DEFAULT) { - return getAllAgentIdsWithoutDepartment(); + return getAllAgentIdsForDefaultBusinessHour(); } const departmentIds = ( await LivechatDepartment.findEnabledByBusinessHourId(businessHour._id, { diff --git a/apps/meteor/server/models/raw/LivechatDepartment.ts b/apps/meteor/server/models/raw/LivechatDepartment.ts index debe262060fe..75329e3e6125 100644 --- a/apps/meteor/server/models/raw/LivechatDepartment.ts +++ b/apps/meteor/server/models/raw/LivechatDepartment.ts @@ -128,6 +128,14 @@ export class LivechatDepartmentRaw extends BaseRaw implemen return this.find(query, options); } + findActiveDepartmentsWithoutBusinessHour(options: FindOptions): FindCursor { + const query = { + enabled: true, + businessHourId: { $exists: false }, + }; + return this.find(query, options); + } + findEnabledByListOfBusinessHourIdsAndDepartmentIds( businessHourIds: string[], departmentIds: string[], diff --git a/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts b/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts index ace8ee052549..da709ff1136e 100644 --- a/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts +++ b/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts @@ -356,6 +356,10 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw { return this.col.countDocuments({ departmentId }); } + + findAllAgentsConnectedToListOfDepartments(departmentIds: string[]): Promise { + return this.col.distinct('agentId', { departmentId: { $in: departmentIds } }); + } } const isStringValue = (value: any): value is string => typeof value === 'string'; diff --git a/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts b/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts index 081b1071c095..94c824e14f07 100644 --- a/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts +++ b/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts @@ -87,4 +87,5 @@ export interface ILivechatDepartmentAgentsModel extends IBaseModel; replaceUsernameOfAgentByUserId(userId: string, username: string): Promise; countByDepartmentId(departmentId: string): Promise; + findAllAgentsConnectedToListOfDepartments(departmentIds: string[]): Promise; } diff --git a/packages/model-typings/src/models/ILivechatDepartmentModel.ts b/packages/model-typings/src/models/ILivechatDepartmentModel.ts index 31e122e7e1f5..d0f11f2bff95 100644 --- a/packages/model-typings/src/models/ILivechatDepartmentModel.ts +++ b/packages/model-typings/src/models/ILivechatDepartmentModel.ts @@ -23,6 +23,8 @@ export interface ILivechatDepartmentModel extends IBaseModel, ): FindCursor; + findActiveDepartmentsWithoutBusinessHour(options: FindOptions): FindCursor; + addBusinessHourToDepartmentsByIds(ids: string[], businessHourId: string): Promise; removeBusinessHourFromDepartmentsByIdsAndBusinessHourId(ids: string[], businessHourId: string): Promise;