tango-app-api-store-builder 1.0.0-beta-112 → 1.0.0-beta-113

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.
@@ -1,463 +0,0 @@
1
- import { logger } from 'tango-app-api-middleware';
2
- import * as fixtureConfigService from '../service/fixtureConfig.service.js';
3
- import * as fixtureLibService from '../service/planoLibrary.service.js';
4
- import * as storeFixtureService from '../service/storeFixture.service.js';
5
- import * as planoService from '../service/planogram.service.js';
6
- import * as storeService from '../service/store.service.js';
7
- import * as processedTaskService from '../service/processedTaskservice.js';
8
- import * as fixtureShelfService from '../service/fixtureShelf.service.js';
9
- import * as vmService from '../service/planoVm.service.js';
10
- import { createTask } from './task.controller.js';
11
- import mongoose from 'mongoose';
12
- import dayjs from 'dayjs';
13
- const ObjectId = mongoose.Types.ObjectId;
14
- import customParseFormat from 'dayjs/plugin/customParseFormat.js';
15
- dayjs.extend( customParseFormat );
16
-
17
-
18
- export async function createTemplate( req, res ) {
19
- try {
20
- let inputData = req.body;
21
- let getLibDetails = await fixtureLibService.findOne( { _id: inputData.fixtureLibraryId, clientId: inputData.clientId } );
22
- if ( !getLibDetails ) {
23
- return res.sendError( 'Fixture library id is wrong', 400 );
24
- }
25
- let fixtureCapacity = getLibDetails.shelfConfig.reduce(
26
- ( acc, ele ) => acc + ele.productPerShelf,
27
- 0,
28
- );
29
- let templateId = await getTemplateId();
30
- let templateData = {
31
- clientId: inputData.clientId,
32
- fixtureLibraryId: inputData.fixtureLibraryId,
33
- fixtureName: `${templateId}-${getLibDetails.fixtureCategory}`,
34
- fixtureCategory: getLibDetails.fixtureCategory,
35
- fixtureType: getLibDetails.fixtureType,
36
- fixtureHeight: getLibDetails.fixtureHeight,
37
- fixtureLength: getLibDetails.fixtureLength,
38
- fixtureWidth: getLibDetails.fixtureWidth,
39
- shelfConfig: getLibDetails.shelfConfig,
40
- header: getLibDetails.header,
41
- footer: getLibDetails.footer,
42
- isBodyEnabled: getLibDetails.isBodyEnabled,
43
- fixtureCapacity: fixtureCapacity,
44
- };
45
- let fixtureData = await fixtureConfigService.create( templateData );
46
- return res.sendSuccess( { message: 'Fixture template created successfully', fixtureData } );
47
- } catch ( e ) {
48
- logger.error( { functionName: 'createTemplate', error: e } );
49
- return res.sendError( e, 500 );
50
- }
51
- }
52
-
53
- async function getTemplateId() {
54
- let templateId = 'Template01';
55
- let fixtureTemplateData = await fixtureConfigService.find( { fixtureName: { $exists: true } }, { fixtureName: 1 } );
56
- let fixtureData = fixtureTemplateData.map( ( ele ) => ele.fixtureName.split( '-' )[0] );
57
- let count = 1;
58
- while ( fixtureData.includes( templateId ) ) {
59
- count = count + 1;
60
- let countId = String( count ).padStart( 2, '0' );
61
- templateId =`Template${countId}`;
62
- }
63
- return templateId;
64
- }
65
-
66
- export async function updateTemplate( req, res ) {
67
- try {
68
- let inputData = req.body;
69
- let templateDetails = await fixtureConfigService.findOne( { _id: req.params.templateId } );
70
- if ( !templateDetails ) {
71
- return res.sendError( 'No data found', 204 );
72
- }
73
- if ( inputData.status == 'active' ) {
74
- let newFixture;
75
- let storeList = inputData.store;
76
- delete inputData.store;
77
- if ( req.body?.new ) {
78
- templateDetails = templateDetails.toObject();
79
- delete templateDetails._id;
80
- let templateData = { ...templateDetails, ...inputData };
81
- newFixture = await fixtureConfigService.create( templateData );
82
- }
83
- await Promise.all( storeList.map( async ( ele ) => {
84
- let fixtureCapacity = inputData.shelfConfig.reduce(
85
- ( acc, ele ) => acc + ele.productPerShelf,
86
- 0,
87
- );
88
- let storeFixtureDetails = await storeFixtureService.findOne( { storeId: ele.storeId, fixtureConfigId: req.params.templateId } );
89
- let fixtureData = {
90
- ...inputData,
91
- storeName: ele.storeName,
92
- storeId: ele.storeId,
93
- fixtureCapacity: fixtureCapacity,
94
- fixtureConfigId: newFixture ? newFixture._id : storeFixtureDetails.fixtureConfigId,
95
- };
96
- await storeFixtureService.updateOne( { _id: storeFixtureDetails._id }, fixtureData );
97
- await fixtureShelfService.deleteMany( { fixtureId: storeFixtureDetails._id } );
98
- let shelfData = [];
99
- inputData.shelfConfig.forEach( ( ele, index ) => {
100
- shelfData.push( {
101
- productCategory: inputData.productCategory,
102
- productSubCategory: inputData.productCategory,
103
- shelfType: ele.shelfType,
104
- trayRows: ele.trayRows,
105
- shelfNumber: index + 1,
106
- fixtureId: storeFixtureDetails._id,
107
- clientId: req.body.clientId,
108
- planoId: storeFixtureDetails.planoId,
109
- floorId: storeFixtureDetails.floorId,
110
- productBrandName: ele.productBrandName,
111
- shelfOrder: 'LTR',
112
- shelfSplitup: 0,
113
- storeId: storeFixtureDetails.storeId,
114
- storeName: storeFixtureDetails.storeName,
115
- productPerShelf: ele.productPerShelf,
116
- sectionZone: ele.zone,
117
- } );
118
- } );
119
- await fixtureShelfService.insertMany( shelfData );
120
- } ) );
121
- }
122
- await fixtureConfigService.updateOne( { _id: req.params.templateId }, inputData );
123
- return res.sendSuccess( 'Fixture template details updated successfully' );
124
- } catch ( e ) {
125
- logger.error( { functionName: 'updateTemplate', error: e } );
126
- return res.sendError( e, 500 );
127
- }
128
- }
129
-
130
- export async function deleteTemplate( req, res ) {
131
- try {
132
- let templateDetails = await fixtureConfigService.findOne( { _id: req.body.templateId } );
133
- if ( !templateDetails ) {
134
- return res.sendError( 'No data found', 204 );
135
- }
136
- let getFixtureDetails = await storeFixtureService.find( { fixtureConfigId: req.body.templateId }, { _id: 1, planoId: 1 } );
137
- if ( getFixtureDetails.length ) {
138
- let planoDetails = await planoService.find( { _id: getFixtureDetails.map( ( ele ) => ele.planoId ) } );
139
- return res.sendError( `Fixture template is mapped with ${planoDetails.length}` );
140
- }
141
- await fixtureConfigService.deleteOne( { _id: req.body.templateId } );
142
- return res.sendSuccess( 'Fixture template deleted successfully' );
143
- } catch ( e ) {
144
- logger.error( { functionName: 'deleteTemplate', error: e } );
145
- return res.sendError( e, 500 );
146
- }
147
- }
148
-
149
- export async function duplicateTemplate( req, res ) {
150
- try {
151
- let templateDetails = await fixtureConfigService.findOne( { _id: req.body.templateId } );
152
- if ( !templateDetails ) {
153
- return res.sendError( 'No data found', 204 );
154
- }
155
- let getAllTemplate = await fixtureConfigService.findAndSort( { fixtureName: { $regex: templateDetails.fixtureName.replace( /[.*+?^${}()|[\]\\]/g, '\\$&' ), $options: 'i' } }, { fixtureName: 1 }, { fixtureName: -1 } );
156
- let counter = 1;
157
- let newFixtureName = templateDetails.fixtureName + ` (${counter})`;
158
- if ( getAllTemplate?.length ) {
159
- let fixtureNameList = getAllTemplate.map( ( ele ) => ele.fixtureName );
160
- while ( fixtureNameList.includes( newFixtureName ) ) {
161
- newFixtureName = templateDetails.fixtureName + ` (${counter})`;
162
- counter++;
163
- }
164
- }
165
- templateDetails = templateDetails.toObject();
166
- delete templateDetails._id;
167
- templateDetails.fixtureName = newFixtureName;
168
- let duplicateDetails = await fixtureConfigService.create( templateDetails );
169
- return res.sendSuccess( { message: 'Fixture template duplicated successfully', id: duplicateDetails._id } );
170
- } catch ( e ) {
171
- logger.error( { functionName: 'duplicateFixture', error: e } );
172
- return res.sendError( e, 500 );
173
- }
174
- }
175
-
176
- export async function getTemplateDetails( req, res ) {
177
- try {
178
- let templateDetails = await fixtureConfigService.findOne( { _id: req.query.templateId } );
179
- if ( !templateDetails ) {
180
- return res.sendError( 'No data found', 204 );
181
- }
182
- let query = [
183
- {
184
- $match: {
185
- fixtureConfigId: new ObjectId( req.query.templateId ),
186
- },
187
- },
188
- {
189
- $group: {
190
- _id: '',
191
- store: { $addToSet: '$storeName' },
192
- },
193
- },
194
- ];
195
- templateDetails = templateDetails.toObject();
196
- templateDetails.vmConfig = await Promise.all( templateDetails.vmConfig.map( async ( vm ) => {
197
- let vmDetails = await vmService.findOne( { _id: vm.vmId } );
198
- if ( vmDetails ) {
199
- vm = { ...vm, ...vmDetails.toObject() };
200
- return vm;
201
- }
202
- } ) );
203
- let mappedStoreList = await storeFixtureService.aggregate( query );
204
- let storeList = mappedStoreList?.[0]?.store || [];
205
- let storeDetails = await storeService.find( { clientId: templateDetails.clientId, storeName: { $in: storeList } }, { storeName: 1, storeId: 1, spocDetails: 1 } );
206
- let storeFixtureDetails = await storeFixtureService.find( { fixtureConfigId: req.query.templateId } );
207
- if ( storeFixtureDetails.length ) {
208
- let fixtureId = storeFixtureDetails.map( ( ele ) => ele.planoId );
209
- let planoDetails = await planoService.find( { _id: { $in: fixtureId } }, { status: 1 } );
210
- planoDetails = planoDetails.map( ( ele ) => ele.status );
211
- templateDetails.status = planoDetails.includes( 'completed' ) ? 'active' : 'inactive';
212
- }
213
- let data = {
214
- ...templateDetails,
215
- store: storeDetails.map( ( ele ) => {
216
- return { storeName: ele.storeName, storeId: ele.storeId, userEmail: ele?.spocDetails?.[0]?.email };
217
- } ),
218
- };
219
- return res.sendSuccess( data );
220
- } catch ( e ) {
221
- logger.error( { functionName: 'getTemplateDetails', error: e } );
222
- return res.sendError( e, 500 );
223
- }
224
- }
225
-
226
- export async function getTemplateList( req, res ) {
227
- try {
228
- let limit = req.body?.limit || 10;
229
- let page = req.body?.offset || 1;
230
- let skip = limit * ( page - 1 );
231
-
232
- const matchStage = {
233
- clientId: req.body.clientId,
234
- ...( req.body?.searchValue ?
235
- { fixtureName: { $regex: req.body.searchValue, $options: 'i' } } :
236
- {} ),
237
- ...( req.body?.filter?.brand?.length ?
238
- { $or: [
239
- { 'productBrandName': { $in: req.body.filter.brand } },
240
- { 'shelfConfig.productBrandName': { $in: req.body.filter.brand } },
241
- ] } :
242
- {} ),
243
- ...( req.body?.filter?.category?.length ?
244
- { fixtureCategory: { $in: req.body.filter.category } } :
245
- {} ),
246
- ...( req.body?.filter?.subCategory?.length ?
247
- { productSubCategory: { $in: req.body.subCategory.category } } :
248
- {} ),
249
- };
250
-
251
- const query = [
252
- { $match: matchStage },
253
- {
254
- $lookup: {
255
- from: 'storefixtures',
256
- let: { templateId: '$_id' },
257
- pipeline: [
258
- {
259
- $match: {
260
- $expr: {
261
- $eq: [ '$$templateId', '$fixtureConfigId' ],
262
- },
263
- },
264
- },
265
- {
266
- $group: {
267
- _id: null,
268
- planoId: { $addToSet: '$planoId' },
269
- },
270
- },
271
- {
272
- $project: {
273
- _id: 0,
274
- planoId: 1,
275
- },
276
- },
277
- ],
278
- as: 'storeFixtureDetails',
279
- },
280
- },
281
- {
282
- $project: {
283
- fixtureCategory: 1,
284
- fixtureName: 1,
285
- fixtureWidth: 1,
286
- productBrandName: 1,
287
- productCategory: 1,
288
- clientId: 1,
289
- productSubCategory: 1,
290
- status: 1,
291
- fixtureType: 1,
292
- vmCapacity: { $size: '$vmConfig' },
293
- productCapacity: {
294
- $sum: {
295
- $map: {
296
- input: '$shelfConfig',
297
- as: 'shelf',
298
- in: '$$shelf.productPerShelf',
299
- },
300
- },
301
- },
302
- planoId: { $ifNull: [ { $arrayElemAt: [ '$storeFixtureDetails.planoId', 0 ] }, [] ] },
303
- },
304
- },
305
- {
306
- $lookup: {
307
- from: 'planograms',
308
- let: { planoIds: '$planoId' },
309
- pipeline: [
310
- {
311
- $match: {
312
- $expr: {
313
- $in: [ '$_id', { $ifNull: [ '$$planoIds', [] ] } ],
314
- },
315
- },
316
- },
317
- {
318
- $group: {
319
- _id: null,
320
- statusList: { $addToSet: '$status' },
321
- },
322
- },
323
- ],
324
- as: 'planoStatus',
325
- },
326
- },
327
- {
328
- $project: {
329
- fixtureCategory: 1,
330
- fixtureName: 1,
331
- fixtureWidth: 1,
332
- productBrandName: 1,
333
- productCategory: 1,
334
- clientId: 1,
335
- fixtureType: 1,
336
- productSubCategory: 1,
337
- status: 1,
338
- templateId: 1,
339
- planoId: 1,
340
- vmCapacity: 1,
341
- productCapacity: 1,
342
- planoStatus: { $ifNull: [ { $arrayElemAt: [ '$planoStatus.statusList', 0 ] }, [] ] },
343
- status: {
344
- $cond: {
345
- if: { $in: [ 'completed', { $ifNull: [ { $arrayElemAt: [ '$planoStatus.statusList', 0 ] }, [] ] } ] },
346
- then: 'active',
347
- else: {
348
- $cond: {
349
- if: {
350
- $eq: [
351
- '$status', 'draft',
352
- ],
353
- },
354
- then: 'draft',
355
- else: 'inactive',
356
- },
357
- },
358
- },
359
- },
360
- },
361
- },
362
- ];
363
-
364
- if ( req.body.filter.status.length ) {
365
- query.push( {
366
- $match: {
367
- status: { $in: req.body.filter.status },
368
- },
369
- } );
370
- }
371
-
372
- if ( req.body?.sortColumnName && req.body?.sortBy ) {
373
- query.push( {
374
- $sort: {
375
- [req.body.sortColumnName]: req.body.sortBy,
376
- },
377
- },
378
- );
379
- }
380
- query.push(
381
- {
382
- $facet: {
383
- ...( !req.body?.export ) ? {
384
- templateData: [ { $skip: skip }, { $limit: limit } ],
385
- } : { templateData: [ { $skip: skip } ] },
386
- count: [ { $count: 'total' } ],
387
- },
388
- },
389
- );
390
- let fixtureDetails = await fixtureConfigService.aggregate( query );
391
- if ( !fixtureDetails[0]?.templateData.length ) {
392
- return res.sendError( 'No data found', 204 );
393
- }
394
- let result = {
395
- count: fixtureDetails[0].count[0].total,
396
- data: fixtureDetails[0].templateData,
397
- };
398
- return res.sendSuccess( result );
399
- } catch ( e ) {
400
- console.log( e );
401
- logger.error( { functionName: 'getTemplateList', error: e } );
402
- return res.sendError( e, 500 );
403
- }
404
- }
405
-
406
- export async function updateFixtureTask( req, res ) {
407
- try {
408
- let storeList = req.body.storeList.map( ( ele ) => ele.toLowerCase() );
409
- let query = [
410
- {
411
- $addFields: {
412
- storeLower: { $toLower: '$storeName' },
413
- },
414
- },
415
- {
416
- $match: {
417
- clientId: req.body.clientId,
418
- status: 'active',
419
- storeLower: { $in: storeList },
420
- },
421
- },
422
- ];
423
- let storeDetails = await storeService.aggregate( query );
424
- if ( !storeDetails.length ) {
425
- return res.sendError( 'No date found', 204 );
426
- }
427
- storeList = storeDetails.map( ( ele ) => {
428
- return { store: ele.storeName, email: ele?.spocDetails?.[0]?.email };
429
- } );
430
- let fixtureTaskStore = [];
431
- let layoutTaskStore = [];
432
- await Promise.all( storeList.map( async ( ele ) => {
433
- let getTaskDetails = await processedTaskService.findOne( { storeName: ele.store, userEmail: ele.email, isPlano: true, date_iso: new Date( dayjs().format( 'YYYY-MM-DD' ) ), type: 'layout' } );
434
- if ( getTaskDetails && getTaskDetails.planoType == 'layout' && getTaskDetails.checklistStatus == 'submit' ) {
435
- fixtureTaskStore.push( ele );
436
- } else {
437
- layoutTaskStore.push( ele );
438
- }
439
- } ) );
440
- let currDate = dayjs();
441
- let endDate = dayjs( req.body.endDate, 'YYYY-MM-DD' );
442
- let todayDate = currDate.format( 'YYYY-MM-DD' ) == endDate.format( 'YYYY-MM-DD' );
443
- let data = [
444
- 'Fixture Verification',
445
- 'Layout Verification',
446
- ];
447
- await Promise.all( data.map( async ( ele ) => {
448
- req.body = {
449
- clientId: req.body.clientId,
450
- stores: ele.includes( 'Fixture' ) ? fixtureTaskStore : layoutTaskStore,
451
- days: todayDate ? 1 : endDate.diff( currDate, 'day' ) + 2,
452
- checkListName: ele,
453
- geoFencing: req.body.geoFencing,
454
- endTime: req.body.endTime,
455
- };
456
- if ( req.body.stores.length ) {
457
- await createTask( req, res );
458
- }
459
- } ) );
460
- } catch ( e ) {
461
- logger.error( { functionName: 'updateFixtureTask', error: e } );
462
- }
463
- }