tango-app-api-trax 3.4.0-beta-0 → 3.4.0-beta-2

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tango-app-api-trax",
3
- "version": "3.4.0-beta-0",
3
+ "version": "3.4.0-beta-2",
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.73",
30
- "tango-app-api-middleware": "^3.1.66",
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 = inputstores.map((data)=>data.storeName)
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
- console.log( req.body );
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 fcmToken;
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 ( !fcmToken ) {
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 sendPushNotification( requestData.title, requestData.description, fcmToken, custom );
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
  }
@@ -320,7 +323,7 @@ export async function startChecklistv1( req, res ) {
320
323
  if ( !getchecklist[0].redoStatus ) {
321
324
  await processedchecklist.updateOne( updateQuery, { questionAnswers: getchecklist[0].questionAnswers } );
322
325
  }
323
- getupdatedchecklist[0].questionAnswers.forEach( ( section ) => {
326
+ getchecklist[0].questionAnswers.forEach( ( section ) => {
324
327
  section.questions.forEach( async ( question ) => {
325
328
  if ( question.questionReferenceImage && question.questionReferenceImage!='' ) {
326
329
  question.questionReferenceImage = JSON.parse( process.env.CDNURL )?.TraxAnswerCDN + question.questionReferenceImage;
@@ -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
  }
@@ -3507,10 +3429,94 @@ export async function questionListv1( req, res ) {
3507
3429
  getchecklist[index].questionAnswers[secIndex].questions = questions;
3508
3430
  }
3509
3431
  }
3510
- if ( !getchecklist[0].redoStatus ) {
3432
+ if ( !getchecklist[0].redoStatus && getchecklist[0].checklistStatus != 'submit' ) {
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
- return res.sendError( { message: 'Unable to create more than 20 linked questions.' }, 400 );
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
- checkListDetails.updateOne( { _id: req.params.checklistId }, params );
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: 'Unable to create more than 20 linked questions' }, 400 );
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
- await Promise.all( req.body.assignedList.map( async ( assign ) => {
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 = 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 } } );