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.
- package/package.json +9 -1
- package/src/controllers/script.controller.js +736 -280
- package/src/controllers/storeBuilder.controller.js +4 -7
- package/src/controllers/task.controller.js +150 -39
- package/src/routes/script.routes.js +2 -1
- package/src/routes/storeBuilder.routes.js +2 -2
- package/src/routes/task.routes.js +3 -1
- package/src/service/planoTask.service.js +4 -0
- package/src/service/processedTaskservice.js +4 -0
|
@@ -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.
|
|
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.
|
|
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 (
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
205
|
+
if ( planoDetails ) {
|
|
206
|
+
if ( getUserEmail ) {
|
|
207
|
+
let query = [
|
|
208
|
+
{
|
|
209
|
+
$addFields: {
|
|
210
|
+
emailLower: { $toLower: '$email' },
|
|
211
|
+
},
|
|
210
212
|
},
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
213
|
+
{
|
|
214
|
+
$match: {
|
|
215
|
+
clientId: req.body.clientId,
|
|
216
|
+
email: getUserEmail.email.toLowerCase(),
|
|
217
|
+
},
|
|
216
218
|
},
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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(
|
|
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',
|
|
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',
|
|
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
|
}
|