tango-app-api-trax 3.4.1-beta-2 → 3.5.0-alpha-0

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/index.js CHANGED
@@ -8,5 +8,6 @@ import { downloadRouter } from './src/routes/download.router.js';
8
8
  import { mobileRouter } from './src/routes/mobileTrax.routes.js';
9
9
  import { internalTraxRouter } from './src/routes/internalTraxApi.router.js';
10
10
  import { locusOrderRouter } from './src/routes/locus.router.js';
11
+ import { traxActivityLogRouter } from './src/routes/activityLog.router.js';
11
12
 
12
- export { traxDashboardRouter, traxFlagRouter, traxRouter, galleryRouter, downloadRouter, mobileRouter, internalTraxRouter, locusOrderRouter };
13
+ export { traxDashboardRouter, traxFlagRouter, traxRouter, galleryRouter, downloadRouter, mobileRouter, internalTraxRouter, locusOrderRouter, traxActivityLogRouter };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tango-app-api-trax",
3
- "version": "3.4.1-beta-2",
3
+ "version": "3.5.0-alpha-0",
4
4
  "description": "Trax",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -0,0 +1,294 @@
1
+ // import mongoose from 'mongoose';
2
+ import { insertOpenSearchData, updateOpenSearchData, getOpenSearchData } from 'tango-app-api-middleware';
3
+ import * as checklistService from '../services/checklist.service.js';
4
+ import * as taskconfigService from '../services/taskConfig.service.js';
5
+
6
+ export const insertLog = async ( req, res ) => {
7
+ try {
8
+ // let currentDate = new Date();
9
+ // let inserttraxlogs = {
10
+ // 'client_id': '11',
11
+ // 'createAt': new Date(),
12
+ // 'sourceCheckList_id': '668e3e1807d5312fa49b0046',
13
+ // 'checkListName': 'Daily Store Checklistnafi33',
14
+ // 'fromCheckListName': '',
15
+ // 'type': 'checklist',
16
+ // 'action': 'updated',
17
+ // 'storeName': 'LKST007',
18
+ // 'store_id': '',
19
+ // 'createdByEmail': 'lkst007bc1@lenskart.co.in',
20
+ // 'createdBy': 'lkst007bc1',
21
+ // 'coverage': 'store',
22
+ // 'logDetails': {
23
+ // 'schedule': {
24
+ // 'previous': {
25
+ // 'schedule': 'repeats',
26
+ // // "repeats":"daily",
27
+ // 'time': '10:00 AM to 11:00 PM',
28
+ // // "occurs":[],
29
+ // 'scheduleRepeatedDay': [ '01' ],
30
+ // 'scheduleRepeatedType': 'daily',
31
+ // 'scheduleStartTime_iso': '2025-02-10T23:30:00.000+00:00',
32
+ // 'scheduleEndTime_iso': '2025-02-10T23:30:00.000+00:00',
33
+ // 'configStartDate': '2025-03-11T00:00:00.000+00:00',
34
+ // 'configEndDate': '2025-03-12T00:00:00.000+00:00',
35
+ // 'scheduleWeekDays': [ 'Monday', 'Tuesday' ],
36
+ // 'scheduleRepeatedMonthWeek': '2 Tuesday',
37
+ // 'specificDate': [ '10', '11' ],
38
+
39
+ // },
40
+ // 'new': {
41
+ // 'schedule': 'onetime',
42
+ // // "repeats":"weekly",
43
+ // 'time': '10:00 AM to 11:00 PM',
44
+ // // "occurs":["Mondy","Tuesday"],
45
+ // 'scheduleRepeatedDay': [ '01' ],
46
+ // 'scheduleRepeatedType': 'daily',
47
+ // 'configStartDate': '2025-03-11T00:00:00.000+00:00',
48
+ // 'configEndDate': '2025-03-12T00:00:00.000+00:00',
49
+ // 'scheduleStartTime_iso': '2025-02-10T23:30:00.000+00:00',
50
+ // 'scheduleEndTime_iso': '2025-02-10T23:30:00.000+00:00',
51
+ // 'scheduleWeekDays': [ 'Monday', 'Tuesday' ],
52
+ // 'scheduleRepeatedMonthWeek': '2 Tuesday',
53
+ // 'specificDate': [ '10', '11' ],
54
+ // },
55
+ // },
56
+ // 'response': {
57
+ // 'previous': [ 'Geo Facing', 'Allow Multiple response' ],
58
+ // 'new': [ 'Geo Facing 2', 'Allow Multiple response 2' ],
59
+ // },
60
+ // 'owner': {
61
+ // 'previous': [ 'Ajinkya Malshe' ],
62
+ // 'new': [ 'Ajinkya Malshe' ],
63
+ // },
64
+ // 'approver': {
65
+ // 'previous': [ 'raju', 'rajuapprover' ],
66
+ // 'new': [ 'raju 1', 'rajuapprover 2' ],
67
+ // },
68
+ // 'storeAdded': [ 'LKST011', 'LKST022', 'LKST3444', 'LKST455', 'LKST566', 'LKST666', 'LKST766', 'LKST866', 'LkST966' ],
69
+ // 'storeRemoved': [ 'LKST1166', 'LKST1177', 'LKST1188', 'LKST1199', 'LKST1155', 'LKST1144', 'LKST1133', 'LKST1122', 'LkST1111' ],
70
+ // 'userAdded': [ 'LKST011@yopmail.com', 'LKST022@yopmail.com', 'LKST3444@yopmail.com', 'LKST455@yopmail.com', 'LKST566@yopmail.com', 'LKST666@yopmail.com', 'LKST766@yopmail.com', 'LKST866@yopmail.com', 'LkST966@yopmail.com' ],
71
+ // 'userRemoved': [ 'LKST1166@yopmail.com', 'LKST1177@yopmail.com', 'LKST1188@yopmail.com', 'LKST1199@yopmail.com', 'LKST1155@yopmail.com', 'LKST1144@yopmail.com', 'LKST1133@yopmail.com', 'LKST1122@yopmail.com', 'LkST1111@yopmail.com' ],
72
+ // },
73
+ // };
74
+
75
+ let inserttraxlogs = {
76
+ client_id: '201',
77
+ createAt: new Date( '2025-04-21T14:43:22.603Z' ),
78
+ sourceCheckList_id: '68065496feb4eaeb4515cf1d',
79
+ checkListName: 'Ghk',
80
+ fromCheckListName: '',
81
+ type: 'checklist',
82
+ action: 'draft',
83
+ storeName: '',
84
+ store_id: '',
85
+ createdByEmail: 'praveenraju@tangotech.co.in',
86
+ createdBy: 'Praveen Raju',
87
+ coverage: 'store',
88
+ logDetails: {
89
+ schedule: {
90
+ previous: {
91
+ scheduleDateString: '28 Apr, 2025',
92
+ schedule: 'onetime',
93
+ time: '10:00 AM to 10:00 PM',
94
+ scheduleRepeatedDay: '',
95
+ scheduleRepeatedType: 'onetime',
96
+ scheduleWeekDays: [],
97
+ scheduleRepeatedMonthWeek: '',
98
+ specificDate: [],
99
+ },
100
+ new: {
101
+ scheduleDateString: '29 Apr, 2025',
102
+ schedule: 'onetime',
103
+ time: '10:00 AM to 10:00 PM',
104
+ scheduleRepeatedDay: '',
105
+ scheduleRepeatedType: 'onetime',
106
+ scheduleWeekDays: [],
107
+ scheduleRepeatedMonthWeek: '',
108
+ specificDate: [],
109
+ },
110
+ },
111
+ response: { previous: [], new: [] },
112
+ approver: {},
113
+ owner: {},
114
+ storeAdded: [ 'test_Eye52', 'test_Eye53' ],
115
+ storeRemoved: [],
116
+ userAdded: [],
117
+ userRemoved: [],
118
+ },
119
+ userType: 'tango',
120
+ };
121
+ // console.log( 'inserttraxlogs =>', inserttraxlogs );
122
+ let insertOS = await insertOpenSearchData( JSON.parse( process.env.OPENSEARCH ).traxActivityLog, inserttraxlogs );
123
+ console.log( 'insertOS', insertOS );
124
+ return res.sendSuccess( 'insert successfully' );
125
+ // if ( insertOS && insertOS.body.result == 'created' ) {
126
+ // emailersIds.push( insertOS.body._id );
127
+ // }
128
+ } catch ( e ) {
129
+ // logger.error( 'insertLog =>', e );
130
+ // console.log( 'insertLog =>', e );
131
+ return res.sendError( e, 500 );
132
+ }
133
+ };
134
+ export const updateLog = async ( req, res ) => {
135
+ try {
136
+ // console.log( 'update' );
137
+ const document = {
138
+ doc: {
139
+ storeName: 'LKST008',
140
+ // fromDate: '2025-01-13',
141
+ // toDate: '2025-01-19',
142
+ // status: 'completed',
143
+ // storeIds: [ '347-1' ],
144
+ },
145
+ };
146
+ let updateResult = await updateOpenSearchData( JSON.parse( process.env.OPENSEARCH ).traxActivityLog, '5DwBYZUBcRcpuflp5oek', document );
147
+ // console.log( 'updateResult', updateResult );
148
+ if ( updateResult?.statusCode == 200 && updateResult?.body?.result == 'updated' ) {
149
+ return res.sendSuccess( 'Email Send Successfully' );
150
+ } else {
151
+ return res.sendSuccess( 'Email Send Successfully' );
152
+ // return res.sendError( { error: error }, 500 );
153
+ }
154
+ } catch ( e ) {
155
+ logger.error( 'updateLog =>', e );
156
+ return res.sendError( e, 500 );
157
+ }
158
+ };
159
+ export const listLog = async ( req, res ) => {
160
+ try {
161
+ let requestBody = req.body;
162
+ let from = ( requestBody.offset ) * requestBody.limit;
163
+
164
+ let start = new Date( requestBody.fromDate );
165
+ let userTimezoneOffset = start.getTimezoneOffset() * 60000;
166
+ start = new Date( start.getTime() - userTimezoneOffset );
167
+ start.setUTCHours( 0, 0, 0, 0 );
168
+ let end = new Date( requestBody.toDate );
169
+ end = new Date( end.getTime() - userTimezoneOffset );
170
+ end.setUTCHours( 23, 59, 59, 59 );
171
+
172
+ // console.log( 'list' );
173
+ const mustConditions = [];
174
+
175
+ if ( requestBody.clientId ) {
176
+ mustConditions.push( { term: { client_id: requestBody.clientId } } );
177
+ }
178
+
179
+ if ( requestBody.type ) {
180
+ mustConditions.push( { term: { type: requestBody.type } } );
181
+ }
182
+ if ( requestBody.action && requestBody.action.length > 0 ) {
183
+ mustConditions.push( { terms: { action: requestBody.action } } );
184
+ }
185
+
186
+ if ( req.user.userType == 'client' && req.user.role == 'user' ) {
187
+ return res.sendError( 'no data found', 204 );
188
+ }
189
+ let sourceCheckListIds;
190
+ if ( req.user.userType === 'client' && req.user.role == 'admin' ) {
191
+ if ( requestBody.type === 'checklist' ) {
192
+ const sourceCheckListResult = await checklistService.aggregate( [
193
+ // { $match: { 'owner.value': req.user.email } },
194
+ { $match: { $or: [ { 'owner.value': req.user.email }, { 'approver.value': req.user.email } ] } },
195
+ { $group: { _id: null, checklistIds: { $push: { $toString: '$_id' } } } },
196
+ { $project: { _id: 0, checklistIds: 1 } },
197
+ ] );
198
+ sourceCheckListIds = sourceCheckListResult.length > 0 ? sourceCheckListResult[0].checklistIds : [];
199
+ // console.log( 'sourceCheckListIds', sourceCheckListIds );
200
+ }
201
+ if ( requestBody.type === 'task' ) {
202
+ const sourceCheckListResult = await taskconfigService.aggregate( [
203
+ { $match: { createdBy: req.user._id } },
204
+ // { $match: { $or: [ { 'owner.value': req.user.email }, { 'approver.value': req.user.email } ] } },
205
+ { $group: { _id: null, checklistIds: { $push: { $toString: '$_id' } } } },
206
+ { $project: { _id: 0, checklistIds: 1 } },
207
+ ] );
208
+ sourceCheckListIds = sourceCheckListResult.length > 0 ? sourceCheckListResult[0].checklistIds : [];
209
+ // console.log( 'sourceCheckListIds', sourceCheckListIds );
210
+ }
211
+
212
+ // mustConditions.push( { terms: { $or: [ { store_id: { $in: requestBody.storeId } }, { store_id: { $eq: '' }, userEmail: { $in: requestBody.userEmailes } }, { sourceCheckList_id: { $in: sourceCheckListIds } } ] } } );
213
+ mustConditions.push( {
214
+ 'bool': {
215
+ 'should': [
216
+ { 'terms': { 'store_id': requestBody.storeId } },
217
+ {
218
+ 'bool': {
219
+ 'must': [
220
+ { 'term': { 'store_id': '' } },
221
+ { 'terms': { 'userEmail': requestBody.userEmailes } },
222
+ ],
223
+ },
224
+ },
225
+ { 'terms': { 'sourceCheckList_id': sourceCheckListIds.map( String ) } },
226
+ ],
227
+ 'minimum_should_match': 1,
228
+ },
229
+ } );
230
+ }
231
+ if ( req.user.userType === 'client' ) {
232
+ mustConditions.push( {
233
+ term: { userType: 'client' },
234
+ } );
235
+ }
236
+
237
+
238
+ if ( requestBody.searchValue ) {
239
+ mustConditions.push( { multi_match: {
240
+ 'query': requestBody.searchValue,
241
+ 'fields': [ 'checkListName', 'storeName', 'createdByEmail' ],
242
+ 'type': 'phrase_prefix',
243
+ },
244
+ } );
245
+ }
246
+ // console.log( 'Generated Query:', JSON.stringify( mustConditions, null, 2 ) );
247
+
248
+ // console.log( 'mustConditions =>', mustConditions );
249
+ if ( requestBody.fromDate && requestBody.toDate ) {
250
+ mustConditions.push( {
251
+ range: {
252
+ createAt: {
253
+ gte: start, // Start date
254
+ lte: end, // End date
255
+ },
256
+ },
257
+ } );
258
+ }
259
+ let sortCreatedAt = 'desc';
260
+ if ( requestBody.sortColumnName && requestBody.sortColumnName != '' ) {
261
+ if ( requestBody.sortBy == '1' ) {
262
+ sortCreatedAt = 'asc';
263
+ }
264
+ }
265
+ let query = {
266
+ from: parseInt( from ),
267
+ size: parseInt( requestBody.limit ),
268
+ track_total_hits: true,
269
+ query: {
270
+ bool: {
271
+ must: mustConditions,
272
+ },
273
+ },
274
+ sort: [
275
+ {
276
+ createAt: {
277
+ order: sortCreatedAt,
278
+ },
279
+ },
280
+ '_doc',
281
+ ],
282
+ };
283
+ // console.log( 'Executing OpenSearch Query:', JSON.stringify( query, null, 2 ) );
284
+ let result = await getOpenSearchData( JSON.parse( process.env.OPENSEARCH ).traxActivityLog, query );
285
+ // console.log( 'OpenSearch Raw Response', JSON.stringify( result, null, 2 ) );
286
+ if ( !result || !result.body.hits.hits.length ) {
287
+ return res.sendError( 'no data found', 204 );
288
+ }
289
+ return res.sendSuccess( { count: result.body.hits.total.value, result: result.body.hits.hits } );
290
+ } catch ( e ) {
291
+ // console.log( 'listLog', e );
292
+ return res.sendError( e, 500 );
293
+ }
294
+ };
@@ -559,6 +559,8 @@ export const getChecklistFromZipId = async ( req, res ) => {
559
559
  resultData.questions = getzipdata.questions;
560
560
  resultData.insertType = getzipdata.insertType;
561
561
  resultData.status = getzipdata.status;
562
+ resultData.fromDate = getzipdata.fromDate;
563
+ resultData.toDate = getzipdata.toDate;
562
564
  return res.sendSuccess( resultData );
563
565
  }
564
566
  } else {
@@ -1,6 +1,6 @@
1
1
 
2
2
 
3
- import { logger } from 'tango-app-api-middleware';
3
+ import { logger, insertOpenSearchData } from 'tango-app-api-middleware';
4
4
  import * as storeService from '../services/store.service.js';
5
5
  import * as groupService from '../services/group.service.js';
6
6
  import * as clusterService from '../services/cluster.service.js';
@@ -282,15 +282,23 @@ export async function approveChecklist( req, res ) {
282
282
  if ( req.body?.storeId?.length ) {
283
283
  query['store_id'] = { $in: req.body.storeId };
284
284
  }
285
- let checklistDetails = await processedChecklist.find( query, { _id: 1, checklistStatus: 1, storeName: 1, store_id: 1, userEmail: 1 } );
285
+ let checklistDetails = await processedChecklist.find( query, { _id: 1, checklistStatus: 1, storeName: 1, store_id: 1, userEmail: 1, client_id: 1, coverage: 1, checkListName: 1 } );
286
286
  if ( !checklistDetails.length ) {
287
287
  return res.sendError( 'No data found', 204 );
288
288
  }
289
289
  let idList = checklistDetails.filter( ( ele ) => ele.checklistStatus == 'submit' ).map( ( item ) => item._id );
290
290
  if ( idList.length ) {
291
- let updateResponse = await processedChecklist.updateMany( { _id: { $in: idList } }, { approvalStatus: true } );
291
+ let approvalUpdateData = {
292
+ approvalStatus: true,
293
+ approvalTime: new Date(),
294
+ approvalTime_string: dayjs().format( 'hh:mm A, DD MMM YYYY' ),
295
+ approvalByName: req.user.userName,
296
+ approvalByEmail: req.user.email,
297
+ };
298
+ let updateResponse = await processedChecklist.updateMany( { _id: { $in: idList } }, approvalUpdateData );
292
299
  if ( updateResponse.modifiedCount || updateResponse.matchedCount ) {
293
300
  let inputstores = checklistDetails.filter( ( data ) => data.checklistStatus == 'submit' );
301
+ let storeNames = inputstores.map( ( data ) => data.storeName );
294
302
 
295
303
 
296
304
  let params = {
@@ -303,6 +311,10 @@ export async function approveChecklist( req, res ) {
303
311
  },
304
312
  'upsert': {
305
313
  approvalStatus: true,
314
+ approvalTime: new Date(),
315
+ approvalTime_string: dayjs().format( 'hh:mm A, DD MMM YYYY' ),
316
+ approvalByName: req.user.userName,
317
+ approvalByEmail: req.user.email,
306
318
  },
307
319
  };
308
320
 
@@ -315,7 +327,27 @@ export async function approveChecklist( req, res ) {
315
327
  };
316
328
  let url = JSON.parse( process.env.LAMBDAURL );
317
329
  let searchResponse = await fetch( url.approveChecklist, requestOptions );
318
-
330
+ let logData= {
331
+ 'client_id': checklistDetails[0].client_id,
332
+ 'createAt': new Date(),
333
+ 'sourceCheckList_id': req.body.sourceCheckList_id,
334
+ 'checkListName': checklistDetails[0].checkListName,
335
+ 'fromCheckListName': '',
336
+ 'type': 'checklist',
337
+ 'action': 'approved',
338
+ 'storeName': '',
339
+ 'store_id': '',
340
+ 'createdByEmail': req.user.email,
341
+ 'createdBy': req.user._id,
342
+ 'coverage': checklistDetails[0].coverage,
343
+ 'logDetails': {
344
+ 'approved': storeNames,
345
+ },
346
+ 'userType': req.user.userType,
347
+ };
348
+ console.log( 'logData', logData );
349
+ let urlopensearch = JSON.parse( process.env.OPENSEARCH );
350
+ insertOpenSearchData( urlopensearch.traxActivityLog, logData );
319
351
  console.log( searchResponse.ok );
320
352
  if ( searchResponse.ok ) {
321
353
  let pendingstores = checklistDetails.filter( ( data ) => data.checklistStatus != 'submit' );
@@ -350,7 +382,7 @@ export async function redoChecklist( req, res ) {
350
382
  }
351
383
 
352
384
 
353
- let checklistDetails = await processedChecklist.findOne( { _id: req.body.payload._id }, { questionAnswers: 1, redoStatus: 1, checklistStatus: 1, client_id: 1, store_id: 1, storeName: 1, checkListType: 1, sourceCheckList_id: 1, checkListName: 1, submitTime: 1, userName: 1, answerType: 1 } );
385
+ let checklistDetails = await processedChecklist.findOne( { _id: req.body.payload._id }, { questionAnswers: 1, redoStatus: 1, checklistStatus: 1, client_id: 1, store_id: 1, storeName: 1, checkListType: 1, sourceCheckList_id: 1, checkListName: 1, submitTime: 1, userName: 1, answerType: 1, coverage: 1, userEmail: 1 } );
354
386
  if ( !checklistDetails ) {
355
387
  return res.sendError( 'No data found', 204 );
356
388
  }
@@ -440,7 +472,27 @@ export async function redoChecklist( req, res ) {
440
472
  let url = JSON.parse( process.env.LAMBDAURL );
441
473
  let searchResponse = await fetch( url.redoChecklist, requestOptions );
442
474
  console.log( searchResponse.ok );
443
-
475
+ let logData= {
476
+ 'client_id': checklistDetails.client_id,
477
+ 'createAt': new Date(),
478
+ 'sourceCheckList_id': checklistDetails.sourceCheckList_id,
479
+ 'checkListName': checklistDetails.checkListName,
480
+ 'fromCheckListName': checklistDetails.checkListName,
481
+ 'type': 'checklist',
482
+ 'action': checklistDetails.redoStatus?'multiredo': 'redo',
483
+ 'storeName': checklistDetails?.storeName?checklistDetails?.storeName:'',
484
+ 'store_id': checklistDetails?.store_id?checklistDetails?.store_id:'',
485
+ 'userName': checklistDetails.userName,
486
+ 'userEmail': checklistDetails.userEmail,
487
+ 'createdByEmail': req.user.email,
488
+ 'createdBy': req.user.userName,
489
+ 'coverage': checklistDetails.coverage,
490
+ 'logDetails': {},
491
+ 'userType': req.user.userType,
492
+ };
493
+ let urlopensearch = JSON.parse( process.env.OPENSEARCH );
494
+ console.log( 'logData', logData );
495
+ insertOpenSearchData( urlopensearch.traxActivityLog, logData );
444
496
  if ( searchResponse.ok ) {
445
497
  return res.sendSuccess( 'Question redo successfully' );
446
498
  } else {
@@ -455,6 +507,150 @@ export async function redoChecklist( req, res ) {
455
507
  }
456
508
  }
457
509
 
510
+ export async function redomultiChecklist( req, res ) {
511
+ try {
512
+ let inputData = req.body.payload.coverage==='user'?req.body.payload.userEmail:req.body.payload.storeName;
513
+
514
+
515
+ for ( let originalData of inputData ) {
516
+ if ( !originalData.checklistId ) {
517
+ return res.sendError( 'Id is Required', 400 );
518
+ }
519
+ if ( !originalData.section_id ) {
520
+ return res.sendError( 'Section id is Required', 400 );
521
+ }
522
+ if ( !req.body.payload.qno ) {
523
+ return res.sendError( 'Question number is Required', 400 );
524
+ }
525
+
526
+
527
+ let checklistDetails = await processedChecklist.findOne( { _id: originalData.checklistId }, { questionAnswers: 1, redoStatus: 1, checklistStatus: 1, client_id: 1, store_id: 1, storeName: 1, checkListType: 1, sourceCheckList_id: 1, checkListName: 1, submitTime: 1, userName: 1, answerType: 1 } );
528
+ if ( !checklistDetails ) {
529
+ return res.sendError( 'No data found', 204 );
530
+ }
531
+ let question = checklistDetails.questionAnswers;
532
+
533
+
534
+ let sectionIndex = question.findIndex( ( sec ) => sec.sectionName == req.body.payload.sectionName );
535
+ if ( sectionIndex == -1 ) {
536
+ return res.sendError( 'section is not found', 400 );
537
+ }
538
+
539
+ let findQuestion = question[sectionIndex].questions.findIndex( ( ele ) => ele.qno == req.body.payload.qno );
540
+
541
+ let data = { ...question[sectionIndex].questions[findQuestion], redo: true, redoComment: req.body.payload?.checklistDescription || '' };
542
+ // if ( checklistDetails.client_id == '458' ) {
543
+ data.answers.forEach( ( item ) => {
544
+ if ( item.showLinked ) {
545
+ item.nestedQuestion.forEach( ( ele ) => {
546
+ let eleIndex = question[sectionIndex].questions.findIndex( ( qn ) => qn.qno == parseInt( ele ) );
547
+ let element = { ...question[sectionIndex].questions[eleIndex], redo: true, redoComment: '', linkquestionenabled: false };
548
+ question[sectionIndex].questions[eleIndex] = element;
549
+ question[sectionIndex].questions[eleIndex].userAnswer = [];
550
+ question[sectionIndex].questions[eleIndex].remarks = '';
551
+ } );
552
+ }
553
+ } );
554
+ // data.answers.forEach( ( item ) => {
555
+ // if ( item.showLinked ) {
556
+ // item.nestedQuestion = [];
557
+ // item.showLinked = false;
558
+ // item.linkedQuestion = 0;
559
+ // }
560
+ // } );
561
+ // }
562
+ let userAnswer = data.userAnswer;
563
+
564
+ question[sectionIndex].questions[findQuestion] = data;
565
+ question[sectionIndex].questions[findQuestion].userAnswer = [];
566
+ question[sectionIndex].questions[findQuestion].remarks = '';
567
+ checklistDetails.questionAnswers = question;
568
+ let updateData = {
569
+ checklistStatus: 'open',
570
+ redoStatus: true,
571
+ reinitiateStatus: true,
572
+ questionAnswers: question,
573
+ };
574
+
575
+ let response = await processedChecklist.updateOne( { _id: originalData.checklistId }, updateData );
576
+ console.log( response );
577
+ if ( response.modifiedCount || response.matchedCount ) {
578
+ let storeTimeZone = await storeService.findOne( { storeName: checklistDetails.storeName }, { 'storeProfile.timeZone': 1 } );
579
+ let currentDateTime;
580
+ if ( storeTimeZone?.storeProfile?.timeZone ) {
581
+ currentDateTime = dayjs().tz( storeTimeZone?.storeProfile?.timeZone );
582
+ } else {
583
+ currentDateTime = dayjs();
584
+ }
585
+ data = {
586
+ checklistId: checklistDetails.sourceCheckList_id,
587
+ checkListName: checklistDetails.checkListName,
588
+ checklistDescription: req.body.payload.checklistDescription,
589
+ sectionId: originalData.section_id,
590
+ sectionName: question[sectionIndex].sectionName,
591
+ questionName: question[sectionIndex].questions[findQuestion].qname,
592
+ action: 'redo',
593
+ store_id: checklistDetails?.store_id?checklistDetails?.store_id:'',
594
+ storeName: checklistDetails?.storeName?checklistDetails?.storeName:'',
595
+ client_id: checklistDetails.client_id,
596
+ processedChecklistId: checklistDetails._id,
597
+ type: checklistDetails.checkListType,
598
+ userAnswer: userAnswer,
599
+ initiatedBy: req.user.userName,
600
+ initiatedTime: dayjs.utc( currentDateTime.format( 'hh:mm:ss A, DD MMM YYYY' ), 'hh:mm:ss A, DD MMM YYYY' ).format(),
601
+ answerType: question[sectionIndex].questions[findQuestion].answerType,
602
+ submitedBy: checklistDetails.userName,
603
+ submitTime: checklistDetails.submitTime,
604
+ };
605
+ await checklistLogs.create( data );
606
+
607
+
608
+ req.body.payload._id=originalData.checklistId;
609
+ req.body.payload.section_id=originalData.section_id;
610
+ req.body.payload.uniqueNo=originalData.uniqueNo;
611
+ console.log( req.body );
612
+
613
+
614
+ const requestOptions = {
615
+ method: 'POST',
616
+ headers: {
617
+ 'Content-Type': 'application/json',
618
+ },
619
+ body: JSON.stringify( req.body ),
620
+ };
621
+ let url = JSON.parse( process.env.LAMBDAURL );
622
+ let searchResponse = await fetch( url.redoChecklist, requestOptions );
623
+ console.log( searchResponse.ok );
624
+ let logData= {
625
+ 'client_id': checklistDetails.client_id,
626
+ 'createAt': new Date(),
627
+ 'sourceCheckList_id': checklistDetails.sourceCheckList_id,
628
+ 'checkListName': checklistDetails.checkListName,
629
+ 'fromCheckListName': checklistDetails.checkListName,
630
+ 'type': 'checklist',
631
+ 'action': checklistDetails.redoStatus?'multiredo': 'redo',
632
+ 'storeName': checklistDetails?.storeName?checklistDetails?.storeName:'',
633
+ 'store_id': checklistDetails?.store_id?checklistDetails?.store_id:'',
634
+ 'userName': checklistDetails.userName,
635
+ 'userEmail': checklistDetails.userEmail,
636
+ 'createdByEmail': req.user.email,
637
+ 'createdBy': req.user.userName,
638
+ 'coverage': checklistDetails.coverage,
639
+ 'logDetails': {},
640
+ 'userType': req.user.userType,
641
+ };
642
+ let urlopensearch = JSON.parse( process.env.OPENSEARCH );
643
+ console.log( 'logData', logData );
644
+ insertOpenSearchData( urlopensearch.traxActivityLog, logData );
645
+ }
646
+ }
647
+ return res.sendSuccess( 'Question redo successfully' );
648
+ } catch ( e ) {
649
+ logger.error( { function: 'redomultiChecklist', error: e } );
650
+ return res.sendError( e, 500 );
651
+ }
652
+ }
653
+
458
654
 
459
655
  export async function getLogs( req, res ) {
460
656
  try {