@tiledesk/tiledesk-server 2.9.12 → 2.9.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/package.json +2 -2
- package/routes/faq_kb.js +501 -243
- package/routes/project.js +174 -67
- package/services/projectUserService.js +32 -0
- package/test/faqkbRoute.js +190 -133
- package/test/projectRoute.js +79 -1
package/routes/project.js
CHANGED
@@ -3,10 +3,13 @@ var router = express.Router();
|
|
3
3
|
var Project = require("../models/project");
|
4
4
|
var projectEvent = require("../event/projectEvent");
|
5
5
|
var projectService = require("../services/projectService");
|
6
|
+
var projectUserService = require("../services/projectUserService");
|
6
7
|
|
7
8
|
var Project_user = require("../models/project_user");
|
8
9
|
|
9
10
|
var operatingHoursService = require("../services/operatingHoursService");
|
11
|
+
var Department = require('../models/department');
|
12
|
+
var Group = require('../models/group');
|
10
13
|
|
11
14
|
var winston = require('../config/winston');
|
12
15
|
var roleChecker = require('../middleware/has-role');
|
@@ -20,7 +23,7 @@ var RoleConstants = require("../models/roleConstants");
|
|
20
23
|
var cacheUtil = require('../utils/cacheUtil');
|
21
24
|
var orgUtil = require("../utils/orgUtil");
|
22
25
|
var cacheEnabler = require("../services/cacheEnabler");
|
23
|
-
|
26
|
+
var mongoose = require('mongoose');
|
24
27
|
|
25
28
|
router.post('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], async (req, res) => {
|
26
29
|
|
@@ -881,83 +884,187 @@ router.get('/:projectid/isopen', function (req, res) {
|
|
881
884
|
}
|
882
885
|
});
|
883
886
|
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
887
|
+
|
888
|
+
router.get('/:projectid/users/availables', async (req, res) => {
|
889
|
+
|
890
|
+
let projectid = req.params.projectid;
|
891
|
+
let raw_option = req.query.raw;
|
892
|
+
let dep_id = req.query.department;
|
893
|
+
let isOpen = true;
|
894
|
+
|
895
|
+
winston.debug("(Users Availables) raw_option: " + raw_option);
|
896
|
+
winston.debug("(Users Availables) dep_id: " + dep_id);
|
897
|
+
|
898
|
+
let available_agents_array = [];
|
899
|
+
|
900
|
+
if (!raw_option || raw_option === false) {
|
901
|
+
try {
|
902
|
+
isOpen = await new Promise((resolve, reject) => {
|
903
|
+
operatingHoursService.projectIsOpenNow(projectid, (isOpen, err) => {
|
904
|
+
if (err) reject(err);
|
905
|
+
else resolve(isOpen);
|
906
|
+
});
|
907
|
+
});
|
908
|
+
} catch (err) {
|
909
|
+
wisnton.error("(Users Availables) check operating hours error: ", err);
|
910
|
+
return res.status(500).send({ success: false, msg: err });
|
911
|
+
}
|
912
|
+
}
|
913
|
+
|
914
|
+
if (isOpen === false) {
|
915
|
+
return res.json(available_agents_array);
|
916
|
+
}
|
917
|
+
|
918
|
+
let query = { id_project: projectid, user_available: true, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]} };
|
919
|
+
|
920
|
+
if (dep_id) {
|
921
|
+
let department = await Department.findById(dep_id).catch((err) => {
|
922
|
+
winston.error("(Users Availables) find department error: ", err)
|
923
|
+
return res.status(500).send({ success: false, error: err })
|
924
|
+
})
|
925
|
+
|
926
|
+
if (!department) {
|
927
|
+
winston.error("(Users Availables) department not found")
|
928
|
+
return res.status(404).send({ success: false, error: "Department " + dep_id + " not found" })
|
929
|
+
}
|
930
|
+
|
931
|
+
let group_id = department.id_group;
|
932
|
+
if (group_id) {
|
933
|
+
let group = await Group.findById(group_id).catch((err) => {
|
934
|
+
winston.error("(Users Availables) find group error: ", err)
|
935
|
+
return res.status(500).send({ success: false, error: err })
|
936
|
+
})
|
937
|
+
|
938
|
+
if (!group) {
|
939
|
+
winston.error("(Users Availables) group not found")
|
940
|
+
return res.status(404).send({ success: false, error: "Group " + group_id + " not found" })
|
941
|
+
}
|
942
|
+
|
943
|
+
query.id_user = { $in: group.members.map(id => mongoose.Types.ObjectId(id) )}
|
944
|
+
}
|
945
|
+
}
|
946
|
+
|
947
|
+
winston.debug("(Users Availables) project_users query ", query)
|
948
|
+
Project_user.find(query)
|
949
|
+
.populate('id_user')
|
950
|
+
.exec( async (err, project_users) => {
|
951
|
+
if (err) {
|
952
|
+
winston.debug('PROJECT ROUTES - FINDS AVAILABLES project_users - ERROR: ', err);
|
953
|
+
return res.status(500).send({ success: false, msg: 'Error getting object.' + err});
|
954
|
+
}
|
955
|
+
|
956
|
+
let project = await Project.findById(projectid).catch((err) => {
|
957
|
+
winston.error("find project error: ", err)
|
958
|
+
res.status(500).send({ success: false, error: err })
|
959
|
+
})
|
960
|
+
|
961
|
+
// check on SMART ASSIGNMENT
|
962
|
+
let available_agents = projectUserService.checkAgentsAvailablesWithSmartAssignment(project, project_users);
|
963
|
+
winston.verbose("(Users Availables) available agents after smart assignment check", available_agents);
|
964
|
+
|
965
|
+
if (available_agents) {
|
908
966
|
|
909
|
-
|
910
|
-
|
967
|
+
available_agents_array = [];
|
968
|
+
available_agents.forEach(agent => {
|
969
|
+
//console.log("agent: ", agent);
|
970
|
+
if (agent.id_user) {
|
971
|
+
available_agents_array.push({
|
972
|
+
"id": agent.id_user._id,
|
973
|
+
"pu_id": agent._id,
|
974
|
+
"fullname": agent.id_user.firstname + " " + agent.id_user.lastname,
|
975
|
+
"email": agent.id_user.email,
|
976
|
+
"assigned_request": agent.number_assigned_requests
|
977
|
+
});
|
978
|
+
} else {
|
979
|
+
winston.warn("(Users Availables) agent.id_user is undefined");
|
911
980
|
}
|
912
981
|
});
|
913
|
-
|
914
|
-
|
915
|
-
|
982
|
+
|
983
|
+
winston.debug("(Users Availables) return following available_agents_array", available_agents_array);
|
984
|
+
res.json(available_agents_array);
|
985
|
+
}
|
986
|
+
})
|
916
987
|
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
if (project_user.id_user) {
|
935
|
-
// winston.debug('PROJECT ROUTES - AVAILABLES PROJECT-USER: ', project_user)
|
936
|
-
user_available_array.push({ "id": project_user.id_user._id, "firstname": project_user.id_user.firstname });
|
937
|
-
} else {
|
938
|
-
// winston.debug('PROJECT ROUTES - AVAILABLES PROJECT-USER (else): ', project_user)
|
939
|
-
}
|
940
|
-
});
|
988
|
+
})
|
989
|
+
|
990
|
+
// OLD ENDPOINT for /users/availables
|
991
|
+
//togli questo route da qui e mettilo in altra route
|
992
|
+
// NEW - RETURN THE USER NAME AND THE USER ID OF THE AVAILABLE PROJECT-USER FOR THE PROJECT ID PASSED
|
993
|
+
// router.get('/:projectid/users/availables', function (req, res) {
|
994
|
+
// //winston.debug("PROJECT ROUTES FINDS AVAILABLES project_users: projectid", req.params.projectid);
|
995
|
+
|
996
|
+
// if (req.query.raw && (req.query.raw === true || req.query.raw === 'true')) {
|
997
|
+
// Project_user.find({ id_project: req.params.projectid, user_available: true, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}}).
|
998
|
+
// populate('id_user').
|
999
|
+
// exec(function (err, project_users) {
|
1000
|
+
// if (err) {
|
1001
|
+
// winston.debug('PROJECT ROUTES - FINDS AVAILABLES project_users - ERROR: ', err);
|
1002
|
+
// return res.status(500).send({ success: false, msg: 'Error getting object.' });
|
1003
|
+
// }
|
1004
|
+
// if (project_users) {
|
941
1005
|
|
942
|
-
|
1006
|
+
// user_available_array = [];
|
1007
|
+
// project_users.forEach(project_user => {
|
1008
|
+
// if (project_user.id_user) {
|
1009
|
+
// // winston.debug('PROJECT ROUTES - AVAILABLES PROJECT-USER: ', project_user)
|
1010
|
+
// user_available_array.push({ "id": project_user.id_user._id, "firstname": project_user.id_user.firstname });
|
1011
|
+
// } else {
|
1012
|
+
// // winston.debug('PROJECT ROUTES - AVAILABLES PROJECT-USER (else): ', project_user)
|
1013
|
+
// }
|
1014
|
+
// });
|
943
1015
|
|
944
|
-
|
945
|
-
|
946
|
-
|
1016
|
+
// //winston.debug('ARRAY OF THE AVAILABLE USER ', user_available_array);
|
1017
|
+
// res.json(user_available_array);
|
1018
|
+
// }
|
1019
|
+
// });
|
1020
|
+
// } else {
|
1021
|
+
// operatingHoursService.projectIsOpenNow(req.params.projectid, function (isOpen, err) {
|
1022
|
+
// //winston.debug('P ---> [ OHS ] -> [ PROJECT ROUTES ] -> IS OPEN THE PROJECT: ', isOpen);
|
947
1023
|
|
1024
|
+
// if (err) {
|
1025
|
+
// winston.debug('P ---> [ OHS ] -> [ PROJECT ROUTES ] -> IS OPEN THE PROJECT - EROR: ', err)
|
1026
|
+
// // sendError(err, res);
|
1027
|
+
// return res.status(500).send({ success: false, msg: err });
|
1028
|
+
// } else if (isOpen) {
|
948
1029
|
|
949
|
-
|
950
|
-
|
951
|
-
|
952
|
-
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
|
1030
|
+
// Project_user.find({ id_project: req.params.projectid, user_available: true, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}}).
|
1031
|
+
// populate('id_user').
|
1032
|
+
// exec(function (err, project_users) {
|
1033
|
+
// if (err) {
|
1034
|
+
// winston.debug('PROJECT ROUTES - FINDS AVAILABLES project_users - ERROR: ', err);
|
1035
|
+
// return res.status(500).send({ success: false, msg: 'Error getting object.' });
|
1036
|
+
// }
|
1037
|
+
// if (project_users) {
|
1038
|
+
|
1039
|
+
// user_available_array = [];
|
1040
|
+
// project_users.forEach(project_user => {
|
1041
|
+
// if (project_user.id_user) {
|
1042
|
+
// // winston.debug('PROJECT ROUTES - AVAILABLES PROJECT-USER: ', project_user)
|
1043
|
+
// user_available_array.push({ "id": project_user.id_user._id, "firstname": project_user.id_user.firstname });
|
1044
|
+
// } else {
|
1045
|
+
// // winston.debug('PROJECT ROUTES - AVAILABLES PROJECT-USER (else): ', project_user)
|
1046
|
+
// }
|
1047
|
+
// });
|
1048
|
+
|
1049
|
+
// //winston.debug('ARRAY OF THE AVAILABLE USER ', user_available_array);
|
1050
|
+
|
1051
|
+
// res.json(user_available_array);
|
1052
|
+
// }
|
1053
|
+
// });
|
1054
|
+
|
1055
|
+
|
1056
|
+
// } else {
|
1057
|
+
// // winston.debug('P ---> [ OHS ] -> [ PROJECT ROUTES ] -> IS OPEN THE PRJCT: ', isOpen, ' -> AVAILABLE EMPTY');
|
1058
|
+
// // closed
|
1059
|
+
// user_available_array = [];
|
1060
|
+
// res.json(user_available_array);
|
1061
|
+
// }
|
1062
|
+
// });
|
1063
|
+
// }
|
957
1064
|
|
958
1065
|
|
959
1066
|
|
960
|
-
});
|
1067
|
+
// });
|
961
1068
|
|
962
1069
|
|
963
1070
|
|
@@ -9,6 +9,38 @@ var pendinginvitation = require("../services/pendingInvitationService");
|
|
9
9
|
|
10
10
|
class ProjectUserService {
|
11
11
|
|
12
|
+
checkAgentsAvailablesWithSmartAssignment(project, available_agents) {
|
13
|
+
|
14
|
+
let max_assigned_chat;
|
15
|
+
let available_agents_request = [];
|
16
|
+
|
17
|
+
if (project && project.settings && project.settings.chat_limit_on && project.settings.max_agent_assigned_chat) {
|
18
|
+
max_assigned_chat = project.settings.max_agent_assigned_chat;
|
19
|
+
winston.verbose('[ProjectUserService] max_agent_assigned_chat: ' + max_assigned_chat);
|
20
|
+
} else {
|
21
|
+
winston.verbose('[ProjectUserService] chat_limit_on or max_agent_assigned_chat is undefined');
|
22
|
+
return available_agents
|
23
|
+
}
|
24
|
+
|
25
|
+
if (available_agents.length == 0) {
|
26
|
+
return available_agents_request;
|
27
|
+
}
|
28
|
+
|
29
|
+
for (const aa of available_agents) {
|
30
|
+
let max_assigned_chat_specific_user = max_assigned_chat;
|
31
|
+
if (aa.max_assigned_chat && aa.max_assigned_chat != -1) {
|
32
|
+
max_assigned_chat_specific_user = aa.max_assigned_chat;
|
33
|
+
}
|
34
|
+
winston.verbose("[ProjectUserService] max_assigned_chat_specific_user " + max_assigned_chat_specific_user);
|
35
|
+
|
36
|
+
if (aa.number_assigned_requests < max_assigned_chat_specific_user) {
|
37
|
+
available_agents_request.push(aa);
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
return available_agents_request;
|
42
|
+
|
43
|
+
}
|
12
44
|
|
13
45
|
}
|
14
46
|
var projectUserService = new ProjectUserService();
|