tango-app-api-store-builder 1.0.0-beta-41 → 1.0.0-beta-42

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.
@@ -552,7 +552,7 @@ export async function storeFixturesv1( req, res ) {
552
552
  { storeId: { $in: req.body.id } },
553
553
  ],
554
554
  },
555
- { storeId: 1, storeName: 1, planoId: '$_id', productResolutionLevel: 1, scanType: 1 },
555
+ { storeId: 1, storeName: 1, planoId: '$_id', productResolutionLevel: 1, scanType: 1, clientId: 1 },
556
556
  );
557
557
 
558
558
  if ( !planograms?.length ) return res.sendError( 'No data found', 204 );
@@ -598,7 +598,7 @@ export async function storeFixturesv1( req, res ) {
598
598
  date: currentDate,
599
599
  } );
600
600
 
601
- const shelves = await fixtureShelfService.find( { fixtureId: fixture._id }, { shelfNumber: 1 } );
601
+ const shelves = await fixtureShelfService.find( { fixtureId: fixture._id }, { shelfNumber: 1, sectionName: 1, sectionZone: 1 } );
602
602
 
603
603
  const shelfDetails = await Promise.all(
604
604
  shelves.map( async ( shelf ) => {
@@ -629,6 +629,16 @@ export async function storeFixturesv1( req, res ) {
629
629
  fixtureStatus = complianceCount === 0 && !missingCount ? '' : complianceCount === productCount ? 'complete' : 'incomplete';
630
630
  }
631
631
 
632
+ const vms = await planoMappingService.find( { fixtureId: fixture._id, type: 'vm' } );
633
+
634
+ const vmDetails = await Promise.all( vms.map( async ( vm ) => {
635
+ const vmTemplate = await planoProductService.findOne( { _id: vm.toObject().productId } );
636
+ return {
637
+ ...vm.toObject(),
638
+ ...vmTemplate?.toObject(),
639
+ };
640
+ } ) );
641
+
632
642
  return {
633
643
  ...fixture.toObject(),
634
644
  status: fixtureStatus,
@@ -636,6 +646,7 @@ export async function storeFixturesv1( req, res ) {
636
646
  productCount: productCount,
637
647
  vmCount: vmCount,
638
648
  shelfDetails: shelfDetails,
649
+ vms: vmDetails,
639
650
  };
640
651
  } ),
641
652
  );
@@ -681,7 +692,7 @@ export async function storeFixturesv1( req, res ) {
681
692
  date: currentDate,
682
693
  } );
683
694
 
684
- const shelves = await fixtureShelfService.find( { fixtureId: fixture._id }, { shelfNumber: 1 } );
695
+ const shelves = await fixtureShelfService.find( { fixtureId: fixture._id }, { shelfNumber: 1, sectionName: 1, sectionZone: 1 } );
685
696
 
686
697
  const shelfDetails = await Promise.all(
687
698
  shelves.map( async ( shelf ) => {
@@ -712,6 +723,17 @@ export async function storeFixturesv1( req, res ) {
712
723
  fixtureStatus = complianceCount === 0 && !missingCount ? '' : complianceCount === productCount ? 'complete' : 'incomplete';
713
724
  }
714
725
 
726
+ const vms = await planoMappingService.find( { fixtureId: fixture._id, type: 'vm' } );
727
+
728
+ const vmDetails = await Promise.all( vms.map( async ( vm ) => {
729
+ const vmTemplate = await planoProductService.findOne( { _id: vm.toObject().productId } );
730
+
731
+ return {
732
+ ...vm.toObject(),
733
+ ...vmTemplate?.toObject(),
734
+ };
735
+ } ) );
736
+
715
737
  return {
716
738
  ...fixture.toObject(),
717
739
  status: fixtureStatus,
@@ -719,7 +741,7 @@ export async function storeFixturesv1( req, res ) {
719
741
  productCount: productCount,
720
742
  vmCount: vmCount,
721
743
  shelfDetails: shelfDetails,
722
-
744
+ vms: vmDetails,
723
745
  };
724
746
  } ),
725
747
  );
@@ -2358,4 +2380,69 @@ export const fixtureQrUpdate = async ( req, res ) => {
2358
2380
  }
2359
2381
  };
2360
2382
 
2383
+ export const updateDetailedDistance = async ( req, res ) => {
2384
+ try {
2385
+ const { floorId, elementNumber, elementType, detailedDistance } = req.body;
2386
+
2387
+ if ( !floorId || elementNumber === undefined || !elementType || detailedDistance === undefined ) {
2388
+ return res.sendError( 'Missing required fields', 400 );
2389
+ }
2390
+
2391
+ const floorData = await storeBuilderService.findOne( { '_id': new mongoose.Types.ObjectId( floorId ) } );
2392
+
2393
+ const layoutPolygon = floorData.toObject().layoutPolygon.map( ( element ) => {
2394
+ if ( element.elementType === elementType && element.elementNumber === elementNumber ) {
2395
+ return {
2396
+ ...element,
2397
+ detailedDistance: detailedDistance,
2398
+ };
2399
+ } else {
2400
+ return { ...element };
2401
+ }
2402
+ } );
2403
+
2404
+ const updateFloor = await storeBuilderService.updateOne( { '_id': new mongoose.Types.ObjectId( floorId ) }, { layoutPolygon: layoutPolygon } );
2361
2405
 
2406
+
2407
+ if ( !updateFloor.modifiedCount ) {
2408
+ return res.sendError( 'Floor layout or element not found', 400 );
2409
+ }
2410
+
2411
+ return res.sendSuccess( { message: 'Detailed distance updated successfully', updateFloor } );
2412
+ } catch ( error ) {
2413
+ logger.error( 'updateDetailedDistance =>', error );
2414
+ return res.sendError( 'Internal Server Error', 500 );
2415
+ }
2416
+ };
2417
+
2418
+ export const upsertFixtures = async ( req, res ) => {
2419
+ try {
2420
+ const { fixtureId, planoId, floorId, data } = req.body;
2421
+
2422
+ if ( !planoId || !floorId || !data ) {
2423
+ return res.sendError( 'Missing required fields', 400 );
2424
+ }
2425
+
2426
+ const updateData = {
2427
+ planoId: new mongoose.Types.ObjectId( planoId ),
2428
+ floorId: new mongoose.Types.ObjectId( floorId ),
2429
+ ...data,
2430
+ };
2431
+
2432
+ let fixture;
2433
+ if ( fixtureId ) {
2434
+ fixture = await storeFixtureService.findOneAndUpdate(
2435
+ { _id: fixtureId },
2436
+ { $set: updateData },
2437
+ { new: true, upsert: true },
2438
+ );
2439
+ } else {
2440
+ fixture = await storeFixtureService.create( updateData );
2441
+ }
2442
+
2443
+ return res.sendSuccess( { message: 'Fixture upserted successfully', fixture } );
2444
+ } catch ( error ) {
2445
+ logger.error( 'upsertFixtures =>', error );
2446
+ return res.sendError( 'Internal Server Error', 500 );
2447
+ }
2448
+ };
@@ -106,117 +106,123 @@ export async function createTask( req, res ) {
106
106
  if ( !taskDetails.length ) {
107
107
  return res.sendError( 'No data found', 204 );
108
108
  }
109
+ let endDate = dayjs().add( req.body.days, 'day' ).format( 'YYYY-MM-DD' );
109
110
  await Promise.all( taskDetails.map( async ( task ) => {
110
- let processedList = await processedService.findOne( { sourceCheckList_id: task._id, checklistStatus: 'submit' } );
111
- if ( !processedList ) {
112
- let data = {
113
- client_id: req.body.clientId,
114
- date_iso: new Date( dayjs().format( 'YYYY-MM-DD' ) ),
115
- date_string: dayjs().format( 'YYYY-MM-DD' ),
116
- sourceCheckList_id: task._id,
117
- checkListName: task.checkListName,
118
- checkListId: task._id,
119
- scheduleStartTime: '12:00 AM',
120
- scheduleEndTime: '11:59 PM',
121
- scheduleStartTime_iso: dayjs.utc( '12:00 AM', 'hh:mm A' ).format(),
122
- scheduleEndTime_iso: dayjs.utc( '11:59 PM', 'hh:mm A' ).format(),
123
- allowedOverTime: false,
124
- allowedStoreLocation: false,
125
- createdBy: task.createdBy,
126
- createdByName: task.createdByName,
127
- questionAnswers: [],
128
- isdeleted: false,
129
- questionCount: 0,
130
- storeCount: 0,
131
- locationCount: 0,
132
- checkListType: 'task',
133
- country: '',
134
- store_id: '',
135
- storeName: '',
136
- userId: '',
137
- userName: '',
138
- userEmail: '',
139
- checklistStatus: 'open',
140
- timeFlagStatus: true,
141
- timeFlag: 0,
142
- questionFlag: 0,
143
- mobileDetectionFlag: 0,
144
- storeOpenCloseFlag: 0,
145
- reinitiateStatus: false,
146
- markasread: false,
147
- uniformDetectionFlag: 0,
148
- scheduleRepeatedType: 'daily',
149
- approvalStatus: false,
150
- approvalEnable: false,
151
- redoStatus: false,
152
- isPlano: true,
153
- };
111
+ let data = {
112
+ client_id: req.body.clientId,
113
+ date_iso: new Date( dayjs().format( 'YYYY-MM-DD' ) ),
114
+ date_string: dayjs().format( 'YYYY-MM-DD' ),
115
+ sourceCheckList_id: task._id,
116
+ checkListName: task.checkListName,
117
+ checkListId: task._id,
118
+ scheduleStartTime: '12:00 AM',
119
+ scheduleEndTime: '11:59 PM',
120
+ scheduleStartTime_iso: dayjs.utc( '12:00 AM', 'hh:mm A' ).format(),
121
+ scheduleEndTime_iso: dayjs( endDate ).utc( '11:59 PM', 'hh:mm A' ).format(),
122
+ allowedOverTime: false,
123
+ allowedStoreLocation: false,
124
+ createdBy: task.createdBy,
125
+ createdByName: task.createdByName,
126
+ questionAnswers: [],
127
+ isdeleted: false,
128
+ questionCount: 0,
129
+ storeCount: 0,
130
+ locationCount: 0,
131
+ checkListType: 'task',
132
+ country: '',
133
+ store_id: '',
134
+ storeName: '',
135
+ userId: '',
136
+ userName: '',
137
+ userEmail: '',
138
+ checklistStatus: 'open',
139
+ timeFlagStatus: true,
140
+ timeFlag: 0,
141
+ questionFlag: 0,
142
+ mobileDetectionFlag: 0,
143
+ storeOpenCloseFlag: 0,
144
+ reinitiateStatus: false,
145
+ markasread: false,
146
+ uniformDetectionFlag: 0,
147
+ scheduleRepeatedType: 'daily',
148
+ approvalStatus: false,
149
+ approvalEnable: false,
150
+ redoStatus: false,
151
+ isPlano: true,
152
+ type: task.checkListName == 'Product Verification' ? 'product' : task.checkListName == 'Fixture Verification' ? 'fixture' : 'vm',
153
+ };
154
+ let query = [
155
+ {
156
+ $addFields: {
157
+ store: { $toLower: '$storeName' },
158
+ },
159
+ },
160
+ {
161
+ $match: {
162
+ clientId: req.body.clientId,
163
+ store: { $in: storeList },
164
+ },
165
+ },
166
+ ];
167
+
168
+ let storeDetails = await storeService.aggregate( query );
169
+ if ( req.body.userEmail ) {
154
170
  let query = [
155
171
  {
156
172
  $addFields: {
157
- store: { $toLower: '$storeName' },
173
+ emailLower: { $toLower: '$email' },
158
174
  },
159
175
  },
160
176
  {
161
177
  $match: {
162
178
  clientId: req.body.clientId,
163
- store: { $in: storeList },
179
+ emailLower: req.body.userEmail,
164
180
  },
165
181
  },
166
182
  ];
183
+ userDetails = await userService.aggregate( query );
184
+ if ( !userDetails.length ) {
185
+ let userData = {
186
+ clientId: req.body.clientId,
187
+ mobileNumber: '',
188
+ email: req.body.userEmail,
189
+ userName: req.body.userEmail.split( '@' )[0],
190
+ };
191
+ userDetails = await createUser( userData );
192
+ } else {
193
+ userDetails = userDetails[0];
194
+ }
195
+ }
167
196
 
168
- let storeDetails = await storeService.aggregate( query );
169
- if ( req.body.userEmail ) {
170
- let query = [
171
- {
172
- $addFields: {
173
- emailLower: { $toLower: '$email' },
174
- },
175
- },
176
- {
177
- $match: {
178
- clientId: req.body.clientId,
179
- emailLower: req.body.userEmail,
180
- },
181
- },
182
- ];
183
- userDetails = await userService.aggregate( query );
184
- if ( !userDetails.length ) {
197
+ await Promise.all( storeDetails.map( async ( store ) => {
198
+ let planoDetails = await planoService.findOne( { storeId: store.storeId } );
199
+ console.log( planoDetails, store.storeId, 'details' );
200
+ if ( !req.body.userEmail ) {
201
+ userDetails = await userService.findOne( { email: store?.spocDetails?.[0]?.email } );
202
+ if ( !userDetails ) {
185
203
  let userData = {
186
204
  clientId: req.body.clientId,
187
- mobileNumber: '',
188
- email: req.body.userEmail,
189
- userName: req.body.userEmail.split( '@' )[0],
205
+ mobileNumber: store?.spocDetails?.[0]?.contact,
206
+ email: store?.spocDetails?.[0]?.email,
207
+ userName: store?.spocDetails?.[0]?.name,
190
208
  };
191
209
  userDetails = await createUser( userData );
192
- } else {
193
- userDetails = userDetails[0];
194
210
  }
195
211
  }
196
- if ( !req.body.userEmail ) {
197
- await Promise.all( storeDetails.map( async ( store ) => {
198
- let planoDetails = await planoService.findOne( { storeId: store.storeId } );
199
- userDetails = await userService.findOne( { email: store?.spocDetails?.[0]?.email } );
200
- if ( !userDetails ) {
201
- let userData = {
202
- clientId: req.body.clientId,
203
- mobileNumber: store?.spocDetails?.[0]?.contact,
204
- email: store?.spocDetails?.[0]?.email,
205
- userName: store?.spocDetails?.[0]?.name,
206
- };
207
- userDetails = await createUser( userData );
208
- }
209
- let taskData = { ...data };
210
- taskData.store_id = store.storeId;
211
- taskData.storeName = store.storeName;
212
- taskData.userId = userDetails._id;
213
- taskData.userName = userDetails.userName;
214
- taskData.userEmail = userDetails.email;
215
- taskData.planoId = planoDetails?.planoId;
216
- await processedService.create( taskData );
217
- } ) );
212
+ let taskData = { ...data };
213
+ taskData.store_id = store.storeId;
214
+ taskData.storeName = store.storeName;
215
+ taskData.userId = userDetails._id;
216
+ taskData.userName = userDetails.userName;
217
+ taskData.userEmail = userDetails.email;
218
+ taskData.planoId = planoDetails?._id;
219
+ for ( let i=0; i<req.body.days; i++ ) {
220
+ let currDate = dayjs().add( i, 'day' );
221
+ 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() };
222
+ 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 );
223
+ console.log( insertData.store_id, response );
218
224
  }
219
- }
225
+ } ) );
220
226
  } ) );
221
227
 
222
228
  return res.sendSuccess( 'Task created successfully' );
@@ -289,6 +295,9 @@ export async function updateStatus( req, res ) {
289
295
  return res.sendError( 'No data found', 204 );
290
296
  }
291
297
  await processedService.updateOne( { _id: req.body.taskId }, { checklistStatus: req.body.status } );
298
+ if ( req.body.status == 'submit' ) {
299
+ await processedService.deleteMany( { _id: req.body.taskId, date_iso: { $gt: new Date( dayjs().format( 'YYYY-MM-DD' ) ) } } );
300
+ }
292
301
  return res.sendSuccess( 'Task status updated successfully' );
293
302
  } catch ( e ) {
294
303
  logger.error( { functionName: 'storeLayout', error: e } );
@@ -0,0 +1,13 @@
1
+ import express from 'express';
2
+
3
+ export const scriptRouter = express.Router();
4
+ import * as scriptController from '../controllers/script.controller.js';
5
+
6
+
7
+ scriptRouter
8
+ .post( '/getUniqueStoresFromExcel', scriptController.getStoreNames )
9
+ .post( '/bilkInsertFixtureConfig', scriptController.createFixtureConfig )
10
+ .post( '/bulkInsertPlanoData', scriptController.createPlano )
11
+ .post( '/bulkIinsertFloorData', scriptController.createFloors )
12
+ .post( '/bulkIinsertVmTemplateData', scriptController.createVmData )
13
+ .post( '/bulkIinsertFixturesShelvesVmsData', scriptController.createFixturesShelves );
@@ -1,23 +1,25 @@
1
1
  import express from 'express';
2
- import { isAllowedSessionHandler, validate } from 'tango-app-api-middleware';
2
+ import { validate } from 'tango-app-api-middleware';
3
3
  import * as storeBuilderController from '../controllers/storeBuilder.controller.js';
4
+ // import * as scriptController from '../controllers/script.controller.js';
4
5
  import * as validateDtos from '../dtos/validation.dtos.js';
5
6
 
7
+
6
8
  export const storeBuilderRouter = express.Router();
7
9
 
8
10
  storeBuilderRouter
9
- .post( '/createStoreLayout', isAllowedSessionHandler, validate( validateDtos.createBuilder ), storeBuilderController.createStoreBuilder )
10
- .post( '/updateStoreLayout', isAllowedSessionHandler, validate( validateDtos.updateStoreLayout ), storeBuilderController.updateStoreLayout )
11
- .post( '/storeLayoutList', isAllowedSessionHandler, validate( validateDtos.storeLayoutList ), storeBuilderController.getLayoutList )
12
- .post( '/updateFloor', isAllowedSessionHandler, validate( validateDtos.updateFloor ), storeBuilderController.updateFloor )
13
- .post( '/uploadBulkStore', isAllowedSessionHandler, storeBuilderController.uploadBulkStore )
14
- .post( '/uploadFile', isAllowedSessionHandler, storeBuilderController.uploadFile )
11
+ .post( '/createStoreLayout', validate( validateDtos.createBuilder ), storeBuilderController.createStoreBuilder )
12
+ .post( '/updateStoreLayout', validate( validateDtos.updateStoreLayout ), storeBuilderController.updateStoreLayout )
13
+ .post( '/storeLayoutList', validate( validateDtos.storeLayoutList ), storeBuilderController.getLayoutList )
14
+ .post( '/updateFloor', validate( validateDtos.updateFloor ), storeBuilderController.updateFloor )
15
+ .post( '/uploadBulkStore', storeBuilderController.uploadBulkStore )
16
+ .post( '/uploadFile', storeBuilderController.uploadFile )
15
17
  // .post( '/storeLayout', validate( validateDtos.storeList ), storeBuilderController.storeFixtures )
16
- .post( '/storeDetails', isAllowedSessionHandler, validate( validateDtos.storeDetails ), storeBuilderController.getStoreDetails )
17
- .delete( '/deleteStoreLayout/:id', isAllowedSessionHandler, validate( validateDtos.deleteStoreLayout ), storeBuilderController.deleteStoreLayout )
18
- .post( '/removeFile', isAllowedSessionHandler, storeBuilderController.deleteFile )
19
- .post( '/deleteFloor', isAllowedSessionHandler, storeBuilderController.deleteFloor )
20
- .post( '/updateStatus', isAllowedSessionHandler, validate( validateDtos.updateStatus ), storeBuilderController.updateStatus )
18
+ .post( '/storeDetails', validate( validateDtos.storeDetails ), storeBuilderController.getStoreDetails )
19
+ .delete( '/deleteStoreLayout/:id', validate( validateDtos.deleteStoreLayout ), storeBuilderController.deleteStoreLayout )
20
+ .post( '/removeFile', storeBuilderController.deleteFile )
21
+ .post( '/deleteFloor', storeBuilderController.deleteFloor )
22
+ .post( '/updateStatus', validate( validateDtos.updateStatus ), storeBuilderController.updateStatus )
21
23
  // .post( '/FixtureShelfDetails', storeBuilderController.fixtureShelfProduct )
22
24
  // .post( '/scan', storeBuilderController.scan )
23
25
  .post( '/storeLayout', validate( validateDtos.storeList ), storeBuilderController.storeLayout )
@@ -31,5 +33,6 @@ storeBuilderRouter
31
33
  .post( '/qrFileUpload', storeBuilderController.qrFileUpload )
32
34
  .post( '/updateQrCvProcessRequest', storeBuilderController.updateQrCvProcessRequest )
33
35
  .post( '/getQrCvProcessRequest', storeBuilderController.getQrCvProcessRequest )
34
- .post( '/fixtureQrUpdate', storeBuilderController.fixtureQrUpdate );
35
-
36
+ .post( '/fixtureQrUpdate', storeBuilderController.fixtureQrUpdate )
37
+ .post( '/updateDeatailedDistance', storeBuilderController.updateDetailedDistance )
38
+ .post( '/upsertFixture', storeBuilderController.upsertFixtures );
@@ -24,3 +24,7 @@ export async function aggregate( query ) {
24
24
  export async function updateOne( query, record ) {
25
25
  return model.planoProductModel.updateOne( query, { $set: record } );
26
26
  }
27
+
28
+ export async function create( data ) {
29
+ return model.planoProductModel.create( data );
30
+ }
@@ -9,7 +9,7 @@ export async function findOne( query = {}, field = {} ) {
9
9
  }
10
10
 
11
11
  export async function updateOne( query = {}, record = {} ) {
12
- return model.taskProcessedModel.updateOne( query, { $set: record } );
12
+ return model.taskProcessedModel.updateOne( query, { $set: record }, { upsert: true } );
13
13
  }
14
14
 
15
15
  export async function find( query = {}, field = {} ) {
@@ -8,6 +8,10 @@ export async function findOne( query={}, field={} ) {
8
8
  return model.storeLayoutModel.findOne( query, field ).sort( { floorNumber: -1 } );
9
9
  }
10
10
 
11
+ export async function findOneAndUpdate( query={}, field={} ) {
12
+ return model.storeLayoutModel.findOneAndUpdate( query, field ).sort( { floorNumber: -1 } );
13
+ }
14
+
11
15
  export async function insertMany( data ) {
12
16
  return model.storeLayoutModel.insertMany( data );
13
17
  }
@@ -31,3 +35,7 @@ export async function updateOne( query, record ) {
31
35
  export async function updateMany( query, record ) {
32
36
  return model.storeLayoutModel.updateMany( query, { $set: record } );
33
37
  }
38
+
39
+ export async function create( data ) {
40
+ return model.storeLayoutModel.create( data );
41
+ }
@@ -19,3 +19,11 @@ export async function aggregate( query ) {
19
19
  export async function updateOne( query, record ) {
20
20
  return model.storeFixtureModel.updateOne( query, { $set: record } );
21
21
  }
22
+
23
+ export async function findOneAndUpdate( query={}, field={} ) {
24
+ return model.storeFixtureModel.findOneAndUpdate( query, field );
25
+ }
26
+
27
+ export async function create( data ) {
28
+ return model.storeFixtureModel.create( data );
29
+ }