tango-app-api-trax 3.4.0-beta-0 → 3.4.0-beta-1
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/package.json +3 -3
- package/src/controllers/activityLog.controller.js +27 -10
- package/src/controllers/gallery.controller.js +3 -3
- package/src/controllers/internalTrax.controller.js +10 -6
- package/src/controllers/mobileTrax.controller.js +95 -89
- package/src/controllers/trax.controller.js +50 -15
- package/src/hbs/login-otp.hbs +943 -943
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tango-app-api-trax",
|
|
3
|
-
"version": "3.4.0-beta-
|
|
3
|
+
"version": "3.4.0-beta-1",
|
|
4
4
|
"description": "Trax",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"mongodb": "^6.8.0",
|
|
27
27
|
"nodemon": "^3.1.4",
|
|
28
28
|
"path": "^0.12.7",
|
|
29
|
-
"tango-api-schema": "^2.2.
|
|
30
|
-
"tango-app-api-middleware": "^3.1.
|
|
29
|
+
"tango-api-schema": "^2.2.78",
|
|
30
|
+
"tango-app-api-middleware": "^3.1.69",
|
|
31
31
|
"url": "^0.11.4",
|
|
32
32
|
"winston": "^3.13.1",
|
|
33
33
|
"winston-daily-rotate-file": "^5.0.0"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// import mongoose from 'mongoose';
|
|
2
2
|
import { insertOpenSearchData, updateOpenSearchData, getOpenSearchData } from 'tango-app-api-middleware';
|
|
3
3
|
import * as checklistService from '../services/checklist.service.js';
|
|
4
|
+
import * as taskconfigService from '../services/taskConfig.service.js';
|
|
4
5
|
|
|
5
6
|
export const insertLog = async ( req, res ) => {
|
|
6
7
|
try {
|
|
@@ -130,23 +131,37 @@ export const listLog = async ( req, res ) => {
|
|
|
130
131
|
if ( requestBody.type ) {
|
|
131
132
|
mustConditions.push( { term: { type: requestBody.type } } );
|
|
132
133
|
}
|
|
133
|
-
|
|
134
|
-
if ( requestBody.action ) {
|
|
134
|
+
if ( requestBody.action && requestBody.action.length > 0 ) {
|
|
135
135
|
mustConditions.push( { terms: { action: requestBody.action } } );
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
if ( req.user.userType == 'client' && req.user.role == 'user' ) {
|
|
139
139
|
return res.sendError( 'no data found', 204 );
|
|
140
140
|
}
|
|
141
|
+
let sourceCheckListIds;
|
|
142
|
+
if ( req.user.userType === 'client' && req.user.role == 'admin' ) {
|
|
143
|
+
if ( requestBody.type === 'checklist' ) {
|
|
144
|
+
const sourceCheckListResult = await checklistService.aggregate( [
|
|
145
|
+
// { $match: { 'owner.value': req.user.email } },
|
|
146
|
+
{ $match: { $or: [ { 'owner.value': req.user.email }, { 'approver.value': req.user.email } ] } },
|
|
147
|
+
{ $group: { _id: null, checklistIds: { $push: { $toString: '$_id' } } } },
|
|
148
|
+
{ $project: { _id: 0, checklistIds: 1 } },
|
|
149
|
+
] );
|
|
150
|
+
sourceCheckListIds = sourceCheckListResult.length > 0 ? sourceCheckListResult[0].checklistIds : [];
|
|
151
|
+
console.log( 'sourceCheckListIds', sourceCheckListIds );
|
|
152
|
+
}
|
|
153
|
+
if ( requestBody.type === 'task' ) {
|
|
154
|
+
const sourceCheckListResult = await taskconfigService.aggregate( [
|
|
155
|
+
// { $match: { 'owner.value': req.user.email } },
|
|
156
|
+
{ $match: { $or: [ { 'owner.value': req.user.email }, { 'approver.value': req.user.email } ] } },
|
|
157
|
+
{ $group: { _id: null, checklistIds: { $push: { $toString: '$_id' } } } },
|
|
158
|
+
{ $project: { _id: 0, checklistIds: 1 } },
|
|
159
|
+
] );
|
|
160
|
+
|
|
161
|
+
sourceCheckListIds = sourceCheckListResult.length > 0 ? sourceCheckListResult[0].checklistIds : [];
|
|
162
|
+
}
|
|
163
|
+
|
|
141
164
|
|
|
142
|
-
if ( req.user.userType == 'client' && req.user.role == 'admin' ) {
|
|
143
|
-
const sourceCheckListResult = await checklistService.aggregate( [
|
|
144
|
-
{ $match: { 'owner.value': req.user.email } },
|
|
145
|
-
{ $group: { _id: null, checklistIds: { $push: { $toString: '$_id' } } } },
|
|
146
|
-
{ $project: { _id: 0, checklistIds: 1 } },
|
|
147
|
-
] );
|
|
148
|
-
const sourceCheckListIds = sourceCheckListResult.length > 0 ? sourceCheckListResult[0].checklistIds : [];
|
|
149
|
-
console.log( 'sourceCheckListIds', sourceCheckListIds );
|
|
150
165
|
// mustConditions.push( { terms: { $or: [ { store_id: { $in: requestBody.storeId } }, { store_id: { $eq: '' }, userEmail: { $in: requestBody.userEmailes } }, { sourceCheckList_id: { $in: sourceCheckListIds } } ] } } );
|
|
151
166
|
mustConditions.push( {
|
|
152
167
|
'bool': {
|
|
@@ -210,7 +225,9 @@ export const listLog = async ( req, res ) => {
|
|
|
210
225
|
},
|
|
211
226
|
],
|
|
212
227
|
};
|
|
228
|
+
// console.log( 'Executing OpenSearch Query:', JSON.stringify( query, null, 2 ) );
|
|
213
229
|
let result = await getOpenSearchData( JSON.parse( process.env.OPENSEARCH ).traxActivityLog, query );
|
|
230
|
+
// console.log( 'OpenSearch Raw Response', JSON.stringify( result, null, 2 ) );
|
|
214
231
|
if ( !result || !result.body.hits.hits.length ) {
|
|
215
232
|
return res.sendError( 'no data found', 204 );
|
|
216
233
|
}
|
|
@@ -291,7 +291,7 @@ export async function approveChecklist( req, res ) {
|
|
|
291
291
|
let updateResponse = await processedChecklist.updateMany( { _id: { $in: idList } }, { approvalStatus: true } );
|
|
292
292
|
if ( updateResponse.modifiedCount || updateResponse.matchedCount ) {
|
|
293
293
|
let inputstores = checklistDetails.filter( ( data ) => data.checklistStatus == 'submit' );
|
|
294
|
-
let storeNames =
|
|
294
|
+
let storeNames = inputstores.map( ( data ) => data.storeName );
|
|
295
295
|
|
|
296
296
|
|
|
297
297
|
let params = {
|
|
@@ -333,7 +333,7 @@ export async function approveChecklist( req, res ) {
|
|
|
333
333
|
'createdBy': req.user._id,
|
|
334
334
|
'coverage': checklistDetails[0].coverage,
|
|
335
335
|
'logDetails': {
|
|
336
|
-
'approved': storeNames
|
|
336
|
+
'approved': storeNames,
|
|
337
337
|
},
|
|
338
338
|
};
|
|
339
339
|
let urlopensearch = JSON.parse( process.env.OPENSEARCH );
|
|
@@ -450,7 +450,7 @@ export async function redoChecklist( req, res ) {
|
|
|
450
450
|
submitTime: checklistDetails.submitTime,
|
|
451
451
|
};
|
|
452
452
|
await checklistLogs.create( data );
|
|
453
|
-
|
|
453
|
+
|
|
454
454
|
const requestOptions = {
|
|
455
455
|
method: 'POST',
|
|
456
456
|
headers: {
|
|
@@ -18,7 +18,7 @@ import timeZone from 'dayjs/plugin/timezone.js';
|
|
|
18
18
|
import utc from 'dayjs/plugin/utc.js';
|
|
19
19
|
import { logger } from 'tango-app-api-middleware';
|
|
20
20
|
import mongoose from 'mongoose';
|
|
21
|
-
import { sendPushNotification } from 'tango-app-api-middleware';
|
|
21
|
+
import { sendPushNotification, sendAiPushNotification } from 'tango-app-api-middleware';
|
|
22
22
|
// import * as planoService from '../services/planogram.service.js';
|
|
23
23
|
import * as clusterServices from '../services/cluster.service.js';
|
|
24
24
|
import * as teamsServices from '../services/teams.service.js';
|
|
@@ -1663,24 +1663,28 @@ export async function internalAISendPushNotification( req, res ) {
|
|
|
1663
1663
|
return res.sendError( 'Description is Required', 400 );
|
|
1664
1664
|
}
|
|
1665
1665
|
|
|
1666
|
-
let
|
|
1666
|
+
let userData;
|
|
1667
1667
|
if ( requestData.email && requestData.email !='' ) {
|
|
1668
|
-
fcmToken = await getUserToken( requestData.clientId, requestData.email );
|
|
1668
|
+
// fcmToken = await getUserToken( requestData.clientId, requestData.email );
|
|
1669
|
+
userData = await userService.findOne( { clientId: requestData.clientId, email: requestData.email }, { fcmToken: 1, loginFrom: 1 } );
|
|
1669
1670
|
} else {
|
|
1670
1671
|
let storeData = await storeService.findOne( { clientId: requestData.clientId, storeId: requestData.storeId }, { spocDetails: 1 } );
|
|
1671
1672
|
if ( storeData && storeData.spocDetails.length > 0 && storeData.spocDetails[0].email ) {
|
|
1672
|
-
fcmToken = await getUserToken( storeData.spocDetails[0].email );
|
|
1673
|
+
// fcmToken = await getUserToken( storeData.spocDetails[0].email );
|
|
1674
|
+
userData = await userService.findOne( { clientId: requestData.clientId, email: requestData.email }, { fcmToken: 1, loginFrom: 1 } );
|
|
1673
1675
|
}
|
|
1674
1676
|
}
|
|
1675
|
-
if ( !
|
|
1677
|
+
if ( !userData ) {
|
|
1676
1678
|
return res.sendSuccess( 'Notification Send Successfully' );
|
|
1677
1679
|
}
|
|
1678
1680
|
let custom = {
|
|
1681
|
+
title: requestData.title,
|
|
1682
|
+
description: requestData.description,
|
|
1679
1683
|
type: req.body?.type,
|
|
1680
1684
|
storeId: req.body?.storeId,
|
|
1681
1685
|
date: req.body?.date,
|
|
1682
1686
|
};
|
|
1683
|
-
let responseData = await
|
|
1687
|
+
let responseData = await sendAiPushNotification( userData.fcmToken, custom, userData.loginFrom );
|
|
1684
1688
|
if ( responseData ) {
|
|
1685
1689
|
return res.sendSuccess( 'Notification Send Successfully' );
|
|
1686
1690
|
} else {
|
|
@@ -222,7 +222,7 @@ export async function startChecklistv1( req, res ) {
|
|
|
222
222
|
coverage: getBeforeChecklist[0].coverage || '',
|
|
223
223
|
};
|
|
224
224
|
await checklistLogs.create( logInsertData );
|
|
225
|
-
let getchecklist = getupdatedchecklist;
|
|
225
|
+
let getchecklist = JSON.parse( JSON.stringify( getupdatedchecklist ) );
|
|
226
226
|
let questions = [];
|
|
227
227
|
// function processQuestion( question, section, questions, nested=false ) {
|
|
228
228
|
// let findExists = questions.find( ( item ) => item?.qno && item.qno == question.qno );
|
|
@@ -246,13 +246,15 @@ export async function startChecklistv1( req, res ) {
|
|
|
246
246
|
for ( let [ index, data ] of getchecklist.entries() ) {
|
|
247
247
|
for ( let [ secIndex, section ] of data.questionAnswers.entries() ) {
|
|
248
248
|
questions = [];
|
|
249
|
+
let count = 0;
|
|
249
250
|
for ( let [ questionIndex, question ] of section.questions.entries() ) {
|
|
250
251
|
let linkedQuestions;
|
|
251
252
|
let uniqueShow = false;
|
|
252
253
|
if ( !question.linkType ) {
|
|
253
254
|
if ( !question?.uniqueNo ) {
|
|
255
|
+
count = count + 1;
|
|
254
256
|
uniqueShow = true;
|
|
255
|
-
question.uniqueNo = parseInt( getOtp() ) + Date.now() + questionIndex;
|
|
257
|
+
question.uniqueNo = parseInt( getOtp() ) + Date.now() + questionIndex + count;
|
|
256
258
|
}
|
|
257
259
|
questions.push( question );
|
|
258
260
|
linkedQuestions = [];
|
|
@@ -269,11 +271,12 @@ export async function startChecklistv1( req, res ) {
|
|
|
269
271
|
let nesedQuestion = [];
|
|
270
272
|
answer.oldNestedQuestion = !uniqueShow ? JSON.parse( JSON.stringify( answer.oldNestedQuestion ) ) : JSON.parse( JSON.stringify( answer.nestedQuestion ) );
|
|
271
273
|
answer.nestedQuestion.forEach( ( qn, qidx ) => {
|
|
274
|
+
count = count + 1;
|
|
272
275
|
let getQn = questionList.get( qn );
|
|
273
276
|
if ( getQn ) {
|
|
274
277
|
let randomNo;
|
|
275
278
|
if ( !getQn?.uniqueNo || uniqueShow ) {
|
|
276
|
-
randomNo = parseInt( getOtp() ) + Date.now() + qidx;
|
|
279
|
+
randomNo = parseInt( getOtp() ) + Date.now() + qidx + count;
|
|
277
280
|
} else {
|
|
278
281
|
randomNo = getQn?.uniqueNo;
|
|
279
282
|
}
|
|
@@ -3317,90 +3320,6 @@ export async function questionListv1( req, res ) {
|
|
|
3317
3320
|
} else {
|
|
3318
3321
|
logger.info( `v5 => Checklist Continue => store Name: ${getchecklist[0].storeName}, User Email: ${getchecklist[0].userEmail}, Checklist Name: ${getchecklist[0].checkListName}` );
|
|
3319
3322
|
// let bucket = JSON.parse( process.env.BUCKET );
|
|
3320
|
-
for ( let [ secIndex, section ] of getchecklist[0].questionAnswers.entries() ) {
|
|
3321
|
-
for ( let [ questionIndex, question ] of section.questions.entries() ) {
|
|
3322
|
-
let Multianswer = [];
|
|
3323
|
-
if ( getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage && getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage !='' ) {
|
|
3324
|
-
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage = await signedUrl( { file_path: decodeURIComponent( getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage ), Bucket: bucket.sop } );
|
|
3325
|
-
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage;
|
|
3326
|
-
}
|
|
3327
|
-
for ( let [ ansIndex, answer ] of question.answers.entries() ) {
|
|
3328
|
-
if ( question.answerType == 'multiplechoicemultiple' ) {
|
|
3329
|
-
let checkvalidation = null;
|
|
3330
|
-
if ( answer.validationAnswer && answer.validationAnswer !='' ) {
|
|
3331
|
-
if ( answer.validationType != 'Descriptive Answer' ) {
|
|
3332
|
-
// checkvalidation = await signedUrl( { file_path: decodeURIComponent( answer.validationAnswer ), Bucket: bucket.sop } );
|
|
3333
|
-
checkvalidation = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + answer.validationAnswer;
|
|
3334
|
-
} else {
|
|
3335
|
-
checkvalidation = answer.validationAnswer;
|
|
3336
|
-
}
|
|
3337
|
-
}
|
|
3338
|
-
Multianswer.push( { 'answer': answer.answer, 'no': ansIndex, 'validationAnswer': checkvalidation } );
|
|
3339
|
-
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].answers[ansIndex].index = ansIndex;
|
|
3340
|
-
}
|
|
3341
|
-
if ( answer.referenceImage != '' ) {
|
|
3342
|
-
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].answers[ansIndex].referenceImage = await signedUrl( { file_path: decodeURIComponent( answer.referenceImage ), Bucket: bucket.sop } );
|
|
3343
|
-
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].answers[ansIndex].referenceImage = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + answer.referenceImage;
|
|
3344
|
-
}
|
|
3345
|
-
if ( ( answer.validationType == 'Capture Image' || answer.validationType == 'Capture Video' ) && answer.validationAnswer && answer.validationAnswer != '' ) {
|
|
3346
|
-
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].answers[ansIndex].validationAnswer = await signedUrl( { file_path: decodeURIComponent( answer.validationAnswer ), Bucket: bucket.sop } );
|
|
3347
|
-
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].answers[ansIndex].validationAnswer = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + answer.validationAnswer;
|
|
3348
|
-
}
|
|
3349
|
-
}
|
|
3350
|
-
if ( question?.userAnswer ) {
|
|
3351
|
-
for ( let [ userAnsIndex, userAns ] of question.userAnswer.entries() ) {
|
|
3352
|
-
if ( ( userAns.validationType == 'Capture Image' || userAns.validationType == 'Capture Video' ) && userAns.validationAnswer && userAns.validationAnswer != '' ) {
|
|
3353
|
-
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].validationAnswer = await signedUrl( { file_path: decodeURIComponent( userAns.validationAnswer ), Bucket: bucket.sop } );
|
|
3354
|
-
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].validationAnswer = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + userAns.validationAnswer;
|
|
3355
|
-
}
|
|
3356
|
-
if ( [ 'image', 'descriptiveImage', 'video' ].includes( question.answerType ) && userAns.answer != '' ) {
|
|
3357
|
-
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].answer = await signedUrl( { file_path: decodeURIComponent( userAns.answer ), Bucket: bucket.sop } );
|
|
3358
|
-
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].answer = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + userAns.answer;
|
|
3359
|
-
}
|
|
3360
|
-
if ( userAns.referenceImage != '' ) {
|
|
3361
|
-
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].referenceImage = await signedUrl( { file_path: decodeURIComponent( userAns.referenceImage ), Bucket: bucket.sop } );
|
|
3362
|
-
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].referenceImage = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + userAns.referenceImage;
|
|
3363
|
-
}
|
|
3364
|
-
if ( question.answerType == 'multiplechoicemultiple' ) {
|
|
3365
|
-
let ansIndex = Multianswer.findIndex( ( item ) => item.answer == userAns.answer );
|
|
3366
|
-
if ( ansIndex ) {
|
|
3367
|
-
Multianswer[ansIndex].validationAnswer = userAns.validationAnswer;
|
|
3368
|
-
}
|
|
3369
|
-
}
|
|
3370
|
-
if ( question.answerType == 'multipleImage' ) {
|
|
3371
|
-
if ( userAns && userAns.answer && userAns.answer !='' ) {
|
|
3372
|
-
// let manswer = await signedUrl( { file_path: decodeURIComponent( userAns.answer ), Bucket: bucket.sop } );
|
|
3373
|
-
let manswer = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + userAns.answer;
|
|
3374
|
-
Multianswer.push( { 'answer': manswer, 'no': userAnsIndex, 'validationAnswer': '' } );
|
|
3375
|
-
} else {
|
|
3376
|
-
|
|
3377
|
-
}
|
|
3378
|
-
}
|
|
3379
|
-
}
|
|
3380
|
-
}
|
|
3381
|
-
if ( question.answerType == 'multiplechoicemultiple' ) {
|
|
3382
|
-
Multianswer.forEach( ( item ) => {
|
|
3383
|
-
if ( item.validationAnswer == null ) {
|
|
3384
|
-
item.answer = null;
|
|
3385
|
-
}
|
|
3386
|
-
} );
|
|
3387
|
-
if ( Multianswer.length ) {
|
|
3388
|
-
question.Multianswer = Multianswer;
|
|
3389
|
-
} else {
|
|
3390
|
-
question.Multianswer = Multianswer;
|
|
3391
|
-
}
|
|
3392
|
-
}
|
|
3393
|
-
if ( question.answerType == 'multipleImage' ) {
|
|
3394
|
-
if ( Multianswer.length ) {
|
|
3395
|
-
question.Multianswer = Multianswer;
|
|
3396
|
-
} else {
|
|
3397
|
-
Multianswer.push( { 'answer': null, 'no': 0, 'validationAnswer': null } );
|
|
3398
|
-
question.Multianswer = Multianswer;
|
|
3399
|
-
}
|
|
3400
|
-
}
|
|
3401
|
-
}
|
|
3402
|
-
}
|
|
3403
|
-
|
|
3404
3323
|
let questions = [];
|
|
3405
3324
|
// function processQuestion( question, section, questions, nested=false ) {
|
|
3406
3325
|
// let findExists = questions.find( ( item ) => item?.qno && item.qno == question.qno );
|
|
@@ -3433,13 +3352,15 @@ export async function questionListv1( req, res ) {
|
|
|
3433
3352
|
for ( let [ index, data ] of getchecklist.entries() ) {
|
|
3434
3353
|
for ( let [ secIndex, section ] of data.questionAnswers.entries() ) {
|
|
3435
3354
|
questions = [];
|
|
3355
|
+
let count = 0;
|
|
3436
3356
|
for ( let [ questionIndex, question ] of section.questions.entries() ) {
|
|
3437
3357
|
let linkedQuestions;
|
|
3438
3358
|
let uniqueShow = false;
|
|
3439
3359
|
if ( !question.linkType ) {
|
|
3440
3360
|
if ( !question?.uniqueNo ) {
|
|
3361
|
+
count = count + 1;
|
|
3441
3362
|
uniqueShow = true;
|
|
3442
|
-
question.uniqueNo = parseInt( getOtp() ) + Date.now() + questionIndex;
|
|
3363
|
+
question.uniqueNo = parseInt( getOtp() ) + Date.now() + questionIndex + count;
|
|
3443
3364
|
}
|
|
3444
3365
|
questions.push( question );
|
|
3445
3366
|
linkedQuestions = [];
|
|
@@ -3456,11 +3377,12 @@ export async function questionListv1( req, res ) {
|
|
|
3456
3377
|
let nesedQuestion = [];
|
|
3457
3378
|
answer.oldNestedQuestion = !uniqueShow ? JSON.parse( JSON.stringify( answer.oldNestedQuestion ) ) : JSON.parse( JSON.stringify( answer.nestedQuestion ) );
|
|
3458
3379
|
answer.nestedQuestion.forEach( ( qn, qidx ) => {
|
|
3380
|
+
count = count + 1;
|
|
3459
3381
|
let getQn = questionList.get( qn );
|
|
3460
3382
|
if ( getQn ) {
|
|
3461
3383
|
let randomNo;
|
|
3462
3384
|
if ( !getQn?.uniqueNo || uniqueShow ) {
|
|
3463
|
-
randomNo = parseInt( getOtp() ) + Date.now() + qidx;
|
|
3385
|
+
randomNo = parseInt( getOtp() ) + Date.now() + qidx + count;
|
|
3464
3386
|
} else {
|
|
3465
3387
|
randomNo = getQn?.uniqueNo;
|
|
3466
3388
|
}
|
|
@@ -3511,6 +3433,90 @@ export async function questionListv1( req, res ) {
|
|
|
3511
3433
|
await processedchecklist.updateOne( { _id: requestData.processedcheckListId }, { questionAnswers: getchecklist[0].questionAnswers } );
|
|
3512
3434
|
}
|
|
3513
3435
|
|
|
3436
|
+
for ( let [ secIndex, section ] of getchecklist[0].questionAnswers.entries() ) {
|
|
3437
|
+
for ( let [ questionIndex, question ] of section.questions.entries() ) {
|
|
3438
|
+
let Multianswer = [];
|
|
3439
|
+
if ( getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage && getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage !='' ) {
|
|
3440
|
+
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage = await signedUrl( { file_path: decodeURIComponent( getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage ), Bucket: bucket.sop } );
|
|
3441
|
+
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + getchecklist[0].questionAnswers[secIndex].questions[questionIndex].questionReferenceImage;
|
|
3442
|
+
}
|
|
3443
|
+
for ( let [ ansIndex, answer ] of question.answers.entries() ) {
|
|
3444
|
+
if ( question.answerType == 'multiplechoicemultiple' ) {
|
|
3445
|
+
let checkvalidation = null;
|
|
3446
|
+
if ( answer.validationAnswer && answer.validationAnswer !='' ) {
|
|
3447
|
+
if ( answer.validationType != 'Descriptive Answer' ) {
|
|
3448
|
+
// checkvalidation = await signedUrl( { file_path: decodeURIComponent( answer.validationAnswer ), Bucket: bucket.sop } );
|
|
3449
|
+
checkvalidation = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + answer.validationAnswer;
|
|
3450
|
+
} else {
|
|
3451
|
+
checkvalidation = answer.validationAnswer;
|
|
3452
|
+
}
|
|
3453
|
+
}
|
|
3454
|
+
Multianswer.push( { 'answer': answer.answer, 'no': ansIndex, 'validationAnswer': checkvalidation } );
|
|
3455
|
+
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].answers[ansIndex].index = ansIndex;
|
|
3456
|
+
}
|
|
3457
|
+
if ( answer.referenceImage != '' ) {
|
|
3458
|
+
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].answers[ansIndex].referenceImage = await signedUrl( { file_path: decodeURIComponent( answer.referenceImage ), Bucket: bucket.sop } );
|
|
3459
|
+
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].answers[ansIndex].referenceImage = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + answer.referenceImage;
|
|
3460
|
+
}
|
|
3461
|
+
if ( ( answer.validationType == 'Capture Image' || answer.validationType == 'Capture Video' ) && answer.validationAnswer && answer.validationAnswer != '' ) {
|
|
3462
|
+
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].answers[ansIndex].validationAnswer = await signedUrl( { file_path: decodeURIComponent( answer.validationAnswer ), Bucket: bucket.sop } );
|
|
3463
|
+
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].answers[ansIndex].validationAnswer = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + answer.validationAnswer;
|
|
3464
|
+
}
|
|
3465
|
+
}
|
|
3466
|
+
if ( question?.userAnswer ) {
|
|
3467
|
+
for ( let [ userAnsIndex, userAns ] of question.userAnswer.entries() ) {
|
|
3468
|
+
if ( ( userAns.validationType == 'Capture Image' || userAns.validationType == 'Capture Video' ) && userAns.validationAnswer && userAns.validationAnswer != '' ) {
|
|
3469
|
+
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].validationAnswer = await signedUrl( { file_path: decodeURIComponent( userAns.validationAnswer ), Bucket: bucket.sop } );
|
|
3470
|
+
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].validationAnswer = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + userAns.validationAnswer;
|
|
3471
|
+
}
|
|
3472
|
+
if ( [ 'image', 'descriptiveImage', 'video' ].includes( question.answerType ) && userAns.answer != '' ) {
|
|
3473
|
+
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].answer = await signedUrl( { file_path: decodeURIComponent( userAns.answer ), Bucket: bucket.sop } );
|
|
3474
|
+
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].answer = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + userAns.answer;
|
|
3475
|
+
}
|
|
3476
|
+
if ( userAns.referenceImage != '' ) {
|
|
3477
|
+
// getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].referenceImage = await signedUrl( { file_path: decodeURIComponent( userAns.referenceImage ), Bucket: bucket.sop } );
|
|
3478
|
+
getchecklist[0].questionAnswers[secIndex].questions[questionIndex].userAnswer[userAnsIndex].referenceImage = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + userAns.referenceImage;
|
|
3479
|
+
}
|
|
3480
|
+
if ( question.answerType == 'multiplechoicemultiple' ) {
|
|
3481
|
+
let ansIndex = Multianswer.findIndex( ( item ) => item.answer == userAns.answer );
|
|
3482
|
+
if ( ansIndex ) {
|
|
3483
|
+
Multianswer[ansIndex].validationAnswer = userAns.validationAnswer;
|
|
3484
|
+
}
|
|
3485
|
+
}
|
|
3486
|
+
if ( question.answerType == 'multipleImage' ) {
|
|
3487
|
+
if ( userAns && userAns.answer && userAns.answer !='' ) {
|
|
3488
|
+
// let manswer = await signedUrl( { file_path: decodeURIComponent( userAns.answer ), Bucket: bucket.sop } );
|
|
3489
|
+
let manswer = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + userAns.answer;
|
|
3490
|
+
Multianswer.push( { 'answer': manswer, 'no': userAnsIndex, 'validationAnswer': '' } );
|
|
3491
|
+
} else {
|
|
3492
|
+
|
|
3493
|
+
}
|
|
3494
|
+
}
|
|
3495
|
+
}
|
|
3496
|
+
}
|
|
3497
|
+
if ( question.answerType == 'multiplechoicemultiple' ) {
|
|
3498
|
+
Multianswer.forEach( ( item ) => {
|
|
3499
|
+
if ( item.validationAnswer == null ) {
|
|
3500
|
+
item.answer = null;
|
|
3501
|
+
}
|
|
3502
|
+
} );
|
|
3503
|
+
if ( Multianswer.length ) {
|
|
3504
|
+
question.Multianswer = Multianswer;
|
|
3505
|
+
} else {
|
|
3506
|
+
question.Multianswer = Multianswer;
|
|
3507
|
+
}
|
|
3508
|
+
}
|
|
3509
|
+
if ( question.answerType == 'multipleImage' ) {
|
|
3510
|
+
if ( Multianswer.length ) {
|
|
3511
|
+
question.Multianswer = Multianswer;
|
|
3512
|
+
} else {
|
|
3513
|
+
Multianswer.push( { 'answer': null, 'no': 0, 'validationAnswer': null } );
|
|
3514
|
+
question.Multianswer = Multianswer;
|
|
3515
|
+
}
|
|
3516
|
+
}
|
|
3517
|
+
}
|
|
3518
|
+
}
|
|
3519
|
+
|
|
3514
3520
|
return res.sendSuccess( getchecklist );
|
|
3515
3521
|
}
|
|
3516
3522
|
} catch ( e ) {
|
|
@@ -190,7 +190,7 @@ export const create = async ( req, res ) => {
|
|
|
190
190
|
checkListDescription: inputBody.checklistDescription,
|
|
191
191
|
createdBy: req.user._id,
|
|
192
192
|
createdByName: req.user.userName,
|
|
193
|
-
questionCount: questionCount,
|
|
193
|
+
// questionCount: questionCount,
|
|
194
194
|
client_id: req.body?.clientId,
|
|
195
195
|
owner: req.user.userType == 'client' ? [ { name: req.user.userName, value: req.user.email } ] : [],
|
|
196
196
|
// configStartDate:new Date(),
|
|
@@ -282,7 +282,8 @@ export const create = async ( req, res ) => {
|
|
|
282
282
|
} );
|
|
283
283
|
|
|
284
284
|
if ( checkNestedLevel ) {
|
|
285
|
-
|
|
285
|
+
await checklistService.deleteOne( { _id: checkListId } );
|
|
286
|
+
return res.sendError( { message: `This ${section.name} contains more than 20 nested linked questions` }, 400 );
|
|
286
287
|
}
|
|
287
288
|
|
|
288
289
|
let sectionList = {
|
|
@@ -296,6 +297,7 @@ export const create = async ( req, res ) => {
|
|
|
296
297
|
};
|
|
297
298
|
await questionService.create( sectionList ).then( async ( data ) => {
|
|
298
299
|
if ( i == inputBody.sections.length - 1 ) {
|
|
300
|
+
await checklistService.updateOne( { _id: checkListId }, { questionCount: questionCount } );
|
|
299
301
|
let logObj = {
|
|
300
302
|
client_id: inputBody.clientId,
|
|
301
303
|
createAt: new Date(),
|
|
@@ -325,7 +327,6 @@ export const create = async ( req, res ) => {
|
|
|
325
327
|
}
|
|
326
328
|
}
|
|
327
329
|
} ).catch( async ( e ) => {
|
|
328
|
-
console.log( e );
|
|
329
330
|
await checklistService.deleteOne( { _id: checkListId } );
|
|
330
331
|
return res.sendError( e, 500 );
|
|
331
332
|
} );
|
|
@@ -637,6 +638,22 @@ export const deleteChecklist = async ( req, res ) => {
|
|
|
637
638
|
await processedchecklist.deleteMany( { date_string: { $ne: date }, date_iso: { $gt: date }, sourceCheckList_id: req.params.checklistId, checklistStatus: { $ne: 'submit' } } );
|
|
638
639
|
logger.info( { function: 'deleteChecklist', query: { date_string: { $ne: date }, date_iso: { $gt: date }, sourceCheckList_id: req.params.checklistId, checklistStatus: { $ne: 'submit' } } } );
|
|
639
640
|
checklistDetails.save().then( () => {
|
|
641
|
+
let logObj = {
|
|
642
|
+
client_id: checklistDetails.client_id,
|
|
643
|
+
createAt: new Date(),
|
|
644
|
+
sourceCheckList_id: checklistDetails._id,
|
|
645
|
+
checkListName: checklistDetails.checkListName,
|
|
646
|
+
fromCheckListName: '',
|
|
647
|
+
type: 'checklist',
|
|
648
|
+
action: 'deleted',
|
|
649
|
+
storeName: '',
|
|
650
|
+
store_id: '',
|
|
651
|
+
createdByEmail: req.user.email,
|
|
652
|
+
createdBy: req.user.userName,
|
|
653
|
+
coverage: checklistDetails.coverage,
|
|
654
|
+
logDetails: {},
|
|
655
|
+
};
|
|
656
|
+
insertOpenSearchData( JSON.parse( process.env.OPENSEARCH ).traxActivityLog, logObj );
|
|
640
657
|
return res.sendSuccess( { message: 'Checklist Deleted Successfully' } );
|
|
641
658
|
} ).catch( ( e ) => {
|
|
642
659
|
return res.sendError( e, 500 );
|
|
@@ -710,6 +727,22 @@ export const duplicateChecklist = async ( req, res ) => {
|
|
|
710
727
|
sections.push( sectionDetails );
|
|
711
728
|
}
|
|
712
729
|
await questionService.insertMany( sections );
|
|
730
|
+
let logObj = {
|
|
731
|
+
client_id: checkDetails.client_id,
|
|
732
|
+
createAt: new Date(),
|
|
733
|
+
sourceCheckList_id: checkDetails._id,
|
|
734
|
+
checkListName: checkDetails.checkListName,
|
|
735
|
+
fromCheckListName: '',
|
|
736
|
+
type: 'checklist',
|
|
737
|
+
action: 'duplicated',
|
|
738
|
+
storeName: '',
|
|
739
|
+
store_id: '',
|
|
740
|
+
createdByEmail: req.user.email,
|
|
741
|
+
createdBy: req.user.userName,
|
|
742
|
+
coverage: checkDetails.coverage,
|
|
743
|
+
logDetails: {},
|
|
744
|
+
};
|
|
745
|
+
insertOpenSearchData( JSON.parse( process.env.OPENSEARCH ).traxActivityLog, logObj );
|
|
713
746
|
return res.sendSuccess( { message: 'CheckList Duplicated Successfully' } );
|
|
714
747
|
} else {
|
|
715
748
|
return res.sendSuccess( { message: 'duplicated Successfully' } );
|
|
@@ -764,7 +797,7 @@ export const update = async ( req, res ) => {
|
|
|
764
797
|
questionCount: questionCount,
|
|
765
798
|
};
|
|
766
799
|
|
|
767
|
-
|
|
800
|
+
await checklistService.updateOne( { _id: req.params.checklistId }, params );
|
|
768
801
|
let checkListId = req.params.checklistId;
|
|
769
802
|
let logInsertData = {
|
|
770
803
|
action: 'checklistUpdate',
|
|
@@ -844,10 +877,8 @@ export const update = async ( req, res ) => {
|
|
|
844
877
|
} );
|
|
845
878
|
} );
|
|
846
879
|
|
|
847
|
-
console.log( checkNestedLevel, 'lebej' );
|
|
848
|
-
|
|
849
880
|
if ( checkNestedLevel ) {
|
|
850
|
-
return res.sendError( { message:
|
|
881
|
+
return res.sendError( { message: `This ${section.name} contains more than 20 nested linked questions` }, 400 );
|
|
851
882
|
}
|
|
852
883
|
|
|
853
884
|
sectionList.push( {
|
|
@@ -1579,6 +1610,10 @@ export const updateConfigurev1 =async ( req, res ) => {
|
|
|
1579
1610
|
}
|
|
1580
1611
|
}
|
|
1581
1612
|
|
|
1613
|
+
if ( !inputBody.checkListDetails.sections[0].questions.length && inputBody.submitType == 'publish' ) {
|
|
1614
|
+
return res.sendError( 'Please add a question', 400 );
|
|
1615
|
+
}
|
|
1616
|
+
|
|
1582
1617
|
if ( !inputBody.checkListDetails.assignedUsers.length && inputBody.submitType == 'publish' ) {
|
|
1583
1618
|
return res.sendError( 'Please Assigned a user', 400 );
|
|
1584
1619
|
}
|
|
@@ -1613,8 +1648,9 @@ export const updateConfigurev1 =async ( req, res ) => {
|
|
|
1613
1648
|
if ( inputBody.timeZone ) {
|
|
1614
1649
|
currentDate = dayjs().tz( inputBody.timeZone ).format();
|
|
1615
1650
|
} else {
|
|
1616
|
-
currentDate = dayjs().format();
|
|
1651
|
+
currentDate = dayjs().format( 'HH:mm:ss' );
|
|
1617
1652
|
}
|
|
1653
|
+
currentDate = dayjs.utc( currentDate, 'HH:mm:ss' ).format();
|
|
1618
1654
|
let updatedscheduleEndTimeISO = dayjs.utc( inputBody?.checkListDetails?.scheduleEndTime, 'hh:mm A' ).format( 'HH:mm:ss' );
|
|
1619
1655
|
let newUpdatedDate = dayjs.utc( updatedscheduleEndTimeISO, 'HH:mm:ss' ).format();
|
|
1620
1656
|
|
|
@@ -1778,7 +1814,7 @@ export const updateConfigurev1 =async ( req, res ) => {
|
|
|
1778
1814
|
checkListName: configDetails.checkListName,
|
|
1779
1815
|
fromCheckListName: '',
|
|
1780
1816
|
type: 'checklist',
|
|
1781
|
-
action: 'updated',
|
|
1817
|
+
action: inputBody.checkListDetails.publish ? 'updated' : 'draft',
|
|
1782
1818
|
storeName: '',
|
|
1783
1819
|
store_id: '',
|
|
1784
1820
|
createdByEmail: req.user.email,
|
|
@@ -2290,7 +2326,6 @@ export const validateUserv1 = async ( req, res ) => {
|
|
|
2290
2326
|
}, {} );
|
|
2291
2327
|
|
|
2292
2328
|
const duplicateUsers = Object.keys( duplicateUser ).filter( ( storeName ) => duplicateUser[storeName].count > 1 );
|
|
2293
|
-
console.log( duplicateUsers, 'user' );
|
|
2294
2329
|
if ( duplicateUsers.length ) {
|
|
2295
2330
|
return res.sendError( { validate: false, duplicates: duplicateUsers, message: 'Email is Duplicated' }, 400 );
|
|
2296
2331
|
}
|
|
@@ -2329,7 +2364,7 @@ export const validateUserv1 = async ( req, res ) => {
|
|
|
2329
2364
|
{
|
|
2330
2365
|
$project: {
|
|
2331
2366
|
newEmail: { $toLower: '$email' },
|
|
2332
|
-
isActive: 1,
|
|
2367
|
+
// isActive: 1,
|
|
2333
2368
|
clientId: 1,
|
|
2334
2369
|
email: 1,
|
|
2335
2370
|
},
|
|
@@ -2337,7 +2372,7 @@ export const validateUserv1 = async ( req, res ) => {
|
|
|
2337
2372
|
{
|
|
2338
2373
|
$match: {
|
|
2339
2374
|
newEmail: { $in: userEmailList },
|
|
2340
|
-
isActive: true,
|
|
2375
|
+
// isActive: true,
|
|
2341
2376
|
clientId: { $ne: req.body.clientId },
|
|
2342
2377
|
},
|
|
2343
2378
|
},
|
|
@@ -4247,7 +4282,7 @@ export async function updateAssign( req, res ) {
|
|
|
4247
4282
|
},
|
|
4248
4283
|
];
|
|
4249
4284
|
let assignUserDetails = await userService.aggregate( query );
|
|
4250
|
-
|
|
4285
|
+
for ( let assign of req.body.assignedList ) {
|
|
4251
4286
|
let userDetails = assignUserDetails.find( ( ele ) => ele.email.toLowerCase() == assign.userEmail.toLowerCase() );
|
|
4252
4287
|
if ( !userDetails ) {
|
|
4253
4288
|
let userData = {
|
|
@@ -4257,7 +4292,7 @@ export async function updateAssign( req, res ) {
|
|
|
4257
4292
|
clientId: req.body.clientId,
|
|
4258
4293
|
};
|
|
4259
4294
|
userDetails = await createUser( userData );
|
|
4260
|
-
userDetails
|
|
4295
|
+
assignUserDetails.push( userDetails );
|
|
4261
4296
|
}
|
|
4262
4297
|
let data = {
|
|
4263
4298
|
...assign,
|
|
@@ -4271,7 +4306,7 @@ export async function updateAssign( req, res ) {
|
|
|
4271
4306
|
};
|
|
4272
4307
|
delete data._id;
|
|
4273
4308
|
assignedUserList.push( data );
|
|
4274
|
-
}
|
|
4309
|
+
}
|
|
4275
4310
|
let assignGroupDetails = [];
|
|
4276
4311
|
if ( req.body.coverage == 'store' ) {
|
|
4277
4312
|
assignGroupDetails = await clusterServices.findcluster( { _id: { $in: req.body.assignedGroup } } );
|