tango-app-api-task 3.2.1-beta-42 → 3.2.1-hotfix-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.
@@ -8,9 +8,7 @@ import * as storeService from '../service/store.service.js';
8
8
  import * as traxApprover from '../service/approver.service.js';
9
9
  import * as processedChecklist from '../service/processedChecklist.service.js';
10
10
  import * as checklistassignconfigModel from '../service/checklistAssign.service.js';
11
- import * as clusterServices from '../service/cluster.service.js';
12
- import * as teamsServices from '../service/teams.service.js';
13
- // import * as clusterModel from '../service/cluster.service.js';
11
+ import * as clusterModel from '../service/cluster.service.js';
14
12
  // import * as domainService from '../service/domain.service.js';
15
13
  import mongoose from 'mongoose';
16
14
  const ObjectId = mongoose.Types.ObjectId;
@@ -127,6 +125,38 @@ export async function createUpdateTask( req, res ) {
127
125
  } );
128
126
  } );
129
127
 
128
+ for ( let [ index, question ] of section.questions.entries() ) {
129
+ await processNested( index, question );
130
+ }
131
+
132
+ async function processNested( qIdx, question, nestedIndex = -1 ) {
133
+ if ( question?.answers?.length ) {
134
+ for ( let [ index, answer ] of question?.answers?.entries() ) {
135
+ if ( !section.questions[qIdx].answers[index]?.nestedQuestion && nestedIndex == -1 ) {
136
+ section.questions[qIdx].answers[index].nestedQuestion = [];
137
+ }
138
+ if ( answer.showLinked ) {
139
+ if ( nestedIndex != -1 ) {
140
+ section.questions[qIdx].answers[nestedIndex].nestedQuestion.push( answer.linkedQuestion );
141
+ } else {
142
+ section.questions[qIdx].answers[index].nestedQuestion.push( answer.linkedQuestion );
143
+ }
144
+ let nestedLinkedQuestion = section.questions.find( ( item ) => item.qno == answer.linkedQuestion );
145
+ if ( nestedLinkedQuestion ) {
146
+ let findNestedAnswers = nestedLinkedQuestion.answers.find( ( item ) => item.showLinked );
147
+ if ( findNestedAnswers ) {
148
+ if ( nestedIndex != -1 ) {
149
+ await processNested( qIdx, nestedLinkedQuestion, nestedIndex );
150
+ } else {
151
+ await processNested( qIdx, nestedLinkedQuestion, index );
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+
130
160
  sectionList.push( {
131
161
  section: section?.name || 'Section 1',
132
162
  createdBy: req.user._id,
@@ -264,29 +294,9 @@ export async function taskDetails( req, res ) {
264
294
  }
265
295
  if ( storechecklistdetails ) {
266
296
  result.checkListDetails = { ...storechecklistdetails._doc };
267
- let query = {
268
- checkListId: storechecklistdetails._id,
269
- ...( storechecklistdetails.coverage == 'store' ) ? { $or: [ { store_id: { $exists: true } }, { clusterName: { $exists: true } } ] } : { $or: [ { userEmail: { $exists: true } }, { teamName: { $exists: true } } ] },
270
- };
271
- let assignList = await taskAssignService.find( query, { _id: 1, store_id: 1, clusterName: 1, userEmail: 1, teamName: 1, assignId: 1 } );
272
- let singleAssign;
273
- let groupAssign;
274
- if ( storechecklistdetails.coverage == 'store' ) {
275
- singleAssign = assignList.filter( ( item ) => typeof item?.store_id != 'undefined' && item?.store_id != '' ).map( ( item ) => {
276
- return { id: item.assignId, type: 'store' };
277
- } );
278
- groupAssign = assignList.filter( ( item ) => typeof item?.clusterName != 'undefined' && item?.clusterName != '' ).map( ( item ) => {
279
- return { id: item.assignId, type: 'cluster' };
280
- } );
281
- } else {
282
- singleAssign = assignList.filter( ( item ) => typeof item?.userEmail != 'undefined' && item?.userEmail !='' ).map( ( item ) => {
283
- return { id: item.assignId, type: 'user' };
284
- } );
285
- groupAssign = assignList.filter( ( item ) => typeof item?.teamName != 'undefined' && item?.teamName != '' ).map( ( item ) => {
286
- return { id: item.assignId, type: 'teams' };
287
- } );
288
- }
289
- result.checkListDetails = { ...result.checkListDetails, ...{ sections: sectionList }, singleAssign, groupAssign };
297
+ let removedUsers = await taskAssignService.find( { checkFlag: false, checkListId: storechecklistdetails._id }, { _id: 1 } );
298
+ removedUsers = removedUsers?.map( ( item ) => item._id );
299
+ result.checkListDetails = { ...result.checkListDetails, ...{ sections: sectionList }, ...{ removedUsers: removedUsers } };
290
300
  }
291
301
  return res.sendSuccess( result );
292
302
  } catch ( e ) {
@@ -455,189 +465,6 @@ export async function validateUser( req, res ) {
455
465
  }
456
466
  };
457
467
 
458
- export const validateUserv1 = async ( req, res ) => {
459
- try {
460
- if ( !req.body.assignedUsers?.length ) {
461
- return res.sendError( 'Please Enter user Details', 400 );
462
- }
463
-
464
- let assignDetails = req.body.assignedUsers;
465
-
466
- if ( req.body.coverage == 'store' ) {
467
- const duplicateStore = assignDetails.reduce( ( acc, obj ) => {
468
- if ( !acc[obj.storeName.toLowerCase()] ) {
469
- acc[obj.storeName.toLowerCase()] = {
470
- email: [ obj.userEmail.toLowerCase() ],
471
- count: 1,
472
- };
473
- } else {
474
- if ( acc[obj.storeName.toLowerCase()] ) {
475
- if ( acc[obj.storeName.toLowerCase()].email.includes( obj.userEmail.toLowerCase() ) ) {
476
- acc[obj.storeName.toLowerCase()].count++;
477
- } else {
478
- acc[obj.storeName.toLowerCase()].email.push( obj.userEmail.toLowerCase() );
479
- }
480
- }
481
- }
482
- return acc;
483
- }, {} );
484
-
485
- const duplicateStores = Object.keys( duplicateStore ).filter( ( storeName ) => duplicateStore[storeName].count > 1 );
486
- if ( duplicateStores.length ) {
487
- return res.sendError( { validate: false, duplicates: duplicateStores, message: 'Store and email is duplicated' }, 400 );
488
- }
489
- } else {
490
- const duplicateUser = assignDetails.reduce( ( acc, obj ) => {
491
- if ( !acc[obj.userEmail.toLowerCase()] ) {
492
- acc[obj.userEmail.toLowerCase()] = {
493
- name: [ obj.userName.toLowerCase() ],
494
- count: 1,
495
- };
496
- } else {
497
- if ( acc[obj.userEmail.toLowerCase()] ) {
498
- if ( acc[obj.userEmail.toLowerCase()].name.includes( obj.userName.toLowerCase() ) ) {
499
- acc[obj.userEmail.toLowerCase()].count++;
500
- } else {
501
- acc[obj.userEmail.toLowerCase()].name.push( obj.userEmail.toLowerCase() );
502
- }
503
- }
504
- }
505
- return acc;
506
- }, {} );
507
-
508
- const duplicateUsers = Object.keys( duplicateUser ).filter( ( storeName ) => duplicateUser[storeName].count > 1 );
509
- if ( duplicateUsers.length ) {
510
- return res.sendError( { validate: false, duplicates: duplicateUsers, message: 'Email is Duplicated' }, 400 );
511
- }
512
- }
513
-
514
- if ( req.body.hasOwnProperty( 'addSingle' ) ) {
515
- let checkExists = await taskAssignService.findOne( { userEmail: assignDetails[0]?.userEmail, storeName: assignDetails[0]?.storeName, checkListId: req.body.id } );
516
- if ( checkExists ) {
517
- return res.sendError( 'User already Exists', 400 );
518
- }
519
- }
520
-
521
- let userEmailList = assignDetails.map( ( item ) => item.userEmail?.trim()?.toLowerCase() );
522
- let storeList = assignDetails.map( ( item ) => item?.storeName?.trim()?.toLowerCase() );
523
-
524
- let userQuery = [
525
- {
526
- $project: {
527
- newEmail: { $toLower: '$email' },
528
- isActive: 1,
529
- clientId: 1,
530
- userName: 1,
531
- email: 1,
532
- },
533
- },
534
- {
535
- $match: {
536
- newEmail: { $in: userEmailList },
537
- isActive: true,
538
- clientId: req.body.clientId,
539
- },
540
- },
541
- ];
542
-
543
- let emailCheckQuery = [
544
- {
545
- $project: {
546
- newEmail: { $toLower: '$email' },
547
- isActive: 1,
548
- clientId: 1,
549
- },
550
- },
551
- {
552
- $match: {
553
- newEmail: { $in: userEmailList },
554
- isActive: true,
555
- clientId: { $ne: req.body.clientId },
556
- },
557
- },
558
- ];
559
-
560
- let storeQuery = [
561
- {
562
- $project: {
563
- 'store': { $toLower: '$storeName' },
564
- 'clientId': 1,
565
- 'storeProfile.city': 1,
566
- 'status': 1,
567
- 'storeId': 1,
568
- 'spocDetails': 1,
569
- 'storeName': 1,
570
- },
571
- },
572
- {
573
- $match: {
574
- clientId: req.body.clientId,
575
- store: { $in: storeList },
576
- },
577
- },
578
- ];
579
-
580
- let [ userDetails, storeDetails, existEmail ] = await Promise.all( [
581
- await userService.aggregate( userQuery ),
582
- await storeService.aggregate( storeQuery ),
583
- await userService.aggregate( emailCheckQuery ),
584
- ] );
585
-
586
- existEmail = existEmail.map( ( ele ) => ele.newEmail );
587
- let existUserEmail = userDetails.map( ( ele ) => ele.newEmail );
588
- let newUserList = userEmailList.filter( ( ele ) => !existUserEmail.includes( ele ) && !existEmail.includes( ele ) );
589
- let inActiveStores = storeDetails.filter( ( ele ) => ele.status == 'deactive' ).map( ( ele ) => ele.storeName );
590
-
591
- let existsStore = storeDetails.map( ( ele ) => ele.storeName.toLowerCase() );
592
- let newStoreList = storeList.filter( ( ele ) => ele != null && !existsStore.includes( ele.toLowerCase() ) );
593
- if ( req.body.coverage == 'store' ) {
594
- assignDetails.forEach( ( item ) => {
595
- let getStoreDetails = storeDetails.find( ( store ) => store.storeName.toLowerCase() == item.storeName.toLowerCase() );
596
- if ( getStoreDetails ) {
597
- let storeUserDetails = userDetails.find( ( ele ) => ele.newEmail.toLowerCase() == item.userEmail.toLowerCase() );
598
- item._id = getStoreDetails._id;
599
- item.storeId = getStoreDetails.storeId;
600
- item.userName = getStoreDetails?.spocDetails?.[0]?.email.toLowerCase() == item.userEmail.toLowerCase() ? getStoreDetails?.spocDetails?.[0]?.name : storeUserDetails?.email == item.userEmail.toLowerCase() ? storeUserDetails?.userName : item.userName;
601
- item.storeName = getStoreDetails.storeName;
602
- item.userEmail = storeUserDetails?.email || item.userEmail;
603
- }
604
- } );
605
- } else {
606
- assignDetails.forEach( ( item ) => {
607
- let getUserDetails = userDetails.find( ( user ) => user.newEmail.toLowerCase() == item.userEmail.toLowerCase() );
608
- if ( getUserDetails ) {
609
- item._id = getUserDetails._id;
610
- item.userName = getUserDetails.userName;
611
- item.userEmail = getUserDetails.email;
612
- }
613
- } );
614
- }
615
-
616
- if ( ( newUserList.length || newStoreList.length || existEmail.length || inActiveStores.length ) && !req.body?.addUser ) {
617
- return res.sendError( { validate: false, user: newUserList, store: newStoreList, existEmail, inActiveStores, data: assignDetails }, 400 );
618
- }
619
- await Promise.all( newUserList.map( async ( ele ) => {
620
- let findUserIndex = assignDetails.findIndex( ( item ) => item?.userEmail?.toLowerCase() == ele?.toLowerCase() );
621
- if ( findUserIndex != -1 ) {
622
- let data = {
623
- userName: assignDetails[findUserIndex]?.userName,
624
- email: ele,
625
- mobileNumber: assignDetails[findUserIndex]?.mobileNumber,
626
- clientId: req.body.clientId,
627
- };
628
- let response = await createUser( data );
629
- if ( req.body.coverage == 'user' ) {
630
- assignDetails[findUserIndex]._id = response._id;
631
- }
632
- }
633
- } ) );
634
- return res.sendSuccess( { validate: true, data: assignDetails } );
635
- } catch ( e ) {
636
- logger.error( 'validateUser 2=>', e );
637
- return res.sendError( e, 500 );
638
- }
639
- };
640
-
641
468
  async function uploadUser( req, res ) {
642
469
  try {
643
470
  let inputBody = req.body;
@@ -768,76 +595,55 @@ export async function userDetails( req, res ) {
768
595
  if ( !req.query.taskId ) {
769
596
  return res.sendError( { message: 'Task Id is required' }, 400 );
770
597
  }
771
- // let limit = parseInt( req.query.limit ) || 5;
772
- // let page = parseInt( req.query.offset ) || 0;
773
- // let skip = limit * page;
598
+ let limit = parseInt( req.query.limit ) || 5;
599
+ let page = parseInt( req.query.offset ) || 0;
600
+ let skip = limit * page;
601
+
602
+ let query = [ { $match: { checkListId: new ObjectId( req.query.taskId ) } } ];
603
+ if ( req.query?.search?.trim() && req.query?.search?.trim() != '' ) {
604
+ let searchValue = req.query.search;
605
+ searchValue = searchValue.split( ',' ).map( ( item ) => item.trim().toLowerCase() );
606
+ if ( searchValue.length > 1 ) {
607
+ query.push( { $addFields: { storeLower: { $toLower: '$storeName' } } } );
608
+ query.push( { $match: { storeLower: { $in: searchValue } } } );
609
+ } else {
610
+ query.push( { $match: { storeName: { $regex: req.query.search.trim(), $options: 'i' } } } );
611
+ }
612
+ }
774
613
 
775
- let query = [ { $match: { checkListId: new ObjectId( req.query.taskId ), isdeleted: false } }, { $sort: { _id: -1 } } ];
614
+ query.push( {
615
+ $facet: {
616
+ data: [
617
+ { $skip: skip }, { $limit: limit },
618
+ ],
619
+ count: [
620
+ { $count: 'total' },
621
+ ],
622
+ },
623
+ } );
776
624
 
777
625
  let taskDetails = await taskAssignService.aggregate( query );
778
- if ( !taskDetails.length ) {
626
+
627
+ if ( !taskDetails[0].data.length ) {
779
628
  return res.sendError( 'No data found', 204 );
780
629
  }
781
630
 
782
631
  let userDetails = [];
783
- await Promise.all( taskDetails.map( async ( ele ) => {
784
- if ( ele?.clusterName ) {
785
- let clusterDetails = await clusterServices.findOneCluster( { _id: ele.assignId }, { stores: 1 } );
786
- if ( clusterDetails ) {
787
- let storeDetails = await storeService.find( { _id: { $in: clusterDetails.stores.map( ( item ) => item.store ) }, status: 'active' } );
788
- storeDetails.forEach( ( item ) => {
789
- userDetails.push( {
790
- id: ele.assignId,
791
- userName: item.spocDetails?.[0]?.name,
792
- userEmail: item.spocDetails?.[0]?.email,
793
- storeId: item?.storeId,
794
- storeName: item?.storeName,
795
- userPhone: item.spocDetails?.[0]?.phone,
796
- city: ele?.city,
797
- checkFlag: ele.checkFlag,
798
- clusterName: ele?.clusterName || '',
799
- teamName: ele?.teamName || '',
800
- } );
801
- } );
802
- }
803
- } else if ( ele?.teamName ) {
804
- let teamDetails = await teamsServices.findOneTeams( { _id: ele.assignId }, { users: 1, teamName: 1 } );
805
- if ( teamDetails ) {
806
- let teamUserDetails = await userService.find( { _id: { $in: teamDetails.users.map( ( item ) => item.userId ) } } );
807
- teamUserDetails.forEach( ( item ) => {
808
- userDetails.push( {
809
- id: ele.assignId,
810
- userName: item.userName,
811
- userEmail: item.email,
812
- storeId: ele?.storeId,
813
- storeName: ele?.storeName,
814
- userPhone: item?.mobileNumber,
815
- city: ele?.city,
816
- checkFlag: ele.checkFlag,
817
- clusterName: ele?.clusterName || '',
818
- teamName: ele?.teamName || '',
819
- } );
820
- } );
821
- }
822
- } else {
823
- userDetails.push( {
824
- _id: ele.assignId,
825
- userName: ele.userName,
826
- userEmail: ele.userEmail,
827
- storeId: ele?.store_id,
828
- storeName: ele?.storeName,
829
- userPhone: ele.userPhone,
830
- city: ele.city,
831
- checkFlag: ele.checkFlag,
832
- clusterName: ele?.clusterName || '',
833
- teamName: ele?.teamName || '',
834
- } );
835
- }
836
- } ) );
837
-
838
- return res.sendSuccess( { count: userDetails.length, userDetails } );
632
+ taskDetails[0].data.forEach( ( item ) => {
633
+ userDetails.push( {
634
+ id: item._id,
635
+ userName: item.userName,
636
+ userEmail: item.userEmail,
637
+ store_id: item.store_id,
638
+ storeName: item.storeName,
639
+ userPhone: item.userPhone,
640
+ city: item.city,
641
+ checkFlag: item.checkFlag,
642
+ } );
643
+ } );
644
+ return res.sendSuccess( { users: userDetails, count: taskDetails[0].count[0].total } );
839
645
  } catch ( e ) {
840
- logger.error( 'userDetails =>', e );
646
+ logger.error( { functionName: 'userDetails', error: e, message: req.body } );
841
647
  return res.sendError( e, 500 );
842
648
  }
843
649
  };
@@ -845,22 +651,20 @@ export async function userDetails( req, res ) {
845
651
  export async function taskConfig( req, res ) {
846
652
  try {
847
653
  let inputBody = req.body;
654
+ let storeCount = 0;
655
+ let locationCount = 0;
848
656
  let checklistDetails;
849
657
  inputBody.client_id = inputBody.clientId;
850
658
  if ( !inputBody._id ) {
851
659
  return res.sendError( { message: 'Task Id is Required' }, 400 );
852
660
  }
853
661
 
854
- if ( !inputBody.assignedUsers.length && inputBody.submitType == 'publish' ) {
855
- return res.sendError( 'Please Assigned a user', 400 );
662
+ if ( inputBody.submitType == 'publish' ) {
663
+ let checkUserAssigned = await taskAssignService.findOne( { checkListId: inputBody._id, checkFlag: true } );
664
+ if ( !checkUserAssigned ) {
665
+ return res.sendError( { message: 'Please assign a user' }, 400 );
666
+ }
856
667
  }
857
-
858
- // if ( inputBody.submitType == 'publish' ) {
859
- // let checkUserAssigned = await taskAssignService.findOne( { checkListId: inputBody._id, checkFlag: true } );
860
- // if ( !checkUserAssigned ) {
861
- // return res.sendError( { message: 'Please assign a user' }, 400 );
862
- // }
863
- // }
864
668
  if ( !inputBody?.approver.length && inputBody.submitType == 'publish' ) {
865
669
  return res.sendError( { message: 'Please assign approver' }, 400 );
866
670
  }
@@ -878,7 +682,7 @@ export async function taskConfig( req, res ) {
878
682
  };
879
683
  await checklistLogs.create( logInsertData );
880
684
 
881
- checklistDetails = await taskService.findOne( { _id: inputBody._id, isdeleted: false, client_id: inputBody.clientId } );
685
+ checklistDetails = await taskService.findOne( { _id: inputBody._id, isdeleted: false } );
882
686
 
883
687
  if ( !checklistDetails ) {
884
688
  return res.sendError( 'No data found', 204 );
@@ -916,7 +720,39 @@ export async function taskConfig( req, res ) {
916
720
  await traxApprover.insertMany( data );
917
721
  }
918
722
  }
723
+ await taskAssignService.updateMany( { checkListId: inputBody._id }, { checkFlag: true } );
724
+ if ( inputBody.removedUsers.length ) {
725
+ await taskAssignService.updateMany( { _id: { $in: inputBody.removedUsers } }, { checkFlag: false } );
726
+ }
919
727
  let storeConfigDetails = await taskAssignService.find( { checkListId: inputBody._id, checkFlag: true }, { _id: 0, store_id: 1, userEmail: 1, storeName: 1 } );
728
+ let storeList = storeConfigDetails.map( ( store ) => store.store_id );
729
+
730
+ storeCount = storeList.length;
731
+ if ( storeList.length ) {
732
+ let query = [
733
+ {
734
+ $match: {
735
+ client_id: inputBody.client_id,
736
+ id: { $in: storeList },
737
+ city: { $exists: true },
738
+ },
739
+ },
740
+ {
741
+ $group: {
742
+ _id: '$city',
743
+ },
744
+ },
745
+ {
746
+ $project: {
747
+ _id: 0,
748
+ city: '$_id',
749
+ },
750
+ },
751
+ ];
752
+ let storeDetails = await storeService.aggregate( query );
753
+ locationCount = storeDetails.length;
754
+ }
755
+ await taskService.updateOne( { _id: inputBody._id }, { storeCount, locationCount } );
920
756
  if ( inputBody.submitType == 'publish' ) {
921
757
  let taskName = checklistDetails.checkListName;
922
758
  let dueDate = dayjs( configDetails.scheduleEndTimeISO ).format( 'YYYY-MM-DD hh:mm A' );
@@ -1009,7 +845,6 @@ export async function insertSingleProcessData( checklistId ) {
1009
845
  insertdata.remainder = getCLconfig?.remainder || [];
1010
846
  insertdata.approver = getCLconfig?.approver || [];
1011
847
  insertdata.restrictAttendance = getCLconfig?.restrictAttendance;
1012
- insertdata.coverage = getCLconfig?.coverage;
1013
848
  let collectSections = [];
1014
849
  let sectionQuery = [];
1015
850
  sectionQuery.push( {
@@ -1075,6 +910,7 @@ export async function insertSingleProcessData( checklistId ) {
1075
910
  await taskProcessedConfigService.updateOne( { _id: checklistDetails._id }, insertDataPerDay );
1076
911
  updatedchecklist = checklistDetails;
1077
912
  }
913
+
1078
914
  if ( updatedchecklist ) {
1079
915
  await insertPCBulkV3( getCLconfig, checklistId, updatedchecklist, dateVal, startTimeIso, endTimeIso, insertdata );
1080
916
  }
@@ -1090,13 +926,16 @@ export async function insertSingleProcessData( checklistId ) {
1090
926
 
1091
927
  async function insertPCBulkV3( getCLconfig, checklistId, updatedchecklist, date, startTimeIso, endTimeIso, insertdata ) {
1092
928
  let getquestionQuery = [];
929
+
1093
930
  if ( dayjs( getCLconfig.publishDate ).format( 'YYYY-MM-DD' ) != dayjs( date ).format( 'YYYY-MM-DD' ) ) {
1094
931
  let todayDate = `${dayjs( date ).format( 'YYYY-MM-DD' )} 00:00 AM`;
1095
932
  startTimeIso = dayjs.utc( todayDate, 'YYYY-MM-DD HH:mm A' );
1096
933
  }
934
+
1097
935
  getquestionQuery.push( {
1098
936
  $match: {
1099
937
  checkListId: new ObjectId( checklistId ),
938
+ checkFlag: true,
1100
939
  isdeleted: false,
1101
940
  },
1102
941
  } );
@@ -1105,109 +944,7 @@ async function insertPCBulkV3( getCLconfig, checklistId, updatedchecklist, date,
1105
944
 
1106
945
  if ( allQuestion ) {
1107
946
  let userIdList = [];
1108
- let assignList = [];
1109
- let assignUserList = [];
1110
- if ( getCLconfig.coverage == 'store' ) {
1111
- let clusterList = allQuestion.filter( ( ele ) => ele?.clusterName ).map( ( item ) => item.assignId );
1112
- if ( clusterList.length ) {
1113
- let clusterDetails = await clusterServices.findcluster( { _id: { $in: clusterList } } );
1114
- if ( clusterDetails.length ) {
1115
- let idList = clusterDetails.flatMap( ( item ) => item.stores.map( ( ele ) => ele.store ) );
1116
- let getStoreDetails = await storeService.find( { _id: { $in: idList }, status: 'active' } );
1117
- if ( getStoreDetails.length ) {
1118
- getStoreDetails = getStoreDetails.filter( ( store ) => {
1119
- let findStore = allQuestion.find( ( storeList ) => storeList.assignId.toString() == store._id.toString() );
1120
- if ( findStore ) {
1121
- return store?.spocDetails?.[0]?.email.toLowerCase() != findStore.userEmail.toLowerCase();
1122
- } else {
1123
- return true;
1124
- }
1125
- } );
1126
- assignList = await Promise.all( getStoreDetails.map( async ( store ) => {
1127
- let userQuery = [
1128
- {
1129
- $project: {
1130
- newEmail: { $toLower: '$email' },
1131
- isActive: 1,
1132
- clientId: 1,
1133
- userName: 1,
1134
- email: 1,
1135
- },
1136
- },
1137
- {
1138
- $match: {
1139
- newEmail: store?.spocDetails?.[0]?.email.toLowerCase(),
1140
- isActive: true,
1141
- clientId: store.clientId,
1142
- },
1143
- },
1144
- ];
1145
- let userDetails = await userService.aggregate( userQuery );
1146
- if ( !userDetails.length ) {
1147
- let data = {
1148
- clientId: store.clientId,
1149
- userName: store.spocDetails?.[0]?.name,
1150
- mobileNumber: store.spocDetails?.[0]?.phone || '',
1151
- email: store.spocDetails[0].email,
1152
- };
1153
- userDetails = await createUser( data );
1154
- userDetails = [ userDetails ];
1155
- }
1156
- let data = {
1157
- store_id: store?.storeId,
1158
- storeName: store?.storeName,
1159
- userId: userDetails?.[0]?._id,
1160
- userName: userDetails?.[0]?.userName,
1161
- userEmail: userDetails?.[0]?.email,
1162
- userPhone: userDetails?.[0]?.mobileNumber,
1163
- city: store?.storeProfile?.city,
1164
- country: store?.storeProfile?.country,
1165
- checkFlag: true,
1166
- checkListId: getCLconfig._id,
1167
- checkListName: getCLconfig.checkListName,
1168
- client_id: getCLconfig.client_id,
1169
- };
1170
- return data;
1171
- } ) );
1172
- }
1173
- }
1174
- }
1175
- allQuestion = allQuestion.filter( ( ele ) => !clusterList.includes( ele.assignId ) );
1176
- }
1177
- if ( getCLconfig.coverage == 'user' ) {
1178
- let teamsList = allQuestion.filter( ( ele ) => ele?.teamName ).map( ( item ) => item.assignId );
1179
- if ( teamsList.length ) {
1180
- let teamDetails = await teamsServices.findteams( { _id: { $in: teamsList } } );
1181
- if ( teamDetails.length ) {
1182
- let idList = teamDetails.flatMap( ( item ) => item.users.map( ( ele ) => ele.userId ) );
1183
- let userIdList = allQuestion.filter( ( qn ) => !qn?.teamName ).map( ( qn ) => qn.assignId.toString() );
1184
- idList = idList.filter( ( id ) => !userIdList.includes( id.toString() ) );
1185
- let getUserDetails = await userService.find( { _id: { $in: idList } } );
1186
- if ( getUserDetails.length ) {
1187
- assignList = getUserDetails.map( ( user ) => {
1188
- let data = {
1189
- store_id: '',
1190
- storeName: '',
1191
- userId: user._id,
1192
- userName: user.userName,
1193
- userEmail: user.email,
1194
- userPhone: user?.mobileNumber,
1195
- city: '',
1196
- country: '',
1197
- checkFlag: true,
1198
- checkListId: getCLconfig._id,
1199
- checkListName: getCLconfig.checkListName,
1200
- client_id: getCLconfig.client_id,
1201
- };
1202
- return data;
1203
- } );
1204
- }
1205
- }
1206
- }
1207
- allQuestion = allQuestion.filter( ( ele ) => !teamsList.includes( ele.assignId ) );
1208
- }
1209
- allQuestion = [ ...allQuestion, ...assignList ];
1210
- await Promise.all( allQuestion.map( async ( element4 ) => {
947
+ for ( let element4 of allQuestion ) {
1211
948
  let query;
1212
949
  query = {
1213
950
  date_string: dayjs( date ).format( 'YYYY-MM-DD' ),
@@ -1223,45 +960,43 @@ async function insertPCBulkV3( getCLconfig, checklistId, updatedchecklist, date,
1223
960
  let getsubmitDetails = await taskProcessedService.find( query );
1224
961
  if ( getsubmitDetails.length ) {
1225
962
  userIdList.push( element4._id );
1226
- } else {
1227
- delete element4._id;
1228
- delete element4.checkFlag;
1229
- delete element4.isdeleted;
1230
- delete element4.createdAt;
1231
- delete element4.updatedAt;
1232
- element4.checkListId = updatedchecklist._id;
1233
- element4.checkListName = getCLconfig.checkListName;
1234
- element4.checkListDescription = getCLconfig.checkListDescription;
1235
- element4.date_iso = new Date( dayjs( date, 'YYYY-MM-DD' ).format( 'YYYY-MM-DD' ) );
1236
- element4.date_string = dayjs( date ).format( 'YYYY-MM-DD' );
1237
- element4.allowedOverTime = false;
1238
- element4.allowedStoreLocation = getCLconfig.allowedStoreLocation;
1239
- element4.scheduleStartTime = '12:00 AM';
1240
- element4.scheduleStartTime_iso = startTimeIso.format();
1241
- element4.scheduleEndTime = getCLconfig.scheduleEndTime;
1242
- element4.scheduleEndTime_iso = endTimeIso.format();
1243
- element4.createdBy = new ObjectId( getCLconfig.createdBy );
1244
- element4.createdByName = getCLconfig.createdByName;
1245
- element4.sourceCheckList_id = getCLconfig._id;
1246
- element4.checkListType = getCLconfig.checkListType;
1247
- element4.storeCount = getCLconfig.storeCount;
1248
- element4.questionCount = getCLconfig.questionCount;
1249
- element4.publishDate = getCLconfig.publishDate;
1250
- element4.locationCount = getCLconfig.locationCount;
1251
- element4.scheduleRepeatedType = 'daily';
1252
- element4.approvalEnable = getCLconfig.approver.length ? true : false;
1253
- element4.priorityType = getCLconfig.priorityType;
1254
- element4.remainder = getCLconfig?.remainder || [];
1255
- element4.restrictAttendance = getCLconfig?.restrictAttendance;
1256
- element4.coverage = getCLconfig?.coverage;
1257
- assignUserList.push( element4 );
1258
- }
1259
- } ) );
963
+ continue;
964
+ }
965
+ delete element4._id;
966
+ delete element4.checkFlag;
967
+ delete element4.isdeleted;
968
+ delete element4.createdAt;
969
+ delete element4.updatedAt;
970
+ element4.checkListId = updatedchecklist._id;
971
+ element4.checkListName = getCLconfig.checkListName;
972
+ element4.checkListDescription = getCLconfig.checkListDescription;
973
+ element4.date_iso = new Date( dayjs( date, 'YYYY-MM-DD' ).format( 'YYYY-MM-DD' ) );
974
+ element4.date_string = dayjs( date ).format( 'YYYY-MM-DD' );
975
+ element4.allowedOverTime = false;
976
+ element4.allowedStoreLocation = getCLconfig.allowedStoreLocation;
977
+ element4.scheduleStartTime = '12:00 AM';
978
+ element4.scheduleStartTime_iso = startTimeIso.format();
979
+ element4.scheduleEndTime = getCLconfig.scheduleEndTime;
980
+ element4.scheduleEndTime_iso = endTimeIso.format();
981
+ element4.createdBy = new ObjectId( getCLconfig.createdBy );
982
+ element4.createdByName = getCLconfig.createdByName;
983
+ element4.sourceCheckList_id = getCLconfig._id;
984
+ element4.checkListType = getCLconfig.checkListType;
985
+ element4.storeCount = getCLconfig.storeCount;
986
+ element4.questionCount = getCLconfig.questionCount;
987
+ element4.publishDate = getCLconfig.publishDate;
988
+ element4.locationCount = getCLconfig.locationCount;
989
+ element4.scheduleRepeatedType = 'daily';
990
+ element4.approvalEnable = getCLconfig.approver.length ? true : false;
991
+ element4.priorityType = getCLconfig.priorityType;
992
+ element4.remainder = getCLconfig?.remainder || [];
993
+ element4.restrictAttendance = getCLconfig?.restrictAttendance;
994
+ }
1260
995
  if ( userIdList.length ) {
1261
- assignUserList = assignUserList.filter( ( item ) => typeof item._id == 'undefined' );
996
+ allQuestion = allQuestion.filter( ( item ) => typeof item._id == 'undefined' );
1262
997
  }
1263
998
 
1264
- if ( assignUserList ) {
999
+ if ( allQuestion ) {
1265
1000
  let assigndeletequery = {
1266
1001
  date_iso: date,
1267
1002
  client_id: insertdata.client_id,
@@ -1284,7 +1019,7 @@ async function insertPCBulkV3( getCLconfig, checklistId, updatedchecklist, date,
1284
1019
 
1285
1020
  const taskToRetain = await taskProcessedService.find( retainTaskQuery );
1286
1021
 
1287
- const insertList = assignUserList.filter( ( item2 ) =>
1022
+ const insertList = allQuestion.filter( ( item2 ) =>
1288
1023
  !taskToRetain.some( ( item1 ) =>
1289
1024
  item1.store_id === item2.store_id && item1.userEmail === item2.userEmail,
1290
1025
  ),
@@ -1350,7 +1085,6 @@ export async function uploadImage( req, res ) {
1350
1085
 
1351
1086
  async function createUser( data ) {
1352
1087
  try {
1353
- console.log( 'createUser ====>', data );
1354
1088
  let params = {
1355
1089
  userName: data.userName,
1356
1090
  email: data.email,
@@ -1433,8 +1167,7 @@ async function createUser( data ) {
1433
1167
  ],
1434
1168
  };
1435
1169
  let response = await userService.create( params );
1436
- // console.log( 'createUser ====>', response );
1437
- return response;
1170
+ return response._id;
1438
1171
  } catch ( e ) {
1439
1172
  logger.error( 'createUser =>', e );
1440
1173
  return false;
@@ -1634,17 +1367,16 @@ export async function createChecklistTask( req, res ) {
1634
1367
  client_id: inputBody.clientId,
1635
1368
  };
1636
1369
  await taskQuestionService.create( question );
1637
- let storeDetails;
1638
- if ( inputBody?.storeName ) {
1639
- storeDetails = await storeService.findOne( { storeName: inputBody.storeName, status: 'active' }, { storeId: 1, storeProfile: 1 } );
1370
+ let storeDetails = await storeService.findOne( { storeName: inputBody.storeName, status: 'active' }, { storeId: 1, storeProfile: 1 } );
1371
+ if ( !storeDetails ) {
1372
+ return res.sendError( 'No data found', 204 );
1640
1373
  }
1641
-
1642
1374
  let userDetails = {
1643
1375
  userName: inputBody.userName,
1644
1376
  userEmail: inputBody.userEmail,
1645
- store_id: storeDetails?.storeId?storeDetails.storeId:'',
1646
- storeName: inputBody?.storeName?inputBody?.storeName:'',
1647
- city: storeDetails?.storeProfile?.city?storeDetails?.storeProfile?.city:'',
1377
+ store_id: storeDetails.storeId,
1378
+ storeName: inputBody.storeName,
1379
+ city: storeDetails?.storeProfile?.city,
1648
1380
  checkFlag: true,
1649
1381
  checkListId: response?._id,
1650
1382
  checkListName: data.checkListName,
@@ -1663,9 +1395,8 @@ export async function createChecklistTask( req, res ) {
1663
1395
  if ( sectionIndex == -1 ) {
1664
1396
  return res.sendError( 'section is not found', 400 );
1665
1397
  }
1666
- let findQuestion = question[sectionIndex].questions.findIndex( ( ele ) => ele?.parentQuestion ? ele.qno == req.body.qno && ele.parentQuestion == req.body.parentQuestion : ele.qno == req.body.qno );
1398
+ let data = { ...question[sectionIndex].questions[req.body.qno - 1], taskId: response?._id, task: true };
1667
1399
 
1668
- let data = { ...question[sectionIndex].questions[findQuestion], taskId: response?._id, task: true };
1669
1400
  question[sectionIndex].questions[req.body.qno - 1] = data;
1670
1401
  taskDetails.questionAnswers = question;
1671
1402
  let updateData = {
@@ -1678,7 +1409,6 @@ export async function createChecklistTask( req, res ) {
1678
1409
  _id: inputBody.processedChecklistId,
1679
1410
  section_id: inputBody.sectionId,
1680
1411
  qno: inputBody.qno,
1681
- parentQuestion: inputBody.parentQuestion,
1682
1412
  },
1683
1413
  'upsert': {
1684
1414
  taskId: String( response?._id ),
@@ -1738,7 +1468,6 @@ export async function approveTask( req, res ) {
1738
1468
  sourceCheckList_id: req.body.sourceCheckList_id,
1739
1469
  fromDate: req.body.fromDate,
1740
1470
  toDate: req.body.toDate,
1741
- filtertype: req.body.filtertype,
1742
1471
  store_id: inputstores,
1743
1472
  },
1744
1473
  'upsert': {
@@ -1816,7 +1545,6 @@ export async function redoTask( req, res ) {
1816
1545
  };
1817
1546
 
1818
1547
  let response = await taskProcessedService.updateOne( { _id: req.body.payload._id }, updateData );
1819
- console.log( response );
1820
1548
  if ( response.modifiedCount || response.matchedCount ) {
1821
1549
  let storeTimeZone = await storeService.findOne( { storeName: taskDetails.storeName }, { 'storeProfile.timeZone': 1 } );
1822
1550
  let currentDateTime;
@@ -1833,8 +1561,8 @@ export async function redoTask( req, res ) {
1833
1561
  sectionName: question[sectionIndex].sectionName,
1834
1562
  questionName: question[sectionIndex].questions[req.body.payload.qno - 1].qname,
1835
1563
  action: 'redo',
1836
- store_id: taskDetails?.store_id?taskDetails?.store_id:'',
1837
- storeName: taskDetails.storeName?taskDetails.storeName:'',
1564
+ store_id: taskDetails.store_id,
1565
+ storeName: taskDetails.storeName,
1838
1566
  client_id: taskDetails.client_id,
1839
1567
  processedChecklistId: taskDetails._id,
1840
1568
  type: taskDetails.checkListType,
@@ -1856,7 +1584,6 @@ export async function redoTask( req, res ) {
1856
1584
  };
1857
1585
  let url = JSON.parse( process.env.LAMBDAURL );
1858
1586
  let searchResponse = await fetch( url.redoTask, requestOptions );
1859
- console.log( searchResponse.ok );
1860
1587
  if ( searchResponse.ok ) {
1861
1588
  return res.sendSuccess( 'Question redo successfully' );
1862
1589
  } else {
@@ -1929,19 +1656,15 @@ export async function getAnswerCount( req, res ) {
1929
1656
  export const taskDropdown = async ( req, res ) => {
1930
1657
  try {
1931
1658
  let requestData = req.body;
1932
- let fromDate = new Date( requestData.fromDate );
1933
- let toDate = new Date( requestData.toDate );
1934
- let userTimezoneOffset = toDate.getTimezoneOffset() * 60000;
1935
- toDate = new Date( toDate.getTime() - userTimezoneOffset );
1936
- toDate.setUTCHours( 23, 59, 59, 59 );
1659
+
1937
1660
  let result = {};
1938
1661
 
1939
1662
  let findQuery = [];
1940
1663
  let findAndQuery = [];
1941
1664
  findAndQuery.push(
1942
1665
  { client_id: requestData.clientId },
1943
- { date_iso: { $gte: fromDate } },
1944
- { date_iso: { $lte: toDate } },
1666
+ // { date_iso: { $gte: fromDate } },
1667
+ // { date_iso: { $lte: toDate } },
1945
1668
  { checkListType: { $in: [ 'task', 'checklistTask', 'cctv' ] } },
1946
1669
  );
1947
1670
 
@@ -1957,7 +1680,6 @@ export const taskDropdown = async ( req, res ) => {
1957
1680
  scheduleRepeatedType: 1,
1958
1681
  scheduleStartTime: 1,
1959
1682
  scheduleEndTime: 1,
1960
- coverage: 1,
1961
1683
  },
1962
1684
  } );
1963
1685
 
@@ -1972,7 +1694,6 @@ export const taskDropdown = async ( req, res ) => {
1972
1694
  scheduleRepeatedType: { $last: '$scheduleRepeatedType' },
1973
1695
  scheduleStartTime: { $last: '$scheduleStartTime' },
1974
1696
  scheduleEndTime: { $last: '$scheduleEndTime' },
1975
- coverage: { $last: '$coverage' },
1976
1697
  },
1977
1698
  } );
1978
1699
 
@@ -2011,7 +1732,6 @@ export const taskDropdown = async ( req, res ) => {
2011
1732
  scheduleRepeatedType: 1,
2012
1733
  scheduleStartTime: 1,
2013
1734
  scheduleEndTime: 1,
2014
- coverage: 1,
2015
1735
  checkListDescription: '$checklistconfigs.checkListDescription',
2016
1736
  publish: '$checklistconfigs.publish',
2017
1737
  },
@@ -2447,13 +2167,13 @@ export async function clusterMigrations( req, res ) {
2447
2167
  if ( userexits ) {
2448
2168
  let findStore = await storeService.findOne( { storeName: user.FacilityCode } );
2449
2169
  if ( findStore ) {
2450
- let clusterExists = await clusterServices.findOneCluster( { clusterName: user.AomName } );
2170
+ let clusterExists = await clusterModel.findOneCluster( { clusterName: user.AomName } );
2451
2171
  if ( clusterExists ) {
2452
2172
  let data = {
2453
2173
  storeId: findStore.storeId,
2454
2174
  store: findStore._id,
2455
2175
  };
2456
- let updatecluster = await clusterServices.updateCluster( { clusterName: user.AomName }, { $push: { stores: data } } );
2176
+ let updatecluster = await clusterModel.updateCluster( { clusterName: user.AomName }, { $push: { stores: data } } );
2457
2177
  console.log( updatecluster );
2458
2178
  } else {
2459
2179
  let payload = {
@@ -2475,7 +2195,7 @@ export async function clusterMigrations( req, res ) {
2475
2195
  ],
2476
2196
  'users': [],
2477
2197
  };
2478
- let createcluster = await clusterServices.createclusterModel( payload );
2198
+ let createcluster = await clusterModel.createclusterModel( payload );
2479
2199
  console.log( createcluster );
2480
2200
  }
2481
2201
  }
@@ -2680,7 +2400,6 @@ export async function StoreHygienetask( req, res ) {
2680
2400
  let date = inputBody?.scheduleDate || dayjs().format( 'YYYY-MM-DD' );
2681
2401
  let description = `A new task has been assigned to ${storeDetails.storeName}. Please complete it before the due date of ${date}.`;
2682
2402
  let userDetails = await userService.findOne( { _id: new mongoose.Types.ObjectId( finduser.userId ) } );
2683
- console.log( userDetails.fcmToken );
2684
2403
  if ( userDetails&&userDetails.fcmToken ) {
2685
2404
  const fcmToken = userDetails.fcmToken;
2686
2405
  await sendPushNotification( title, description, fcmToken );
@@ -2860,10 +2579,9 @@ export async function StoreHygienetask( req, res ) {
2860
2579
  return res.sendError( e, 500 );
2861
2580
  }
2862
2581
  }
2863
- export async function commonAiTask( req, res ) {
2582
+ export async function eyeTesttask( req, res ) {
2864
2583
  try {
2865
2584
  let inputBody = req.body;
2866
-
2867
2585
  inputBody.clientId = 11;
2868
2586
  inputBody.taskDescription = '';
2869
2587
  let userId;
@@ -2900,6 +2618,7 @@ export async function commonAiTask( req, res ) {
2900
2618
  let time = inputBody?.scheduleEndTime || '11:59 PM';
2901
2619
  let date = inputBody?.scheduleDate || dayjs().format( 'YYYY-MM-DD' );
2902
2620
  let description = `A new task has been assigned to ${storeDetails.storeName}. Please complete it before the due date of ${date}.`;
2621
+ let userDetails = await userService.findOne( { _id: new mongoose.Types.ObjectId( finduser.userId ) } );
2903
2622
  if ( userDetails&&userDetails.fcmToken ) {
2904
2623
  const fcmToken = userDetails.fcmToken;
2905
2624
  await sendPushNotification( title, description, fcmToken );
@@ -2924,6 +2643,7 @@ export async function commonAiTask( req, res ) {
2924
2643
  return res.sendError( 'Invalid Creator Details', 500 );
2925
2644
  }
2926
2645
 
2646
+
2927
2647
  if ( req.body && req.body.referenceImage && req.body.referenceImage.length > 3 ) {
2928
2648
  return res.sendError( 'Maximum 3 referenceImage only allowed', 500 );
2929
2649
  }
@@ -2945,7 +2665,11 @@ export async function commonAiTask( req, res ) {
2945
2665
  locationCount: 1,
2946
2666
  ...( inputBody?.checkListId ) ? { referenceCheckListId: inputBody?.checkListId } : {},
2947
2667
  };
2668
+
2669
+
2948
2670
  data['approver'] = userAdmin;
2671
+
2672
+
2949
2673
  let answer = await findAnswer( inputBody?.answerType );
2950
2674
  if ( answer.length == 0 ) {
2951
2675
  return res.sendError( 'please enter Valid AnswerType', 500 );
@@ -2976,6 +2700,8 @@ export async function commonAiTask( req, res ) {
2976
2700
  return res.sendError( 'please enter Valid Options', 500 );
2977
2701
  }
2978
2702
  }
2703
+
2704
+
2979
2705
  let response = await taskService.create( data );
2980
2706
  if ( response?.approver.length ) {
2981
2707
  let inputData = [];
@@ -2988,8 +2714,10 @@ export async function commonAiTask( req, res ) {
2988
2714
  checkListName: data?.checkListName || '',
2989
2715
  } );
2990
2716
  } );
2717
+
2991
2718
  await traxApprover.insertMany( inputData );
2992
2719
  }
2720
+
2993
2721
  if ( response?._id ) {
2994
2722
  let question = [
2995
2723
  {
@@ -3005,31 +2733,34 @@ export async function commonAiTask( req, res ) {
3005
2733
  'descriptivetype': 'text',
3006
2734
  },
3007
2735
  ];
3008
- let images = [];
3009
- for ( let imgpath of req.body.referenceImage ) {
3010
- let configURL = JSON.parse( process.env.BUCKET );
3011
- let inputData = {
3012
- Bucket: configURL.commonAiTaskBucket,
3013
- Key: imgpath,
3014
- };
3015
- let output = await getObject( inputData );
3016
- console.log( output );
3017
2736
 
3018
- let image = {
3019
- data: output.Body,
3020
- name: imgpath,
3021
- mimetype: output.ContentType,
3022
- };
3023
- let uplaodedImage = await uploadmultiImage( image );
3024
2737
 
2738
+ if ( req.files && req.files.referenceImage && req.files.referenceImage.length ) {
2739
+ let images = [];
2740
+
2741
+
2742
+ for ( let image of req.files.referenceImage ) {
2743
+ let uplaodedImage = await uploadmultiImage( image );
2744
+ let imgUrl = decodeURIComponent( uplaodedImage.imgUrl.split( '?' )[0] );
2745
+ let url = imgUrl.split( '/' );
2746
+ if ( url.includes( 'https:' ) || url.includes( 'http:' ) ) {
2747
+ url.splice( 0, 3 );
2748
+ }
2749
+ images.push( url.join( '/' ) );
2750
+ }
2751
+ question[0].questionReferenceImage = images;
2752
+ } else {
2753
+ let images = [];
2754
+ let uplaodedImage = await uploadmultiImage( req.files.referenceImage );
3025
2755
  let imgUrl = decodeURIComponent( uplaodedImage.imgUrl.split( '?' )[0] );
3026
2756
  let url = imgUrl.split( '/' );
3027
2757
  if ( url.includes( 'https:' ) || url.includes( 'http:' ) ) {
3028
2758
  url.splice( 0, 3 );
3029
2759
  }
3030
2760
  images.push( url.join( '/' ) );
2761
+
2762
+ question[0].questionReferenceImage = images;
3031
2763
  }
3032
- question[0].questionReferenceImage = images;
3033
2764
 
3034
2765
  if ( inputBody?.answerType === 'image' || inputBody?.answerType === 'descriptiveImage' || inputBody?.answerType === 'multipleImage' ) {
3035
2766
  answer[0].referenceImage = question[0].questionReferenceImage;
@@ -3062,14 +2793,13 @@ export async function commonAiTask( req, res ) {
3062
2793
  return res.sendSuccess( 'Task created successfully' );
3063
2794
  }
3064
2795
  } catch ( e ) {
3065
- logger.error( { function: 'commonAiTask', error: e } );
2796
+ logger.error( { function: 'eyeTesttask', error: e } );
3066
2797
  return res.sendError( e, 500 );
3067
2798
  }
3068
2799
  }
3069
- export async function eyeTesttask( req, res ) {
2800
+ export async function createAiTask( req, res ) {
3070
2801
  try {
3071
2802
  let inputBody = req.body;
3072
- console.log( inputBody );
3073
2803
  inputBody.clientId = 11;
3074
2804
  inputBody.taskDescription = '';
3075
2805
  let userId;
@@ -3080,40 +2810,24 @@ export async function eyeTesttask( req, res ) {
3080
2810
 
3081
2811
  let url = JSON.parse( process.env.LAMBDAURL );
3082
2812
  let checklistId = url.dailystoreChecklistId;
3083
- console.log( checklistId );
3084
2813
  let finduser = await checklistassignconfigModel.findOne( { checkListId: new mongoose.Types.ObjectId( checklistId ), store_id: storeDetails.storeId } );
3085
- console.log( finduser );
3086
2814
 
3087
2815
  if ( !finduser ) {
3088
2816
  return res.sendError( 'No user Found For this store', 500 );
3089
2817
  }
3090
-
3091
2818
  userId = finduser.userId;
3092
2819
  inputBody.userName = finduser.userName;
3093
2820
  inputBody.userEmail = finduser.userEmail;
3094
2821
 
3095
2822
 
3096
- let teamList = await findteams( { users: { $elemMatch: { email: finduser.userEmail } } } );
3097
-
3098
- inputBody.approver = '';
3099
- for ( let team of teamList ) {
3100
- for ( let user of team.Teamlead ) {
3101
- inputBody.approver = user.email + ',' + inputBody.approver;
3102
- }
3103
- }
3104
- inputBody.approver = inputBody.approver.replace( /,$/, '' );
3105
-
3106
-
3107
- let title = `New Task Alert ${inputBody.taskName}-${storeDetails.storeName}-${dayjs().format( 'YYYY-MM-DD' )}`;
2823
+ // let title = `New Task Alert ${inputBody.taskName}-${storeDetails.storeName}-${dayjs().format( 'YYYY-MM-DD' )}`;
3108
2824
  let time = inputBody?.scheduleEndTime || '11:59 PM';
3109
2825
  let date = inputBody?.scheduleDate || dayjs().format( 'YYYY-MM-DD' );
3110
- let description = `A new task has been assigned to ${storeDetails.storeName}. Please complete it before the due date of ${date}.`;
3111
- let userDetails = await userService.findOne( { _id: new mongoose.Types.ObjectId( finduser.userId ) } );
3112
- console.log( userDetails.fcmToken );
3113
- if ( userDetails&&userDetails.fcmToken ) {
3114
- const fcmToken = userDetails.fcmToken;
3115
- await sendPushNotification( title, description, fcmToken );
3116
- }
2826
+ // let description = `A new task has been assigned to ${storeDetails.storeName}. Please complete it before the due date of ${date}.`;
2827
+ // if ( userDetails&&userDetails.fcmToken ) {
2828
+ // const fcmToken = userDetails.fcmToken;
2829
+ // await sendPushNotification( title, description, fcmToken );
2830
+ // }
3117
2831
  const inputDateTime = dayjs.utc( `${date} ${time}`, 'YYYY-MM-DD hh:mm A' );
3118
2832
  const currentTime = dayjs.utc();
3119
2833
  if ( inputDateTime.isBefore( currentTime ) ) {
@@ -3126,20 +2840,19 @@ export async function eyeTesttask( req, res ) {
3126
2840
  let userAdmin = await userService.find( { clientId: inputBody.clientId, email: { $in: approverList }, userType: 'client', isActive: true }, { name: '$userName', email: 1 } );
3127
2841
 
3128
2842
  if ( userAdmin && userAdmin.length === 0 ) {
3129
- userAdmin = await userService.find( { clientId: inputBody.clientId, email: 'rohit.chawla@lenskart.com', userType: 'client', isActive: true }, { name: '$userName', email: 1 } );
2843
+ return res.sendError( 'Invalid Approver Details', 500 );
3130
2844
  }
3131
2845
 
3132
- let creator = await userService.find( { clientId: inputBody.clientId, email: 'rohit.chawla@lenskart.com', userType: 'client', isActive: true } );
2846
+ let creator = await userService.find( { clientId: inputBody.clientId, email: { $in: inputBody.creator }, userType: 'client', isActive: true } );
3133
2847
  if ( creator && creator.length === 0 ) {
3134
2848
  return res.sendError( 'Invalid Creator Details', 500 );
3135
2849
  }
3136
-
3137
-
3138
- if ( req.body && req.body.referenceImage && req.body.referenceImage.length > 3 ) {
2850
+ if ( req.files && req.files.referenceImage && req.files.referenceImage.length > 3 ) {
3139
2851
  return res.sendError( 'Maximum 3 referenceImage only allowed', 500 );
3140
2852
  }
2853
+
3141
2854
  let data = {
3142
- checkListName: `${inputBody.taskName}(${storeDetails.storeName}-${dayjs().format( 'YYYY-MM-DD' )})`,
2855
+ checkListName: `${inputBody.taskName}-${storeDetails.storeName}-${dayjs().format( 'YYYY-MM-DD' )}`,
3143
2856
  checkListDescription: inputBody.taskDescription,
3144
2857
  createdBy: creator[0]._id,
3145
2858
  createdByName: creator[0].userName,
@@ -3239,22 +2952,8 @@ export async function eyeTesttask( req, res ) {
3239
2952
  }
3240
2953
  images.push( url.join( '/' ) );
3241
2954
  }
3242
- question[0].questionReferenceImage = images;
3243
- } else {
3244
- console.log( req.file );
3245
- let images = [];
3246
- let uplaodedImage = await uploadmultiImage( req.files.referenceImage );
3247
- console.log( uplaodedImage );
3248
- let imgUrl = decodeURIComponent( uplaodedImage.imgUrl.split( '?' )[0] );
3249
- let url = imgUrl.split( '/' );
3250
- if ( url.includes( 'https:' ) || url.includes( 'http:' ) ) {
3251
- url.splice( 0, 3 );
3252
- }
3253
- images.push( url.join( '/' ) );
3254
-
3255
2955
  question[0].questionReferenceImage = images;
3256
2956
  }
3257
-
3258
2957
  if ( inputBody?.answerType === 'image' || inputBody?.answerType === 'descriptiveImage' || inputBody?.answerType === 'multipleImage' ) {
3259
2958
  answer[0].referenceImage = question[0].questionReferenceImage;
3260
2959
  }
@@ -3281,199 +2980,7 @@ export async function eyeTesttask( req, res ) {
3281
2980
  client_id: inputBody.clientId,
3282
2981
  userId: userId,
3283
2982
  };
3284
- await taskAssignService.create( userDetails );
3285
- await insertSingleProcessData( response?._id );
3286
- return res.sendSuccess( 'Task created successfully' );
3287
- }
3288
- } catch ( e ) {
3289
- logger.error( { function: 'eyeTesttask', error: e } );
3290
- return res.sendError( e, 500 );
3291
- }
3292
- }
3293
- export async function createAiTask( req, res ) {
3294
- try {
3295
- let inputBody = req.body;
3296
- inputBody.clientId = 11;
3297
- inputBody.taskDescription = '';
3298
- let userId;
3299
- let storeDetails = await storeService.findOne( { storeName: inputBody.storeName, clientId: inputBody.clientId, status: 'active' }, { storeId: 1, storeName: 1, storeProfile: 1 } );
3300
- if ( !storeDetails ) {
3301
- return res.sendError( 'Store Not Found', 500 );
3302
- }
3303
-
3304
- let url = JSON.parse( process.env.LAMBDAURL );
3305
- let checklistId = url.dailystoreChecklistId;
3306
- let finduser = await checklistassignconfigModel.findOne( { checkListId: new mongoose.Types.ObjectId( checklistId ), store_id: storeDetails.storeId } );
3307
-
3308
- if ( !finduser ) {
3309
- return res.sendError( 'No user Found For this store', 500 );
3310
- }
3311
- userId = finduser.userId;
3312
- inputBody.userName = finduser.userName;
3313
- inputBody.userEmail = finduser.userEmail;
3314
-
3315
-
3316
- let title = `New Task Alert ${inputBody.taskName}-${storeDetails.storeName}-${dayjs().format( 'YYYY-MM-DD' )}`;
3317
- let time = inputBody?.scheduleEndTime || '11:59 PM';
3318
- let date = inputBody?.scheduleDate || dayjs().format( 'YYYY-MM-DD' );
3319
- let description = `A new task has been assigned to ${storeDetails.storeName}. Please complete it before the due date of ${date}.`;
3320
- if ( userDetails&&userDetails.fcmToken ) {
3321
- const fcmToken = userDetails.fcmToken;
3322
- await sendPushNotification( title, description, fcmToken );
3323
- }
3324
- const inputDateTime = dayjs.utc( `${date} ${time}`, 'YYYY-MM-DD hh:mm A' );
3325
- const currentTime = dayjs.utc();
3326
- if ( inputDateTime.isBefore( currentTime ) ) {
3327
- return res.sendError( 'The input date-time is before the current time.', 500 );
3328
- }
3329
-
3330
- let approverList = inputBody?.approver.split( ',' );
3331
-
3332
-
3333
- let userAdmin = await userService.find( { clientId: inputBody.clientId, email: { $in: approverList }, userType: 'client', isActive: true }, { name: '$userName', email: 1 } );
3334
-
3335
- if ( userAdmin && userAdmin.length === 0 ) {
3336
- return res.sendError( 'Invalid Approver Details', 500 );
3337
- }
3338
-
3339
- let creator = await userService.find( { clientId: inputBody.clientId, email: { $in: inputBody.creator }, userType: 'client', isActive: true } );
3340
- if ( creator && creator.length === 0 ) {
3341
- return res.sendError( 'Invalid Creator Details', 500 );
3342
- }
3343
- if ( req.files && req.files.referenceImage && req.files.referenceImage.length > 3 ) {
3344
- return res.sendError( 'Maximum 3 referenceImage only allowed', 500 );
3345
- }
3346
-
3347
- let data = {
3348
- checkListName: `${inputBody.taskName}-${storeDetails.storeName}-${dayjs().format( 'YYYY-MM-DD' )}`,
3349
- checkListDescription: inputBody.taskDescription,
3350
- createdBy: creator[0]._id,
3351
- createdByName: creator[0].userName,
3352
- publish: true,
3353
- questionCount: 1,
3354
- storeCount: 1,
3355
- scheduleDate: date,
3356
- scheduleEndTime: time,
3357
- scheduleEndTimeISO: dayjs.utc( `${date} ${time}`, 'YYYY-MM-DD hh:mm A' ).format(),
3358
- priorityType: 'high',
3359
- client_id: inputBody.clientId,
3360
- checkListType: 'task',
3361
- publishDate: new Date(),
3362
- locationCount: 1,
3363
- ...( inputBody?.checkListId ) ? { referenceCheckListId: inputBody?.checkListId } : {},
3364
- };
3365
-
3366
-
3367
- data['approver'] = userAdmin;
3368
-
3369
-
3370
- let answer = await findAnswer( inputBody?.answerType );
3371
- if ( answer.length == 0 ) {
3372
- return res.sendError( 'please enter Valid AnswerType', 500 );
3373
- }
3374
- if ( inputBody?.answerType === 'multiplechoicesingle' || inputBody?.answerType === 'multiplechoicemultiple' ) {
3375
- if ( inputBody?.options && inputBody?.options.length > 0 ) {
3376
- let optionsResult = [];
3377
- let optionList = inputBody?.options.split( ',' );
3378
- for ( let option of optionList ) {
3379
- let optiondata = {
3380
- 'answer': '',
3381
- 'sopFlag': false,
3382
- 'validation': false,
3383
- 'validationType': '',
3384
- 'referenceImage': [],
3385
- 'runAI': false,
3386
- 'allowUploadfromGallery': false,
3387
- 'descriptivetype': '',
3388
- 'showLinked': false,
3389
- 'linkedQuestion': 0,
3390
- 'nestedQuestion': [],
3391
- };
3392
- optiondata.answer = option;
3393
- optionsResult.push( optiondata );
3394
- }
3395
- answer = optionsResult;
3396
- } else {
3397
- return res.sendError( 'please enter Valid Options', 500 );
3398
- }
3399
- }
3400
-
3401
-
3402
- let response = await taskService.create( data );
3403
- if ( response?.approver.length ) {
3404
- let inputData = [];
3405
- response?.approver.forEach( ( ele ) => {
3406
- inputData.push( {
3407
- userEmail: ele.email,
3408
- checkListId: response._id,
3409
- type: 'task',
3410
- client_id: inputBody.clientId,
3411
- checkListName: data?.checkListName || '',
3412
- } );
3413
- } );
3414
-
3415
- await traxApprover.insertMany( inputData );
3416
- }
3417
-
3418
- if ( response?._id ) {
3419
- let question = [
3420
- {
3421
- 'qno': 1,
3422
- 'qname': inputBody.question,
3423
- 'answerType': inputBody?.answerType || 'yes/no',
3424
- 'runAI': false,
3425
- 'runAIDescription': '',
3426
- 'allowUploadfromGallery': false,
3427
- 'linkType': false,
3428
- 'questionReferenceImage': [],
3429
- 'answers': answer,
3430
- 'descriptivetype': 'text',
3431
- },
3432
- ];
3433
-
3434
-
3435
- if ( req.files && req.files.referenceImage && req.files.referenceImage.length ) {
3436
- let images = [];
3437
-
3438
-
3439
- for ( let image of req.files.referenceImage ) {
3440
- let uplaodedImage = await uploadmultiImage( image );
3441
- let imgUrl = decodeURIComponent( uplaodedImage.imgUrl.split( '?' )[0] );
3442
- let url = imgUrl.split( '/' );
3443
- if ( url.includes( 'https:' ) || url.includes( 'http:' ) ) {
3444
- url.splice( 0, 3 );
3445
- }
3446
- images.push( url.join( '/' ) );
3447
- }
3448
- question[0].questionReferenceImage = images;
3449
- }
3450
- if ( inputBody?.answerType === 'image' || inputBody?.answerType === 'descriptiveImage' || inputBody?.answerType === 'multipleImage' ) {
3451
- answer[0].referenceImage = question[0].questionReferenceImage;
3452
- }
3453
-
3454
-
3455
- question = {
3456
- checkListId: response?._id,
3457
- question: question,
3458
- section: 'Section 1',
3459
- checkList: data.checkListName,
3460
- client_id: inputBody.clientId,
3461
- };
3462
- await taskQuestionService.create( question );
3463
-
3464
- let userDetails = {
3465
- userName: inputBody.userName,
3466
- userEmail: inputBody.userEmail,
3467
- store_id: storeDetails.storeId,
3468
- storeName: storeDetails.storeName,
3469
- city: storeDetails?.storeProfile?.city,
3470
- checkFlag: true,
3471
- checkListId: response?._id,
3472
- checkListName: data.checkListName,
3473
- client_id: inputBody.clientId,
3474
- userId: userId,
3475
- };
3476
-
2983
+
3477
2984
  await taskAssignService.create( userDetails );
3478
2985
  await insertSingleProcessData( response?._id );
3479
2986
  return res.sendSuccess( 'Task created successfully' );
@@ -3758,43 +3265,6 @@ export async function uploadmultiImage( images ) {
3758
3265
  }
3759
3266
  };
3760
3267
 
3761
- async function assignUsers( data ) {
3762
- let assignedData;
3763
- if ( data?.type == 'cluster' ) {
3764
- let clusterDetails = await clusterServices.findcluster( { clientId: data.clientId, _id: new mongoose.Types.ObjectId( data.id ) } );
3765
- if ( clusterDetails.length ) {
3766
- let clusterList = clusterDetails[0].stores.map( ( ele ) => ele.store );
3767
- let storeDetails = await storeService.find( { _id: { $in: clusterList }, status: 'active' } );
3768
- assignedData = await Promise.all( storeDetails.map( async ( store ) => {
3769
- let userData = {
3770
- storeId: store.storeId,
3771
- storeName: store.storeName,
3772
- userName: store.spocDetails?.[0]?.name,
3773
- userEmail: store.spocDetails?.[0]?.email,
3774
- clusterName: clusterDetails?.[0]?.clusterName,
3775
- id: clusterDetails?.[0]?._id,
3776
- };
3777
- return userData;
3778
- } ) );
3779
- }
3780
- } else {
3781
- let teamDetails = await teamsServices.findteams( { clientId: data.clientId, _id: new mongoose.Types.ObjectId( data.id ) } );
3782
- if ( teamDetails.length ) {
3783
- let userIdList = teamDetails[0].users.map( ( ele ) => ele.userId );
3784
- let userDetails = await userService.find( { _id: userIdList } );
3785
- assignedData = userDetails.map( ( user ) => {
3786
- let userData = {
3787
- userName: user.userName,
3788
- userEmail: user.email,
3789
- teamName: teamDetails?.[0]?.teamName,
3790
- id: teamDetails?.[0]?._id,
3791
- };
3792
- return userData;
3793
- } );
3794
- }
3795
- }
3796
- return assignedData;
3797
- }
3798
3268
 
3799
3269
  export async function customertrial( params ) {
3800
3270
  try {
@@ -3820,145 +3290,403 @@ export async function customertrial( params ) {
3820
3290
  }
3821
3291
  };
3822
3292
 
3823
- export async function taskAssign( req, res ) {
3293
+ export async function commonAiTask( req, res ) {
3824
3294
  try {
3825
- if ( !req.body.taskId ) {
3826
- return res.sendError( 'task id is required', 400 );
3827
- }
3828
- if ( !req.body.coverage ) {
3829
- return res.sendError( 'Coverage is required', 400 );
3830
- }
3831
- if ( !req.body.idList ) {
3832
- return res.sendError( 'Id is required', 400 );
3295
+ let inputBody = req.body;
3296
+
3297
+ inputBody.clientId = 11;
3298
+ inputBody.taskDescription = '';
3299
+ let userId;
3300
+ let storeDetails = await storeService.findOne( { storeName: inputBody.storeName, clientId: inputBody.clientId, status: 'active' }, { storeId: 1, storeName: 1, storeProfile: 1 } );
3301
+ if ( !storeDetails ) {
3302
+ return res.sendError( 'Store Not Found', 500 );
3833
3303
  }
3834
3304
 
3835
- let taskDetails = await taskService.findOne( { _id: req.body.taskId } );
3836
- if ( !taskDetails ) {
3837
- return res.sendError( 'No data found', 204 );
3305
+ let url = JSON.parse( process.env.LAMBDAURL );
3306
+ let checklistId = url.dailystoreChecklistId;
3307
+ let finduser = await checklistassignconfigModel.findOne( { checkListId: new mongoose.Types.ObjectId( checklistId ), store_id: storeDetails.storeId } );
3308
+
3309
+ if ( !finduser ) {
3310
+ return res.sendError( 'No user Found For this store', 500 );
3838
3311
  }
3839
3312
 
3840
- let uniqueArr = [];
3313
+ userId = finduser.userId;
3314
+ inputBody.userName = finduser.userName;
3315
+ inputBody.userEmail = finduser.userEmail;
3841
3316
 
3842
- await Promise.all( req.body.idList.map( async ( data ) => {
3843
- let assignedData = {
3844
- ...data,
3845
- clientId: req.body.clientId,
3846
- };
3847
- let uploadData = await assignUsers( assignedData );
3848
- if ( uploadData?.length ) {
3849
- uniqueArr.push( ...uploadData );
3850
- }
3851
- } ) );
3852
3317
 
3853
- if ( uniqueArr.length ) {
3854
- if ( req.body.coverage == 'store' ) {
3855
- uniqueArr = uniqueArr.reduce( ( acc, obj ) => {
3856
- if ( acc[obj.storeName] ) {
3857
- acc[obj.storeName].clusterName += ',' + obj.clusterName;
3858
- } else {
3859
- acc[obj.storeName] = { ...obj };
3860
- }
3861
- return acc;
3862
- }, {} );
3318
+ let teamList = await findteams( { users: { $elemMatch: { email: finduser.userEmail } } } );
3863
3319
 
3864
- uniqueArr= Object.values( uniqueArr );
3865
- } else {
3866
- uniqueArr = uniqueArr.reduce( ( acc, obj ) => {
3867
- if ( acc[obj.userEmail] ) {
3868
- acc[obj.userEmail].teamName += ','+ obj.teamName;
3869
- } else {
3870
- acc[obj.userEmail] = { ...obj };
3871
- }
3872
- return acc;
3873
- }, {} );
3874
- uniqueArr = Object.values( uniqueArr );
3320
+ inputBody.approver = '';
3321
+ for ( let team of teamList ) {
3322
+ for ( let user of team.Teamlead ) {
3323
+ inputBody.approver = user.email + ',' + inputBody.approver;
3875
3324
  }
3876
3325
  }
3326
+ inputBody.approver = inputBody.approver.replace( /,$/, '' );
3877
3327
 
3878
- return res.sendSuccess( { count: uniqueArr.length, uniqueArr } );
3879
- } catch ( e ) {
3880
- logger.error( { functionName: 'taskAssign', error: e } );
3881
- return res.sendError( e, 500 );
3882
- }
3883
- }
3884
3328
 
3885
- export async function updateAssign( req, res ) {
3886
- try {
3887
- // if ( !req.body.assignedList.length && !req.body.assignedGroup.length ) {
3888
- // return res.sendError( 'No data found', 204 );
3889
- // }
3890
- let taskDetails = await taskService.findOne( { _id: req.body.taskId, client_id: req.body.clientId } );
3891
- if ( !taskDetails ) {
3892
- return res.sendError( 'No data found', 204 );
3329
+ let title = `New Task Alert ${inputBody.taskName}-${storeDetails.storeName}-${dayjs().format( 'YYYY-MM-DD' )}`;
3330
+ let time = inputBody?.scheduleEndTime || '11:59 PM';
3331
+ let date = inputBody?.scheduleDate || dayjs().format( 'YYYY-MM-DD' );
3332
+ let description = `A new task has been assigned to ${storeDetails.storeName}. Please complete it before the due date of ${date}.`;
3333
+ if ( userDetails&&userDetails.fcmToken ) {
3334
+ const fcmToken = userDetails.fcmToken;
3335
+ await sendPushNotification( title, description, fcmToken );
3893
3336
  }
3894
- req.body.assignedGroup = [ ...new Set( req.body.assignedGroup.map( ( item ) => item.id ) ) ];
3895
- req.body.assignedGroup = req.body.assignedGroup.map( ( ele ) => {
3896
- return { id: ele };
3897
- } );
3898
- await taskAssignService.deleteMany( { checkListId: req.body.taskId } );
3899
- let assignedUserList = [];
3900
- await Promise.all( req.body.assignedList.map( async ( assign ) => {
3901
- let query = [
3902
- {
3903
- $addFields: {
3904
- emailToLower: { $toLower: '$email' },
3905
- },
3906
- },
3907
- {
3908
- $match: {
3909
- clientId: req.body.clientId,
3910
- emailToLower: assign.userEmail.toLowerCase(),
3911
- },
3337
+ const inputDateTime = dayjs.utc( `${date} ${time}`, 'YYYY-MM-DD hh:mm A' );
3338
+ const currentTime = dayjs.utc();
3339
+ if ( inputDateTime.isBefore( currentTime ) ) {
3340
+ return res.sendError( 'The input date-time is before the current time.', 500 );
3341
+ }
3342
+
3343
+ let approverList = inputBody?.approver.split( ',' );
3344
+
3345
+
3346
+ let userAdmin = await userService.find( { clientId: inputBody.clientId, email: { $in: approverList }, userType: 'client', isActive: true }, { name: '$userName', email: 1 } );
3347
+
3348
+ if ( userAdmin && userAdmin.length === 0 ) {
3349
+ userAdmin = await userService.find( { clientId: inputBody.clientId, email: 'rohit.chawla@lenskart.com', userType: 'client', isActive: true }, { name: '$userName', email: 1 } );
3350
+ }
3351
+
3352
+ let creator = await userService.find( { clientId: inputBody.clientId, email: 'rohit.chawla@lenskart.com', userType: 'client', isActive: true } );
3353
+ if ( creator && creator.length === 0 ) {
3354
+ return res.sendError( 'Invalid Creator Details', 500 );
3355
+ }
3356
+
3357
+ if ( req.body && req.body.referenceImage && req.body.referenceImage.length > 3 ) {
3358
+ return res.sendError( 'Maximum 3 referenceImage only allowed', 500 );
3359
+ }
3360
+ let data = {
3361
+ checkListName: `${inputBody.taskName}(${storeDetails.storeName}-${dayjs().format( 'YYYY-MM-DD' )})`,
3362
+ checkListDescription: inputBody.taskDescription,
3363
+ createdBy: creator[0]._id,
3364
+ createdByName: creator[0].userName,
3365
+ publish: true,
3366
+ questionCount: 1,
3367
+ storeCount: 1,
3368
+ scheduleDate: date,
3369
+ scheduleEndTime: time,
3370
+ scheduleEndTimeISO: dayjs.utc( `${date} ${time}`, 'YYYY-MM-DD hh:mm A' ).format(),
3371
+ priorityType: 'high',
3372
+ client_id: inputBody.clientId,
3373
+ checkListType: 'task',
3374
+ publishDate: new Date(),
3375
+ locationCount: 1,
3376
+ ...( inputBody?.checkListId ) ? { referenceCheckListId: inputBody?.checkListId } : {},
3377
+ };
3378
+ data['approver'] = userAdmin;
3379
+ let answer = await findAnswer( inputBody?.answerType );
3380
+ if ( answer.length == 0 ) {
3381
+ return res.sendError( 'please enter Valid AnswerType', 500 );
3382
+ }
3383
+ if ( inputBody?.answerType === 'multiplechoicesingle' || inputBody?.answerType === 'multiplechoicemultiple' ) {
3384
+ if ( inputBody?.options && inputBody?.options.length > 0 ) {
3385
+ let optionsResult = [];
3386
+ let optionList = inputBody?.options.split( ',' );
3387
+ for ( let option of optionList ) {
3388
+ let optiondata = {
3389
+ 'answer': '',
3390
+ 'sopFlag': false,
3391
+ 'validation': false,
3392
+ 'validationType': '',
3393
+ 'referenceImage': [],
3394
+ 'runAI': false,
3395
+ 'allowUploadfromGallery': false,
3396
+ 'descriptivetype': '',
3397
+ 'showLinked': false,
3398
+ 'linkedQuestion': 0,
3399
+ 'nestedQuestion': [],
3400
+ };
3401
+ optiondata.answer = option;
3402
+ optionsResult.push( optiondata );
3403
+ }
3404
+ answer = optionsResult;
3405
+ } else {
3406
+ return res.sendError( 'please enter Valid Options', 500 );
3407
+ }
3408
+ }
3409
+ let response = await taskService.create( data );
3410
+ if ( response?.approver.length ) {
3411
+ let inputData = [];
3412
+ response?.approver.forEach( ( ele ) => {
3413
+ inputData.push( {
3414
+ userEmail: ele.email,
3415
+ checkListId: response._id,
3416
+ type: 'task',
3417
+ client_id: inputBody.clientId,
3418
+ checkListName: data?.checkListName || '',
3419
+ } );
3420
+ } );
3421
+ await traxApprover.insertMany( inputData );
3422
+ }
3423
+ if ( response?._id ) {
3424
+ let question = [
3425
+ {
3426
+ 'qno': 1,
3427
+ 'qname': inputBody.question,
3428
+ 'answerType': inputBody?.answerType || 'yes/no',
3429
+ 'runAI': false,
3430
+ 'runAIDescription': '',
3431
+ 'allowUploadfromGallery': false,
3432
+ 'linkType': false,
3433
+ 'questionReferenceImage': [],
3434
+ 'answers': answer,
3435
+ 'descriptivetype': 'text',
3912
3436
  },
3913
3437
  ];
3914
- let userDetails = await userService.aggregate( query );
3915
- if ( !userDetails.length ) {
3916
- let userData = {
3917
- userName: assign.userName,
3918
- email: assign.userEmail,
3919
- mobileNumber: assign?.phone || '',
3920
- clientId: req.body.clientId,
3438
+ let images = [];
3439
+ for ( let imgpath of req.body.referenceImage ) {
3440
+ let configURL = JSON.parse( process.env.BUCKET );
3441
+ let inputData = {
3442
+ Bucket: configURL.commonAiTaskBucket,
3443
+ Key: imgpath,
3444
+ };
3445
+ let output = await getObject( inputData );
3446
+ let image = {
3447
+ data: output.Body,
3448
+ name: imgpath,
3449
+ mimetype: output.ContentType,
3921
3450
  };
3922
- userDetails = await createUser( userData );
3923
- userDetails = [ userDetails ];
3451
+ let uplaodedImage = await uploadmultiImage( image );
3452
+
3453
+ let imgUrl = decodeURIComponent( uplaodedImage.imgUrl.split( '?' )[0] );
3454
+ let url = imgUrl.split( '/' );
3455
+ if ( url.includes( 'https:' ) || url.includes( 'http:' ) ) {
3456
+ url.splice( 0, 3 );
3457
+ }
3458
+ images.push( url.join( '/' ) );
3924
3459
  }
3925
- let data = {
3926
- ...assign,
3927
- store_id: assign?.storeId,
3928
- client_id: req.body.clientId,
3929
- checkListId: req.body.taskId,
3930
- coverage: req.body.coverage,
3931
- assignId: assign._id,
3932
- userId: userDetails?.[0]?._id,
3933
- checkListName: taskDetails.checkListName,
3460
+ question[0].questionReferenceImage = images;
3461
+
3462
+ if ( inputBody?.answerType === 'image' || inputBody?.answerType === 'descriptiveImage' || inputBody?.answerType === 'multipleImage' ) {
3463
+ answer[0].referenceImage = question[0].questionReferenceImage;
3464
+ }
3465
+
3466
+
3467
+ question = {
3468
+ checkListId: response?._id,
3469
+ question: question,
3470
+ section: 'Section 1',
3471
+ checkList: data.checkListName,
3472
+ client_id: inputBody.clientId,
3473
+ };
3474
+ await taskQuestionService.create( question );
3475
+
3476
+ let userDetails = {
3477
+ userName: inputBody.userName,
3478
+ userEmail: inputBody.userEmail,
3479
+ store_id: storeDetails.storeId,
3480
+ storeName: storeDetails.storeName,
3481
+ city: storeDetails?.storeProfile?.city,
3482
+ checkFlag: true,
3483
+ checkListId: response?._id,
3484
+ checkListName: data.checkListName,
3485
+ client_id: inputBody.clientId,
3486
+ userId: userId,
3934
3487
  };
3935
- delete data._id;
3936
- assignedUserList.push( data );
3937
- } ) );
3938
- await Promise.all( req.body.assignedGroup.map( async ( assign ) => {
3939
- let groupDetails;
3940
- if ( req.body.coverage == 'store' ) {
3941
- groupDetails = await clusterServices.findOneCluster( { _id: assign.id } );
3488
+ await taskAssignService.create( userDetails );
3489
+ await insertSingleProcessData( response?._id );
3490
+ return res.sendSuccess( 'Task created successfully' );
3491
+ }
3492
+ } catch ( e ) {
3493
+ logger.error( { function: 'commonAiTask', error: e } );
3494
+ return res.sendError( e, 500 );
3495
+ }
3496
+ }
3497
+
3498
+
3499
+ export async function taskcreation( req, res ) {
3500
+ try {
3501
+ let inputBody = req.body;
3502
+
3503
+ inputBody.clientId = 458;
3504
+ inputBody.taskDescription = '';
3505
+ let userId;
3506
+ let storeDetails = await storeService.findOne( { storeName: inputBody.storeName, clientId: inputBody.clientId, status: 'active' }, { storeId: 1, storeName: 1, storeProfile: 1 } );
3507
+ if ( !storeDetails ) {
3508
+ return res.sendError( 'Store Not Found', 500 );
3509
+ }
3510
+
3511
+
3512
+ let finduser = await userService.findOne( { clientId: inputBody.clientId, email: req.body.user, userType: 'client', isActive: true }, { userName: '$userName', email: 1, userId: '$_id' } );
3513
+ console.log( finduser );
3514
+
3515
+ if ( !finduser ) {
3516
+ return res.sendError( 'No user Found', 500 );
3517
+ }
3518
+
3519
+ userId = finduser._id;
3520
+ inputBody.userName = finduser.userName;
3521
+ inputBody.userEmail = finduser.email;
3522
+
3523
+
3524
+ let title = `New Task Alert ${inputBody.taskName}-${storeDetails.storeName}-${dayjs().format( 'YYYY-MM-DD' )}`;
3525
+ let time = inputBody?.scheduleEndTime || '11:59 PM';
3526
+ let date = inputBody?.scheduleDate || dayjs().format( 'YYYY-MM-DD' );
3527
+ let description = `A new task has been assigned to ${storeDetails.storeName}. Please complete it before the due date of ${date}.`;
3528
+ if ( userDetails&&userDetails.fcmToken ) {
3529
+ const fcmToken = userDetails.fcmToken;
3530
+ await sendPushNotification( title, description, fcmToken );
3531
+ }
3532
+ const inputDateTime = dayjs.utc( `${date} ${time}`, 'YYYY-MM-DD hh:mm A' );
3533
+ const currentTime = dayjs.utc();
3534
+ if ( inputDateTime.isBefore( currentTime ) ) {
3535
+ return res.sendError( 'The input date-time is before the current time.', 500 );
3536
+ }
3537
+
3538
+
3539
+ let userAdmin = await userService.find( { clientId: inputBody.clientId, email: inputBody?.approver, userType: 'client', isActive: true }, { name: '$userName', email: 1 } );
3540
+
3541
+
3542
+ if ( userAdmin && userAdmin.length === 0 ) {
3543
+ return res.sendError( 'Invalid Creator Details', 500 );
3544
+ }
3545
+
3546
+ let creator = await userService.find( { clientId: inputBody.clientId, email: inputBody.creator, userType: 'client', isActive: true } );
3547
+ if ( creator && creator.length === 0 ) {
3548
+ return res.sendError( 'Invalid Creator Details', 500 );
3549
+ }
3550
+
3551
+ if ( req.body && req.body.referenceImage && req.body.referenceImage.length > 3 ) {
3552
+ return res.sendError( 'Maximum 3 referenceImage only allowed', 500 );
3553
+ }
3554
+ let data = {
3555
+ checkListName: `${inputBody.taskName}(${storeDetails.storeName}-${dayjs().format( 'YYYY-MM-DD' )})`,
3556
+ checkListDescription: inputBody.taskDescription,
3557
+ createdBy: creator[0]._id,
3558
+ createdByName: creator[0].userName,
3559
+ publish: true,
3560
+ questionCount: 1,
3561
+ storeCount: 1,
3562
+ scheduleDate: date,
3563
+ scheduleEndTime: time,
3564
+ scheduleEndTimeISO: dayjs.utc( `${date} ${time}`, 'YYYY-MM-DD hh:mm A' ).format(),
3565
+ priorityType: 'high',
3566
+ client_id: inputBody.clientId,
3567
+ checkListType: 'task',
3568
+ publishDate: new Date(),
3569
+ locationCount: 1,
3570
+ ...( inputBody?.checkListId ) ? { referenceCheckListId: inputBody?.checkListId } : {},
3571
+ };
3572
+ data['approver'] = userAdmin;
3573
+ let answer = await findAnswer( inputBody?.answerType );
3574
+ if ( answer.length == 0 ) {
3575
+ return res.sendError( 'please enter Valid AnswerType', 500 );
3576
+ }
3577
+ if ( inputBody?.answerType === 'multiplechoicesingle' || inputBody?.answerType === 'multiplechoicemultiple' ) {
3578
+ if ( inputBody?.options && inputBody?.options.length > 0 ) {
3579
+ let optionsResult = [];
3580
+ let optionList = inputBody?.options.split( ',' );
3581
+ for ( let option of optionList ) {
3582
+ let optiondata = {
3583
+ 'answer': '',
3584
+ 'sopFlag': false,
3585
+ 'validation': false,
3586
+ 'validationType': '',
3587
+ 'referenceImage': [],
3588
+ 'runAI': false,
3589
+ 'allowUploadfromGallery': false,
3590
+ 'descriptivetype': '',
3591
+ 'showLinked': false,
3592
+ 'linkedQuestion': 0,
3593
+ 'nestedQuestion': [],
3594
+ };
3595
+ optiondata.answer = option;
3596
+ optionsResult.push( optiondata );
3597
+ }
3598
+ answer = optionsResult;
3942
3599
  } else {
3943
- groupDetails = await teamsServices.findOneTeams( { _id: assign.id } );
3944
- }
3945
- if ( groupDetails ) {
3946
- let groupData = {
3947
- client_id: req.body.clientId,
3948
- checkListId: req.body.taskId,
3949
- coverage: req.body.coverage,
3950
- assignId: assign.id,
3951
- checkListName: taskDetails.checkListName,
3952
- ...( req.body.coverage == 'store' ) ? { clusterName: groupDetails?.clusterName } : { teamName: groupDetails?.teamName },
3953
- };
3954
- assignedUserList.push( groupData );
3600
+ return res.sendError( 'please enter Valid Options', 500 );
3955
3601
  }
3956
- } ) );
3957
- await taskAssignService.insertMany( assignedUserList );
3958
- return res.sendSuccess( 'Assign details updated successfully' );
3602
+ }
3603
+ let response = await taskService.create( data );
3604
+ if ( response?.approver.length ) {
3605
+ let inputData = [];
3606
+ response?.approver.forEach( ( ele ) => {
3607
+ inputData.push( {
3608
+ userEmail: ele.email,
3609
+ checkListId: response._id,
3610
+ type: 'task',
3611
+ client_id: inputBody.clientId,
3612
+ checkListName: data?.checkListName || '',
3613
+ } );
3614
+ } );
3615
+ await traxApprover.insertMany( inputData );
3616
+ }
3617
+ if ( response?._id ) {
3618
+ let question = [
3619
+ {
3620
+ 'qno': 1,
3621
+ 'qname': inputBody.question,
3622
+ 'answerType': inputBody?.answerType || 'yes/no',
3623
+ 'runAI': false,
3624
+ 'runAIDescription': '',
3625
+ 'allowUploadfromGallery': false,
3626
+ 'linkType': false,
3627
+ 'questionReferenceImage': [],
3628
+ 'answers': answer,
3629
+ 'descriptivetype': 'text',
3630
+ },
3631
+ ];
3632
+ let images = [];
3633
+
3634
+ // for ( let imgpath of req.body.referenceImage ) {
3635
+ // let configURL = JSON.parse( process.env.BUCKET );
3636
+ // let inputData = {
3637
+ // Bucket: configURL.commonAiTaskBucket,
3638
+ // Key: imgpath,
3639
+ // };
3640
+ // let output = await getObject( inputData );
3641
+ // console.log( output );
3642
+
3643
+ // let image = {
3644
+ // data: output.Body,
3645
+ // name: imgpath,
3646
+ // mimetype: output.ContentType,
3647
+ // };
3648
+ // let uplaodedImage = await uploadmultiImage( image );
3649
+
3650
+ // let imgUrl = decodeURIComponent( uplaodedImage.imgUrl.split( '?' )[0] );
3651
+ // let url = imgUrl.split( '/' );
3652
+ // if ( url.includes( 'https:' ) || url.includes( 'http:' ) ) {
3653
+ // url.splice( 0, 3 );
3654
+ // }
3655
+ // images.push( url.join( '/' ) );
3656
+ // }
3657
+ question[0].questionReferenceImage = images;
3658
+
3659
+ if ( inputBody?.answerType === 'image' || inputBody?.answerType === 'descriptiveImage' || inputBody?.answerType === 'multipleImage' ) {
3660
+ answer[0].referenceImage = question[0].questionReferenceImage;
3661
+ }
3662
+
3663
+
3664
+ question = {
3665
+ checkListId: response?._id,
3666
+ question: question,
3667
+ section: 'Section 1',
3668
+ checkList: data.checkListName,
3669
+ client_id: inputBody.clientId,
3670
+ };
3671
+ await taskQuestionService.create( question );
3672
+ let userDetails = {
3673
+ userName: inputBody.userName,
3674
+ userEmail: inputBody.userEmail,
3675
+ store_id: storeDetails.storeId,
3676
+ storeName: storeDetails.storeName,
3677
+ city: storeDetails?.storeProfile?.city,
3678
+ checkFlag: true,
3679
+ checkListId: response?._id,
3680
+ checkListName: data.checkListName,
3681
+ client_id: inputBody.clientId,
3682
+ userId: userId,
3683
+ };
3684
+ await taskAssignService.create( userDetails );
3685
+ await insertSingleProcessData( response?._id );
3686
+ return res.sendSuccess( 'Task created successfully' );
3687
+ }
3959
3688
  } catch ( e ) {
3960
- logger.error( { functionName: 'updateAssign', error: e } );
3689
+ logger.error( { function: 'taskcreation ventota', error: e } );
3961
3690
  return res.sendError( e, 500 );
3962
3691
  }
3963
3692
  }
3964
-