@tiledesk/tiledesk-server 2.9.26 → 2.9.28
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 +9 -0
- package/package.json +2 -2
- package/pubmodules/pubModulesManager.js +41 -41
- package/pubmodules/routing-queue/listenerQueued.js +72 -27
- package/routes/faq_kb.js +1 -1
- package/routes/kb.js +2 -1
- package/routes/message.js +55 -50
- package/routes/request.js +581 -47
- package/routes/users.js +4 -7
- package/services/QuoteManager.js +104 -16
- package/services/emailService.js +11 -2
- package/services/operatingHoursService.js +1 -0
- package/services/projectService.js +21 -0
- package/services/requestService.js +344 -9
- package/template/email/redirectToDesktopEmail.html +2 -2
- package/test/mock/projectMock.js +29 -1
- package/test/projectRoute.js +86 -3
- package/test/quoteManager.js +77 -5
- package/test/requestRoute.js +42 -0
- package/websocket/webSocketServer.js +1 -1
package/routes/request.js
CHANGED
|
@@ -901,17 +901,19 @@ router.get('/', function (req, res, next) {
|
|
|
901
901
|
var skip = page * limit;
|
|
902
902
|
winston.debug('REQUEST ROUTE - SKIP PAGE ', skip);
|
|
903
903
|
|
|
904
|
+
let statusArray = [];
|
|
904
905
|
|
|
905
906
|
var query = { "id_project": req.projectid, "status": { $lt: 1000 }, preflight: false };
|
|
906
907
|
|
|
908
|
+
|
|
907
909
|
var projectuser = req.projectuser;
|
|
908
910
|
|
|
909
911
|
|
|
910
912
|
if (req.user instanceof Subscription) {
|
|
911
913
|
//all request
|
|
912
914
|
} else if (projectuser && (projectuser.role == "owner" || projectuser.role == "admin")) {
|
|
913
|
-
//all request
|
|
914
|
-
// per uni mostrare solo quelle
|
|
915
|
+
// all request
|
|
916
|
+
// per uni mostrare solo quelle proprie quindi solo participants
|
|
915
917
|
if (req.query.mine) {
|
|
916
918
|
query["$or"] = [{ "snapshot.agents.id_user": req.user.id }, { "participants": req.user.id }];
|
|
917
919
|
}
|
|
@@ -919,9 +921,6 @@ router.get('/', function (req, res, next) {
|
|
|
919
921
|
query["$or"] = [{ "snapshot.agents.id_user": req.user.id }, { "participants": req.user.id }];
|
|
920
922
|
}
|
|
921
923
|
|
|
922
|
-
// console.log('REQUEST ROUTE - req ', req);
|
|
923
|
-
// console.log('REQUEST ROUTE - req.project ', req.project);
|
|
924
|
-
|
|
925
924
|
|
|
926
925
|
if (req.query.dept_id) {
|
|
927
926
|
query.department = req.query.dept_id;
|
|
@@ -937,19 +936,43 @@ router.get('/', function (req, res, next) {
|
|
|
937
936
|
query.$text = { "$search": req.query.full_text };
|
|
938
937
|
}
|
|
939
938
|
|
|
940
|
-
var history_search = false;
|
|
939
|
+
var history_search = false; // ? serve ancora?
|
|
940
|
+
|
|
941
|
+
// if (req.query.status) {
|
|
942
|
+
// winston.debug('req.query.status', req.query.status);
|
|
943
|
+
// query.status = req.query.status;
|
|
944
|
+
|
|
945
|
+
// if (req.query.status == 1000 || req.query.status == "1000") {
|
|
946
|
+
// history_search = true;
|
|
947
|
+
// }
|
|
948
|
+
// if (req.query.status === "all") {
|
|
949
|
+
// history_search = true;
|
|
950
|
+
// delete query.status;
|
|
951
|
+
// }
|
|
952
|
+
// }
|
|
941
953
|
|
|
942
954
|
if (req.query.status) {
|
|
943
|
-
winston.debug('req.query.status', req.query.status);
|
|
944
|
-
query.status = req.query.status;
|
|
945
955
|
|
|
946
|
-
if (req.query.status
|
|
947
|
-
history_search = true;
|
|
948
|
-
}
|
|
949
|
-
if (req.query.status === "all") {
|
|
950
|
-
history_search = true;
|
|
956
|
+
if (req.query.status === 'all') {
|
|
951
957
|
delete query.status;
|
|
958
|
+
} else {
|
|
959
|
+
let statusArray = req.query.status.split(',').map(Number);
|
|
960
|
+
statusArray = statusArray.map(status => { return isNaN(status) ? null : status }).filter(status => status !== null)
|
|
961
|
+
if (statusArray.length > 0) {
|
|
962
|
+
query.status = {
|
|
963
|
+
$in: statusArray
|
|
964
|
+
}
|
|
965
|
+
} else {
|
|
966
|
+
delete query.status;
|
|
967
|
+
}
|
|
952
968
|
}
|
|
969
|
+
|
|
970
|
+
if (statusArray.length > 0) {
|
|
971
|
+
query.status = {
|
|
972
|
+
$in: statusArray
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
|
|
953
976
|
}
|
|
954
977
|
|
|
955
978
|
if (req.query.lead) {
|
|
@@ -988,6 +1011,11 @@ router.get('/', function (req, res, next) {
|
|
|
988
1011
|
query.ticket_id = req.query.ticket_id;
|
|
989
1012
|
}
|
|
990
1013
|
|
|
1014
|
+
if (req.query.preflight && (req.query.preflight === 'true' || req.query.preflight === true)) {
|
|
1015
|
+
//query.preflight = req.query.preflight;
|
|
1016
|
+
delete query.preflight;
|
|
1017
|
+
}
|
|
1018
|
+
|
|
991
1019
|
// if (req.query.request_id) {
|
|
992
1020
|
// console.log('req.query.request_id', req.query.request_id);
|
|
993
1021
|
// query.request_id = req.query.request_id;
|
|
@@ -1238,6 +1266,376 @@ router.get('/', function (req, res, next) {
|
|
|
1238
1266
|
|
|
1239
1267
|
});
|
|
1240
1268
|
|
|
1269
|
+
// router.get('/', function (req, res, next) {
|
|
1270
|
+
|
|
1271
|
+
// const startExecTime = new Date();
|
|
1272
|
+
|
|
1273
|
+
// winston.debug("req projectid", req.projectid);
|
|
1274
|
+
// winston.debug("req.query.sort", req.query.sort);
|
|
1275
|
+
// winston.debug('REQUEST ROUTE - QUERY ', req.query)
|
|
1276
|
+
|
|
1277
|
+
// const DEFAULT_LIMIT = 40;
|
|
1278
|
+
|
|
1279
|
+
// var limit = DEFAULT_LIMIT; // Number of request per page
|
|
1280
|
+
|
|
1281
|
+
// if (req.query.limit) {
|
|
1282
|
+
// limit = parseInt(req.query.limit);
|
|
1283
|
+
// }
|
|
1284
|
+
// if (limit > 100) {
|
|
1285
|
+
// limit = DEFAULT_LIMIT;
|
|
1286
|
+
// }
|
|
1287
|
+
|
|
1288
|
+
|
|
1289
|
+
// var page = 0;
|
|
1290
|
+
|
|
1291
|
+
// if (req.query.page) {
|
|
1292
|
+
// page = req.query.page;
|
|
1293
|
+
// }
|
|
1294
|
+
|
|
1295
|
+
// var skip = page * limit;
|
|
1296
|
+
// winston.debug('REQUEST ROUTE - SKIP PAGE ', skip);
|
|
1297
|
+
|
|
1298
|
+
|
|
1299
|
+
// var query = { "id_project": req.projectid, "status": { $lt: 1000 }, preflight: false };
|
|
1300
|
+
|
|
1301
|
+
// var projectuser = req.projectuser;
|
|
1302
|
+
|
|
1303
|
+
|
|
1304
|
+
// if (req.user instanceof Subscription) {
|
|
1305
|
+
// //all request
|
|
1306
|
+
// } else if (projectuser && (projectuser.role == "owner" || projectuser.role == "admin")) {
|
|
1307
|
+
// //all request
|
|
1308
|
+
// // per uni mostrare solo quelle priprio quindi solo participants
|
|
1309
|
+
// if (req.query.mine) {
|
|
1310
|
+
// query["$or"] = [{ "snapshot.agents.id_user": req.user.id }, { "participants": req.user.id }];
|
|
1311
|
+
// }
|
|
1312
|
+
// } else {
|
|
1313
|
+
// query["$or"] = [{ "snapshot.agents.id_user": req.user.id }, { "participants": req.user.id }];
|
|
1314
|
+
// }
|
|
1315
|
+
|
|
1316
|
+
// // console.log('REQUEST ROUTE - req ', req);
|
|
1317
|
+
// // console.log('REQUEST ROUTE - req.project ', req.project);
|
|
1318
|
+
|
|
1319
|
+
|
|
1320
|
+
// if (req.query.dept_id) {
|
|
1321
|
+
// query.department = req.query.dept_id;
|
|
1322
|
+
// winston.debug('REQUEST ROUTE - QUERY DEPT ID', query.department);
|
|
1323
|
+
// }
|
|
1324
|
+
|
|
1325
|
+
// if (req.query.requester_email) {
|
|
1326
|
+
// query["snapshot.lead.email"] = req.query.requester_email;
|
|
1327
|
+
// }
|
|
1328
|
+
|
|
1329
|
+
// if (req.query.full_text) {
|
|
1330
|
+
// winston.debug('req.query.fulltext', req.query.full_text);
|
|
1331
|
+
// query.$text = { "$search": req.query.full_text };
|
|
1332
|
+
// }
|
|
1333
|
+
|
|
1334
|
+
// var history_search = false;
|
|
1335
|
+
|
|
1336
|
+
// if (req.query.status) {
|
|
1337
|
+
// winston.debug('req.query.status', req.query.status);
|
|
1338
|
+
// query.status = req.query.status;
|
|
1339
|
+
|
|
1340
|
+
// if (req.query.status == 1000 || req.query.status == "1000") {
|
|
1341
|
+
// history_search = true;
|
|
1342
|
+
// }
|
|
1343
|
+
// if (req.query.status === "all") {
|
|
1344
|
+
// history_search = true;
|
|
1345
|
+
// delete query.status;
|
|
1346
|
+
// }
|
|
1347
|
+
// }
|
|
1348
|
+
|
|
1349
|
+
// if (req.query.lead) {
|
|
1350
|
+
// winston.debug('req.query.lead', req.query.lead);
|
|
1351
|
+
// query.lead = req.query.lead;
|
|
1352
|
+
// }
|
|
1353
|
+
|
|
1354
|
+
// // USERS & BOTS
|
|
1355
|
+
// if (req.query.participant) {
|
|
1356
|
+
// winston.debug('req.query.participant', req.query.participant);
|
|
1357
|
+
// query.participants = req.query.participant;
|
|
1358
|
+
// }
|
|
1359
|
+
|
|
1360
|
+
// winston.debug('req.query.hasbot', req.query.hasbot);
|
|
1361
|
+
// if (req.query.hasbot != undefined) {
|
|
1362
|
+
// winston.debug('req.query.hasbot', req.query.hasbot);
|
|
1363
|
+
// query.hasBot = req.query.hasbot;
|
|
1364
|
+
// }
|
|
1365
|
+
|
|
1366
|
+
// // if (req.query.waiting_time_exists) { //non basta aggiungi anche che nn è null
|
|
1367
|
+
// // query.waiting_time = {"$exists": req.query.waiting_time_exists} //{$ne:null}
|
|
1368
|
+
// // winston.debug('REQUEST ROUTE - QUERY waiting_time_exists', query.waiting_time_exists);
|
|
1369
|
+
// // }
|
|
1370
|
+
|
|
1371
|
+
|
|
1372
|
+
// if (req.query.tags) {
|
|
1373
|
+
// winston.debug('req.query.tags', req.query.tags);
|
|
1374
|
+
// query["tags.tag"] = req.query.tags;
|
|
1375
|
+
// }
|
|
1376
|
+
|
|
1377
|
+
// if (req.query.location) {
|
|
1378
|
+
// query.location = req.query.location;
|
|
1379
|
+
// }
|
|
1380
|
+
|
|
1381
|
+
// if (req.query.ticket_id) {
|
|
1382
|
+
// query.ticket_id = req.query.ticket_id;
|
|
1383
|
+
// }
|
|
1384
|
+
|
|
1385
|
+
// if (req.query.preflight) {
|
|
1386
|
+
// query.preflight = req.query.preflight;
|
|
1387
|
+
// }
|
|
1388
|
+
|
|
1389
|
+
// // if (req.query.request_id) {
|
|
1390
|
+
// // console.log('req.query.request_id', req.query.request_id);
|
|
1391
|
+
// // query.request_id = req.query.request_id;
|
|
1392
|
+
// // }
|
|
1393
|
+
|
|
1394
|
+
// /**
|
|
1395
|
+
// **! *** DATE RANGE USECASE 1 ***
|
|
1396
|
+
// * in the tiledesk dashboard's HISTORY PAGE
|
|
1397
|
+
// * WHEN THE TRIAL IS EXIPIRED OR THE SUBSCIPTION IS NOT ACTIVE
|
|
1398
|
+
// * THE SEARCH FOR DATE INTERVAL OF THE HISTORY OF REQUESTS ARE DISABLED AND
|
|
1399
|
+
// * ARE DISPLAYED ONLY THE REQUESTS OF THE LAST 14 DAYS
|
|
1400
|
+
// */
|
|
1401
|
+
// //fixato. secondo me qui manca un parentesi tonda per gli or
|
|
1402
|
+
// if (history_search === true && req.project && req.project.profile && ((req.project.profile.type === 'free' && req.project.trialExpired === true) || (req.project.profile.type === 'payment' && req.project.isActiveSubscription === false))) {
|
|
1403
|
+
|
|
1404
|
+
|
|
1405
|
+
// var startdate = moment().subtract(14, "days").format("YYYY-MM-DD");
|
|
1406
|
+
|
|
1407
|
+
// var enddate = moment().format("YYYY-MM-DD");
|
|
1408
|
+
|
|
1409
|
+
// winston.debug('»»» REQUEST ROUTE - startdate ', startdate);
|
|
1410
|
+
// winston.debug('»»» REQUEST ROUTE - enddate ', enddate);
|
|
1411
|
+
|
|
1412
|
+
// var enddatePlusOneDay = moment(new Date()).add(1, 'days').toDate()
|
|
1413
|
+
// winston.debug('»»» REQUEST ROUTE - enddate + 1 days: ', enddatePlusOneDay);
|
|
1414
|
+
|
|
1415
|
+
// // var enddatePlusOneDay = "2019-09-17T00:00:00.000Z"
|
|
1416
|
+
|
|
1417
|
+
// query.createdAt = { $gte: new Date(Date.parse(startdate)).toISOString(), $lte: new Date(enddatePlusOneDay).toISOString() }
|
|
1418
|
+
// winston.debug('REQUEST ROUTE - QUERY CREATED AT ', query.createdAt);
|
|
1419
|
+
|
|
1420
|
+
// }
|
|
1421
|
+
|
|
1422
|
+
// /**
|
|
1423
|
+
// **! *** DATE RANGE USECASE 2 ***
|
|
1424
|
+
// * in the tiledesk dashboard's HISTORY PAGE
|
|
1425
|
+
// * WHEN THE USER SEARCH FOR DATE INTERVAL OF THE HISTORY OF REQUESTS
|
|
1426
|
+
// */
|
|
1427
|
+
// if (req.query.start_date && req.query.end_date) {
|
|
1428
|
+
// winston.debug('REQUEST ROUTE - REQ QUERY start_date ', req.query.start_date);
|
|
1429
|
+
// winston.debug('REQUEST ROUTE - REQ QUERY end_date ', req.query.end_date);
|
|
1430
|
+
|
|
1431
|
+
// /**
|
|
1432
|
+
// * USING TIMESTAMP in MS */
|
|
1433
|
+
// // var formattedStartDate = new Date(+req.query.start_date);
|
|
1434
|
+
// // var formattedEndDate = new Date(+req.query.end_date);
|
|
1435
|
+
// // query.createdAt = { $gte: formattedStartDate, $lte: formattedEndDate }
|
|
1436
|
+
|
|
1437
|
+
// /**
|
|
1438
|
+
// * USING MOMENT */
|
|
1439
|
+
// var startDate = moment(req.query.start_date, 'DD/MM/YYYY').format('YYYY-MM-DD');
|
|
1440
|
+
// var endDate = moment(req.query.end_date, 'DD/MM/YYYY').format('YYYY-MM-DD');
|
|
1441
|
+
|
|
1442
|
+
// winston.debug('REQUEST ROUTE - REQ QUERY FORMATTED START DATE ', startDate);
|
|
1443
|
+
// winston.debug('REQUEST ROUTE - REQ QUERY FORMATTED END DATE ', endDate);
|
|
1444
|
+
|
|
1445
|
+
// // ADD ONE DAY TO THE END DAY
|
|
1446
|
+
// var date = new Date(endDate);
|
|
1447
|
+
// var newdate = new Date(date);
|
|
1448
|
+
// var endDate_plusOneDay = newdate.setDate(newdate.getDate() + 1);
|
|
1449
|
+
// winston.debug('REQUEST ROUTE - REQ QUERY FORMATTED END DATE + 1 DAY ', endDate_plusOneDay);
|
|
1450
|
+
// // var endDate_plusOneDay = moment('2018-09-03').add(1, 'd')
|
|
1451
|
+
// // var endDate_plusOneDay = endDate.add(1).day();
|
|
1452
|
+
// // var toDate = new Date(Date.parse(endDate_plusOneDay)).toISOString()
|
|
1453
|
+
|
|
1454
|
+
// query.createdAt = { $gte: new Date(Date.parse(startDate)).toISOString(), $lte: new Date(endDate_plusOneDay).toISOString() }
|
|
1455
|
+
// winston.debug('REQUEST ROUTE - QUERY CREATED AT ', query.createdAt);
|
|
1456
|
+
|
|
1457
|
+
// } else if (req.query.start_date && !req.query.end_date) {
|
|
1458
|
+
// winston.debug('REQUEST ROUTE - REQ QUERY END DATE IS EMPTY (so search only for start date)');
|
|
1459
|
+
// var startDate = moment(req.query.start_date, 'DD/MM/YYYY').format('YYYY-MM-DD');
|
|
1460
|
+
|
|
1461
|
+
// var range = { $gte: new Date(Date.parse(startDate)).toISOString() };
|
|
1462
|
+
// if (req.query.filterRangeField) {
|
|
1463
|
+
// query[req.query.filterRangeField] = range;
|
|
1464
|
+
// } else {
|
|
1465
|
+
// query.createdAt = range;
|
|
1466
|
+
// }
|
|
1467
|
+
|
|
1468
|
+
// winston.debug('REQUEST ROUTE - QUERY CREATED AT (only for start date)', query.createdAt);
|
|
1469
|
+
// }
|
|
1470
|
+
// // }
|
|
1471
|
+
|
|
1472
|
+
|
|
1473
|
+
|
|
1474
|
+
// if (req.query.snap_department_routing) {
|
|
1475
|
+
// query["snapshot.department.routing"] = req.query.snap_department_routing;
|
|
1476
|
+
// winston.debug('REQUEST ROUTE - QUERY snap_department_routing', query.snap_department_routing);
|
|
1477
|
+
// }
|
|
1478
|
+
|
|
1479
|
+
// if (req.query.snap_department_default) {
|
|
1480
|
+
// query["snapshot.department.default"] = req.query.snap_department_default;
|
|
1481
|
+
// winston.debug('REQUEST ROUTE - QUERY snap_department_default', query.snap_department_default);
|
|
1482
|
+
// }
|
|
1483
|
+
|
|
1484
|
+
|
|
1485
|
+
// if (req.query.snap_department_id_bot) {
|
|
1486
|
+
// query["snapshot.department.id_bot"] = req.query.snap_department_id_bot;
|
|
1487
|
+
// winston.debug('REQUEST ROUTE - QUERY snap_department_id_bot', query.snap_department_id_bot);
|
|
1488
|
+
// }
|
|
1489
|
+
|
|
1490
|
+
// if (req.query.snap_department_id_bot_exists) {
|
|
1491
|
+
// query["snapshot.department.id_bot"] = { "$exists": req.query.snap_department_id_bot_exists }
|
|
1492
|
+
// winston.debug('REQUEST ROUTE - QUERY snap_department_id_bot_exists', query.snap_department_id_bot_exists);
|
|
1493
|
+
// }
|
|
1494
|
+
|
|
1495
|
+
// if (req.query.snap_lead_lead_id) {
|
|
1496
|
+
// query["snapshot.lead.lead_id"] = req.query.snap_lead_lead_id;
|
|
1497
|
+
// winston.debug('REQUEST ROUTE - QUERY snap_lead_lead_id', query.snap_lead_lead_id);
|
|
1498
|
+
// }
|
|
1499
|
+
|
|
1500
|
+
// if (req.query.snap_lead_email) {
|
|
1501
|
+
// query["snapshot.lead.email"] = req.query.snap_lead_email;
|
|
1502
|
+
// winston.debug('REQUEST ROUTE - QUERY snap_lead_email', query.snap_lead_email);
|
|
1503
|
+
// }
|
|
1504
|
+
|
|
1505
|
+
// if (req.query.smartAssignment) {
|
|
1506
|
+
// query.smartAssignment = req.query.smartAssignment;
|
|
1507
|
+
// winston.debug('REQUEST ROUTE - QUERY smartAssignment', query.smartAssignment);
|
|
1508
|
+
// }
|
|
1509
|
+
|
|
1510
|
+
// if (req.query.channel) {
|
|
1511
|
+
// if (req.query.channel === "offline") {
|
|
1512
|
+
// query["channel.name"] = { "$in": ["email", "form"] }
|
|
1513
|
+
// } else if (req.query.channel === "online") {
|
|
1514
|
+
// query["channel.name"] = { "$nin": ["email", "form"] }
|
|
1515
|
+
// } else {
|
|
1516
|
+
// query["channel.name"] = req.query.channel
|
|
1517
|
+
// }
|
|
1518
|
+
|
|
1519
|
+
// winston.debug('REQUEST ROUTE - QUERY channel', query.channel);
|
|
1520
|
+
// }
|
|
1521
|
+
|
|
1522
|
+
// if (req.query.priority) {
|
|
1523
|
+
// query.priority = req.query.priority;
|
|
1524
|
+
// }
|
|
1525
|
+
|
|
1526
|
+
|
|
1527
|
+
// var direction = -1; //-1 descending , 1 ascending
|
|
1528
|
+
// if (req.query.direction) {
|
|
1529
|
+
// direction = req.query.direction;
|
|
1530
|
+
// }
|
|
1531
|
+
// winston.debug("direction", direction);
|
|
1532
|
+
|
|
1533
|
+
// var sortField = "createdAt";
|
|
1534
|
+
// if (req.query.sort) {
|
|
1535
|
+
// sortField = req.query.sort;
|
|
1536
|
+
// }
|
|
1537
|
+
// winston.debug("sortField", sortField);
|
|
1538
|
+
|
|
1539
|
+
// var sortQuery = {};
|
|
1540
|
+
// sortQuery[sortField] = direction;
|
|
1541
|
+
// winston.debug("sort query", sortQuery);
|
|
1542
|
+
|
|
1543
|
+
// if (req.query.draft && (req.query.draft === 'false' || req.query.draft === false)) {
|
|
1544
|
+
// query.draft = { $in: [false, null] }
|
|
1545
|
+
// }
|
|
1546
|
+
|
|
1547
|
+
// winston.debug('REQUEST ROUTE - REQUEST FIND ', query);
|
|
1548
|
+
|
|
1549
|
+
// var projection = undefined;
|
|
1550
|
+
|
|
1551
|
+
// if (req.query.full_text) {
|
|
1552
|
+
|
|
1553
|
+
// if (req.query.no_textscore != "true" && req.query.no_textscore != true) {
|
|
1554
|
+
// winston.info('fulltext projection on');
|
|
1555
|
+
// projection = { score: { $meta: "textScore" } };
|
|
1556
|
+
// }
|
|
1557
|
+
|
|
1558
|
+
// }
|
|
1559
|
+
// // requestcachefarequi populaterequired
|
|
1560
|
+
// var q1 = Request.find(query, projection).
|
|
1561
|
+
// skip(skip).limit(limit);
|
|
1562
|
+
|
|
1563
|
+
|
|
1564
|
+
|
|
1565
|
+
|
|
1566
|
+
|
|
1567
|
+
// winston.debug('REQUEST ROUTE no_populate:' + req.query.no_populate);
|
|
1568
|
+
|
|
1569
|
+
// if (req.query.no_populate != "true" && req.query.no_populate != true) {
|
|
1570
|
+
// winston.verbose('REQUEST ROUTE - no_polutate false ', req.headers);
|
|
1571
|
+
// q1.populate('department').
|
|
1572
|
+
// populate('participatingBots'). //nico già nn gli usa
|
|
1573
|
+
// populate('participatingAgents'). //nico già nn gli usa
|
|
1574
|
+
// populate('lead').
|
|
1575
|
+
// populate({ path: 'requester', populate: { path: 'id_user' } }); //toglilo perche nico lo prende già da snapshot
|
|
1576
|
+
// }
|
|
1577
|
+
|
|
1578
|
+
// // cache(cacheUtil.defaultTTL, "requests-"+projectId).
|
|
1579
|
+
|
|
1580
|
+
|
|
1581
|
+
// // if (req.query.select_snapshot) {
|
|
1582
|
+
// // winston.info('select_snapshot');
|
|
1583
|
+
// // q1.select("+snapshot");
|
|
1584
|
+
// // // q1.select({ "snapshot": 1});
|
|
1585
|
+
// // }
|
|
1586
|
+
|
|
1587
|
+
// if (req.query.full_text) {
|
|
1588
|
+
// winston.debug('fulltext sort');
|
|
1589
|
+
// if (req.query.no_textscore != "true" && req.query.no_textscore != true) {
|
|
1590
|
+
// q1.sort({ score: { $meta: "textScore" } }) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
|
|
1591
|
+
// }
|
|
1592
|
+
// } else {
|
|
1593
|
+
// q1.sort(sortQuery);
|
|
1594
|
+
// }
|
|
1595
|
+
|
|
1596
|
+
|
|
1597
|
+
// // winston.info('q1',q1);
|
|
1598
|
+
|
|
1599
|
+
|
|
1600
|
+
// q1.exec();
|
|
1601
|
+
|
|
1602
|
+
// // TODO if ?onlycount=true do not perform find query but only
|
|
1603
|
+
// // set q1 to undefined; to skip query
|
|
1604
|
+
|
|
1605
|
+
// var q2 = Request.countDocuments(query).exec();
|
|
1606
|
+
|
|
1607
|
+
// if (req.query.no_count && req.query.no_count == "true") {
|
|
1608
|
+
// winston.info('REQUEST ROUTE - no_count ');
|
|
1609
|
+
// q2 = 0;
|
|
1610
|
+
// }
|
|
1611
|
+
|
|
1612
|
+
// var promises = [
|
|
1613
|
+
// q1,
|
|
1614
|
+
// q2
|
|
1615
|
+
// ];
|
|
1616
|
+
|
|
1617
|
+
// Promise.all(promises).then(function (results) {
|
|
1618
|
+
// var objectToReturn = {
|
|
1619
|
+
// perPage: limit,
|
|
1620
|
+
// count: results[1],
|
|
1621
|
+
// requests: results[0]
|
|
1622
|
+
// };
|
|
1623
|
+
// winston.debug('REQUEST ROUTE - objectToReturn ');
|
|
1624
|
+
// winston.debug('REQUEST ROUTE - objectToReturn ', objectToReturn);
|
|
1625
|
+
|
|
1626
|
+
// const endExecTime = new Date();
|
|
1627
|
+
// winston.verbose('REQUEST ROUTE - exec time: ' + (endExecTime - startExecTime));
|
|
1628
|
+
|
|
1629
|
+
// return res.json(objectToReturn);
|
|
1630
|
+
|
|
1631
|
+
// }).catch(function (err) {
|
|
1632
|
+
// winston.error('REQUEST ROUTE - REQUEST FIND ERR ', err);
|
|
1633
|
+
// return res.status(500).send({ success: false, msg: 'Error getting requests.', err: err });
|
|
1634
|
+
// });
|
|
1635
|
+
|
|
1636
|
+
|
|
1637
|
+
// });
|
|
1638
|
+
|
|
1241
1639
|
|
|
1242
1640
|
// TODO converti con fast-csv e stream
|
|
1243
1641
|
// DOWNLOAD HISTORY REQUESTS AS CSV
|
|
@@ -1257,6 +1655,8 @@ router.get('/csv', function (req, res, next) {
|
|
|
1257
1655
|
var skip = page * limit;
|
|
1258
1656
|
winston.debug('REQUEST ROUTE - SKIP PAGE ', skip);
|
|
1259
1657
|
|
|
1658
|
+
let statusArray = [];
|
|
1659
|
+
|
|
1260
1660
|
var query = { "id_project": req.projectid };
|
|
1261
1661
|
|
|
1262
1662
|
if (req.query.dept_id) {
|
|
@@ -1269,9 +1669,40 @@ router.get('/csv', function (req, res, next) {
|
|
|
1269
1669
|
query.$text = { "$search": req.query.full_text };
|
|
1270
1670
|
}
|
|
1271
1671
|
|
|
1672
|
+
// if (req.query.status) {
|
|
1673
|
+
// winston.debug('req.query.status', req.query.status);
|
|
1674
|
+
// query.status = req.query.status;
|
|
1675
|
+
// }
|
|
1676
|
+
|
|
1272
1677
|
if (req.query.status) {
|
|
1273
|
-
|
|
1274
|
-
|
|
1678
|
+
|
|
1679
|
+
if (req.query.status === 'all') {
|
|
1680
|
+
delete query.status;
|
|
1681
|
+
} else {
|
|
1682
|
+
let statusArray = req.query.status.split(',').map(Number);
|
|
1683
|
+
statusArray = statusArray.map(status => { return isNaN(status) ? null : status }).filter(status => status !== null)
|
|
1684
|
+
if (statusArray.length > 0) {
|
|
1685
|
+
query.status = {
|
|
1686
|
+
$in: statusArray
|
|
1687
|
+
}
|
|
1688
|
+
} else {
|
|
1689
|
+
delete query.status;
|
|
1690
|
+
}
|
|
1691
|
+
}
|
|
1692
|
+
|
|
1693
|
+
if (statusArray.length > 0) {
|
|
1694
|
+
query.status = {
|
|
1695
|
+
$in: statusArray
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1698
|
+
|
|
1699
|
+
}
|
|
1700
|
+
|
|
1701
|
+
if (req.query.preflight) {
|
|
1702
|
+
let preflight = (req.query.preflight === 'false');
|
|
1703
|
+
if (preflight) {
|
|
1704
|
+
query.preflight = false;
|
|
1705
|
+
}
|
|
1275
1706
|
}
|
|
1276
1707
|
|
|
1277
1708
|
if (req.query.lead) {
|
|
@@ -1464,50 +1895,153 @@ router.get('/csv', function (req, res, next) {
|
|
|
1464
1895
|
});
|
|
1465
1896
|
|
|
1466
1897
|
router.get('/count', async (req, res) => {
|
|
1467
|
-
|
|
1898
|
+
|
|
1468
1899
|
let id_project = req.projectid;
|
|
1469
1900
|
let merge_assigned = req.query.merge_assigned;
|
|
1901
|
+
let quota_count = false;
|
|
1902
|
+
if (req.query.conversation_quota === true || req.query.conversation_quota === 'true') {
|
|
1903
|
+
quota_count = true;
|
|
1904
|
+
}
|
|
1470
1905
|
|
|
1906
|
+
let open_count = 0;
|
|
1907
|
+
let closed_count = 0;
|
|
1471
1908
|
let unassigned_count = 0;
|
|
1472
1909
|
let human_assigned_count = 0;
|
|
1473
1910
|
let bot_assigned_count = 0;
|
|
1474
1911
|
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1912
|
+
let currentSlot
|
|
1913
|
+
let promises = [];
|
|
1914
|
+
|
|
1915
|
+
if (quota_count) {
|
|
1916
|
+
|
|
1917
|
+
let quoteManager = req.app.get('quote_manager');
|
|
1918
|
+
|
|
1919
|
+
currentSlot = await quoteManager.getCurrentSlot(req.project);
|
|
1920
|
+
winston.debug("currentSlot: ", currentSlot)
|
|
1921
|
+
// Open count
|
|
1922
|
+
// Warning: 201 is a fake status -> Logical meaning: status < 1000;
|
|
1923
|
+
// (method) RequestService.getConversationsCount(id_project: any, status: any, preflight: any, hasBot: any): Promise<any>
|
|
1924
|
+
promises.push(requestService.getConversationsCount(id_project, 201, null, null, currentSlot.startDate, currentSlot.endDate).then((count) => {
|
|
1925
|
+
open_count = count;
|
|
1926
|
+
winston.debug("Unassigned count for project " + id_project + ": " + unassigned_count);
|
|
1927
|
+
}).catch((err) => {
|
|
1928
|
+
winston.error("Error getting unassigned conversation count");
|
|
1929
|
+
}))
|
|
1930
|
+
|
|
1931
|
+
// Closed count
|
|
1932
|
+
promises.push(requestService.getConversationsCount(id_project, RequestConstants.CLOSED, null, null, currentSlot.startDate, currentSlot.endDate).then((count) => {
|
|
1933
|
+
closed_count = count;
|
|
1934
|
+
winston.debug("Unassigned count for project " + id_project + ": " + unassigned_count);
|
|
1935
|
+
}).catch((err) => {
|
|
1936
|
+
winston.error("Error getting unassigned conversation count");
|
|
1937
|
+
}))
|
|
1938
|
+
} else {
|
|
1939
|
+
// Unassigned count
|
|
1940
|
+
promises.push(requestService.getConversationsCount(id_project, RequestConstants.UNASSIGNED, false, null, null, null).then((count) => {
|
|
1941
|
+
unassigned_count = count;
|
|
1942
|
+
winston.debug("Unassigned count for project " + id_project + ": " + unassigned_count);
|
|
1943
|
+
}).catch((err) => {
|
|
1944
|
+
winston.error("Error getting unassigned conversation count");
|
|
1945
|
+
}))
|
|
1946
|
+
|
|
1947
|
+
// Human assigned count
|
|
1948
|
+
promises.push(requestService.getConversationsCount(id_project, RequestConstants.ASSIGNED, false, false, null, null).then((count) => {
|
|
1949
|
+
human_assigned_count = count;
|
|
1950
|
+
winston.debug("Human assigned count for project " + id_project + ": " + human_assigned_count);
|
|
1951
|
+
}).catch((err) => {
|
|
1952
|
+
winston.error("Error getting human assigned conversation count");
|
|
1953
|
+
}))
|
|
1954
|
+
|
|
1955
|
+
// Bot assigned count
|
|
1956
|
+
promises.push(requestService.getConversationsCount(id_project, RequestConstants.ASSIGNED, false, true, null, null).then((count) => {
|
|
1957
|
+
bot_assigned_count = count;
|
|
1958
|
+
winston.debug("Bot assigned count for project " + id_project + ": " + bot_assigned_count);
|
|
1959
|
+
}).catch((err) => {
|
|
1960
|
+
winston.error("Error getting bot assigned conversation count");
|
|
1961
|
+
}))
|
|
1962
|
+
}
|
|
1963
|
+
|
|
1964
|
+
Promise.all(promises).then((response) => {
|
|
1965
|
+
|
|
1966
|
+
if (quota_count) {
|
|
1967
|
+
let data = {
|
|
1968
|
+
open: open_count,
|
|
1969
|
+
closed: closed_count,
|
|
1970
|
+
slot: {
|
|
1971
|
+
startDate: currentSlot.startDate.format('DD/MM/YYYY'),
|
|
1972
|
+
endDate: currentSlot.endDate.format('DD/MM/YYYY')
|
|
1973
|
+
}
|
|
1974
|
+
}
|
|
1975
|
+
return res.status(200).send(data);
|
|
1976
|
+
} else {
|
|
1977
|
+
if (merge_assigned) {
|
|
1978
|
+
let data = {
|
|
1979
|
+
unassigned: unassigned_count,
|
|
1980
|
+
assigned: human_assigned_count + bot_assigned_count
|
|
1981
|
+
}
|
|
1982
|
+
return res.status(200).send(data);
|
|
1983
|
+
|
|
1984
|
+
} else {
|
|
1985
|
+
let data = {
|
|
1986
|
+
unassigned: unassigned_count,
|
|
1987
|
+
assigned: human_assigned_count,
|
|
1988
|
+
bot_assigned: bot_assigned_count
|
|
1989
|
+
}
|
|
1990
|
+
return res.status(200).send(data);
|
|
1991
|
+
}
|
|
1992
|
+
}
|
|
1486
1993
|
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
res.status(400).send({ success: false, error: err });
|
|
1994
|
+
}).catch((err) => {
|
|
1995
|
+
console.error("err: ", err);
|
|
1996
|
+
return res.status(400).send({ success: false, error: err });
|
|
1490
1997
|
})
|
|
1491
|
-
|
|
1492
|
-
|
|
1998
|
+
})
|
|
1493
1999
|
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
2000
|
+
// router.get('/count', async (req, res) => {
|
|
2001
|
+
|
|
2002
|
+
// let id_project = req.projectid;
|
|
2003
|
+
// let merge_assigned = req.query.merge_assigned;
|
|
2004
|
+
|
|
2005
|
+
// let unassigned_count = 0;
|
|
2006
|
+
// let human_assigned_count = 0;
|
|
2007
|
+
// let bot_assigned_count = 0;
|
|
2008
|
+
|
|
2009
|
+
// unassigned_count = await Request.countDocuments({ id_project: id_project, status: 100, preflight: false }).catch((err) => {
|
|
2010
|
+
// winston.error("Error getting unassigned requests count: ", err);
|
|
2011
|
+
// res.status(400).send({ success: false, error: err });
|
|
2012
|
+
// })
|
|
2013
|
+
// winston.debug("Unassigned count for project " + id_project + ": " + unassigned_count);
|
|
2014
|
+
|
|
2015
|
+
// human_assigned_count = await Request.countDocuments({ id_project: id_project, status: 200, preflight: false, hasBot: false }).catch((err) => {
|
|
2016
|
+
// winston.error("Error getting human unassigned requests count: ", err);
|
|
2017
|
+
// res.status(400).send({ success: false, error: err });
|
|
2018
|
+
// })
|
|
2019
|
+
// winston.debug("Human assigned count for project " + id_project + ": " + human_assigned_count);
|
|
2020
|
+
|
|
2021
|
+
// bot_assigned_count = await Request.countDocuments({ id_project: id_project, status: 200, preflight: false, hasBot: true }).catch((err) => {
|
|
2022
|
+
// winston.error("Error getting bot assigned requests count: ", err);
|
|
2023
|
+
// res.status(400).send({ success: false, error: err });
|
|
2024
|
+
// })
|
|
2025
|
+
// winston.debug("Bot assigned count for project " + id_project + ": " + bot_assigned_count);
|
|
2026
|
+
|
|
2027
|
+
|
|
2028
|
+
// if (merge_assigned) {
|
|
2029
|
+
// let data = {
|
|
2030
|
+
// unassigned: unassigned_count,
|
|
2031
|
+
// assigned: human_assigned_count + bot_assigned_count
|
|
2032
|
+
// }
|
|
2033
|
+
// return res.status(200).send(data);
|
|
1500
2034
|
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
2035
|
+
// } else {
|
|
2036
|
+
// let data = {
|
|
2037
|
+
// unassigned: unassigned_count,
|
|
2038
|
+
// assigned: human_assigned_count,
|
|
2039
|
+
// bot_assigned: bot_assigned_count
|
|
2040
|
+
// }
|
|
2041
|
+
// return res.status(200).send(data);
|
|
2042
|
+
// }
|
|
1509
2043
|
|
|
1510
|
-
})
|
|
2044
|
+
// })
|
|
1511
2045
|
|
|
1512
2046
|
router.get('/:requestid', function (req, res) {
|
|
1513
2047
|
|