@tiledesk/tiledesk-server 2.1.4-0.3 → 2.1.4-0.31

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,9 +1,8 @@
1
1
  var express = require('express');
2
2
  var router = express.Router();
3
- var Lead = require("../models/lead");
4
- var LeadConstants = require("../models/leadConstants");
3
+ var Group = require("../models/group");
4
+ var User = require("../models/user");
5
5
  var winston = require('../config/winston');
6
- var leadService = require("../services/leadService");
7
6
  var requestService = require("../services/requestService");
8
7
  var messageService = require("../services/messageService");
9
8
  var MessageConstants = require("../models/messageConstants");
@@ -12,13 +11,6 @@ const uuidv4 = require('uuid/v4');
12
11
 
13
12
 
14
13
 
15
- // curl -v -X POST -H 'Content-Type:application/json' -u andrea.leo@f21.it:123456 -d '{"text":"ciao"}' http://localhost:3000/5f897142c9e7ad9602a744c9/campaigns/
16
- // curl -v -X POST -H 'Content-Type:application/json' -u andrea.leo@f21.it:123456 -d '{"text":"ciao", "leadid":"213213221"}' http://localhost:3000/5f897142c9e7ad9602a744c9/campaigns/
17
-
18
-
19
- // curl -v -X POST -H 'Content-Type:application/json' -u andrea.leo@frontiere21.it:258456 -d '{"text":"ciao", "leadid":"5f8972c82db41c003473cb03"}' https://tiledesk-server-pre.herokuapp.com/5f86c201189063003453a045/campaigns/
20
- // curl -v -X POST -H 'Content-Type:application/json' -u andrea.leo@frontiere21.it:258456 -d '{"text":"ciao", "leadid":"5f8972c82db41c003473cb03", "request_id":"group-123456789112233"}' https://tiledesk-server-pre.herokuapp.com/5f86c201189063003453a045/campaigns/
21
-
22
14
 
23
15
  // this endpoint supports support-group- or groups. this create a conversation for the sender (agent console)
24
16
  router.post('/', function (req, res) {
@@ -27,43 +19,143 @@ router.post('/', function (req, res) {
27
19
 
28
20
  winston.debug(req.body);
29
21
  winston.debug("req.user", req.user);
30
- var request_id = req.body.request_id || 'support-group-'+uuidv4();
31
-
22
+ var request_id = req.body.request_id || 'support-group-' + req.projectid + "-" + uuidv4();
23
+
24
+ // TODO cicla su segment
25
+
26
+
32
27
  // createWithIdAndRequester(request_id, project_user_id, lead_id, id_project, first_text, departmentid, sourcePage, language, userAgent, status, createdBy, attributes, subject, preflight, channel) {
33
- return requestService.createWithIdAndRequester(request_id, req.projectuser._id, req.body.leadid, req.projectid,
34
- req.body.text, req.body.departmentid, req.body.sourcePage,
28
+
29
+ //TODO USE NEW requestService.create()
30
+ return requestService.createWithIdAndRequester(request_id, req.projectuser._id, req.body.leadid, req.projectid,
31
+ req.body.text, req.body.departmentid, req.body.sourcePage,
35
32
  req.body.language, req.body.userAgent, null, req.user._id, req.body.attributes, req.body.subject, true, req.body.channel).then(function (savedRequest) {
36
33
 
37
34
  winston.info("savedRequest", savedRequest);
38
35
 
39
36
  // create(sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata, language, channel_type) {
40
37
  return messageService.create(req.body.sender || req.user._id, req.body.senderFullname || req.user.fullName, savedRequest.request_id, req.body.text,
41
- req.projectid, req.user._id, messageStatus, req.body.attributes, req.body.type, req.body.metadata, req.body.language, MessageConstants.CHANNEL_TYPE.DIRECT, req.body.channel).then(function(savedMessage){
38
+ req.projectid, req.user._id, messageStatus, req.body.attributes, req.body.type, req.body.metadata, req.body.language, MessageConstants.CHANNEL_TYPE.DIRECT, req.body.channel).then(function (savedMessage) {
42
39
  res.json(savedMessage);
43
- });
40
+ });
44
41
 
45
- });
42
+ });
46
43
  });
47
44
 
48
- // curl -v -X POST -H 'Content-Type:application/json' -u andrea.leo@frontiere21.it:258456 -d '{"text":"ciao", "recipient":"5f8972c82db41c003473cb03"}' https://tiledesk-server-pre.herokuapp.com/5f86c201189063003453a045/campaigns/direct
49
- router.post('/direct', function (req, res) {
45
+ router.post('/direct', async function (req, res) {
50
46
 
51
47
  let messageStatus = req.body.status || MessageConstants.CHAT_MESSAGE_STATUS.SENDING;
52
48
 
53
49
  winston.debug(req.body);
54
50
  winston.debug("req.user", req.user);
51
+
52
+ var recipients = [];
53
+
54
+ var recipient = req.body.recipient;
55
+ if (recipient) {
56
+ recipients.push(recipient);
57
+ }
58
+
59
+ // TODO cicla su segment
60
+ var segment_id = req.body.segment_id;
61
+ if (segment_id) {
62
+
63
+ }
64
+
65
+ var group_id = req.body.group_id;
66
+ if (group_id) {
67
+ var group = await Group.findOne({ _id: group_id, id_project: req.projectid }).exec();
68
+ winston.info("group", group);
69
+
70
+ var recipients = group.members;
71
+ // winston.info("members", members);
72
+
73
+
74
+ }
75
+
76
+ winston.info("recipients", recipients);
77
+ winston.info("recipients.length: " + recipients.length);
78
+
79
+ let message = {
80
+ sender: req.body.sender || req.user._id,
81
+ senderFullname: req.body.senderFullname || req.user.fullName,
82
+ recipient: req.body.recipient,
83
+ recipientFullname: req.body.recipientFullname,
84
+ text: req.body.text,
85
+ id_project: req.projectid, // rendilo opzionale?
86
+ createdBy: req.user._id,
87
+ status: messageStatus,
88
+ attributes: req.body.attributes,
89
+ type: req.body.type,
90
+ metadata: req.body.metadata,
91
+ language: req.body.language,
92
+ channel_type: MessageConstants.CHANNEL_TYPE.DIRECT,
93
+ channel: req.body.channel
94
+ };
55
95
 
56
96
 
57
- // create(sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata, language, channel_type) {
58
- return messageService.create(req.body.sender || req.user._id, req.body.senderFullname || req.user.fullName, req.body.recipient, req.body.text,
59
- req.projectid, req.user._id, messageStatus, req.body.attributes, req.body.type, req.body.metadata, req.body.language, MessageConstants.CHANNEL_TYPE.DIRECT, req.body.channel).then(function(savedMessage){
60
- res.json(savedMessage);
61
- });
97
+ if (recipients.length == 0) {
98
+ // return res XXX
99
+ }
100
+
101
+ if (recipients.length == 1) {
102
+ return messageService.save(message).then(function(savedMessage){
103
+ if (req.body.returnobject) {
104
+ return res.json(savedMessage);
105
+ } else {
106
+ return res.json({ success: true });
107
+ }
108
+
109
+ });
110
+ }
111
+
112
+
113
+ var promises = [];
114
+ for (const recipient of recipients) {
115
+ // recipients.forEach( async (recipient) => {
116
+
117
+ // create(sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata, language, channel_type) {
118
+ // var promise = messageService.create(req.body.sender || req.user._id, req.body.senderFullname || req.user.fullName, recipient, req.body.text,
119
+ // req.projectid, req.user._id, messageStatus, req.body.attributes, req.body.type, req.body.metadata, req.body.language, MessageConstants.CHANNEL_TYPE.DIRECT, req.body.channel);
120
+
121
+ winston.info("recipient: " + recipient);
122
+
123
+ message.recipient = recipient;
124
+
125
+ var user = await User.findOne({_id:recipient}).exec();
126
+ winston.info("user", user);
127
+
128
+ message.recipientFullname = user.fullName;
129
+
130
+ var promise = messageService.save(message);
131
+ promises.push(promise);
132
+ // .then(function(savedMessage){
133
+ // result.push(savedMessage);
134
+ // res.json(savedMessage);
135
+ }
136
+ //);
137
+
138
+ Promise.all(promises).then(function (data) {
139
+ if (req.body.returnobject) {
140
+ return res.json(data);
141
+ }
142
+ });
143
+
144
+ if (!req.body.returnobject) {
145
+ return res.json({ success: true });
146
+ }
147
+
148
+
149
+
62
150
 
63
-
64
151
  });
65
152
 
66
153
 
67
154
 
68
155
 
156
+
157
+
158
+
159
+
160
+
69
161
  module.exports = router;
package/routes/faq_kb.js CHANGED
@@ -58,8 +58,15 @@ router.post('/askbot', function (req, res) {
58
58
  }else {
59
59
  query = { "id_project": req.projectid, "id_faq_kb": req.body.id_faq_kb};
60
60
 
61
- query.$text = {"$search": req.body.question};
62
-
61
+ var search_obj = {"$search": req.body.question};
62
+
63
+ if (faq_kb.language) {
64
+ search_obj["$language"] = faq_kb.language;
65
+ }
66
+ query.$text = search_obj;
67
+ winston.info("fulltext search query", query);
68
+
69
+
63
70
  winston.debug('internal ft query: '+ query);
64
71
 
65
72
  Faq.find(query, {score: { $meta: "textScore" } })
@@ -1,41 +1,98 @@
1
1
  var express = require('express');
2
2
 
3
3
  // https://stackoverflow.com/questions/28977253/express-router-undefined-params-with-router-use-when-split-across-files
4
- var router = express.Router();
4
+ var router = express.Router({mergeParams: true});
5
5
 
6
6
  var MessageConstants = require("../models/messageConstants");
7
+ var Message = require("../models/message");
7
8
  var messageService = require("../services/messageService");
8
9
  var winston = require('../config/winston');
10
+ var fastCsv = require("fast-csv");
11
+ var roleChecker = require('../middleware/has-role');
12
+ const { check, validationResult } = require('express-validator');
9
13
 
10
- // curl -v -X POST -H 'Content-Type:application/json' -u andrea.leo@frontiere21.it:258456td -d '{"senderFullname":"Bot","recipient":"USERID", "text":"ciao"}' https://tiledesk-server-pre.herokuapp.com/5f86c201189063003453a045/messages/
11
- // curl -v -X POST -H 'Content-Type:application/json' -u andrea.leo@f21.it:123456 -d '{"senderFullname":"Bot","recipient":"USERID", "text":"ciao"}' http://localhost:3000/609e3fd8e049553972114b88/messages/
12
14
 
13
15
  router.post('/',
16
+ [
17
+ check('recipient').notEmpty(),
18
+ check('recipientFullname').notEmpty(),
19
+ check('text').custom((value, { req }) => {
20
+ winston.debug('validation: '+ value + ' req.body.type ' + req.body.type);
21
+ if (!value && (!req.body.type || req.body.type === "text") ) {
22
+ winston.debug('validation1 ');
23
+ return Promise.reject('Text field is required for messages with type "text"');
24
+ }
25
+ winston.debug('validation2 ');
26
+ return Promise.resolve('validation ok');
27
+ })
28
+ ],
14
29
  async (req, res) => {
15
30
 
16
31
  winston.debug('req.body post message', req.body);
17
32
  winston.debug('req.params: ', req.params);
18
33
  winston.debug('req.params.request_id: ' + req.params.request_id);
19
34
 
20
- let messageStatus = req.body.status || MessageConstants.CHAT_MESSAGE_STATUS.SENDING;
21
35
 
22
- return messageService.create(req.body.sender || req.user._id, req.body.senderFullname || req.user.fullName, req.body.recipient, req.body.text,
23
- req.projectid, req.user._id, messageStatus, req.body.attributes, req.body.type, req.body.metadata, req.body.language, MessageConstants.CHANNEL_TYPE.DIRECT, req.body.channel).then(function(savedMessage){
36
+ const errors = validationResult(req);
37
+ if (!errors.isEmpty()) {
38
+ winston.error("Signup validation error", errors);
39
+ return res.status(422).json({ errors: errors.array() });
40
+ }
41
+ let message = {
42
+ sender: req.body.sender || req.user._id,
43
+ senderFullname: req.body.senderFullname || req.user.fullName,
44
+ recipient: req.body.recipient,
45
+ recipientFullname: req.body.recipientFullname,
46
+ text: req.body.text,
47
+ id_project: req.projectid, // rendilo opzionale?
48
+ createdBy: req.user._id,
49
+ status: MessageConstants.CHAT_MESSAGE_STATUS.SENDING,
50
+ attributes: req.body.attributes,
51
+ type: req.body.type,
52
+ metadata: req.body.metadata,
53
+ language: req.body.language,
54
+ channel_type: req.body.channel_type || MessageConstants.CHANNEL_TYPE.DIRECT,
55
+ channel: req.body.channel
56
+ };
57
+ return messageService.save(message).then(function(savedMessage){
24
58
  res.json(savedMessage);
25
- });
59
+ }).catch(function(err){
60
+ winston.error('Error saving message.', err);
61
+ return res.status(500).send({ success: false, msg: 'Error saving message.', err: err });
62
+ })
26
63
 
27
64
  });
28
65
 
29
66
 
30
- //TODO reenable it with role owner
31
- /*
32
- router.get('/csv', function(req, res) {
33
67
 
34
- return Message.find({id_project: req.projectid}).sort({createdAt: 'asc'}).exec(function(err, messages) {
35
- if (err) return next(err);
36
- res.csv(messages, true);
37
- });
68
+ router.get('/csv', roleChecker.hasRoleOrTypes('owner'), function(req, res) {
69
+
70
+
71
+ const cursor = Message.find({id_project: req.projectid}).select("-channel -attributes -metadata");
72
+
73
+ const transformer = (doc)=> {
74
+ return {
75
+ Id: doc._id,
76
+ Name: doc.fullname,
77
+ Email: doc.email,
78
+ Type: doc.registration_type,
79
+ RegisterOn: doc.registered_on
80
+ };
81
+ }
82
+
83
+ const filename = 'export.csv';
84
+
85
+ res.setHeader('Content-disposition', `attachment; filename=${filename}`);
86
+ res.writeHead(200, { 'Content-Type': 'text/csv' });
87
+
88
+ res.flushHeaders();
89
+
90
+ console.log("fastCsv",fastCsv)
91
+ var csvStream = fastCsv.format({headers: true})//.transform(transformer)
92
+ // var csvStream = fastCsv.createWriteStream({headers: true}).transform(transformer)
93
+ cursor.stream().pipe(csvStream).pipe(res);
94
+
38
95
  });
39
- */
40
96
 
41
- module.exports = router;
97
+
98
+ module.exports = router;
@@ -112,7 +112,7 @@ router.post('/invite', [passport.authenticate(['basic', 'jwt'], { session: false
112
112
  // if ('5ae6c62c61c7d54bf119ac73' == '5ae6c62c61c7d54bf119ac73') {
113
113
 
114
114
  winston.debug('»»»» THE PRJCT-USER ID ', p_user.id_user, ' MATCHES THE FOUND USER-ID', user._id)
115
- winston.debug('»»»» USER IS ALREADY A MEMBER OF THE PROJECT ')
115
+ winston.warn("User " + projectUserId+ " is already a member of the project: " + req.projectid)
116
116
 
117
117
  // cannot use continue or break inside a JavaScript Array.prototype.forEach loop. However, there are other options:
118
118
  throw new Error('User is already a member'); // break
@@ -359,6 +359,37 @@ router.get('/:project_userid', [passport.authenticate(['basic', 'jwt'], { sessio
359
359
  });
360
360
 
361
361
 
362
+ router.get('/users/search', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], async (req, res, next) => {
363
+ winston.info("--> users search ");
364
+
365
+ if (!req.project) {
366
+ return res.status(404).send({ success: false, msg: 'Project not found.' });
367
+ }
368
+
369
+
370
+ let query = {email: req.query.email};
371
+
372
+ winston.info('query: ', query);
373
+
374
+ let user = await User.findOne(query).exec();
375
+ winston.info('user: ', user);
376
+
377
+ if (!user) {
378
+ return res.status(404).send({ success: false, msg: 'Object not found.' });
379
+ }
380
+
381
+
382
+ let project_user = await Project_user.findOne({id_user: user._id, id_project: req.projectid}).exec();
383
+ winston.info('project_user: ', project_user);
384
+
385
+ if (!project_user) {
386
+ return res.status(403).json({msg: "Unauthorized. This is not a your teammate." });
387
+ }
388
+
389
+
390
+ return res.json({_id: user._id});
391
+
392
+ });
362
393
 
363
394
  /**
364
395
  * GET PROJECT-USER BY PROJECT ID AND CURRENT USER ID
@@ -368,6 +399,10 @@ router.get('/:project_userid', [passport.authenticate(['basic', 'jwt'], { sessio
368
399
  router.get('/users/:user_id', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], function (req, res, next) {
369
400
  winston.debug("--> users USER ID ", req.params.user_id);
370
401
 
402
+ if (!req.project) {
403
+ return res.status(404).send({ success: false, msg: 'Project not found.' });
404
+ }
405
+
371
406
  var isObjectId = mongoose.Types.ObjectId.isValid(req.params.user_id);
372
407
  winston.debug("isObjectId:"+ isObjectId);
373
408
 
package/routes/request.js CHANGED
@@ -541,6 +541,37 @@ router.delete('/:requestid', function (req, res) {
541
541
 
542
542
 
543
543
 
544
+
545
+ router.delete('/id/:id', function (req, res) {
546
+
547
+ var projectuser = req.projectuser;
548
+
549
+
550
+ if (projectuser.role != "owner" ) {
551
+ return res.status(403).send({ success: false, msg: 'Unauthorized.' });
552
+ }
553
+
554
+ Request.remove({ _id: req.params.id }, function (err, request) {
555
+ if (err) {
556
+ winston.error('--- > ERROR ', err);
557
+ return res.status(500).send({ success: false, msg: 'Error deleting object.' });
558
+ }
559
+
560
+ if (!request) {
561
+ return res.status(404).send({ success: false, msg: 'Object not found.' });
562
+ }
563
+
564
+ winston.verbose('Request deleted with id: '+ req.params.id );
565
+
566
+ requestEvent.emit('request.delete', request);
567
+
568
+ res.json(request);
569
+
570
+ });
571
+ });
572
+
573
+
574
+
544
575
  router.get('/', function (req, res, next) {
545
576
 
546
577
  winston.debug("req projectid", req.projectid);
@@ -957,51 +988,68 @@ router.get('/csv', function (req, res, next) {
957
988
  }
958
989
 
959
990
 
960
- requests.forEach(function(element) {
961
-
962
- var channel_name = "";
963
- if (element.channel && element.channel.name) {
964
- channel_name = element.channel.name;
965
- }
966
- delete element.channel;
967
- element.channel_name = channel_name;
968
-
969
- var department_name = "";
970
- if (element.department && element.department.name) {
971
- department_name = element.department.name;
972
- }
973
- delete element.department;
974
- element.department_name = department_name;
975
-
976
- var lead_fullname = "";
977
- if (element.lead && element.lead.fullname) {
978
- lead_fullname = element.lead.fullname
979
- }
980
- element.lead_fullname = lead_fullname;
981
-
982
-
983
- var lead_email = "";
984
- if (element.lead && element.lead.email) {
985
- lead_email = element.lead.email
986
- }
987
-
988
- element.lead_email = lead_email;
991
+ requests.forEach(function(element) {
989
992
 
990
- delete element.lead;
993
+ var channel_name = "";
994
+ if (element.channel && element.channel.name) {
995
+ channel_name = element.channel.name;
996
+ }
997
+ delete element.channel;
998
+ element.channel_name = channel_name;
991
999
 
992
- delete element.attributes;
1000
+ var department_name = "";
1001
+ if (element.department && element.department.name) {
1002
+ department_name = element.department.name;
1003
+ }
1004
+ delete element.department;
1005
+ element.department_name = department_name;
993
1006
 
994
- delete element.notes;
1007
+ var lead_fullname = "";
1008
+ if (element.lead && element.lead.fullname) {
1009
+ lead_fullname = element.lead.fullname
1010
+ }
1011
+ element.lead_fullname = lead_fullname;
995
1012
 
996
- delete element.tags;
997
1013
 
998
- delete element.channelOutbound;
1014
+ var lead_email = "";
1015
+ if (element.lead && element.lead.email) {
1016
+ lead_email = element.lead.email
1017
+ }
1018
+
1019
+ element.lead_email = lead_email;
999
1020
 
1000
- delete element.location;
1021
+ var tags = [];
1022
+ var tagsString = "";
1023
+ if (element.tags && element.tags.length>0) {
1001
1024
 
1025
+ element.tags.forEach(function(tag) {
1026
+ // tags = tags + tag.tag + ", ";
1027
+ tags.push(tag.tag);
1028
+ });
1029
+ }
1030
+ tagsString = tags.join(", ")
1002
1031
 
1003
- // TODO print also lead. use a library to flattize
1004
- });
1032
+ winston.debug('tagsString ' +tagsString)
1033
+
1034
+ element.tags = tagsString;
1035
+
1036
+ delete element.lead;
1037
+
1038
+ delete element.attributes;
1039
+
1040
+ delete element.notes;
1041
+
1042
+ // delete element.tags;
1043
+
1044
+ delete element.channelOutbound;
1045
+
1046
+ delete element.location;
1047
+
1048
+ delete element.snapshot;
1049
+
1050
+
1051
+ // TODO print also lead. use a library to flattize
1052
+ });
1005
1053
 
1006
1054
  winston.debug('REQUEST ROUTE - REQUEST AS CSV', requests);
1007
1055
 
@@ -0,0 +1,30 @@
1
+ var express = require('express');
2
+
3
+ var router = express.Router();
4
+
5
+ var Request = require("../models/request");
6
+ var winston = require('../config/winston');
7
+
8
+ // https://tiledesk-server-pre.herokuapp.com/requests_util/lookup/id_project/support-group-60ffe291f725db00347661ef-b4cb6875785c4a23b27244fe498eecf4
9
+ router.get('/lookup/id_project/:request_id', function(req, res) {
10
+ winston.info("lookup: "+req.params.request_id);
11
+
12
+ return Request.findOne({request_id: req.params.request_id}).select("id_project").exec(function(err, request) {
13
+ if (err) {
14
+ return res.status(500).send({success: false, msg: 'Error creating message', err:err });
15
+ }
16
+ if (!request) {
17
+ return res.status(404).send({success: false, msg: "Request with " + req.params.request_id + " not found" });
18
+ }
19
+ winston.info("request",request);
20
+ res.json({id_project: request.id_project});
21
+ });
22
+
23
+ });
24
+
25
+
26
+ module.exports = router;
27
+
28
+
29
+
30
+
@@ -77,11 +77,11 @@ roundRobin(operatorSelectedEvent) {
77
77
 
78
78
  // db.getCollection('requests').find({id_project: "5c12662488379d0015753c49", participants: { $exists: true, $ne: [] }}).sort({_id:-1}).limit(1)
79
79
 
80
- // https://stackoverflow.com/questions/14789684/find-mongodb-records-where-array-field-is-not-empty
80
+ // https://stackoverflow.com/questions/14789684/find-mongodb-records-where-array-field-is-not-empty
81
81
  let query = {id_project: operatorSelectedEvent.id_project,
82
82
  hasBot:false, preflight:false, status: { $gt: 100 },
83
83
  participants: { $exists: true, $ne: [] }};
84
-
84
+
85
85
  winston.debug('query', query);
86
86
 
87
87
  // let lastRequests = await
@@ -96,6 +96,7 @@ roundRobin(operatorSelectedEvent) {
96
96
  winston.debug('lastRequests',lastRequests);
97
97
 
98
98
  if (lastRequests.length==0) {
99
+ winston.debug('roundRobin lastRequest not found. fall back to random info',operatorSelectedEvent);
99
100
  winston.verbose('roundRobin lastRequest not found. fall back to random');
100
101
  //first request use default random algoritm
101
102
  // return 0;
@@ -123,7 +124,7 @@ roundRobin(operatorSelectedEvent) {
123
124
  if (operatorSelectedEvent.available_agents && operatorSelectedEvent.available_agents.length==0) {
124
125
  winston.debug('operatorSelectedEvent.available_agents empty ', operatorSelectedEvent.available_agents);
125
126
  return resolve(operatorSelectedEvent);
126
- }
127
+ }
127
128
 
128
129
  // https://stackoverflow.com/questions/15997879/get-the-index-of-the-object-inside-an-array-matching-a-condition
129
130
  let lastOperatorIndex = operatorSelectedEvent.available_agents.findIndex(projectUser => projectUser.id_user.toString() === lastOperatorId);
@@ -135,6 +136,9 @@ roundRobin(operatorSelectedEvent) {
135
136
 
136
137
  winston.debug('lastOperatorIndex: ' + lastOperatorIndex);
137
138
 
139
+ winston.debug('operatorSelectedEvent.available_agents: ', operatorSelectedEvent.available_agents);
140
+
141
+
138
142
  let nextOperator = that.nextOperator(operatorSelectedEvent.available_agents, lastOperatorIndex);
139
143
 
140
144
 
@@ -210,8 +214,8 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
210
214
  }
211
215
  // console.log("department", department);
212
216
  if (!department) {
213
- winston.error("Department not found for query ", query);
214
- return reject({ success: false, msg: 'Department not found.' });
217
+ winston.error("Department not found for projectid: "+ projectid +" for query: ", query, context);
218
+ return reject({ success: false, msg: 'Department not found for projectid: '+ projectid +' for query: ' + JSON.stringify(query) });
215
219
  }
216
220
  // console.log('OPERATORS - »»» DETECTED ROUTING ', department.routing)
217
221
  // console.log('OPERATORS - »»» DEPARTMENT - ID BOT ', department.id_bot)