tango-app-api-trax 3.8.31 → 3.9.1
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 +2 -2
- package/src/controllers/download.controller.js +19 -19
- package/src/controllers/gallery.controller.js +31 -88
- package/src/controllers/handlebar-helper.js +1 -0
- package/src/controllers/internalTrax.controller.js +11 -11
- package/src/controllers/mobileTrax.controller.js +539 -33
- package/src/controllers/teaxFlag.controller.js +5 -5
- package/src/controllers/trax.controller.js +2 -2
- package/src/hbs/recurringFlag.hbs +250 -250
- package/src/hbs/weeklyWrap.hbs +218 -218
- package/src/routes/mobileTrax.routes.js +1 -0
- package/src/utils/visitChecklistPdf.utils.js +1 -1
|
@@ -608,7 +608,7 @@ export const flagCardsV1 = async ( req, res ) => {
|
|
|
608
608
|
{
|
|
609
609
|
client_id: clientId,
|
|
610
610
|
publish: true,
|
|
611
|
-
checkListType: { $in: [ 'customerunattended', 'mobileusagedetection', 'staffleftinthemiddle', 'storeopenandclose', 'uniformdetection', 'cleaning', 'scrum', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert' ] },
|
|
611
|
+
checkListType: { $in: [ 'customerunattended', 'mobileusagedetection', 'staffleftinthemiddle', 'storeopenandclose', 'uniformdetection', 'cleaning', 'scrum', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert', 'staffgrouping', 'boxalert', 'employeeCount', 'storehygienemonitoring' ] },
|
|
612
612
|
},
|
|
613
613
|
{ checkListType: 1 },
|
|
614
614
|
);
|
|
@@ -2743,7 +2743,7 @@ export const checklistDropdownV1 = async ( req, res ) => {
|
|
|
2743
2743
|
$or: [
|
|
2744
2744
|
{ questionFlag: { $gte: 1 } },
|
|
2745
2745
|
{ timeFlag: { $gte: 1 } },
|
|
2746
|
-
{ checkListType: { $in: [ 'customerunattended', 'mobileusagedetection', 'staffleftinthemiddle', 'storeopenandclose', 'uniformdetection', 'cleaning', 'scrum', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert' ] } },
|
|
2746
|
+
{ checkListType: { $in: [ 'customerunattended', 'mobileusagedetection', 'staffleftinthemiddle', 'storeopenandclose', 'uniformdetection', 'cleaning', 'scrum', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert', 'staffgrouping', 'boxalert', 'employeeCount', 'storehygienemonitoring' ] } },
|
|
2747
2747
|
{
|
|
2748
2748
|
runAIQuestionCount: { $gte: 1 },
|
|
2749
2749
|
},
|
|
@@ -2945,7 +2945,7 @@ export const flagComparisonCardsV2 = async ( req, res ) => {
|
|
|
2945
2945
|
{
|
|
2946
2946
|
client_id: requestData.clientId,
|
|
2947
2947
|
publish: true,
|
|
2948
|
-
checkListType: { $in: [ 'customerunattended', 'mobileusagedetection', 'staffleftinthemiddle', 'storeopenandclose', 'uniformdetection', 'cleaning', 'scrum', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert' ] },
|
|
2948
|
+
checkListType: { $in: [ 'customerunattended', 'mobileusagedetection', 'staffleftinthemiddle', 'storeopenandclose', 'uniformdetection', 'cleaning', 'scrum', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert', 'staffgrouping', 'boxalert', 'employeeCount', 'storehygienemonitoring' ] },
|
|
2949
2949
|
},
|
|
2950
2950
|
{ checkListType: 1 },
|
|
2951
2951
|
);
|
|
@@ -3047,7 +3047,7 @@ export const flagTablesV2 = async ( req, res ) => {
|
|
|
3047
3047
|
}
|
|
3048
3048
|
|
|
3049
3049
|
if ( requestData?.filter === 'all' ) {
|
|
3050
|
-
findAndQuery.push( { $or: [ { checkListType: { $in: [ 'custom', 'customerunattended', 'mobileusagedetection', 'staffleftinthemiddle', 'storeopenandclose', 'uniformdetection', 'cleaning', 'scrum', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert' ] } } ] } );
|
|
3050
|
+
findAndQuery.push( { $or: [ { checkListType: { $in: [ 'custom', 'customerunattended', 'mobileusagedetection', 'staffleftinthemiddle', 'storeopenandclose', 'uniformdetection', 'cleaning', 'scrum', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert', 'staffgrouping', 'boxalert', 'employeeCount', 'storehygienemonitoring' ] } } ] } );
|
|
3051
3051
|
} else if ( requestData?.filter === 'question' ) {
|
|
3052
3052
|
findAndQuery.push( { checkListType: 'custom' } );
|
|
3053
3053
|
findAndQuery.push( { questionFlag: { $gte: 1 } } );
|
|
@@ -3055,7 +3055,7 @@ export const flagTablesV2 = async ( req, res ) => {
|
|
|
3055
3055
|
findAndQuery.push( { checkListType: 'custom' } );
|
|
3056
3056
|
findAndQuery.push( { timeFlag: { $gte: 1 } } );
|
|
3057
3057
|
} else if ( requestData?.filter === 'detection' ) {
|
|
3058
|
-
findAndQuery.push( { checkListType: { $in: [ 'customerunattended', 'mobileusagedetection', 'staffleftinthemiddle', 'storeopenandclose', 'uniformdetection', 'cleaning', 'scrum', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert' ] } } );
|
|
3058
|
+
findAndQuery.push( { checkListType: { $in: [ 'customerunattended', 'mobileusagedetection', 'staffleftinthemiddle', 'storeopenandclose', 'uniformdetection', 'cleaning', 'scrum', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert', 'staffgrouping', 'boxalert', 'employeeCount', 'storehygienemonitoring' ] } } );
|
|
3059
3059
|
} else if ( requestData?.filter === 'runAI' ) {
|
|
3060
3060
|
if ( req.body.runAIChecklistName ) {
|
|
3061
3061
|
findAndQuery.push( { checkListName: { $in: req.body.runAIChecklistName } } );
|
|
@@ -4131,7 +4131,7 @@ async function updateOpenSearch( user, data ) {
|
|
|
4131
4131
|
export const aiChecklist = async ( req, res ) => {
|
|
4132
4132
|
try {
|
|
4133
4133
|
let storeDetails = await storeService.count( { clientId: req.query.clientId, status: 'active' } );
|
|
4134
|
-
let aiList = [ 'mobileusagedetection', 'storeopenandclose', 'uniformdetection', 'staffleftinthemiddle', 'customerunattended', 'eyetest', 'remoteoptometrist', 'storehygienemonitoring', 'cleaning', 'scrum', 'suspiciousactivity', '
|
|
4134
|
+
let aiList = [ 'mobileusagedetection', 'storeopenandclose', 'uniformdetection', 'staffleftinthemiddle', 'customerunattended', 'eyetest', 'remoteoptometrist', 'storehygienemonitoring', 'cleaning', 'scrum', 'suspiciousactivity', 'suspiciousfootfall', 'drinking', 'bagdetection', 'inventorycount', 'carsattended', 'numberplateinfo', 'vehicle_check_in', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert', 'staffgrouping', 'boxalert', 'employeeCount' ];
|
|
4135
4135
|
let checklistDetails = [];
|
|
4136
4136
|
let publishList = [];
|
|
4137
4137
|
let unpublishList = [];
|
|
@@ -4144,7 +4144,7 @@ export const aiChecklist = async ( req, res ) => {
|
|
|
4144
4144
|
checklistDetails = [ ...publishList, ...unpublishList ];
|
|
4145
4145
|
|
|
4146
4146
|
checklistDetails.forEach( ( item ) => {
|
|
4147
|
-
if ( ![ 'mobileusagedetection', 'storeopenandclose', 'cleaning', 'scrum', 'uniformdetection', 'staffleftinthemiddle', 'customerunattended', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert' ].includes( item.checkListType ) ) {
|
|
4147
|
+
if ( ![ 'mobileusagedetection', 'storeopenandclose', 'cleaning', 'scrum', 'uniformdetection', 'staffleftinthemiddle', 'customerunattended', 'outsidebusinesshoursqueuetracking', 'halfshutter', 'tvcompliance', 'cameratampering', 'queuealert', 'staffgrouping', 'boxalert', 'employeeCount' ].includes( item.checkListType ) ) {
|
|
4148
4148
|
item.storeCount = storeDetails;
|
|
4149
4149
|
}
|
|
4150
4150
|
} );
|
|
@@ -1,250 +1,250 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
|
|
4
|
-
<head>
|
|
5
|
-
<meta charset="utf-8">
|
|
6
|
-
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
7
|
-
<title>Recurring Flags Detected</title>
|
|
8
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
9
|
-
<style type="text/css">
|
|
10
|
-
body { font-family: "Inter", sans-serif !important; }
|
|
11
|
-
body, table, td, a { -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; }
|
|
12
|
-
table, td { mso-table-rspace: 0pt; mso-table-lspace: 0pt; }
|
|
13
|
-
img { -ms-interpolation-mode: bicubic; }
|
|
14
|
-
a[x-apple-data-detectors] {
|
|
15
|
-
font-family: "inherit" !important;
|
|
16
|
-
font-size: inherit !important;
|
|
17
|
-
font-weight: inherit !important;
|
|
18
|
-
line-height: inherit !important;
|
|
19
|
-
color: inherit !important;
|
|
20
|
-
text-decoration: none !important;
|
|
21
|
-
}
|
|
22
|
-
body { width: 100% !important; height: 100% !important; padding: 0 !important; margin: 0 !important; }
|
|
23
|
-
table { border-collapse: collapse !important; }
|
|
24
|
-
a { color: #1a82e2; }
|
|
25
|
-
img { height: auto; line-height: 100%; text-decoration: none; border: 0; outline: none; }
|
|
26
|
-
.flagText { font-size: 16px; font-weight: 600; line-height: 24px; text-align: left; }
|
|
27
|
-
.rfTable { width: 100%; border-collapse: collapse; }
|
|
28
|
-
.rfTable th, .rfTable td {
|
|
29
|
-
border: 1px solid #E2E8F0;
|
|
30
|
-
padding: 8px 12px;
|
|
31
|
-
font-size: 13px;
|
|
32
|
-
text-align: left;
|
|
33
|
-
color: #202B3C;
|
|
34
|
-
}
|
|
35
|
-
.rfTable th { background-color: #F1F5F9; font-weight: 600; }
|
|
36
|
-
.highlight { font-size: 14px; color: #202B3C; line-height: 22px; }
|
|
37
|
-
</style>
|
|
38
|
-
</head>
|
|
39
|
-
|
|
40
|
-
<body style="background-color: #dbe5ea;">
|
|
41
|
-
<div class="preheader" style="display: none; max-width: 0; max-height: 0; overflow: hidden; font-size: 1px; line-height: 1px; color: #fff; opacity: 0;">
|
|
42
|
-
Recurring Flags Detected
|
|
43
|
-
</div>
|
|
44
|
-
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-left:10px;padding-right:10px">
|
|
45
|
-
<tr>
|
|
46
|
-
<td bgcolor="#dbe5ea" style="padding:32px 10px 0 10px">
|
|
47
|
-
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;" align="center">
|
|
48
|
-
<tr>
|
|
49
|
-
<td style="margin-top: 0px;margin-bottom: 0px;font-size: 16px;line-height: 24px;background-color: #ffffff;padding-left: 18px;padding-right: 24px;padding-top: 24px;padding-bottom: 24px;">
|
|
50
|
-
<p style="margin-top: 0px;margin-bottom: 0px;">
|
|
51
|
-
<a href="https://tangoeye.ai/" style="text-decoration: none;outline: none;color: #ffffff;">
|
|
52
|
-
<img src="https://devtangoretail-api.tangoeye.ai/logo.png" width="200" height="100" alt="TangoEye"
|
|
53
|
-
style="-ms-interpolation-mode: bicubic;vertical-align: middle;border: 0;line-height: 100%;height: auto;outline: none;text-decoration: none;">
|
|
54
|
-
</a>
|
|
55
|
-
</p>
|
|
56
|
-
</td>
|
|
57
|
-
</tr>
|
|
58
|
-
<tr>
|
|
59
|
-
<td align="left" bgcolor="#ffffff" style="padding-left: 30px;padding-right: 24px;font-size: 14px; line-height: 24px;">
|
|
60
|
-
<p style="width: 624px;height: 0px;border: 1px solid #CBD5E1;flex: none;order: 1;flex-grow: 0;"></p>
|
|
61
|
-
</td>
|
|
62
|
-
</tr>
|
|
63
|
-
|
|
64
|
-
{{!-- Intro line --}}
|
|
65
|
-
<tr>
|
|
66
|
-
<td style="background-color: #ffffff;padding-left: 30px;padding-right: 24px;padding-bottom: 10px;">
|
|
67
|
-
<div style="margin-top: 0px;margin-bottom: 0px;font-size: 16px;line-height: 28px;color: #82899a;">
|
|
68
|
-
<span style="font-weight: 400;color: #121A26;line-height: 140%;">
|
|
69
|
-
Hi,<br/>
|
|
70
|
-
{{#if data.isMultiStoreSingleChecklist}}
|
|
71
|
-
Recurring flags has been detected across multiple {{data.subjectLabelPluralLower}} in recent <b>{{data.checklistName}}</b> on recent submissions, exceeding the configured threshold of {{data.threshold}} occurrences.
|
|
72
|
-
{{else if data.isMultiStore}}
|
|
73
|
-
Recurring flags has been detected across multiple {{data.subjectLabelPluralLower}} and across multiple checklists on recent submissions, exceeding the configured threshold of {{data.threshold}} occurrences.
|
|
74
|
-
{{else if data.isMultiChecklist}}
|
|
75
|
-
A Recurring flags has been identified for {{data.subjectLabelLower}} <b>{{data.subjectName}}</b> across multiple checklists on recent submissions, exceeding the configured threshold of {{data.threshold}} occurrences.
|
|
76
|
-
{{else}}
|
|
77
|
-
A recurring flag has been identified for {{data.subjectLabelLower}} <b>{{data.subjectName}}</b>.where a question has been flagged multiple times in recent {{data.checklistName}} submissions, exceeding the configured threshold of {{data.threshold}} occurrences.
|
|
78
|
-
{{/if}}
|
|
79
|
-
</span>
|
|
80
|
-
</div>
|
|
81
|
-
</td>
|
|
82
|
-
</tr>
|
|
83
|
-
|
|
84
|
-
{{!-- Multi-store: Key Highlights --}}
|
|
85
|
-
{{#if data.isMultiStore}}
|
|
86
|
-
<tr>
|
|
87
|
-
<td style="background-color: #ffffff;padding-left: 30px;padding-right: 24px;padding-bottom: 10px;">
|
|
88
|
-
<div class="highlight">
|
|
89
|
-
<b>Key Highlights:</b>
|
|
90
|
-
<ul style="margin:8px 0 0 0;padding-left:18px;">
|
|
91
|
-
<li>Total {{data.subjectLabelPlural}} with Recurring Flags: {{data.highlights.totalSubjects}}</li>
|
|
92
|
-
{{#unless data.isMultiStoreSingleChecklist}}
|
|
93
|
-
<li>Total Checklists with Recurring Flags: {{data.highlights.totalChecklists}}</li>
|
|
94
|
-
{{/unless}}
|
|
95
|
-
<li>Total Recurring Flags: {{data.highlights.totalFlags}}</li>
|
|
96
|
-
</ul>
|
|
97
|
-
</div>
|
|
98
|
-
</td>
|
|
99
|
-
</tr>
|
|
100
|
-
{{/if}}
|
|
101
|
-
|
|
102
|
-
{{!-- Section header for details --}}
|
|
103
|
-
<tr>
|
|
104
|
-
<td style="background-color: #ffffff;padding-left: 30px;padding-right: 24px;padding-bottom: 10px;">
|
|
105
|
-
<div style="font-size: 16px;line-height: 28px;color: #121A26;font-weight:600;">
|
|
106
|
-
{{#if data.isMultiStore}}
|
|
107
|
-
Details of the Recurring Flags are as follows:
|
|
108
|
-
{{else if data.isMultiChecklist}}
|
|
109
|
-
Details of the Recurring Flags from {{data.subjectLabel}} {{data.subjectName}} are as follows:
|
|
110
|
-
{{else}}
|
|
111
|
-
Details of the Recurring Flags from checklist are as follows:
|
|
112
|
-
{{/if}}
|
|
113
|
-
</div>
|
|
114
|
-
</td>
|
|
115
|
-
</tr>
|
|
116
|
-
</table>
|
|
117
|
-
</td>
|
|
118
|
-
</tr>
|
|
119
|
-
|
|
120
|
-
{{!-- ============ Single store + single checklist body ============ --}}
|
|
121
|
-
{{#unless data.isMultiChecklist}}{{#unless data.isMultiStore}}
|
|
122
|
-
<tr>
|
|
123
|
-
<td align="center" bgcolor="#dbe5ea" style="padding:0 10px 0 10px">
|
|
124
|
-
<table align="center" bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;">
|
|
125
|
-
<tr bgcolor="#ffffff">
|
|
126
|
-
<td class="flagText" style="padding-left:30px;line-height: 24px;color:#000000">{{data.subjectLabel}} Name :</td>
|
|
127
|
-
<td></td><td></td>
|
|
128
|
-
<td class="flagText">{{data.subjectName}}</td>
|
|
129
|
-
</tr>
|
|
130
|
-
<tr bgcolor="#ffffff">
|
|
131
|
-
<td class="flagText" style="padding-left:30px;line-height: 24px;">Checklist Name :</td>
|
|
132
|
-
<td></td><td></td>
|
|
133
|
-
<td class="flagText">{{data.checklistName}}</td>
|
|
134
|
-
</tr>
|
|
135
|
-
<tr bgcolor="#ffffff">
|
|
136
|
-
<td class="flagText" style="padding-left:30px;line-height: 24px;">Last Submitted By :</td>
|
|
137
|
-
<td></td><td></td>
|
|
138
|
-
<td class="flagText">{{data.lastSubmittedBy}}</td>
|
|
139
|
-
</tr>
|
|
140
|
-
<tr bgcolor="#ffffff">
|
|
141
|
-
<td class="flagText" style="padding-left:30px;line-height: 24px;">Last Submission Date :</td>
|
|
142
|
-
<td></td><td></td>
|
|
143
|
-
<td class="flagText">{{data.lastSubmissionDate}}</td>
|
|
144
|
-
</tr>
|
|
145
|
-
<tr bgcolor="#ffffff">
|
|
146
|
-
<td class="flagText" style="padding-left:30px;line-height: 24px;">No of Flags :</td>
|
|
147
|
-
<td></td><td></td>
|
|
148
|
-
<td class="flagText">{{data.totalFlags}} (Question Flags: {{data.flagCount}}, Run AI Flags: {{data.runAICount}})</td>
|
|
149
|
-
</tr>
|
|
150
|
-
</table>
|
|
151
|
-
</td>
|
|
152
|
-
</tr>
|
|
153
|
-
{{/unless}}{{/unless}}
|
|
154
|
-
|
|
155
|
-
{{!-- ============ Tabular body for multi-checklist or multi-store ============ --}}
|
|
156
|
-
{{#if data.showTable}}
|
|
157
|
-
<tr>
|
|
158
|
-
<td align="center" bgcolor="#dbe5ea" style="padding:0 10px 0 10px">
|
|
159
|
-
<table align="center" bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;">
|
|
160
|
-
<tr>
|
|
161
|
-
<td style="padding:10px 30px 10px 30px;background-color:#ffffff;">
|
|
162
|
-
<table class="rfTable">
|
|
163
|
-
<thead>
|
|
164
|
-
<tr>
|
|
165
|
-
{{#if data.isMultiStore}}{{#unless data.isUserCoverage}}<th>{{data.subjectLabel}} Name</th>{{/unless}}{{/if}}
|
|
166
|
-
{{#unless data.isMultiStoreSingleChecklist}}<th>Checklist Name</th>{{/unless}}
|
|
167
|
-
<th>Last Submitted By</th>
|
|
168
|
-
<th>Last Submission Date</th>
|
|
169
|
-
<th>Total Recurring Flags</th>
|
|
170
|
-
</tr>
|
|
171
|
-
</thead>
|
|
172
|
-
<tbody>
|
|
173
|
-
{{#each data.rows}}
|
|
174
|
-
<tr>
|
|
175
|
-
{{#if ../data.isMultiStore}}{{#unless ../data.isUserCoverage}}<td>{{this.subjectName}}</td>{{/unless}}{{/if}}
|
|
176
|
-
{{#unless ../data.isMultiStoreSingleChecklist}}<td>{{this.checklistName}}</td>{{/unless}}
|
|
177
|
-
<td>{{this.lastSubmittedBy}}</td>
|
|
178
|
-
<td>{{this.lastSubmissionDate}}</td>
|
|
179
|
-
<td>{{this.totalFlags}} (Question Flags: {{this.flagCount}}, Run AI Flags: {{this.runAICount}})</td>
|
|
180
|
-
</tr>
|
|
181
|
-
{{/each}}
|
|
182
|
-
</tbody>
|
|
183
|
-
</table>
|
|
184
|
-
</td>
|
|
185
|
-
</tr>
|
|
186
|
-
</table>
|
|
187
|
-
</td>
|
|
188
|
-
</tr>
|
|
189
|
-
{{/if}}
|
|
190
|
-
|
|
191
|
-
{{!-- View Flags button --}}
|
|
192
|
-
<tr>
|
|
193
|
-
<td align="center" bgcolor="#dbe5ea" style="padding:0 10px 0 10px">
|
|
194
|
-
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;">
|
|
195
|
-
<tr>
|
|
196
|
-
<td bgcolor="#ffffff" style="padding: 20px;padding-top:15px;padding-left:30px;">
|
|
197
|
-
<table border="0" cellpadding="0" cellspacing="0">
|
|
198
|
-
<tr>
|
|
199
|
-
<td align="center" bgcolor="#00A3FF" style="border-radius: 6px;height:50px;">
|
|
200
|
-
<a href="{{data.domain}}" target="_blank"
|
|
201
|
-
style="display: inline-block; padding: 16px 36px;font-size: 16px; color: #ffffff; text-decoration: none; border-radius: 6px;">
|
|
202
|
-
View Flags
|
|
203
|
-
</a>
|
|
204
|
-
</td>
|
|
205
|
-
</tr>
|
|
206
|
-
</table>
|
|
207
|
-
</td>
|
|
208
|
-
</tr>
|
|
209
|
-
</table>
|
|
210
|
-
</td>
|
|
211
|
-
</tr>
|
|
212
|
-
|
|
213
|
-
{{!-- Attachment hint when full data exceeds inline limit --}}
|
|
214
|
-
{{#if data.hasAttachment}}
|
|
215
|
-
<tr>
|
|
216
|
-
<td align="center" bgcolor="#dbe5ea" style="padding:0 10px 0 10px">
|
|
217
|
-
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;">
|
|
218
|
-
<tr>
|
|
219
|
-
<td bgcolor="#ffffff" style="padding:0 30px 15px 30px;font-size:13px;color:#202B3C;">
|
|
220
|
-
Refer to the attached file for a detailed breakdown of the Full report
|
|
221
|
-
</td>
|
|
222
|
-
</tr>
|
|
223
|
-
</table>
|
|
224
|
-
</td>
|
|
225
|
-
</tr>
|
|
226
|
-
{{/if}}
|
|
227
|
-
|
|
228
|
-
<tr>
|
|
229
|
-
<td align="center" bgcolor="#dbe5ea" style="padding:0 10px 32px 10px;">
|
|
230
|
-
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;">
|
|
231
|
-
<tr>
|
|
232
|
-
<td style="background-color: #ffffff;padding-left: 30px;padding-right: 24px;padding-top:5px">
|
|
233
|
-
<div style="font-size: 12px;color: #202B3C;font-weight: 400;line-height: 150%;">
|
|
234
|
-
<p>If you have any questions or need assistance, please reach out to us at support@tangotech.co.in.</p>
|
|
235
|
-
</div>
|
|
236
|
-
</td>
|
|
237
|
-
</tr>
|
|
238
|
-
<tr>
|
|
239
|
-
<td style="background-color: #ffffff;padding-left: 30px;padding-right: 24px;padding-bottom:15px">
|
|
240
|
-
<div style="font-size: 12px;color: #202B3C;font-weight: 400;line-height: 150%;">
|
|
241
|
-
<p>© Tango Eye. All rights reserved.</p>
|
|
242
|
-
</div>
|
|
243
|
-
</td>
|
|
244
|
-
</tr>
|
|
245
|
-
</table>
|
|
246
|
-
</td>
|
|
247
|
-
</tr>
|
|
248
|
-
</table>
|
|
249
|
-
</body>
|
|
250
|
-
</html>
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
7
|
+
<title>Recurring Flags Detected</title>
|
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
9
|
+
<style type="text/css">
|
|
10
|
+
body { font-family: "Inter", sans-serif !important; }
|
|
11
|
+
body, table, td, a { -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; }
|
|
12
|
+
table, td { mso-table-rspace: 0pt; mso-table-lspace: 0pt; }
|
|
13
|
+
img { -ms-interpolation-mode: bicubic; }
|
|
14
|
+
a[x-apple-data-detectors] {
|
|
15
|
+
font-family: "inherit" !important;
|
|
16
|
+
font-size: inherit !important;
|
|
17
|
+
font-weight: inherit !important;
|
|
18
|
+
line-height: inherit !important;
|
|
19
|
+
color: inherit !important;
|
|
20
|
+
text-decoration: none !important;
|
|
21
|
+
}
|
|
22
|
+
body { width: 100% !important; height: 100% !important; padding: 0 !important; margin: 0 !important; }
|
|
23
|
+
table { border-collapse: collapse !important; }
|
|
24
|
+
a { color: #1a82e2; }
|
|
25
|
+
img { height: auto; line-height: 100%; text-decoration: none; border: 0; outline: none; }
|
|
26
|
+
.flagText { font-size: 16px; font-weight: 600; line-height: 24px; text-align: left; }
|
|
27
|
+
.rfTable { width: 100%; border-collapse: collapse; }
|
|
28
|
+
.rfTable th, .rfTable td {
|
|
29
|
+
border: 1px solid #E2E8F0;
|
|
30
|
+
padding: 8px 12px;
|
|
31
|
+
font-size: 13px;
|
|
32
|
+
text-align: left;
|
|
33
|
+
color: #202B3C;
|
|
34
|
+
}
|
|
35
|
+
.rfTable th { background-color: #F1F5F9; font-weight: 600; }
|
|
36
|
+
.highlight { font-size: 14px; color: #202B3C; line-height: 22px; }
|
|
37
|
+
</style>
|
|
38
|
+
</head>
|
|
39
|
+
|
|
40
|
+
<body style="background-color: #dbe5ea;">
|
|
41
|
+
<div class="preheader" style="display: none; max-width: 0; max-height: 0; overflow: hidden; font-size: 1px; line-height: 1px; color: #fff; opacity: 0;">
|
|
42
|
+
Recurring Flags Detected
|
|
43
|
+
</div>
|
|
44
|
+
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-left:10px;padding-right:10px">
|
|
45
|
+
<tr>
|
|
46
|
+
<td bgcolor="#dbe5ea" style="padding:32px 10px 0 10px">
|
|
47
|
+
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;" align="center">
|
|
48
|
+
<tr>
|
|
49
|
+
<td style="margin-top: 0px;margin-bottom: 0px;font-size: 16px;line-height: 24px;background-color: #ffffff;padding-left: 18px;padding-right: 24px;padding-top: 24px;padding-bottom: 24px;">
|
|
50
|
+
<p style="margin-top: 0px;margin-bottom: 0px;">
|
|
51
|
+
<a href="https://tangoeye.ai/" style="text-decoration: none;outline: none;color: #ffffff;">
|
|
52
|
+
<img src="https://devtangoretail-api.tangoeye.ai/logo.png" width="200" height="100" alt="TangoEye"
|
|
53
|
+
style="-ms-interpolation-mode: bicubic;vertical-align: middle;border: 0;line-height: 100%;height: auto;outline: none;text-decoration: none;">
|
|
54
|
+
</a>
|
|
55
|
+
</p>
|
|
56
|
+
</td>
|
|
57
|
+
</tr>
|
|
58
|
+
<tr>
|
|
59
|
+
<td align="left" bgcolor="#ffffff" style="padding-left: 30px;padding-right: 24px;font-size: 14px; line-height: 24px;">
|
|
60
|
+
<p style="width: 624px;height: 0px;border: 1px solid #CBD5E1;flex: none;order: 1;flex-grow: 0;"></p>
|
|
61
|
+
</td>
|
|
62
|
+
</tr>
|
|
63
|
+
|
|
64
|
+
{{!-- Intro line --}}
|
|
65
|
+
<tr>
|
|
66
|
+
<td style="background-color: #ffffff;padding-left: 30px;padding-right: 24px;padding-bottom: 10px;">
|
|
67
|
+
<div style="margin-top: 0px;margin-bottom: 0px;font-size: 16px;line-height: 28px;color: #82899a;">
|
|
68
|
+
<span style="font-weight: 400;color: #121A26;line-height: 140%;">
|
|
69
|
+
Hi,<br/>
|
|
70
|
+
{{#if data.isMultiStoreSingleChecklist}}
|
|
71
|
+
Recurring flags has been detected across multiple {{data.subjectLabelPluralLower}} in recent <b>{{data.checklistName}}</b> on recent submissions, exceeding the configured threshold of {{data.threshold}} occurrences.
|
|
72
|
+
{{else if data.isMultiStore}}
|
|
73
|
+
Recurring flags has been detected across multiple {{data.subjectLabelPluralLower}} and across multiple checklists on recent submissions, exceeding the configured threshold of {{data.threshold}} occurrences.
|
|
74
|
+
{{else if data.isMultiChecklist}}
|
|
75
|
+
A Recurring flags has been identified for {{data.subjectLabelLower}} <b>{{data.subjectName}}</b> across multiple checklists on recent submissions, exceeding the configured threshold of {{data.threshold}} occurrences.
|
|
76
|
+
{{else}}
|
|
77
|
+
A recurring flag has been identified for {{data.subjectLabelLower}} <b>{{data.subjectName}}</b>.where a question has been flagged multiple times in recent {{data.checklistName}} submissions, exceeding the configured threshold of {{data.threshold}} occurrences.
|
|
78
|
+
{{/if}}
|
|
79
|
+
</span>
|
|
80
|
+
</div>
|
|
81
|
+
</td>
|
|
82
|
+
</tr>
|
|
83
|
+
|
|
84
|
+
{{!-- Multi-store: Key Highlights --}}
|
|
85
|
+
{{#if data.isMultiStore}}
|
|
86
|
+
<tr>
|
|
87
|
+
<td style="background-color: #ffffff;padding-left: 30px;padding-right: 24px;padding-bottom: 10px;">
|
|
88
|
+
<div class="highlight">
|
|
89
|
+
<b>Key Highlights:</b>
|
|
90
|
+
<ul style="margin:8px 0 0 0;padding-left:18px;">
|
|
91
|
+
<li>Total {{data.subjectLabelPlural}} with Recurring Flags: {{data.highlights.totalSubjects}}</li>
|
|
92
|
+
{{#unless data.isMultiStoreSingleChecklist}}
|
|
93
|
+
<li>Total Checklists with Recurring Flags: {{data.highlights.totalChecklists}}</li>
|
|
94
|
+
{{/unless}}
|
|
95
|
+
<li>Total Recurring Flags: {{data.highlights.totalFlags}}</li>
|
|
96
|
+
</ul>
|
|
97
|
+
</div>
|
|
98
|
+
</td>
|
|
99
|
+
</tr>
|
|
100
|
+
{{/if}}
|
|
101
|
+
|
|
102
|
+
{{!-- Section header for details --}}
|
|
103
|
+
<tr>
|
|
104
|
+
<td style="background-color: #ffffff;padding-left: 30px;padding-right: 24px;padding-bottom: 10px;">
|
|
105
|
+
<div style="font-size: 16px;line-height: 28px;color: #121A26;font-weight:600;">
|
|
106
|
+
{{#if data.isMultiStore}}
|
|
107
|
+
Details of the Recurring Flags are as follows:
|
|
108
|
+
{{else if data.isMultiChecklist}}
|
|
109
|
+
Details of the Recurring Flags from {{data.subjectLabel}} {{data.subjectName}} are as follows:
|
|
110
|
+
{{else}}
|
|
111
|
+
Details of the Recurring Flags from checklist are as follows:
|
|
112
|
+
{{/if}}
|
|
113
|
+
</div>
|
|
114
|
+
</td>
|
|
115
|
+
</tr>
|
|
116
|
+
</table>
|
|
117
|
+
</td>
|
|
118
|
+
</tr>
|
|
119
|
+
|
|
120
|
+
{{!-- ============ Single store + single checklist body ============ --}}
|
|
121
|
+
{{#unless data.isMultiChecklist}}{{#unless data.isMultiStore}}
|
|
122
|
+
<tr>
|
|
123
|
+
<td align="center" bgcolor="#dbe5ea" style="padding:0 10px 0 10px">
|
|
124
|
+
<table align="center" bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;">
|
|
125
|
+
<tr bgcolor="#ffffff">
|
|
126
|
+
<td class="flagText" style="padding-left:30px;line-height: 24px;color:#000000">{{data.subjectLabel}} Name :</td>
|
|
127
|
+
<td></td><td></td>
|
|
128
|
+
<td class="flagText">{{data.subjectName}}</td>
|
|
129
|
+
</tr>
|
|
130
|
+
<tr bgcolor="#ffffff">
|
|
131
|
+
<td class="flagText" style="padding-left:30px;line-height: 24px;">Checklist Name :</td>
|
|
132
|
+
<td></td><td></td>
|
|
133
|
+
<td class="flagText">{{data.checklistName}}</td>
|
|
134
|
+
</tr>
|
|
135
|
+
<tr bgcolor="#ffffff">
|
|
136
|
+
<td class="flagText" style="padding-left:30px;line-height: 24px;">Last Submitted By :</td>
|
|
137
|
+
<td></td><td></td>
|
|
138
|
+
<td class="flagText">{{data.lastSubmittedBy}}</td>
|
|
139
|
+
</tr>
|
|
140
|
+
<tr bgcolor="#ffffff">
|
|
141
|
+
<td class="flagText" style="padding-left:30px;line-height: 24px;">Last Submission Date :</td>
|
|
142
|
+
<td></td><td></td>
|
|
143
|
+
<td class="flagText">{{data.lastSubmissionDate}}</td>
|
|
144
|
+
</tr>
|
|
145
|
+
<tr bgcolor="#ffffff">
|
|
146
|
+
<td class="flagText" style="padding-left:30px;line-height: 24px;">No of Flags :</td>
|
|
147
|
+
<td></td><td></td>
|
|
148
|
+
<td class="flagText">{{data.totalFlags}} (Question Flags: {{data.flagCount}}, Run AI Flags: {{data.runAICount}})</td>
|
|
149
|
+
</tr>
|
|
150
|
+
</table>
|
|
151
|
+
</td>
|
|
152
|
+
</tr>
|
|
153
|
+
{{/unless}}{{/unless}}
|
|
154
|
+
|
|
155
|
+
{{!-- ============ Tabular body for multi-checklist or multi-store ============ --}}
|
|
156
|
+
{{#if data.showTable}}
|
|
157
|
+
<tr>
|
|
158
|
+
<td align="center" bgcolor="#dbe5ea" style="padding:0 10px 0 10px">
|
|
159
|
+
<table align="center" bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;">
|
|
160
|
+
<tr>
|
|
161
|
+
<td style="padding:10px 30px 10px 30px;background-color:#ffffff;">
|
|
162
|
+
<table class="rfTable">
|
|
163
|
+
<thead>
|
|
164
|
+
<tr>
|
|
165
|
+
{{#if data.isMultiStore}}{{#unless data.isUserCoverage}}<th>{{data.subjectLabel}} Name</th>{{/unless}}{{/if}}
|
|
166
|
+
{{#unless data.isMultiStoreSingleChecklist}}<th>Checklist Name</th>{{/unless}}
|
|
167
|
+
<th>Last Submitted By</th>
|
|
168
|
+
<th>Last Submission Date</th>
|
|
169
|
+
<th>Total Recurring Flags</th>
|
|
170
|
+
</tr>
|
|
171
|
+
</thead>
|
|
172
|
+
<tbody>
|
|
173
|
+
{{#each data.rows}}
|
|
174
|
+
<tr>
|
|
175
|
+
{{#if ../data.isMultiStore}}{{#unless ../data.isUserCoverage}}<td>{{this.subjectName}}</td>{{/unless}}{{/if}}
|
|
176
|
+
{{#unless ../data.isMultiStoreSingleChecklist}}<td>{{this.checklistName}}</td>{{/unless}}
|
|
177
|
+
<td>{{this.lastSubmittedBy}}</td>
|
|
178
|
+
<td>{{this.lastSubmissionDate}}</td>
|
|
179
|
+
<td>{{this.totalFlags}} (Question Flags: {{this.flagCount}}, Run AI Flags: {{this.runAICount}})</td>
|
|
180
|
+
</tr>
|
|
181
|
+
{{/each}}
|
|
182
|
+
</tbody>
|
|
183
|
+
</table>
|
|
184
|
+
</td>
|
|
185
|
+
</tr>
|
|
186
|
+
</table>
|
|
187
|
+
</td>
|
|
188
|
+
</tr>
|
|
189
|
+
{{/if}}
|
|
190
|
+
|
|
191
|
+
{{!-- View Flags button --}}
|
|
192
|
+
<tr>
|
|
193
|
+
<td align="center" bgcolor="#dbe5ea" style="padding:0 10px 0 10px">
|
|
194
|
+
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;">
|
|
195
|
+
<tr>
|
|
196
|
+
<td bgcolor="#ffffff" style="padding: 20px;padding-top:15px;padding-left:30px;">
|
|
197
|
+
<table border="0" cellpadding="0" cellspacing="0">
|
|
198
|
+
<tr>
|
|
199
|
+
<td align="center" bgcolor="#00A3FF" style="border-radius: 6px;height:50px;">
|
|
200
|
+
<a href="{{data.domain}}" target="_blank"
|
|
201
|
+
style="display: inline-block; padding: 16px 36px;font-size: 16px; color: #ffffff; text-decoration: none; border-radius: 6px;">
|
|
202
|
+
View Flags
|
|
203
|
+
</a>
|
|
204
|
+
</td>
|
|
205
|
+
</tr>
|
|
206
|
+
</table>
|
|
207
|
+
</td>
|
|
208
|
+
</tr>
|
|
209
|
+
</table>
|
|
210
|
+
</td>
|
|
211
|
+
</tr>
|
|
212
|
+
|
|
213
|
+
{{!-- Attachment hint when full data exceeds inline limit --}}
|
|
214
|
+
{{#if data.hasAttachment}}
|
|
215
|
+
<tr>
|
|
216
|
+
<td align="center" bgcolor="#dbe5ea" style="padding:0 10px 0 10px">
|
|
217
|
+
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;">
|
|
218
|
+
<tr>
|
|
219
|
+
<td bgcolor="#ffffff" style="padding:0 30px 15px 30px;font-size:13px;color:#202B3C;">
|
|
220
|
+
Refer to the attached file for a detailed breakdown of the Full report
|
|
221
|
+
</td>
|
|
222
|
+
</tr>
|
|
223
|
+
</table>
|
|
224
|
+
</td>
|
|
225
|
+
</tr>
|
|
226
|
+
{{/if}}
|
|
227
|
+
|
|
228
|
+
<tr>
|
|
229
|
+
<td align="center" bgcolor="#dbe5ea" style="padding:0 10px 32px 10px;">
|
|
230
|
+
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px;">
|
|
231
|
+
<tr>
|
|
232
|
+
<td style="background-color: #ffffff;padding-left: 30px;padding-right: 24px;padding-top:5px">
|
|
233
|
+
<div style="font-size: 12px;color: #202B3C;font-weight: 400;line-height: 150%;">
|
|
234
|
+
<p>If you have any questions or need assistance, please reach out to us at support@tangotech.co.in.</p>
|
|
235
|
+
</div>
|
|
236
|
+
</td>
|
|
237
|
+
</tr>
|
|
238
|
+
<tr>
|
|
239
|
+
<td style="background-color: #ffffff;padding-left: 30px;padding-right: 24px;padding-bottom:15px">
|
|
240
|
+
<div style="font-size: 12px;color: #202B3C;font-weight: 400;line-height: 150%;">
|
|
241
|
+
<p>© Tango Eye. All rights reserved.</p>
|
|
242
|
+
</div>
|
|
243
|
+
</td>
|
|
244
|
+
</tr>
|
|
245
|
+
</table>
|
|
246
|
+
</td>
|
|
247
|
+
</tr>
|
|
248
|
+
</table>
|
|
249
|
+
</body>
|
|
250
|
+
</html>
|