tango-app-api-infra 3.0.109-dev → 3.0.111-dev
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.
|
@@ -349,92 +349,95 @@ export async function infraIssuesTable( req, res ) {
|
|
|
349
349
|
},
|
|
350
350
|
} );
|
|
351
351
|
let pendingstorecount = await aggregateTangoTicket( pendingquery );
|
|
352
|
-
let installpendingticket =
|
|
353
|
-
for ( let store of pendingstorecount ) {
|
|
354
|
-
installpendingticket.push( store.basicDetails.storeId );
|
|
355
|
-
}
|
|
352
|
+
let installpendingticket = pendingstorecount.map( ( store ) => store.basicDetails.storeId );
|
|
356
353
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
354
|
+
|
|
355
|
+
let query = [
|
|
356
|
+
{
|
|
357
|
+
$match: {
|
|
358
|
+
$and: [
|
|
359
|
+
{ issueType: 'infra' },
|
|
360
|
+
{ status: { $ne: 'closed' } },
|
|
361
|
+
{ 'basicDetails.clientId': { $in: req.body.clientId } },
|
|
362
|
+
{ 'basicDetails.storeId': { $in: totalnumberstores } },
|
|
363
|
+
{ 'ticketDetails.issueStatus': { $in: issueStatus } },
|
|
364
|
+
{ createdAt: { $lte: date.end } },
|
|
365
|
+
],
|
|
366
|
+
},
|
|
367
367
|
},
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
368
|
+
{
|
|
369
|
+
$project: {
|
|
370
|
+
storeId: '$basicDetails.storeId',
|
|
371
|
+
clientId: '$basicDetails.clientId',
|
|
372
|
+
ticketId: 1,
|
|
373
|
+
storeName: '$basicDetails.storeName',
|
|
374
|
+
clientName: '$basicDetails.clientName',
|
|
375
|
+
status: 1,
|
|
376
|
+
createdAt: 1,
|
|
377
|
+
issueIdentifiedDate: '$ticketDetails.issueIdentifiedDate',
|
|
378
|
+
issueClosedDate: '$issueClosedDate',
|
|
379
|
+
primaryIssue: {
|
|
380
|
+
$filter: {
|
|
381
|
+
input: '$ticketActivity',
|
|
382
|
+
as: 'item',
|
|
383
|
+
cond: { $eq: [ '$$item.actionType', 'issueUpdate' ] },
|
|
384
|
+
},
|
|
385
385
|
},
|
|
386
386
|
},
|
|
387
387
|
},
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
388
|
+
{
|
|
389
|
+
$unwind: {
|
|
390
|
+
path: '$primaryIssue',
|
|
391
|
+
preserveNullAndEmptyArrays: true,
|
|
392
|
+
},
|
|
392
393
|
},
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
394
|
+
{
|
|
395
|
+
$unwind: {
|
|
396
|
+
path: '$primaryIssue.reasons',
|
|
397
|
+
preserveNullAndEmptyArrays: true,
|
|
398
|
+
},
|
|
397
399
|
},
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
400
|
+
{
|
|
401
|
+
$unwind: {
|
|
402
|
+
path: '$primaryIssue.reasons.secondaryIssue',
|
|
403
|
+
preserveNullAndEmptyArrays: true,
|
|
404
|
+
},
|
|
402
405
|
},
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
406
|
+
{
|
|
407
|
+
$project: {
|
|
408
|
+
storeId: 1,
|
|
409
|
+
clientId: 1,
|
|
410
|
+
storeName: 1,
|
|
411
|
+
createdAt: 1,
|
|
412
|
+
ticketId: 1,
|
|
413
|
+
clientName: 1,
|
|
414
|
+
actionBy: '$primaryIssue.actionBy',
|
|
415
|
+
issueIdentifiedDate: { $ifNull: [ '$issueIdentifiedDate', '' ] },
|
|
416
|
+
issueClosedDate: { $ifNull: [ '$issueClosedDate', '' ] },
|
|
417
|
+
status: 1,
|
|
418
|
+
primaryIssue: { $ifNull: [ '$primaryIssue.reasons.primaryIssue', '-' ] },
|
|
419
|
+
secondaryIssue: { $ifNull: [ '$primaryIssue.reasons.secondaryIssue.name', '-' ] },
|
|
420
|
+
},
|
|
418
421
|
},
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
422
|
+
{
|
|
423
|
+
$group: {
|
|
424
|
+
_id: '$ticketId',
|
|
425
|
+
storeId: { $first: '$storeId' },
|
|
426
|
+
clientId: { $first: '$clientId' },
|
|
427
|
+
ticketId: { $first: '$ticketId' },
|
|
428
|
+
actionBy: { $first: '$actionBy' },
|
|
429
|
+
storeName: { $first: '$storeName' },
|
|
430
|
+
clientName: { $first: '$clientName' },
|
|
431
|
+
createdAt: { $first: '$createdAt' },
|
|
432
|
+
issueIdentifiedDate: { $last: '$issueIdentifiedDate' },
|
|
433
|
+
issueClosedDate: { $last: '$issueClosedDate' },
|
|
434
|
+
status: { $last: '$status' },
|
|
435
|
+
primaryIssue: { $last: '$primaryIssue' },
|
|
436
|
+
secondaryIssue: { $last: '$secondaryIssue' },
|
|
437
|
+
},
|
|
435
438
|
},
|
|
436
|
-
},
|
|
437
439
|
];
|
|
440
|
+
|
|
438
441
|
let storesQuery = [];
|
|
439
442
|
if ( req.body.infrafilterIssue == 'Total Stores' ) {
|
|
440
443
|
storesQuery.push( {
|
|
@@ -451,16 +454,14 @@ export async function infraIssuesTable( req, res ) {
|
|
|
451
454
|
}
|
|
452
455
|
if ( req.body.infrafilterIssue == 'Live Stores' ) {
|
|
453
456
|
let infrastores = await aggregateTangoTicket( query );
|
|
454
|
-
let infraissueStore =
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
}
|
|
463
|
-
}
|
|
457
|
+
let infraissueStore = infrastores.map( ( store ) => store.storeId );
|
|
458
|
+
|
|
459
|
+
let result = totalnumberstores.filter( ( data ) =>
|
|
460
|
+
infraissueStore.length > 0 &&
|
|
461
|
+
!infraissueStore.includes( data ) &&
|
|
462
|
+
!installpendingticket.includes( data ),
|
|
463
|
+
);
|
|
464
|
+
|
|
464
465
|
storesQuery.push(
|
|
465
466
|
{
|
|
466
467
|
$match: {
|
|
@@ -471,34 +472,29 @@ export async function infraIssuesTable( req, res ) {
|
|
|
471
472
|
},
|
|
472
473
|
);
|
|
473
474
|
}
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
req.body.infrafilterIssue != 'Issues Not Identified' &&
|
|
477
|
-
req.body.infrafilterIssue != 'All Issues' ) {
|
|
475
|
+
const excludedIssues = [ 'Identified Issues', 'Issues Not Identified', 'All Issues' ];
|
|
476
|
+
if ( req.body.infrafilterIssue && !excludedIssues.includes( req.body.infrafilterIssue ) ) {
|
|
478
477
|
query.push( {
|
|
479
478
|
$match: {
|
|
480
479
|
primaryIssue: req.body.infrafilterIssue,
|
|
481
480
|
},
|
|
482
481
|
} );
|
|
483
482
|
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
$or: [
|
|
488
|
-
{ storeId: { $regex: req.body.searchValue, $options: 'i' } },
|
|
489
|
-
{ storeName: { $regex: req.body.searchValue, $options: 'i' } },
|
|
490
|
-
],
|
|
491
|
-
},
|
|
492
|
-
} );
|
|
493
|
-
storesQuery.push( {
|
|
483
|
+
|
|
484
|
+
if ( req.body.searchValue && req.body.searchValue !== '' ) {
|
|
485
|
+
const searchCondition = {
|
|
494
486
|
$match: {
|
|
495
487
|
$or: [
|
|
496
488
|
{ storeId: { $regex: req.body.searchValue, $options: 'i' } },
|
|
497
489
|
{ storeName: { $regex: req.body.searchValue, $options: 'i' } },
|
|
498
490
|
],
|
|
499
491
|
},
|
|
500
|
-
}
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
query.push( searchCondition );
|
|
495
|
+
storesQuery.push( searchCondition );
|
|
501
496
|
}
|
|
497
|
+
|
|
502
498
|
if ( req.body.filter && req.body.filter.length > 0 ) {
|
|
503
499
|
query.push(
|
|
504
500
|
{
|
|
@@ -509,12 +505,13 @@ export async function infraIssuesTable( req, res ) {
|
|
|
509
505
|
);
|
|
510
506
|
}
|
|
511
507
|
if ( req.body.sortColumName && req.body.sortColumName !== '' && req.body.sortBy ) {
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
508
|
+
const sortOption = { $sort: { [req.body.sortColumName]: req.body.sortBy } };
|
|
509
|
+
query.push( sortOption );
|
|
510
|
+
storesQuery.push( sortOption );
|
|
511
|
+
} else {
|
|
512
|
+
const sortOption = { $sort: { 'storeId': -1 } };
|
|
513
|
+
query.push( sortOption );
|
|
514
|
+
storesQuery.push( sortOption );
|
|
518
515
|
}
|
|
519
516
|
let count;
|
|
520
517
|
if ( req.body.infrafilterIssue == 'Live Stores' || req.body.infrafilterIssue == 'Total Stores' ) {
|
|
@@ -523,52 +520,56 @@ export async function infraIssuesTable( req, res ) {
|
|
|
523
520
|
count = await aggregateTangoTicket( query );
|
|
524
521
|
}
|
|
525
522
|
if ( req.body.limit && req.body.offset && !req.body.export ) {
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
523
|
+
const skipValue = ( req.body.offset - 1 ) * req.body.limit;
|
|
524
|
+
const limitValue = Number( req.body.limit );
|
|
525
|
+
|
|
526
|
+
const pagination = [
|
|
527
|
+
{ $skip: skipValue },
|
|
528
|
+
{ $limit: limitValue },
|
|
529
|
+
];
|
|
530
|
+
|
|
531
|
+
query.push( ...pagination );
|
|
530
532
|
storesQuery.push(
|
|
531
|
-
|
|
532
|
-
{
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
533
|
+
...pagination,
|
|
534
|
+
{
|
|
535
|
+
$lookup: {
|
|
536
|
+
from: 'clients',
|
|
537
|
+
let: { clientId: '$clientId' },
|
|
538
|
+
pipeline: [
|
|
539
|
+
{
|
|
540
|
+
$match: {
|
|
541
|
+
$expr: {
|
|
542
|
+
$and: [
|
|
543
|
+
{ $eq: [ '$clientId', '$$clientId' ] },
|
|
544
|
+
],
|
|
545
|
+
},
|
|
546
|
+
},
|
|
545
547
|
},
|
|
546
|
-
|
|
547
|
-
|
|
548
|
+
{
|
|
549
|
+
$project: {
|
|
550
|
+
clientName: 1,
|
|
551
|
+
},
|
|
552
|
+
},
|
|
553
|
+
],
|
|
554
|
+
as: 'client',
|
|
548
555
|
},
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
556
|
+
},
|
|
557
|
+
{
|
|
558
|
+
$unwind: { path: '$client', preserveNullAndEmptyArrays: true },
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
$project: {
|
|
562
|
+
clientName: '$client.clientName',
|
|
563
|
+
storeId: 1,
|
|
564
|
+
clientId: 1,
|
|
565
|
+
storeName: 1,
|
|
566
|
+
status: 1,
|
|
567
|
+
createdAt: 1,
|
|
553
568
|
},
|
|
554
|
-
|
|
555
|
-
},
|
|
556
|
-
},
|
|
557
|
-
{
|
|
558
|
-
$unwind: { path: '$client', preserveNullAndEmptyArrays: true },
|
|
559
|
-
},
|
|
560
|
-
{
|
|
561
|
-
$project: {
|
|
562
|
-
clientName: '$client.clientName',
|
|
563
|
-
storeId: 1,
|
|
564
|
-
clientId: 1,
|
|
565
|
-
storeName: 1,
|
|
566
|
-
status: 1,
|
|
567
|
-
createdAt: 1,
|
|
568
|
-
},
|
|
569
|
-
},
|
|
569
|
+
},
|
|
570
570
|
);
|
|
571
571
|
}
|
|
572
|
+
|
|
572
573
|
let result;
|
|
573
574
|
if ( req.body.infrafilterIssue == 'Live Stores' || req.body.infrafilterIssue == 'Total Stores' ) {
|
|
574
575
|
result = await aggregateStore( storesQuery );
|
|
@@ -576,30 +577,30 @@ export async function infraIssuesTable( req, res ) {
|
|
|
576
577
|
result = await aggregateTangoTicket( query );
|
|
577
578
|
}
|
|
578
579
|
if ( req.body.export && result.length > 0 ) {
|
|
579
|
-
const exportdata =
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
exportdata.push( {
|
|
580
|
+
const exportdata = result.map( ( element ) => {
|
|
581
|
+
if ( req.body.infrafilterIssue === 'Live Stores' || req.body.infrafilterIssue === 'Total Stores' ) {
|
|
582
|
+
return {
|
|
583
583
|
'Created On': element.createdAt,
|
|
584
584
|
'StoreID': element.storeId,
|
|
585
585
|
'StoreName': element.storeName,
|
|
586
586
|
'Status': element.status,
|
|
587
|
-
}
|
|
587
|
+
};
|
|
588
588
|
} else {
|
|
589
|
-
|
|
589
|
+
return {
|
|
590
590
|
'Created On': element.createdAt,
|
|
591
591
|
'StoreID': element.storeId,
|
|
592
592
|
'StoreName': element.storeName,
|
|
593
593
|
'Primary Issue': element.primaryIssue,
|
|
594
594
|
'Sub Issue': element.secondaryIssue,
|
|
595
|
-
'Issue Identified on': element.issueIdentifiedDate? dayjs( element.issueIdentifiedDate ).tz( 'Asia/Kolkata' ).format( 'YYYY-MM-DD HH:mm A' ):'',
|
|
595
|
+
'Issue Identified on': element.issueIdentifiedDate ? dayjs( element.issueIdentifiedDate ).tz( 'Asia/Kolkata' ).format( 'YYYY-MM-DD HH:mm A' ) : '',
|
|
596
596
|
'Status': element.status,
|
|
597
|
-
}
|
|
597
|
+
};
|
|
598
598
|
}
|
|
599
599
|
} );
|
|
600
600
|
await download( exportdata, res );
|
|
601
601
|
return;
|
|
602
602
|
}
|
|
603
|
+
|
|
603
604
|
if ( result.length > 0 ) {
|
|
604
605
|
res.sendSuccess( {
|
|
605
606
|
count: count.length,
|
|
@@ -1005,111 +1006,155 @@ function generateTimeSlots( startHour, endHour, interval, time ) {
|
|
|
1005
1006
|
};
|
|
1006
1007
|
export async function hourWiseDownstores( req, res ) {
|
|
1007
1008
|
try {
|
|
1008
|
-
let
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
if ( req.body.
|
|
1009
|
+
let date = await getUTC( new Date( req.body.fromDate ), new Date( req.body.toDate ) );
|
|
1010
|
+
let issueStatus = [ 'notidentified', 'identified' ];
|
|
1011
|
+
|
|
1012
|
+
if ( req.body.infrafilterIssue == 'Issues Not Identified' ) {
|
|
1012
1013
|
issueStatus = [ 'notidentified' ];
|
|
1013
1014
|
};
|
|
1014
|
-
if ( req.body.
|
|
1015
|
-
issueStatus = [ '
|
|
1016
|
-
};
|
|
1017
|
-
if ( req.body.filterIssue == 'Live Stores' ) {
|
|
1018
|
-
issueStatus = [ 'notidentified', 'identified' ];
|
|
1015
|
+
if ( req.body.infrafilterIssue == 'Identified Issues' ) {
|
|
1016
|
+
issueStatus = [ 'identified' ];
|
|
1019
1017
|
};
|
|
1020
1018
|
|
|
1019
|
+
|
|
1021
1020
|
let totalstores = await aggregateStore( [ {
|
|
1022
1021
|
$match: {
|
|
1023
1022
|
'$and': [
|
|
1024
|
-
{ 'clientId': req.body.clientId },
|
|
1025
|
-
{ 'edge.firstFile': true },
|
|
1023
|
+
{ 'clientId': { $in: req.body.clientId } },
|
|
1026
1024
|
{ 'status': 'active' },
|
|
1027
|
-
{ 'createdAt': { $lte:
|
|
1025
|
+
{ 'createdAt': { $lte: date.end } },
|
|
1028
1026
|
],
|
|
1029
1027
|
},
|
|
1030
1028
|
} ] );
|
|
1031
|
-
|
|
1032
1029
|
let totalnumberstores = [];
|
|
1033
1030
|
for ( let store of totalstores ) {
|
|
1034
1031
|
totalnumberstores.push( store.storeId );
|
|
1035
1032
|
}
|
|
1036
|
-
let
|
|
1033
|
+
let pendingquery = [];
|
|
1034
|
+
pendingquery.push( {
|
|
1037
1035
|
$match: {
|
|
1038
1036
|
$and: [
|
|
1039
|
-
{ '
|
|
1040
|
-
{ 'basicDetails.storeId': { $in: totalnumberstores } },
|
|
1037
|
+
{ issueType: 'installation' },
|
|
1041
1038
|
{ 'status': { $ne: 'closed' } },
|
|
1042
|
-
{
|
|
1043
|
-
{
|
|
1044
|
-
{ 'issueDate': { $lte: new Date( req.body.toDate ) } },
|
|
1039
|
+
{ 'basicDetails.clientId': { $in: req.body.clientId } },
|
|
1040
|
+
{ createdAt: { $lte: date.end } },
|
|
1045
1041
|
],
|
|
1046
1042
|
},
|
|
1047
|
-
}
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1043
|
+
} );
|
|
1044
|
+
let pendingstorecount = await aggregateTangoTicket( pendingquery );
|
|
1045
|
+
let installpendingticket = pendingstorecount.map( ( store ) => store.basicDetails.storeId );
|
|
1046
|
+
|
|
1047
|
+
|
|
1048
|
+
let query = [
|
|
1049
|
+
{
|
|
1050
|
+
$match: {
|
|
1051
|
+
$and: [
|
|
1052
|
+
{ issueType: 'infra' },
|
|
1053
|
+
{ status: { $ne: 'closed' } },
|
|
1054
|
+
{ 'basicDetails.clientId': { $in: req.body.clientId } },
|
|
1055
|
+
{ 'basicDetails.storeId': { $in: totalnumberstores } },
|
|
1056
|
+
{ 'ticketDetails.issueStatus': { $in: issueStatus } },
|
|
1057
|
+
{ createdAt: { $lte: date.end } },
|
|
1058
|
+
],
|
|
1059
|
+
},
|
|
1060
|
+
},
|
|
1061
|
+
{
|
|
1062
|
+
$project: {
|
|
1063
|
+
storeId: '$basicDetails.storeId',
|
|
1064
|
+
clientId: '$basicDetails.clientId',
|
|
1065
|
+
ticketId: 1,
|
|
1066
|
+
storeName: '$basicDetails.storeName',
|
|
1067
|
+
clientName: '$basicDetails.clientName',
|
|
1068
|
+
status: 1,
|
|
1069
|
+
createdAt: 1,
|
|
1070
|
+
issueIdentifiedDate: '$ticketDetails.issueIdentifiedDate',
|
|
1071
|
+
issueClosedDate: '$issueClosedDate',
|
|
1072
|
+
primaryIssue: {
|
|
1073
|
+
$filter: {
|
|
1074
|
+
input: '$ticketActivity',
|
|
1075
|
+
as: 'item',
|
|
1076
|
+
cond: { $eq: [ '$$item.actionType', 'issueUpdate' ] },
|
|
1077
|
+
},
|
|
1057
1078
|
},
|
|
1058
1079
|
},
|
|
1059
1080
|
},
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1081
|
+
{
|
|
1082
|
+
$unwind: {
|
|
1083
|
+
path: '$primaryIssue',
|
|
1084
|
+
preserveNullAndEmptyArrays: true,
|
|
1085
|
+
},
|
|
1064
1086
|
},
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1087
|
+
{
|
|
1088
|
+
$unwind: {
|
|
1089
|
+
path: '$primaryIssue.reasons',
|
|
1090
|
+
preserveNullAndEmptyArrays: true,
|
|
1091
|
+
},
|
|
1069
1092
|
},
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
primaryIssue: { $ifNull: [ '$primaryIssue.reasons.primaryIssue', 'NotIdentified' ] },
|
|
1093
|
+
{
|
|
1094
|
+
$unwind: {
|
|
1095
|
+
path: '$primaryIssue.reasons.secondaryIssue',
|
|
1096
|
+
preserveNullAndEmptyArrays: true,
|
|
1097
|
+
},
|
|
1076
1098
|
},
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1099
|
+
{
|
|
1100
|
+
$project: {
|
|
1101
|
+
storeId: 1,
|
|
1102
|
+
clientId: 1,
|
|
1103
|
+
storeName: 1,
|
|
1104
|
+
createdAt: 1,
|
|
1105
|
+
ticketId: 1,
|
|
1106
|
+
clientName: 1,
|
|
1107
|
+
actionBy: '$primaryIssue.actionBy',
|
|
1108
|
+
issueIdentifiedDate: { $ifNull: [ '$issueIdentifiedDate', '' ] },
|
|
1109
|
+
issueClosedDate: { $ifNull: [ '$issueClosedDate', '' ] },
|
|
1110
|
+
status: 1,
|
|
1111
|
+
primaryIssue: { $ifNull: [ '$primaryIssue.reasons.primaryIssue', '-' ] },
|
|
1112
|
+
secondaryIssue: { $ifNull: [ '$primaryIssue.reasons.secondaryIssue.name', '-' ] },
|
|
1113
|
+
},
|
|
1114
|
+
},
|
|
1115
|
+
{
|
|
1116
|
+
$group: {
|
|
1117
|
+
_id: '$ticketId',
|
|
1118
|
+
storeId: { $first: '$storeId' },
|
|
1119
|
+
clientId: { $first: '$clientId' },
|
|
1120
|
+
ticketId: { $first: '$ticketId' },
|
|
1121
|
+
actionBy: { $first: '$actionBy' },
|
|
1122
|
+
storeName: { $first: '$storeName' },
|
|
1123
|
+
clientName: { $first: '$clientName' },
|
|
1124
|
+
createdAt: { $first: '$createdAt' },
|
|
1125
|
+
issueIdentifiedDate: { $last: '$issueIdentifiedDate' },
|
|
1126
|
+
issueClosedDate: { $last: '$issueClosedDate' },
|
|
1127
|
+
status: { $last: '$status' },
|
|
1128
|
+
primaryIssue: { $last: '$primaryIssue' },
|
|
1129
|
+
secondaryIssue: { $last: '$secondaryIssue' },
|
|
1130
|
+
},
|
|
1084
1131
|
},
|
|
1085
|
-
},
|
|
1086
1132
|
];
|
|
1133
|
+
|
|
1087
1134
|
let storesQuery = [];
|
|
1088
|
-
if ( req.body.
|
|
1135
|
+
if ( req.body.infrafilterIssue == 'Total Stores' ) {
|
|
1089
1136
|
storesQuery.push( {
|
|
1090
1137
|
$match: {
|
|
1091
1138
|
'$and': [
|
|
1092
|
-
{ 'clientId': req.body.clientId },
|
|
1093
|
-
{ 'edge.firstFile': true },
|
|
1139
|
+
{ 'clientId': { $in: req.body.clientId } },
|
|
1094
1140
|
{ 'status': 'active' },
|
|
1095
|
-
{ '
|
|
1141
|
+
{ 'storeId': { $nin: installpendingticket } },
|
|
1142
|
+
{ 'createdAt': { $lte: date.end } },
|
|
1096
1143
|
],
|
|
1097
1144
|
},
|
|
1098
1145
|
},
|
|
1099
1146
|
);
|
|
1100
1147
|
}
|
|
1101
|
-
if ( req.body.
|
|
1148
|
+
if ( req.body.infrafilterIssue == 'Live Stores' ) {
|
|
1102
1149
|
let infrastores = await aggregateTangoTicket( query );
|
|
1103
|
-
let infraissueStore =
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
}
|
|
1112
|
-
}
|
|
1150
|
+
let infraissueStore = infrastores.map( ( store ) => store.storeId );
|
|
1151
|
+
|
|
1152
|
+
let result = totalnumberstores.filter( ( data ) =>
|
|
1153
|
+
infraissueStore.length > 0 &&
|
|
1154
|
+
!infraissueStore.includes( data ) &&
|
|
1155
|
+
!installpendingticket.includes( data ),
|
|
1156
|
+
);
|
|
1157
|
+
|
|
1113
1158
|
storesQuery.push(
|
|
1114
1159
|
{
|
|
1115
1160
|
$match: {
|
|
@@ -1120,71 +1165,116 @@ export async function hourWiseDownstores( req, res ) {
|
|
|
1120
1165
|
},
|
|
1121
1166
|
);
|
|
1122
1167
|
}
|
|
1123
|
-
|
|
1168
|
+
const excludedIssues = [ 'Identified Issues', 'Issues Not Identified', 'All Issues' ];
|
|
1169
|
+
if ( req.body.infrafilterIssue && !excludedIssues.includes( req.body.infrafilterIssue ) ) {
|
|
1124
1170
|
query.push( {
|
|
1125
1171
|
$match: {
|
|
1126
|
-
|
|
1127
|
-
{ storeName: { $regex: req.body.searchValue, $options: 'i' } },
|
|
1128
|
-
{ storeId: { $regex: req.body.searchValue, $options: 'i' } },
|
|
1129
|
-
],
|
|
1172
|
+
primaryIssue: req.body.infrafilterIssue,
|
|
1130
1173
|
},
|
|
1131
1174
|
} );
|
|
1132
|
-
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
if ( req.body.searchValue && req.body.searchValue !== '' ) {
|
|
1178
|
+
const searchCondition = {
|
|
1133
1179
|
$match: {
|
|
1134
1180
|
$or: [
|
|
1135
|
-
{ storeName: { $regex: req.body.searchValue, $options: 'i' } },
|
|
1136
1181
|
{ storeId: { $regex: req.body.searchValue, $options: 'i' } },
|
|
1182
|
+
{ storeName: { $regex: req.body.searchValue, $options: 'i' } },
|
|
1137
1183
|
],
|
|
1138
1184
|
},
|
|
1139
|
-
}
|
|
1185
|
+
};
|
|
1186
|
+
|
|
1187
|
+
query.push( searchCondition );
|
|
1188
|
+
storesQuery.push( searchCondition );
|
|
1140
1189
|
}
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1190
|
+
|
|
1191
|
+
if ( req.body.filter && req.body.filter.length > 0 ) {
|
|
1192
|
+
query.push(
|
|
1193
|
+
{
|
|
1194
|
+
$match: {
|
|
1195
|
+
actionBy: { $in: req.body.filter },
|
|
1196
|
+
},
|
|
1197
|
+
},
|
|
1198
|
+
);
|
|
1148
1199
|
}
|
|
1149
|
-
if ( req.body.
|
|
1150
|
-
req.body.
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
} );
|
|
1200
|
+
if ( req.body.sortColumName && req.body.sortColumName !== '' && req.body.sortBy ) {
|
|
1201
|
+
const sortOption = { $sort: { [req.body.sortColumName]: req.body.sortBy } };
|
|
1202
|
+
query.push( sortOption );
|
|
1203
|
+
storesQuery.push( sortOption );
|
|
1204
|
+
} else {
|
|
1205
|
+
const sortOption = { $sort: { 'storeId': -1 } };
|
|
1206
|
+
query.push( sortOption );
|
|
1207
|
+
storesQuery.push( sortOption );
|
|
1158
1208
|
}
|
|
1159
|
-
|
|
1160
1209
|
let count;
|
|
1161
|
-
if ( req.body.
|
|
1210
|
+
if ( req.body.infrafilterIssue == 'Live Stores' || req.body.infrafilterIssue == 'Total Stores' ) {
|
|
1162
1211
|
count = await aggregateStore( storesQuery );
|
|
1163
1212
|
} else {
|
|
1164
1213
|
count = await aggregateTangoTicket( query );
|
|
1165
1214
|
}
|
|
1166
1215
|
if ( req.body.limit && req.body.offset && !req.body.export ) {
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1216
|
+
const skipValue = ( req.body.offset - 1 ) * req.body.limit;
|
|
1217
|
+
const limitValue = Number( req.body.limit );
|
|
1218
|
+
|
|
1219
|
+
const pagination = [
|
|
1220
|
+
{ $skip: skipValue },
|
|
1221
|
+
{ $limit: limitValue },
|
|
1222
|
+
];
|
|
1223
|
+
|
|
1224
|
+
query.push( ...pagination );
|
|
1171
1225
|
storesQuery.push(
|
|
1172
|
-
|
|
1173
|
-
{
|
|
1226
|
+
...pagination,
|
|
1227
|
+
{
|
|
1228
|
+
$lookup: {
|
|
1229
|
+
from: 'clients',
|
|
1230
|
+
let: { clientId: '$clientId' },
|
|
1231
|
+
pipeline: [
|
|
1232
|
+
{
|
|
1233
|
+
$match: {
|
|
1234
|
+
$expr: {
|
|
1235
|
+
$and: [
|
|
1236
|
+
{ $eq: [ '$clientId', '$$clientId' ] },
|
|
1237
|
+
],
|
|
1238
|
+
},
|
|
1239
|
+
},
|
|
1240
|
+
},
|
|
1241
|
+
{
|
|
1242
|
+
$project: {
|
|
1243
|
+
clientName: 1,
|
|
1244
|
+
},
|
|
1245
|
+
},
|
|
1246
|
+
],
|
|
1247
|
+
as: 'client',
|
|
1248
|
+
},
|
|
1249
|
+
},
|
|
1250
|
+
{
|
|
1251
|
+
$unwind: { path: '$client', preserveNullAndEmptyArrays: true },
|
|
1252
|
+
},
|
|
1253
|
+
{
|
|
1254
|
+
$project: {
|
|
1255
|
+
clientName: '$client.clientName',
|
|
1256
|
+
storeId: 1,
|
|
1257
|
+
clientId: 1,
|
|
1258
|
+
storeName: 1,
|
|
1259
|
+
status: 1,
|
|
1260
|
+
createdAt: 1,
|
|
1261
|
+
},
|
|
1262
|
+
},
|
|
1174
1263
|
);
|
|
1175
1264
|
}
|
|
1265
|
+
|
|
1176
1266
|
let storesList;
|
|
1177
|
-
if ( req.body.
|
|
1267
|
+
if ( req.body.infrafilterIssue == 'Live Stores' || req.body.infrafilterIssue == 'Total Stores' ) {
|
|
1178
1268
|
storesList = await aggregateStore( storesQuery );
|
|
1179
1269
|
} else {
|
|
1180
1270
|
storesList = await aggregateTangoTicket( query );
|
|
1181
1271
|
}
|
|
1182
|
-
|
|
1183
1272
|
if ( storesList.length == 0 ) {
|
|
1184
1273
|
return res.sendError( 'no data', 204 );
|
|
1185
1274
|
}
|
|
1186
1275
|
let data = {};
|
|
1187
1276
|
let result = [];
|
|
1277
|
+
let inputData = req.body;
|
|
1188
1278
|
for ( const store of storesList ) {
|
|
1189
1279
|
data.storeId = store.storeId;
|
|
1190
1280
|
data.storeName = store.storeName;
|
|
@@ -1203,82 +1293,64 @@ export async function hourWiseDownstores( req, res ) {
|
|
|
1203
1293
|
}
|
|
1204
1294
|
}
|
|
1205
1295
|
|
|
1296
|
+
async function downStoresCheck( data, inputData ) {
|
|
1297
|
+
try {
|
|
1298
|
+
const TimeSlots = generateTimeSlots( 8, 22, 60, inputData.Date );
|
|
1299
|
+
const formattedTimeSlots = TimeSlots.map( ( slot ) => ( {
|
|
1300
|
+
...slot,
|
|
1301
|
+
startTime: dayjs( slot.from ).format( 'hh:mm A' ),
|
|
1302
|
+
endTime: dayjs( slot.to ).format( 'hh:mm A' ),
|
|
1303
|
+
} ) );
|
|
1206
1304
|
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
'bool': {
|
|
1220
|
-
'must': [
|
|
1221
|
-
{
|
|
1222
|
-
'term': {
|
|
1223
|
-
'doc.date.keyword': dayjs( inputData.Date ).format( 'DD-MM-YYYY' ),
|
|
1224
|
-
},
|
|
1225
|
-
},
|
|
1226
|
-
{
|
|
1227
|
-
'term': {
|
|
1228
|
-
'doc.store_id.keyword': data.storeId,
|
|
1229
|
-
},
|
|
1230
|
-
},
|
|
1231
|
-
{
|
|
1232
|
-
'terms': {
|
|
1233
|
-
'doc.hour.keyword': [ obj.hour ],
|
|
1234
|
-
},
|
|
1235
|
-
},
|
|
1236
|
-
],
|
|
1237
|
-
|
|
1238
|
-
},
|
|
1305
|
+
const downTimePromises = formattedTimeSlots.map( async ( obj ) => {
|
|
1306
|
+
const downTime = await getOpenSearchData(
|
|
1307
|
+
JSON.parse( process.env.OPENSEARCH ).downTimeHourly,
|
|
1308
|
+
{
|
|
1309
|
+
size: 1,
|
|
1310
|
+
query: {
|
|
1311
|
+
bool: {
|
|
1312
|
+
must: [
|
|
1313
|
+
{ term: { 'doc.date.keyword': dayjs( inputData.Date ).format( 'DD-MM-YYYY' ) } },
|
|
1314
|
+
{ term: { 'doc.store_id.keyword': data.storeId } },
|
|
1315
|
+
{ terms: { 'doc.hour.keyword': [ obj.hour ] } },
|
|
1316
|
+
],
|
|
1239
1317
|
},
|
|
1318
|
+
},
|
|
1319
|
+
},
|
|
1320
|
+
);
|
|
1240
1321
|
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
const sum = streamwiseDowntime.reduce( ( accumulator, currentValue ) => {
|
|
1245
|
-
return accumulator + currentValue.down_time;
|
|
1246
|
-
}, 0 );
|
|
1247
|
-
|
|
1248
|
-
// Calculate the average
|
|
1249
|
-
const average = sum / streamwiseDowntime.length;
|
|
1250
|
-
obj[obj.startTime + '-' + obj.endTime] = Math.round( average );
|
|
1251
|
-
} else {
|
|
1252
|
-
obj[obj.startTime + '-' + obj.endTime] = '';
|
|
1253
|
-
}
|
|
1322
|
+
const streamwiseDowntime = downTime.body.hits.hits.length > 0 ?
|
|
1323
|
+
downTime.body.hits.hits[0]._source.doc.streamwise_downtime :
|
|
1324
|
+
[];
|
|
1254
1325
|
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
mergedData[key] = obj[key];
|
|
1269
|
-
}
|
|
1270
|
-
}
|
|
1326
|
+
const average = streamwiseDowntime.length ?
|
|
1327
|
+
Math.round( streamwiseDowntime.reduce( ( acc, curr ) => acc + curr.down_time, 0 ) / streamwiseDowntime.length ) :
|
|
1328
|
+
'';
|
|
1329
|
+
|
|
1330
|
+
return { ...obj, [`${obj.startTime}-${obj.endTime}`]: average };
|
|
1331
|
+
} );
|
|
1332
|
+
|
|
1333
|
+
const timewise = await Promise.all( downTimePromises );
|
|
1334
|
+
|
|
1335
|
+
const mergedData = timewise.reduce( ( acc, obj ) => {
|
|
1336
|
+
for ( const [ key, value ] of Object.entries( obj ) ) {
|
|
1337
|
+
if ( ![ 'hour', 'from', 'to', 'startTime', 'endTime', 'clientId' ].includes( key ) ) {
|
|
1338
|
+
acc[key] = ( acc[key] || 0 ) + value;
|
|
1271
1339
|
}
|
|
1272
|
-
}
|
|
1340
|
+
}
|
|
1341
|
+
return acc;
|
|
1342
|
+
}, {
|
|
1343
|
+
storeName: data.storeName,
|
|
1344
|
+
storeId: data.storeId,
|
|
1345
|
+
PrimaryIssue: data.primaryIssue,
|
|
1346
|
+
} );
|
|
1273
1347
|
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
Reject( err );
|
|
1279
|
-
}
|
|
1280
|
-
} );
|
|
1348
|
+
return [ mergedData ];
|
|
1349
|
+
} catch ( err ) {
|
|
1350
|
+
throw err;
|
|
1351
|
+
}
|
|
1281
1352
|
}
|
|
1353
|
+
|
|
1282
1354
|
export async function ticketCountSplit( req, res ) {
|
|
1283
1355
|
try {
|
|
1284
1356
|
const inputData = req.body;
|