tango-app-api-infra 3.0.55-dev → 3.0.56-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.
package/package.json
CHANGED
|
@@ -211,10 +211,10 @@ export async function installationCard( req, res ) {
|
|
|
211
211
|
$group: {
|
|
212
212
|
_id: '$ticketId',
|
|
213
213
|
ticketId: { $first: '$ticketId' },
|
|
214
|
-
issueStatus: { $
|
|
215
|
-
ticketType: { $
|
|
216
|
-
issueIdentifiedBy: { $
|
|
217
|
-
primaryIssue: { $
|
|
214
|
+
issueStatus: { $last: '$issueStatus' },
|
|
215
|
+
ticketType: { $last: '$ticketType' },
|
|
216
|
+
issueIdentifiedBy: { $last: '$issueIdentifiedBy' },
|
|
217
|
+
primaryIssue: { $last: '$primaryIssue' },
|
|
218
218
|
},
|
|
219
219
|
},
|
|
220
220
|
];
|
|
@@ -461,8 +461,8 @@ export async function InstallationIssuesTable( req, res ) {
|
|
|
461
461
|
storeId: { $first: '$storeId' },
|
|
462
462
|
clientId: { $first: '$clientId' },
|
|
463
463
|
storeName: { $first: '$storeName' },
|
|
464
|
-
status: { $
|
|
465
|
-
primaryIssue: { $
|
|
464
|
+
status: { $last: '$status' },
|
|
465
|
+
primaryIssue: { $last: '$primaryIssue' },
|
|
466
466
|
},
|
|
467
467
|
},
|
|
468
468
|
];
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
import { aggregateTangoTicket, createTangoTicket, findOneTangoTicket, updateOneTangoTicket } from '../services/tangoTicket.service.js';
|
|
3
|
+
import { aggregateTangoTicket, createTangoTicket, findOneTangoTicket, updateOneTangoTicket, updateManyTangoTicket } from '../services/tangoTicket.service.js';
|
|
4
4
|
import { createinfraReason, findinfraReason } from '../services/infraReason.service.js';
|
|
5
5
|
import { updateOneStore, findStore } from '../services/store.service.js';
|
|
6
|
-
import { logger, fileUpload, signedUrl, sendEmailWithSES, getOpenSearchData, appConfig } from 'tango-app-api-middleware';
|
|
6
|
+
import { logger, fileUpload, signedUrl, sendEmailWithSES, getOpenSearchData, appConfig, getUTC } from 'tango-app-api-middleware';
|
|
7
7
|
import { aggregateUser, updateOneUser } from '../services/user.service.js';
|
|
8
8
|
import { updateoneClient } from '../services/client.service.js';
|
|
9
9
|
import dayjs from 'dayjs';
|
|
@@ -626,23 +626,145 @@ function inWords( num ) {
|
|
|
626
626
|
export async function infraTable( req, res ) {
|
|
627
627
|
try {
|
|
628
628
|
let query = [];
|
|
629
|
-
|
|
629
|
+
let date = await getUTC( new Date( req.body.fromDate ), new Date( req.body.toDate ) );
|
|
630
|
+
if ( req.body.clientId && req.body.clientId.length > 0 ) {
|
|
631
|
+
query.push( {
|
|
632
|
+
$match: {
|
|
633
|
+
'basicDetails.clientId': { $in: req.body.clientId },
|
|
634
|
+
},
|
|
635
|
+
} );
|
|
636
|
+
}
|
|
630
637
|
query.push( {
|
|
631
638
|
$match: {
|
|
632
639
|
$and: [
|
|
633
640
|
{ issueType: 'infra' },
|
|
634
|
-
{ 'basicDetails.clientId': { $in: req.body.clientId } },
|
|
635
641
|
{ createdAt: { $gte: date.start } },
|
|
636
642
|
{ createdAt: { $lte: date.end } },
|
|
637
643
|
],
|
|
638
644
|
},
|
|
645
|
+
}, {
|
|
646
|
+
$project: {
|
|
647
|
+
storeId: '$basicDetails.storeId',
|
|
648
|
+
clientId: '$basicDetails.clientId',
|
|
649
|
+
ticketId: 1,
|
|
650
|
+
storeName: '$basicDetails.storeName',
|
|
651
|
+
clientName: '$basicDetails.clientName',
|
|
652
|
+
status: 1,
|
|
653
|
+
createdAt: 1,
|
|
654
|
+
issueDate: 1,
|
|
655
|
+
primaryIssue: {
|
|
656
|
+
$filter: {
|
|
657
|
+
input: '$ticketActivity',
|
|
658
|
+
as: 'item',
|
|
659
|
+
cond: { $eq: [ '$$item.actionType', 'issueUpdate' ] },
|
|
660
|
+
},
|
|
661
|
+
},
|
|
662
|
+
},
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
$unwind: {
|
|
666
|
+
path: '$primaryIssue', preserveNullAndEmptyArrays: true,
|
|
667
|
+
},
|
|
668
|
+
},
|
|
669
|
+
{
|
|
670
|
+
$unwind: {
|
|
671
|
+
path: '$primaryIssue.reasons', preserveNullAndEmptyArrays: true,
|
|
672
|
+
},
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
$unwind: {
|
|
676
|
+
path: '$primaryIssue.reasons.secondaryIssue', preserveNullAndEmptyArrays: true,
|
|
677
|
+
},
|
|
678
|
+
},
|
|
679
|
+
{
|
|
680
|
+
$project: {
|
|
681
|
+
storeId: 1,
|
|
682
|
+
clientId: 1,
|
|
683
|
+
storeName: 1,
|
|
684
|
+
clientName: 1,
|
|
685
|
+
createdAt: 1,
|
|
686
|
+
ticketId: 1,
|
|
687
|
+
issueDate: { $ifNull: [ '$issueDate', '' ] },
|
|
688
|
+
status: 1,
|
|
689
|
+
primaryIssue: { $ifNull: [ '$primaryIssue.reasons.primaryIssue', '-' ] },
|
|
690
|
+
secondaryIssue: { $ifNull: [ '$primaryIssue.reasons.secondaryIssue.name', '-' ] },
|
|
691
|
+
},
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
$group: {
|
|
695
|
+
_id: '$ticketId',
|
|
696
|
+
storeId: { $first: '$storeId' },
|
|
697
|
+
clientId: { $first: '$clientId' },
|
|
698
|
+
ticketId: { $first: '$ticketId' },
|
|
699
|
+
storeName: { $first: '$storeName' },
|
|
700
|
+
clientName: { $first: '$clientName' },
|
|
701
|
+
createdAt: { $first: '$createdAt' },
|
|
702
|
+
issueDate: { $last: '$issueDate' },
|
|
703
|
+
status: { $last: '$status' },
|
|
704
|
+
primaryIssue: { $last: '$primaryIssue' },
|
|
705
|
+
secondaryIssue: { $last: '$secondaryIssue' },
|
|
706
|
+
},
|
|
639
707
|
} );
|
|
640
708
|
if ( req.body.sortColumName && req.body.sortColumName !== '' && req.body.sortBy ) {
|
|
641
709
|
query.push( {
|
|
642
710
|
$sort: { [req.body.sortColumName]: req.body.sortBy },
|
|
643
711
|
} );
|
|
644
712
|
}
|
|
713
|
+
if ( req.body.storeIdFilter && req.body.storeIdFilter.length>0 ) {
|
|
714
|
+
query.push( {
|
|
715
|
+
$match: {
|
|
716
|
+
storeId: { $in: req.body.storeIdFilter },
|
|
717
|
+
},
|
|
718
|
+
} );
|
|
719
|
+
}
|
|
720
|
+
let ticketList = await aggregateTangoTicket( query );
|
|
721
|
+
let issueList = await findinfraReason( { parentId: { '$exists': false } } );
|
|
722
|
+
const categoryCounts = {};
|
|
723
|
+
let response;
|
|
724
|
+
if ( ticketList.length > 0 ) {
|
|
725
|
+
ticketList.forEach( ( item ) => {
|
|
726
|
+
const categoryName = item.primaryIssue;
|
|
727
|
+
if ( categoryCounts[categoryName] ) {
|
|
728
|
+
categoryCounts[categoryName]++;
|
|
729
|
+
} else {
|
|
730
|
+
categoryCounts[categoryName] = 1;
|
|
731
|
+
}
|
|
732
|
+
} );
|
|
733
|
+
response = issueList.map( ( category ) => ( {
|
|
734
|
+
name: category.name,
|
|
735
|
+
count: categoryCounts[category.name] || 0,
|
|
736
|
+
} ) );
|
|
737
|
+
} else {
|
|
738
|
+
response = issueList.map( ( category ) => ( {
|
|
739
|
+
name: category.name,
|
|
740
|
+
count: 0,
|
|
741
|
+
} ) );
|
|
742
|
+
}
|
|
743
|
+
response.push( {
|
|
744
|
+
'name': 'total',
|
|
745
|
+
'count': ticketList.length,
|
|
746
|
+
|
|
747
|
+
} );
|
|
748
|
+
if ( req.body.filterIssue && req.body.filterIssue != '' && req.body.filterIssue != 'total' ) {
|
|
749
|
+
query.push( {
|
|
750
|
+
$match: {
|
|
751
|
+
primaryIssue: req.body.filterIssue,
|
|
752
|
+
},
|
|
753
|
+
} );
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
if ( req.body.searchValue && req.body.searchValue != '' ) {
|
|
757
|
+
query.push( {
|
|
758
|
+
$match: {
|
|
759
|
+
$or: [
|
|
760
|
+
{ storeId: { $regex: req.body.searchValue, $options: 'i' } },
|
|
761
|
+
{ storeName: { $regex: req.body.searchValue, $options: 'i' } },
|
|
762
|
+
],
|
|
763
|
+
},
|
|
764
|
+
} );
|
|
765
|
+
}
|
|
645
766
|
let count = await aggregateTangoTicket( query );
|
|
767
|
+
|
|
646
768
|
if ( req.body.limit && req.body.offset && !req.body.export ) {
|
|
647
769
|
query.push(
|
|
648
770
|
{ $skip: ( req.body.offset - 1 ) * req.body.limit },
|
|
@@ -662,6 +784,7 @@ export async function infraTable( req, res ) {
|
|
|
662
784
|
}
|
|
663
785
|
if ( result.length > 0 ) {
|
|
664
786
|
res.sendSuccess( {
|
|
787
|
+
response: response,
|
|
665
788
|
count: count.length,
|
|
666
789
|
result: result,
|
|
667
790
|
} );
|
|
@@ -673,3 +796,184 @@ export async function infraTable( req, res ) {
|
|
|
673
796
|
return res.sendError( error, 500 );
|
|
674
797
|
}
|
|
675
798
|
}
|
|
799
|
+
export async function installationTable( req, res ) {
|
|
800
|
+
try {
|
|
801
|
+
let query = [];
|
|
802
|
+
let date = await getUTC( new Date( req.body.fromDate ), new Date( req.body.toDate ) );
|
|
803
|
+
if ( req.body.clientId && req.body.clientId.length > 0 ) {
|
|
804
|
+
query.push( {
|
|
805
|
+
$match: {
|
|
806
|
+
'basicDetails.clientId': { $in: req.body.clientId },
|
|
807
|
+
},
|
|
808
|
+
} );
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
query.push( {
|
|
812
|
+
$match: {
|
|
813
|
+
$and: [
|
|
814
|
+
{ issueType: 'installation' },
|
|
815
|
+
{ createdAt: { $gte: date.start } },
|
|
816
|
+
{ createdAt: { $lte: date.end } },
|
|
817
|
+
],
|
|
818
|
+
},
|
|
819
|
+
}, {
|
|
820
|
+
$project: {
|
|
821
|
+
storeId: '$basicDetails.storeId',
|
|
822
|
+
clientId: '$basicDetails.clientId',
|
|
823
|
+
ticketId: 1,
|
|
824
|
+
storeName: '$basicDetails.storeName',
|
|
825
|
+
clientName: '$basicDetails.clientName',
|
|
826
|
+
status: 1,
|
|
827
|
+
createdAt: 1,
|
|
828
|
+
installationStatus: '$ticketDetails.installationStatus',
|
|
829
|
+
issueDate: 1,
|
|
830
|
+
primaryIssue: {
|
|
831
|
+
$filter: {
|
|
832
|
+
input: '$ticketActivity',
|
|
833
|
+
as: 'item',
|
|
834
|
+
cond: { $eq: [ '$$item.actionType', 'issueUpdate' ] },
|
|
835
|
+
},
|
|
836
|
+
},
|
|
837
|
+
},
|
|
838
|
+
},
|
|
839
|
+
{
|
|
840
|
+
$unwind: {
|
|
841
|
+
path: '$primaryIssue', preserveNullAndEmptyArrays: true,
|
|
842
|
+
},
|
|
843
|
+
},
|
|
844
|
+
{
|
|
845
|
+
$unwind: {
|
|
846
|
+
path: '$primaryIssue.reasons', preserveNullAndEmptyArrays: true,
|
|
847
|
+
},
|
|
848
|
+
},
|
|
849
|
+
{
|
|
850
|
+
$unwind: {
|
|
851
|
+
path: '$primaryIssue.reasons.secondaryIssue', preserveNullAndEmptyArrays: true,
|
|
852
|
+
},
|
|
853
|
+
},
|
|
854
|
+
{
|
|
855
|
+
$project: {
|
|
856
|
+
storeId: 1,
|
|
857
|
+
clientId: 1,
|
|
858
|
+
storeName: 1,
|
|
859
|
+
clientName: 1,
|
|
860
|
+
createdAt: 1,
|
|
861
|
+
ticketId: 1,
|
|
862
|
+
installationStatus: 1,
|
|
863
|
+
issueDate: { $ifNull: [ '$issueDate', '' ] },
|
|
864
|
+
status: 1,
|
|
865
|
+
primaryIssue: { $ifNull: [ '$primaryIssue.reasons.primaryIssue', '-' ] },
|
|
866
|
+
secondaryIssue: { $ifNull: [ '$primaryIssue.reasons.secondaryIssue.name', '-' ] },
|
|
867
|
+
},
|
|
868
|
+
},
|
|
869
|
+
{
|
|
870
|
+
$group: {
|
|
871
|
+
_id: '$ticketId',
|
|
872
|
+
storeId: { $first: '$storeId' },
|
|
873
|
+
clientId: { $first: '$clientId' },
|
|
874
|
+
ticketId: { $first: '$ticketId' },
|
|
875
|
+
storeName: { $first: '$storeName' },
|
|
876
|
+
clientName: { $first: '$clientName' },
|
|
877
|
+
createdAt: { $first: '$createdAt' },
|
|
878
|
+
issueDate: { $last: '$issueDate' },
|
|
879
|
+
installationStatus: { $last: '$installationStatus' },
|
|
880
|
+
status: { $last: '$status' },
|
|
881
|
+
primaryIssue: { $last: '$primaryIssue' },
|
|
882
|
+
secondaryIssue: { $last: '$secondaryIssue' },
|
|
883
|
+
},
|
|
884
|
+
} );
|
|
885
|
+
if ( req.body.sortColumName && req.body.sortColumName !== '' && req.body.sortBy ) {
|
|
886
|
+
query.push( {
|
|
887
|
+
$sort: { [req.body.sortColumName]: req.body.sortBy },
|
|
888
|
+
} );
|
|
889
|
+
}
|
|
890
|
+
let ticketList = await aggregateTangoTicket( query );
|
|
891
|
+
let issueList = await findinfraReason( { parentId: { '$exists': false } } );
|
|
892
|
+
const categoryCounts = {};
|
|
893
|
+
let response;
|
|
894
|
+
if ( ticketList.length > 0 ) {
|
|
895
|
+
ticketList.forEach( ( item ) => {
|
|
896
|
+
const categoryName = item.primaryIssue;
|
|
897
|
+
if ( categoryCounts[categoryName] ) {
|
|
898
|
+
categoryCounts[categoryName]++;
|
|
899
|
+
} else {
|
|
900
|
+
categoryCounts[categoryName] = 1;
|
|
901
|
+
}
|
|
902
|
+
} );
|
|
903
|
+
response = issueList.map( ( category ) => ( {
|
|
904
|
+
name: category.name,
|
|
905
|
+
count: categoryCounts[category.name] || 0,
|
|
906
|
+
} ) );
|
|
907
|
+
} else {
|
|
908
|
+
response = issueList.map( ( category ) => ( {
|
|
909
|
+
name: category.name,
|
|
910
|
+
count: 0,
|
|
911
|
+
} ) );
|
|
912
|
+
}
|
|
913
|
+
response.push( {
|
|
914
|
+
'name': 'total',
|
|
915
|
+
'count': ticketList.length,
|
|
916
|
+
|
|
917
|
+
} );
|
|
918
|
+
if ( req.body.filterIssue && req.body.filterIssue != '' && req.body.filterIssue != 'total' ) {
|
|
919
|
+
query.push( {
|
|
920
|
+
$match: {
|
|
921
|
+
primaryIssue: req.body.filterIssue,
|
|
922
|
+
},
|
|
923
|
+
} );
|
|
924
|
+
}
|
|
925
|
+
if ( req.body.searchValue && req.body.searchValue != '' ) {
|
|
926
|
+
query.push( {
|
|
927
|
+
$match: {
|
|
928
|
+
$or: [
|
|
929
|
+
{ storeId: { $regex: req.body.searchValue, $options: 'i' } },
|
|
930
|
+
{ storeName: { $regex: req.body.searchValue, $options: 'i' } },
|
|
931
|
+
],
|
|
932
|
+
},
|
|
933
|
+
} );
|
|
934
|
+
}
|
|
935
|
+
let count = await aggregateTangoTicket( query );
|
|
936
|
+
console.log( count.length );
|
|
937
|
+
if ( req.body.limit && req.body.offset && !req.body.export ) {
|
|
938
|
+
query.push(
|
|
939
|
+
{ $skip: ( req.body.offset - 1 ) * req.body.limit },
|
|
940
|
+
{ $limit: Number( req.body.limit ) },
|
|
941
|
+
);
|
|
942
|
+
}
|
|
943
|
+
let result = await aggregateTangoTicket( query );
|
|
944
|
+
|
|
945
|
+
if ( req.body.export && result.length > 0 ) {
|
|
946
|
+
const exportdata = [];
|
|
947
|
+
result.forEach( ( element ) => {
|
|
948
|
+
exportdata.push( {
|
|
949
|
+
|
|
950
|
+
} );
|
|
951
|
+
} );
|
|
952
|
+
await download( exportdata, res );
|
|
953
|
+
return;
|
|
954
|
+
}
|
|
955
|
+
if ( result.length > 0 ) {
|
|
956
|
+
res.sendSuccess( {
|
|
957
|
+
response: response,
|
|
958
|
+
count: count.length,
|
|
959
|
+
result: result,
|
|
960
|
+
} );
|
|
961
|
+
} else {
|
|
962
|
+
res.sendError( 'no data', 204 );
|
|
963
|
+
}
|
|
964
|
+
} catch ( error ) {
|
|
965
|
+
logger.error( { error: error, function: 'installationTable' } );
|
|
966
|
+
return res.sendError( error, 500 );
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
export async function assignTicket( req, res ) {
|
|
970
|
+
try {
|
|
971
|
+
let tickets = await updateManyTangoTicket( { ticketId: { $in: req.body.tickets } }, { 'ticketDetails.assigntoUser': true, 'ticketDetails.addressingUser': req.body.user } );
|
|
972
|
+
if ( tickets ) {
|
|
973
|
+
res.sendSuccess( 'Ticket Assigned Successfully' );
|
|
974
|
+
}
|
|
975
|
+
} catch ( error ) {
|
|
976
|
+
logger.error( { error: error, function: 'assignTicket' } );
|
|
977
|
+
return res.sendError( error, 500 );
|
|
978
|
+
}
|
|
979
|
+
}
|
|
@@ -4,7 +4,7 @@ import { isAllowedSessionHandler, authorize } from 'tango-app-api-middleware';
|
|
|
4
4
|
import { validateDetails, bulkvalidateDetails, validateTicket, bulkvalidateTicket, ticketExists, infraReasonExists, InfrastepstoResolve, InfraAlert } from '../validations/infra.validation.js';
|
|
5
5
|
import { createTicket, bulkcreateTicket, updateStatus, createReason, PrimaryReasons,
|
|
6
6
|
secondaryReason, updateTicketIssue, viewTicket, AlertTicketReply, uploadAttachments,
|
|
7
|
-
updateInstallationTicket, emailUserList, saveInfraEmailConfig, invoice, infraTable } from '../controllers/infra.controllers.js';
|
|
7
|
+
updateInstallationTicket, emailUserList, saveInfraEmailConfig, invoice, infraTable, assignTicket, installationTable } from '../controllers/infra.controllers.js';
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
export const infraRouter = express.Router();
|
|
@@ -57,5 +57,13 @@ infraRouter.post( '/saveInfraEmailConfig', isAllowedSessionHandler, authorize( {
|
|
|
57
57
|
infraRouter.post( '/invoice', invoice );
|
|
58
58
|
infraRouter.post( '/infraTable', isAllowedSessionHandler, authorize( {
|
|
59
59
|
userType: [ 'client', 'tango' ], access: [
|
|
60
|
-
{ featureName: 'manage', name: 'tickets', permissions: [ '
|
|
60
|
+
{ featureName: 'manage', name: 'tickets', permissions: [ 'isView' ] } ],
|
|
61
61
|
} ), infraTable );
|
|
62
|
+
infraRouter.post( '/installationTable', isAllowedSessionHandler, authorize( {
|
|
63
|
+
userType: [ 'client', 'tango' ], access: [
|
|
64
|
+
{ featureName: 'manage', name: 'tickets', permissions: [ 'isView' ] } ],
|
|
65
|
+
} ), installationTable );
|
|
66
|
+
infraRouter.post( '/assignTicket', isAllowedSessionHandler, authorize( {
|
|
67
|
+
userType: [ 'client', 'tango' ], access: [
|
|
68
|
+
{ featureName: 'manage', name: 'tickets', permissions: [ 'isEdit', 'isView' ] } ],
|
|
69
|
+
} ), assignTicket );
|
|
@@ -13,6 +13,9 @@ export async function findOneTangoTicket( query, project ) {
|
|
|
13
13
|
export async function updateOneTangoTicket( query, data ) {
|
|
14
14
|
return await dataModel.tangoTicketModel.updateOne( query, { $set: data } );
|
|
15
15
|
}
|
|
16
|
+
export async function updateManyTangoTicket( query, data ) {
|
|
17
|
+
return await dataModel.tangoTicketModel.updateMany( query, { $set: data } );
|
|
18
|
+
}
|
|
16
19
|
export async function countDocumentsTangoTicket( query, data ) {
|
|
17
20
|
return await dataModel.tangoTicketModel.countDocuments( query );
|
|
18
21
|
}
|