tango-app-api-store-builder 1.0.0-beta-85 → 1.0.0-beta-86

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.
@@ -17,9 +17,6 @@ import * as fixtureConfigService from '../service/fixtureConfig.service.js';
17
17
  import * as planoStaticData from '../service/planoStaticData.service.js';
18
18
 
19
19
 
20
- import path from 'path';
21
-
22
-
23
20
  dayjs.extend( utc );
24
21
  dayjs.extend( customParseFormat );
25
22
 
@@ -578,12 +575,12 @@ export async function storeFixturesv1( req, res ) {
578
575
  let productCapacity = 0;
579
576
  const layoutPolygonWithFixtures = await Promise.all(
580
577
  floor.layoutPolygon.map( async ( element ) => {
581
- const fixtures = await storeFixtureService.find( {
578
+ const fixtures = await storeFixtureService.findAndSort( {
582
579
  floorId: floor._id,
583
580
  associatedElementType: element.elementType,
584
581
  associatedElementNumber: element.elementNumber,
585
582
  fixtureType: 'wall',
586
- }, { shelfcount: 0 } );
583
+ }, { shelfcount: 0 }, { fixtureNumber: 1 } );
587
584
 
588
585
  const fixturesWithStatus = await Promise.all(
589
586
  fixtures.map( async ( fixture ) => {
@@ -2023,12 +2020,12 @@ export async function storeFixturesTask( req, res ) {
2023
2020
  let productCapacity = 0;
2024
2021
  const layoutPolygonWithFixtures = await Promise.all(
2025
2022
  floor.layoutPolygon.map( async ( element ) => {
2026
- const fixtures = await storeFixtureService.find( {
2023
+ const fixtures = await storeFixtureService.findAndSort( {
2027
2024
  floorId: floor._id,
2028
2025
  associatedElementType: element.elementType,
2029
2026
  associatedElementNumber: element.elementNumber,
2030
2027
  fixtureType: 'wall',
2031
- }, { shelfcount: 0 } );
2028
+ }, { shelfcount: 0 }, { fixtureNumber: 1 } );
2032
2029
 
2033
2030
  const fixturesWithStatus = await Promise.all(
2034
2031
  fixtures.map( async ( fixture ) => {
@@ -4,7 +4,7 @@ import * as storeService from '../service/store.service.js';
4
4
  import * as processedChecklistService from '../service/processedchecklist.service.js';
5
5
  import * as userService from '../service/user.service.js';
6
6
  import dayjs from 'dayjs';
7
- import { logger, fileUpload, signedUrl } from 'tango-app-api-middleware';
7
+ import { logger, fileUpload, signedUrl, download } from 'tango-app-api-middleware';
8
8
  import * as planoTaskService from '../service/planoTask.service.js';
9
9
  import * as planoService from '../service/planogram.service.js';
10
10
  import * as checklistService from '../service/checklist.service.js';
@@ -202,45 +202,47 @@ export async function createTask( req, res ) {
202
202
  await Promise.all( storeDetails.map( async ( store ) => {
203
203
  let getUserEmail = req.body.stores.find( ( ele ) => ele.store.toLowerCase() == store.storeName.toLowerCase() );
204
204
  let planoDetails = await planoService.findOne( { storeId: store.storeId } );
205
- if ( getUserEmail ) {
206
- let query = [
207
- {
208
- $addFields: {
209
- emailLower: { $toLower: '$email' },
205
+ if ( planoDetails ) {
206
+ if ( getUserEmail ) {
207
+ let query = [
208
+ {
209
+ $addFields: {
210
+ emailLower: { $toLower: '$email' },
211
+ },
210
212
  },
211
- },
212
- {
213
- $match: {
214
- clientId: req.body.clientId,
215
- email: getUserEmail.email.toLowerCase(),
213
+ {
214
+ $match: {
215
+ clientId: req.body.clientId,
216
+ email: getUserEmail.email.toLowerCase(),
217
+ },
216
218
  },
217
- },
218
- ];
219
- userDetails = await userService.aggregate( query );
220
- // if ( !userDetails.length ) {
221
- // let userData = {
222
- // clientId: req.body.clientId,
223
- // mobileNumber: '',
224
- // email: getUserEmail.email,
225
- // userName: getUserEmail.email.split( '@' )[0],
226
- // };
227
- // userDetails = await createUser( userData );
228
- // } else {
229
- userDetails = userDetails[0];
230
- // }
231
- }
232
- let taskData = { ...data };
233
- taskData.store_id = store.storeId;
234
- taskData.storeName = store.storeName;
235
- taskData.userId = userDetails._id;
236
- taskData.userName = userDetails.userName;
237
- taskData.userEmail = userDetails.email;
238
- taskData.planoId = planoDetails?._id;
239
- for ( let i=0; i<req.body.days; i++ ) {
240
- let currDate = dayjs().add( i, 'day' );
241
- let insertData = { ...taskData, date_string: currDate.format( 'YYYY-MM-DD' ), date_iso: new Date( currDate.format( 'YYYY-MM-DD' ) ), scheduleStartTime_iso: dayjs.utc( `${currDate.format( 'YYYY-MM-DD' )} 12:00 AM`, 'YYYY-MM-DD hh:mm A' ).format() };
242
- let response = await processedService.updateOne( { date_string: currDate.format( 'YYYY-MM-DD' ), store_id: insertData.store_id, userEmail: insertData.userEmail, planoId: insertData.planoId, sourceCheckList_id: task._id }, insertData );
243
- console.log( insertData.store_id, response );
219
+ ];
220
+ userDetails = await userService.aggregate( query );
221
+ // if ( !userDetails.length ) {
222
+ // let userData = {
223
+ // clientId: req.body.clientId,
224
+ // mobileNumber: '',
225
+ // email: getUserEmail.email,
226
+ // userName: getUserEmail.email.split( '@' )[0],
227
+ // };
228
+ // userDetails = await createUser( userData );
229
+ // } else {
230
+ userDetails = userDetails[0];
231
+ // }
232
+ }
233
+ let taskData = { ...data };
234
+ taskData.store_id = store.storeId;
235
+ taskData.storeName = store.storeName;
236
+ taskData.userId = userDetails._id;
237
+ taskData.userName = userDetails.userName;
238
+ taskData.userEmail = userDetails.email;
239
+ taskData.planoId = planoDetails?._id;
240
+ for ( let i=0; i<req.body.days; i++ ) {
241
+ let currDate = dayjs().add( i, 'day' );
242
+ let insertData = { ...taskData, date_string: currDate.format( 'YYYY-MM-DD' ), date_iso: new Date( currDate.format( 'YYYY-MM-DD' ) ), scheduleStartTime_iso: dayjs.utc( `${currDate.format( 'YYYY-MM-DD' )} 12:00 AM`, 'YYYY-MM-DD hh:mm A' ).format() };
243
+ let response = await processedService.updateOne( { date_string: currDate.format( 'YYYY-MM-DD' ), store_id: insertData.store_id, userEmail: insertData.userEmail, planoId: insertData.planoId, sourceCheckList_id: task._id }, insertData );
244
+ console.log( insertData.store_id, response );
245
+ }
244
246
  }
245
247
  } ) );
246
248
  } ) );
@@ -380,7 +382,7 @@ export async function getTaskDetails( req, res ) {
380
382
  }
381
383
  let date = req.query?.date || dayjs().format( 'YYYY-MM-DD' );
382
384
  let getDetails = await processedService.find( { store_id: req.query.storeId, date_string: date, isPlano: true, checklistStatus: { $ne: 'submit' }, userId: req.user._id }, { checkListName: 1, taskType: '$planoType', checklistStatus: 1 } );
383
- return res.sendSuccess( getDetails );
385
+ return res.sendSuccess( [] );
384
386
  } catch ( e ) {
385
387
  logger.error( { functionName: 'getTaskDetails', error: e } );
386
388
  return res.sendError( e, 500 );
@@ -608,3 +610,112 @@ export async function getVmDetails( req, res ) {
608
610
  return res.sendError( e, 500 );
609
611
  }
610
612
  }
613
+
614
+ export async function generatetaskDetails( req, res ) {
615
+ try {
616
+ let query =[
617
+ {
618
+ $match: {
619
+ date_iso: { $gte: new Date( req.body.fromDate ), $lte: new Date( req.body.toDate ) },
620
+ isPlano: true,
621
+ },
622
+ },
623
+ {
624
+ $project: {
625
+ _id: 0,
626
+ storeName: 1,
627
+ userEmail: 1,
628
+ planoId: 1,
629
+ checklistStatus: 1,
630
+ date_string: 1,
631
+ storeStatus: {
632
+ $cond: {
633
+ if: { $eq: [ '$checklistStatus', 'submit' ] },
634
+ then: 'Yes',
635
+ else: '',
636
+
637
+ },
638
+ },
639
+ },
640
+ },
641
+ ];
642
+
643
+ let taskDetails = await processedService.aggregate( query );
644
+ let processedTaskDetails = await planoTaskService.find( { date_string: { $gte: req.body.fromDate, $lte: req.body.toDate }, type: 'layout', status: 'incomplete' } );
645
+ processedTaskDetails.forEach( ( item ) => {
646
+ let taskIndex = taskDetails.findIndex( ( taskItem ) => taskItem.checklistStatus == 'submit' && item.date_string == taskItem.date_string && item.planoId.toString() == taskItem.planoId.toString() );
647
+ if ( taskIndex != -1 ) {
648
+ taskDetails[taskIndex].storeStatus = 'No';
649
+ }
650
+ } );
651
+
652
+ taskDetails.forEach( ( ele ) => {
653
+ delete ele.planoId;
654
+ } );
655
+
656
+ if ( !taskDetails.length ) {
657
+ return res.sendError( 'No date found', 204 );
658
+ }
659
+
660
+ await download( taskDetails, res );
661
+ } catch ( e ) {
662
+ logger.error( { functioName: 'generatetaskDetails', error: e } );
663
+ return res.sendError( e, 500 );
664
+ }
665
+ }
666
+
667
+ export async function taskSubmitDetails( req, res ) {
668
+ try {
669
+ let query = [
670
+ {
671
+ $match: {
672
+ date_string: { $gte: req.body.fromDate, $lte: req.body.toDate },
673
+ type: 'layout',
674
+ },
675
+ },
676
+ {
677
+ $lookup: {
678
+ from: 'planograms',
679
+ let: { plano_id: '$planoId' },
680
+ pipeline: [
681
+ {
682
+ $match: {
683
+ $expr: {
684
+ $and: [
685
+ { $eq: [ '$_id', '$$plano_id' ] },
686
+ ],
687
+ },
688
+ },
689
+ },
690
+ {
691
+ $project: {
692
+ storeName: 1,
693
+ _id: 0,
694
+ },
695
+ },
696
+ ],
697
+ as: 'planogram',
698
+ },
699
+ },
700
+ { $unwind: { path: '$planogram', preserveNullAndEmptyArrays: true } },
701
+ {
702
+ $project: {
703
+ storeName: '$planogram.storeName',
704
+ answers: 1,
705
+ type: 1,
706
+ status: 1,
707
+ planoId: 1,
708
+ floorId: 1,
709
+ },
710
+ },
711
+ ];
712
+
713
+ let processedTaskDetails = await planoTaskService.aggregate( query );
714
+ let completeStore = [ ...new Set( processedTaskDetails.filter( ( ele ) => ele.status == 'complete' ).map( ( ele ) => ele.storeName ) ) ];
715
+ let incompleteStore = [ ...new Set( processedTaskDetails.filter( ( ele ) => ele.status == 'incomplete' ).map( ( ele ) => ele.storeName ) ) ];
716
+ return res.sendSuccess( { complete: { count: completeStore.length, storeList: completeStore }, incompleteStore: { count: incompleteStore.length, storeList: incompleteStore }, data: processedTaskDetails } );
717
+ } catch ( e ) {
718
+ logger.error( { functioName: 'taskSubmitDetails', error: e } );
719
+ return res.sendError( e, 500 );
720
+ }
721
+ }
@@ -24,4 +24,5 @@ scriptRouter
24
24
  .post( '/updateVmData', scriptController.updateVmData )
25
25
  .post( '/createCrestPlanogram', scriptController.createCrestPlanogram )
26
26
  .post( '/updatelayout', scriptController.updatelayout )
27
- .post( '/updateCrestVms', scriptController.updateCrestVms );
27
+ .post( '/updateCrestVms', scriptController.updateCrestVms )
28
+ .post( '/downloadPlanoImages', scriptController.downloadPlanoImage );
@@ -10,7 +10,7 @@ export const storeBuilderRouter = express.Router();
10
10
  storeBuilderRouter
11
11
  .post( '/createStoreLayout', isAllowedSessionHandler, validate( validateDtos.createBuilder ), storeBuilderController.createStoreBuilder )
12
12
  .post( '/updateStoreLayout', isAllowedSessionHandler, validate( validateDtos.updateStoreLayout ), storeBuilderController.updateStoreLayout )
13
- .post( '/storeLayoutList', isAllowedSessionHandler, validate( validateDtos.storeLayoutList ), storeBuilderController.getLayoutList )
13
+ .post( '/storeLayoutList', validate( validateDtos.storeLayoutList ), storeBuilderController.getLayoutList )
14
14
  .post( '/updateFloor', isAllowedSessionHandler, validate( validateDtos.updateFloor ), storeBuilderController.updateFloor )
15
15
  .post( '/uploadBulkStore', isAllowedSessionHandler, storeBuilderController.uploadBulkStore )
16
16
  .post( '/uploadFile', isAllowedSessionHandler, storeBuilderController.uploadFile )
@@ -23,7 +23,7 @@ storeBuilderRouter
23
23
  // .post( '/FixtureShelfDetails', storeBuilderController.fixtureShelfProduct )
24
24
  // .post( '/scan', storeBuilderController.scan )
25
25
  .post( '/storeLayout', isAllowedSessionHandler, validate( validateDtos.storeList ), storeBuilderController.storeLayout )
26
- .post( '/storeFixtures', isAllowedSessionHandler, validate( validateDtos.storeList ), storeBuilderController.storeFixturesv1 )
26
+ .post( '/storeFixtures', validate( validateDtos.storeList ), storeBuilderController.storeFixturesv1 )
27
27
  .post( '/FixtureShelfDetails', isAllowedSessionHandler, validate( validateDtos.fixtureShelfProduct ), storeBuilderController.fixtureShelfProductv1 )
28
28
  .post( '/scan', isAllowedSessionHandler, storeBuilderController.scanv1 )
29
29
  .post( '/updateMissing', isAllowedSessionHandler, storeBuilderController.updateMissing )
@@ -12,4 +12,6 @@ storeBuilderTaskRouter
12
12
  .post( '/updateStatus', isAllowedSessionHandler, taskController.updateStatus )
13
13
  .post( '/updateAnswers', isAllowedSessionHandler, taskController.updateAnswers )
14
14
  .get( '/getFixtureDetails', isAllowedSessionHandler, taskController.getFixtureDetails )
15
- .get( '/getVmDetails', isAllowedSessionHandler, taskController.getVmDetails );
15
+ .get( '/getVmDetails', isAllowedSessionHandler, taskController.getVmDetails )
16
+ .post( '/generateTaskExcel', taskController.generatetaskDetails )
17
+ .post( '/getSubmitDetails', taskController.taskSubmitDetails );
@@ -19,3 +19,7 @@ export async function find( query={}, field={} ) {
19
19
  export async function count( data ) {
20
20
  return model.planoTaskCompliance.countDocuments( data );
21
21
  }
22
+
23
+ export async function aggregate( query ) {
24
+ return model.planoTaskCompliance.aggregate( query );
25
+ }
@@ -16,6 +16,10 @@ export async function deleteMany( query = {} ) {
16
16
  return model.taskProcessedModel.deleteMany( query );
17
17
  }
18
18
 
19
+ export async function aggregate( query = {} ) {
20
+ return model.taskProcessedModel.aggregate( query );
21
+ }
22
+
19
23
  export async function find( query = {}, field = {} ) {
20
24
  return model.taskProcessedModel.find( query, field );
21
25
  }