· 5 years ago · Jul 06, 2020, 06:00 PM
1@model SupportWebTools.Models.KioskViewModels.KioskViewModel
2@{
3 ViewData["Title"] = Model.SerialNumber;
4
5}
6<div class="wrapper wrapper-content animated fadeIn">
7 <div class="row">
8 @*main row*@
9 <div class="col-lg-8">
10 <div class="p-w-md m-b-sm">
11 <div class="row">
12 <div class="col-sm-4">
13 <span class="badge @ViewBag.StatusColor">@ViewBag.KioskStatus</span>
14
15 @if (!Model.isV5)
16 {
17 <small class="m-l-sm tooltip-demo text-navy">
18 <a href="#" data-html="true" data-toggle="tooltip" data-placement="right" title="Valet: @Model.valetVersion<br />Sync: @Model.syncVersion" style="color:inherit; text-decoration: none;">@Model.valetVersion</a>
19 </small>
20 }
21 else if (Model.HwType != "NANO" && Model.HwType != "PICO")
22 {
23 <small class="m-l-sm tooltip-demo text-navy">
24 <a href="#" data-html="true" data-toggle="tooltip" data-placement="right"
25 title="KSK API:@ViewBag.KskAPIVersion<br/>Pay API:@ViewBag.PayAPIVersion<br />Caps API:@ViewBag.CapAPIVersion<br />Print API:@ViewBag.PrintAPIVersion"
26 style="color:@ViewBag.ApiColor; text-decoration: none;">@Model.valetVersion</a>
27 </small>
28 }
29
30
31 <h2 class="m-b-xs m-t-sm">@Model.LocationName</h2>
32 <h4>@Model.CustomerName</h4>
33 @if (!Model.isV5)
34 {
35 <b>DB:</b> @ViewBag.Database
36 <br />
37 }
38 else
39 {
40 @if (Model.isV5 == true && Model.HwType != "NANO" && Model.Type != "VALET" && Model.HwType != "PICO")
41 {
42 <span><b>IP:</b> @ViewBag.V5IP </span>
43 <br />
44 }
45 else if (Model.HwType == "NANO" || Model.HwType == "PICO")
46 {
47 <span><b>Serial:</b> @Model.TabSerial</span>
48 <br />
49 }
50 }
51 <br />
52 <a href="#" data-toggle="modal" data-target="#addressModel" style="color:inherit; text-decoration: none;">
53 @Model.Address<br />
54 @Model.City @Model.State @Model.ZipCode
55 </a>
56 <br />
57 <br />
58 <h5>Live Since:</h5>
59 <h2 class="m-t-xs">@Model.GoLiveDate.ToShortDateString()</h2>
60
61 <div class="modal inmodal" id="addressModel" tabindex="-1" role="dialog" aria-hidden="true" style="display: none;">
62 <div class="modal-dialog">
63 <div class="modal-content animated bounceInRight">
64 <div class="modal-header">
65 <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
66 <h4 class="modal-title" id="timezone"></h4>
67 <small class="font-bold">
68 @Model.Address<br />
69 @Model.City @Model.State @Model.ZipCode
70 </small>
71 </div>
72 <div class="modal-body">
73 <div class="google-map" id="map1"></div>
74 </div>
75 <div class="modal-footer">
76 <button type="button" class="btn btn-white" data-dismiss="modal">Close</button>
77 </div>
78 </div>
79 </div>
80 </div>
81 </div>
82 <div class="col-sm-4 m-b-md">
83 <div class="CenterPhone kioskImage">
84 <img src="@ViewBag.KioskImageUrl" style="margin-bottom: 4px; height: 180px" /><br />
85 <span class="label" style="font-size: 100%; display:inline-block">@Model.SerialNumber</span><br />
86
87 @if (!Model.isV5 && (Model.SerialNumber.Contains("VSH310") || Model.SerialNumber.Contains("VSH300")))
88 {
89 <b>NON-SERVICEABLE</b><br />
90 }
91
92 @if (!Model.isV5)
93 {
94 <b>Market ID : </b> @ViewBag.storeId<br />
95 }
96 else
97 {
98 if (Model.HwType == "PICO")
99 {
100 <span><b>Kiosk Type : </b> PICO</span>
101 }
102 else if (Model.HwType == "NANO")
103 {
104 <span><b>Kiosk Type : </b> NANO</span>
105 }
106 else if (Model.Type == "VALET")
107 {
108 <span><b>Kiosk Type : </b> Valet to ADM</span>
109 }
110 else
111 {
112 <span><b>Kiosk Type : </b> @ViewBag.v5Type</span><br />
113 }
114 }
115 </div>
116 </div>
117
118 <div class="col-sm-4 m-b-md">
119 <div class="row m-t-xs">
120 <div class="col-xs-6">
121 <h5 class="m-b-xs">Credit Sales</h5>
122 <h1 class="no-margins">@Model.CreditSalesToday</h1>
123 <div class="font-bold text-navy" data-toggle="tooltip" data-placement="left" title="" data-original-title="Tooltip on left">
124 <div class="@ViewBag.TextColor">@ViewBag.input @ViewBag.Time<i class="@ViewBag.Icon"></i></div>
125 </div>
126 </div>
127 <div class="col-xs-6">
128 @if(!Model.isV5)
129 {
130 <h5 class="m-b-xs">Fingerprint Sales</h5>
131 }
132 else{
133 <h5 class="m-b-xs">Account Sales</h5>
134 }
135 <h1 class="no-margins">@ViewBag.TotalFingerPrintSales</h1>
136 <div class="@ViewBag.FingerprintTextColor">@ViewBag.FingerprintInput @ViewBag.FingerprintTime<i class="@ViewBag.FingerprintIcon"></i></div>
137 </div>
138 </div>
139 <br />
140 <div class="row m-t-xs">
141 <div class="col-xs-6">
142 <h5 class="m-b-xs">Bills Inserted</h5>
143 <h1 class="no-margins">@ViewBag.TotalBillsInsertedToday</h1>
144 <div class="@ViewBag.BillsInsertedTextColor">@ViewBag.BillsInsertedInput @ViewBag.BillsInsertedTime <i class="@ViewBag.BillsInsertedIcon"></i></div>
145 </div>
146 <div class="col-xs-6">
147 <h5 class="m-b-xs">Items Sold</h5>
148 <h1 class="no-margins">@Model.ItemsScannedToday</h1>
149 <div class="font-bold @ViewBag.LastSaleTextColor">@ViewBag.LastSaleInput @ViewBag.LastSaleTimeFormat<i class="@ViewBag.LastSaleIcon"></i></div>
150
151 </div>
152 </div>
153 </div>
154 </div>
155 </div>
156 <div class="row">
157 @if (Model.Type != "VALET")
158 {
159 <div class="col-lg-3 col-md-6">
160 <div class="ibox float-e-margins">
161 <div class="ibox-title">
162 <i class="@ViewBag.SyncIcon pull-right @ViewBag.SyncColor"></i>
163 <h5>Last Sync</h5>
164 </div>
165 <div class="ibox-content">
166 <h1 class="no-margins">@ViewBag.LastSync</h1>
167 <div class="stat-percent font-bold text-danger"></div>
168 <div class="stat-percent @ViewBag.LastSyncTextColor">@ViewBag.LastSyncInput @ViewBag.LastSyncTimeFormat</div>
169 <small>@ViewBag.SyncStatus</small>
170 </div>
171 </div>
172 </div>
173 }
174 <div class="col-lg-3 col-md-6">
175 <div class="ibox float-e-margins">
176 <div class="ibox-title">
177 <i class="@ViewBag.LastSaleIcon pull-right @ViewBag.LastSaleTextColor"></i>
178 <h5>Last Sale</h5>
179 </div>
180 <div class="ibox-content">
181 <h1 class="no-margins">@ViewBag.LastSaleTime</h1>
182 <div class="stat-percent @ViewBag.LastSaleTextColor">@ViewBag.LastSaleInput @ViewBag.LastSaleTimeFormat</div>
183 <small>$@Model.LastSaleTotal</small>
184 </div>
185 </div>
186 </div>
187 @if (!Model.isV5)
188 {
189 <div class="col-lg-3 col-md-6">
190 <div class="ibox float-e-margins">
191 <div class="ibox-title">
192 <i class="@ViewBag.BatchIcon pull-right @ViewBag.BatchColor"></i>
193 <h5>Last Batch</h5>
194 </div>
195 <div class="ibox-content">
196 <h1 class="no-margins">@ViewBag.LastBatchDate</h1>
197
198 <small>@Model.LastBatchStatus</small>
199 </div>
200 </div>
201 </div>
202 }
203 else
204 {
205 if (@Model.HwType == "NANO" || Model.HwType == "PICO")
206 {
207 <div class="col-lg-3 col-md-6">
208 <div class="ibox float-e-margins">
209 <div class="ibox-title">
210 <i class="@ViewBag.BatchIcon pull-right @ViewBag.BatchColor"></i>
211 <h5>Stuck Transactions</h5>
212 </div>
213 <div class="ibox-content">
214 <h1 class="no-margins">@ViewBag.LastBatchDate</h1>
215
216 <small>@Model.LastBatchStatus</small>
217 </div>
218 </div>
219 </div>
220 }
221 else
222 {
223 if (Model.Type != "VALET")
224 {
225 <div class="col-lg-3 col-md-6">
226 <div class="ibox float-e-margins">
227 <div class="ibox-title">
228 <i class="@ViewBag.TransIcon pull-right @ViewBag.TransColor"></i>
229 <h5>Stuck Transactions</h5>
230 </div>
231 <div class="ibox-content">
232 <h1 class="no-margins">@ViewBag.StuckTransactions</h1>
233
234 <small>@ViewBag.StuckTransactionStatus</small>
235 </div>
236 </div>
237 </div>
238 }
239 //need to add extra square here for VALET>ADM kiosks
240 }
241 }
242 <div class="col-lg-3 col-md-6">
243 <div class="ibox float-e-margins">
244 <div class="ibox-title">
245 <i class="@ViewBag.InvIcon pull-right @ViewBag.InvIconColor"></i>
246 <h5>Last Inventory</h5>
247 </div>
248 <div class="ibox-content">
249 <h1 class="no-margins">
250 <large>@ViewBag.LastInventory</large>
251 </h1>
252
253 <small>@ViewBag.LastInvType</small>
254 </div>
255 </div>
256 </div>
257 </div>
258 <div class="row hidden-xs">
259 <div class="col-lg-12">
260 <div class="ibox float-e-margins " id="TransChart">
261 <div class="ibox-content sk-loading">
262 <div>
263 <span class="pull-right text-right ">
264 <small>Below is an analysis of today's transactional data compared to</small>
265 <br />
266 <small>this day last week</small>
267 </span>
268 <h3 class="font-bold no-margins">
269 Transactional Analysis
270 </h3>
271 <small>Kiosk Sales</small>
272 </div>
273 <div class="sk-spinner sk-spinner-three-bounce">
274 <div class="sk-bounce1"></div>
275 <div class="sk-bounce2"></div>
276 <div class="sk-bounce3"></div>
277 </div>
278 <div class="m-t-sm">
279 <div class="row">
280 <div class="col-md-8 " >
281 <div>
282 <canvas id="lineChart" height="114">
283 </canvas>
284 </div>
285 </div>
286 <div class="col-md-4">
287 <ul class="stat-list m-t-lg">
288 <li>
289 <h2 class="no-margins">@Model.SalesToday</h2>
290 <small>Total Transactions Today</small>
291 <div class="progress progress-mini">
292 <div class="progress-bar" style="width: @ViewBag.TotalTransactionPercent%"></div>
293 </div>
294 </li>
295 <li>
296 <h2 class="no-margins ">$@ViewBag.SaleTotalToday</h2>
297 <small>Total Transaction Amount</small>
298 <div class="progress progress-mini">
299 <div class="progress-bar" style="width: @ViewBag.TotalTransactionAmountPercent%;"></div>
300 </div>
301 </li>
302 </ul>
303 <button type="button" id="hourlyTransactionsButton" class="btn btn-primary btn-xs pull-right m-t-lg">Hourly Data</button>
304 </div>
305 </div>
306
307 </div>
308
309 <div class="m-t-md">
310 <small>
311 <strong>Analysis of sales:</strong> The above graph shows a daily count of transactions for the last week compared to the previous week.
312 </small>
313 </div>
314 </div>
315 </div>
316 </div>
317
318 </div>
319 </div>
320 <div class="col-lg-4">
321 <div class="row">
322 <div class="col-md-12">
323 <div class="ibox float-e-margins">
324 <div class="ibox-title">
325 <h5>Information</h5>
326 </div>
327 <div class="ibox-content">
328 <div class="row">
329 <div class="col-xs-4" style="text-align:center;">
330 <button type="button" class="btn btn-login pull-right kioskCopyData" id="CopyDataButton"> Copy Data</button>
331 </div>
332 <div class="col-xs-4" style="text-align:center;">
333 @if (Model.isV5)
334 {
335 <p>
336 <b>Managed in</b> : ADM
337 @if(Model.HwType != "NANO" && Model.HwType != "PICO" && ViewBag.DeploymentSet != null)
338 {
339 <br />
340 <span><b>Deployment Set</b> : @ViewBag.DeploymentSet</span>
341 <span><b>Last Updated</b> : @ViewBag.LastUpdated</span>
342 }
343 </p>
344 }
345 else
346 {
347 <p>Managed in :<br /> <b>SmartHQ</b></p>
348 }
349 </div>
350 <div class="col-xs-4" style="text-align:center;">
351 @if (Model.isV5)
352 {
353 <p>
354 Processor Info :<br />
355 <b>@Model.Processor1</b><br />
356 @if (Model.HwType == "PICO")
357 {
358 }
359 else
360 {
361 @if (Model.Processor1 == "Apriva")
362 {
363 <span>Terminal ID : </span>@Model.TerminalId<br />
364 }
365 else if (Model.Processor1 == "Heartland")
366 {
367 <span>Device ID : </span>@Model.DeviceId
368 }
369 }
370 </p>
371 }
372 else
373 {
374 <p>
375 Client Kiosks :
376 @if(Model.Clients.Count == 0)
377 {
378 <b>N/A</b><br />
379 }
380 else if (Model.Clients.Count > 0)
381 {
382 @foreach (string client in Model.Clients)
383 {
384 <b>@client</b><br />
385 }
386 }
387 </p>
388 }
389 </div>
390 </div>
391 @if(@ViewBag.v5Type == "V5_MQ")
392 {
393 <div class="row">
394 <div class="col-xs-3"></div>
395 <div class="col-xs-6" style="text-align:center;">
396 <b>V5_MQ Port Checks </b><i class="@ViewBag.MqIcon @ViewBag.MqColor"></i><br />
397 @foreach (string status in ViewBag.MqStatusText)
398 {
399 @status
400 <br />
401 }<i>(Beta)</i>
402 </div>
403 </div>
404 }
405 </div>
406 </div>
407 <div class="ibox float-e-margins" id="CaseSummary">
408 <div class="ibox-title" id="CaseSummaryHeading">
409 <h5 id="CaseSummaryHead">Case Summary</h5>
410 </div>
411 <div class="ibox-content sk-loading">
412 <div class="sk-spinner sk-spinner-three-bounce">
413 <div class="sk-bounce1"></div>
414 <div class="sk-bounce2"></div>
415 <div class="sk-bounce3"></div>
416 </div>
417 <div id="sparkline1" class="m-b-sm"></div>
418 <div class="row">
419 <div class="col-xs-4" style="text-align:center;">
420 <small class="stats-label">Cases Today</small>
421 <h3 id="CasesToday"></h3>
422 </div>
423 <div class="col-xs-4" style="text-align:center;">
424 <small class="stats-label">Total Open Cases</small>
425 <h3 id="OpenCases"></h3>
426 </div>
427 <div class="col-xs-4" style="text-align:center;">
428 <small class="stats-label">Total Cases</small>
429 <h3 id="TotalCases"></h3>
430 </div>
431 </div>
432 </div>
433 </div>
434 </div>
435 </div>
436 <div class="row">
437 <div class="col-lg-12">
438 <div class="ibox float-e-margins" id="CaseAnalysis">
439 <div class="ibox-title">
440 @*<span class="label label-warning pull-right">Data has changed</span>*@
441 <h5>Case Analysis</h5>
442 </div>
443 <div class="ibox-content no-padding sk-loading">
444 <div class="sk-spinner sk-spinner-three-bounce">
445 <div class="sk-bounce1"></div>
446 <div class="sk-bounce2"></div>
447 <div class="sk-bounce3"></div>
448 </div>
449 <div class="row">
450 <div class="col-sm-12">
451 <canvas id="doughnutChart" height="140"></canvas>
452 </div>
453 </div>
454 <ul class="list-group" id="caseAnalysisList">
455
456 </ul>
457 </div>
458 </div>
459 </div>
460 </div>
461 @*saving this section for integrations
462 <div class="row">
463 <div class="col-md-12">
464 <div class="ibox float-e-margins">
465 <div class="ibox-title">
466 <h5>Integrations</h5>
467 </div>
468 <div class="ibox-content sk-loading">
469 <div class="sk-spinner sk-spinner-three-bounce">
470 <div class="sk-bounce1"></div>
471 <div class="sk-bounce2"></div>
472 <div class="sk-bounce3"></div>
473 </div>
474 <div class="row">
475
476 </div>
477 </div>
478 </div>
479 </div>
480 </div>*@
481 </div>
482 </div>
483 <div class="row">
484 @if (!Model.isV5)
485 {
486
487 //if kiosk is in smarthq
488 <div class="col-lg-12">
489 <div class="tabs-container">
490 <ul class="nav nav-tabs">
491 <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">Sync Analysis</a></li>
492 <li class=""><a data-toggle="tab" href="#tab-8" id="syncErrorsTab" aria-expanded="true">Sync Errors</a></li>
493 <li class=""><a data-toggle="tab" href="#tab-2" id="batchTab" aria-expanded="false">Batch History</a></li>
494 <li class=""><a data-toggle="tab" href="#tab-3" id="inventoryTab" aria-expanded="false">Inventory Records</a></li>
495 <li class=""><a data-toggle="tab" href="#tab-4" id="rmaTab" aria-expanded="false">RMA</a></li>
496 <li class=""><a data-toggle="tab" href="#tab-10" id="rmaHistoryTab" aria-expanded="false">RMA History</a></li>
497 <li class=""><a data-toggle="tab" href="#tab-5" id="casesTab" aria-expanded="false">Cases</a></li>
498 <li class=""><a data-toggle="tab" href="#tab-6" id="salesForceCasesTab" aria-expanded="false">Salesforce Cases</a></li>
499 <li class=""><a data-toggle="tab" href="#tab-7" id="integrationsTab" aria-expanded="false">Integrations</a></li>
500 <li class=""><a data-toggle="tab" href="#tab-9" id="mslTab" aria-expanded="false">Linked Kiosks</a></li>
501
502 </ul>
503 <div class="tab-content">
504 <div id="tab-1" class="tab-pane active">
505 @Html.Partial("_SyncAnalysisKioskTab")
506 </div>
507 <div id="tab-8" class="tab-pane">
508 @Html.Partial("_SyncErrorsTab")
509 </div>
510 <div id="tab-2" class="tab-pane">
511 @Html.Partial("_BatchHistoryKioskTab")
512 </div>
513
514 <div id="tab-3" class="tab-pane">
515 @Html.Partial("_InventoryRecordsKioskTab")
516 </div>
517 <div id="tab-4" class="tab-pane">
518 @Html.Partial("_RMAKioskTab")
519 </div>
520 <div id="tab-10" class="tab-pane">
521 @Html.Partial("_HistoricalRMAKioskTab")
522 </div>
523 <div id="tab-5" class="tab-pane">
524 @Html.Partial("_ZenDeskKioskTab")
525 </div>
526 <div id="tab-6" class="tab-pane">
527 @Html.Partial("_SalesForceKioskTab")
528 </div>
529 <div id="tab-7" class="tab-pane">
530 @Html.Partial("_IntegrationsTab")
531 </div>
532 <div id="tab-9" class="tab-pane">
533 @Html.Partial("_MslKioskTab")
534 </div>
535 </div>
536 </div>
537 </div>
538 }
539 else
540 {
541 <div class="col-lg-12">
542 <div class="tabs-container">
543 <ul class="nav nav-tabs">
544 <li class="active"><a data-toggle="tab" href="#tab-1" id="badScansTab" aria-expanded="true">Bad Scans</a></li>
545 <li class=""><a data-toggle="tab" href="#tab-2" id="transactionsTab" aria-expanded="false">Transactions</a></li>
546 <li class=""><a data-toggle="tab" href="#tab-3" id="lightspeedTab" aria-expanded="false">Lightspeed Picklists</a></li>
547 <li class=""><a data-toggle="tab" href="#tab-4" id="rmaTab" aria-expanded="false">RMA</a></li>
548 <li class=""><a data-toggle="tab" href="#tab-5" id="rmaHistoryTab" aria-expanded="false">RMA History</a></li>
549 <li class=""><a data-toggle="tab" href="#tab-6" id="casesTab" aria-expanded="false">Cases</a></li>
550 <li class=""><a data-toggle="tab" href="#tab-7" id="salesForceCasesTab" aria-expanded="false">Salesforce Cases</a></li>
551 <li class=""><a data-toggle="tab" href="#tab-8" id="campusTab" aria-expanded="false">Connected Campus</a></li>
552 </ul>
553 <div class="tab-content">
554 <div id="tab-1" class="tab-pane active">
555 @Html.Partial("_V5BadScansTab")
556 </div>
557 <div id="tab-2" class="tab-pane">
558 @Html.Partial("_V5TransactionsTab")
559 </div>
560 <div id="tab-3" class="tab-pane">
561 @Html.Partial("_LightspeedTab")
562 </div>
563 <div id="tab-4" class="tab-pane">
564 @Html.Partial("_RMAKioskTab")
565 </div>
566 <div id="tab-5" class="tab-pane">
567 @Html.Partial("_HistoricalRMAKioskTab")
568 </div>
569 <div id="tab-6" class="tab-pane">
570 @Html.Partial("_ZenDeskKioskTab")
571 </div>
572 <div id="tab-7" class="tab-pane">
573 @Html.Partial("_SalesForceKioskTab")
574 </div>
575 <div id="tab-8" class="tab-pane">
576 @Html.Partial("_CampusTab")
577 </div>
578 </div>
579 </div>
580 </div>
581 }
582 </div>
583</div>
584
585<link rel="stylesheet" href="~/lib/daterangepicker/daterangepicker-bs3.css" />
586<link rel="stylesheet" href="~/lib_bower/toastr/toastr.min.css" />
587<link rel="stylesheet" href="~/lib_bower/bootstrap-datepicker/dist/css/bootstrap-datepicker3.css" />
588<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/bootstrap.daterangepicker/2/daterangepicker.css" />
589<link rel="stylesheet" href="~/lib/dataTables/datatables.min.css" />
590<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />
591<link rel="stylesheet" href="~/lib/iCheck/custom.css" />
592<link rel="stylesheet" href="~/lib/steps/jquery.steps.css" />
593<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
594<link rel="stylesheet" href="~/lib_bower/sweetalert/dist/sweetalert.css" />
595
596
597
598@section Scripts {
599<environment names="Development">
600
601 <script src="~/lib_bower/moment/moment.js"></script>
602 <script src="~/lib/daterangepicker/daterangepicker.js"></script>
603 <script src="~/lib_bower/bootstrap-datepicker/dist/js/bootstrap-datepicker.js"></script>
604 <script src="//cdn.jsdelivr.net/bootstrap.daterangepicker/2/daterangepicker.js"></script>
605 <script src="~/lib_bower/toastr/toastr.min.js"></script>
606 <script src="~/lib/flot/jquery.flot.js"></script>
607 <script src="~/lib/flot/jquery.flot.tooltip.min.js"></script>
608 <script src="~/lib/flot/jquery.flot.resize.js"></script>
609 <script src="~/lib/flot/jquery.flot.pie.js"></script>
610 <script src="~/lib/flot/jquery.flot.time.js"></script>
611 <script src="~/lib/flot/jquery.flot.spline.js"></script>
612 <script src="~/lib/chartJs/Chart.min.js"></script>
613 <script src="~/lib_bower/peity/jquery.peity.js"></script>
614 <script src="~/lib/sparkline/jquery.sparkline.min.js"></script>
615 <script src="~/lib_bower/moment/moment.js"></script>
616 <script src="~/lib/iCheck/icheck.min.js"></script>
617 <script src="~/lib/steps/jquery.steps.js"></script>
618 <script src="~/lib/validate/jquery.validate.min.js"></script>
619 <script src="~/lib/dataTables/datatables.min.js"></script>
620 <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
621 <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
622 <script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
623 <script src="~/lib_bower/sweetalert/dist/sweetalert-dev.js"></script>
624
625</environment>
626 }
627
628<environment names="Staging,Production">
629 <script src="~/lib_bower/toastr/toastr.min.js"></script>
630 <script src="~/lib/steps/jquery.steps.js"></script>
631 <script src="~/lib_bower/moment/moment.js"></script>
632 <script src="~/lib/daterangepicker/daterangepicker.js"></script>
633 <script src="~/lib_bower/bootstrap-datepicker/dist/js/bootstrap-datepicker.js"></script>
634 <script src="//cdn.jsdelivr.net/bootstrap.daterangepicker/2/daterangepicker.js"></script>
635 <script src="~/lib/flot/jquery.flot.js"></script>
636 <script src="~/lib/flot/jquery.flot.tooltip.min.js"></script>
637 <script src="~/lib/flot/jquery.flot.resize.js"></script>
638 <script src="~/lib/flot/jquery.flot.pie.js"></script>
639 <script src="~/lib/flot/jquery.flot.time.js"></script>
640 <script src="~/lib/flot/jquery.flot.spline.js"></script>
641 <script src="~/lib/chartJs/Chart.min.js"></script>
642 <script src="~/lib_bower/peity/jquery.peity.js"></script>
643 <script src="~/lib/validate/jquery.validate.min.js"></script>
644 <script src="~/lib/sparkline/jquery.sparkline.min.js"></script>
645 <script src="~/lib/dataTables/datatables.min.js"></script>
646 <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
647 <script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
648 <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
649 <script src="~/lib_bower/moment/moment.js"></script>
650 <script src="~/lib_bower/sweetalert/dist/sweetalert.min.js"></script>
651
652</environment>
653
654 @*Donut chart*@
655 <script type="text/javascript">
656 var start;
657 var end;
658
659
660
661
662 $(document).ready(function () {
663
664
665 });
666 </script>
667
668 @* Getting ticket information *@
669 <script type="text/javascript">
670
671 $(document).ready(function () {
672 $.fn.modal.Constructor.prototype.enforceFocus = function () { };
673
674 var isInsider = '@Model.IsInsider';
675
676 if (isInsider === "True") {
677 toastr.options.timeOut = 0;
678 toastr.options.closeButton = true;
679 toastr.error('This is a 365 Insider Kiosk.');
680 }
681
682
683 var offset = new Date().getTimezoneOffset();
684 console.log("Timezone : " + offset);
685 console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
686
687 $.ajax({
688 type: 'post',
689 url: '/Kiosk/TicketInfo',
690 data: { serialNumber: "@Model.SerialNumber" },
691 traditional: true,
692 async: true,
693 success: function (tickets) {
694 {
695 var values = [tickets.casesByMonthArray[5], tickets.casesByMonthArray[4], tickets.casesByMonthArray[3], tickets.casesByMonthArray[2], tickets.casesByMonthArray[1], tickets.casesByMonthArray[0]];
696 var months = tickets.monthArray;
697
698 $("#sparkline1").sparkline(values, {
699 type: 'line',
700 width: '100%',
701 height: '60',
702 lineColor: '#1ab394',
703 fillColor: "transparent",
704 tooltipFormat: '{{offset:offset}} {{value}}',
705 tooltipValueLookups: {
706 'offset': {
707 0: months[5] + " - " + tickets.casesByMonthArray[5],
708 1: months[4] + " - " + tickets.casesByMonthArray[4],
709 2: months[3] + " - " + tickets.casesByMonthArray[3],
710 3: months[2] + " - " + tickets.casesByMonthArray[2],
711 4: months[1] + " - " + tickets.casesByMonthArray[1],
712 5: months[0] + " - " + tickets.casesByMonthArray[0]
713 }
714 }
715 });
716 ticketData(tickets);
717
718 document.getElementById("TotalCases").textContent = tickets.count;
719 document.getElementById("OpenCases").textContent = tickets.openCases;
720 document.getElementById("CasesToday").textContent = tickets.casesToday;
721
722 $('#CaseSummary').children(".ibox-content").toggleClass('sk-loading');
723 var chartData = new Array();
724 var chartLabels = new Array();
725
726 $.each(tickets.caseTypes, function (i, caseType) {
727 if (i < 3) {
728
729 if (caseType.count > 0) {
730 $('#CaseAnalysis').removeClass("hidden");
731 }
732 $('#caseAnalysisList').append('<li class="list-group-item"><span class="badge badge-primary">' + caseType.count + '</span>' + caseType.type.replace(/\b\w/g, l => l.toUpperCase()) + '</li>');
733 chartLabels.push(tickets.caseTypes[i].type);
734 chartData.push(tickets.caseTypes[i].count);
735 }
736 });
737
738
739 var doughnutData = {
740 labels: chartLabels,
741 datasets: [{
742 data: chartData,
743 backgroundColor: ["#a3e1d4", "#dedede", "#b5b8cf", "#aeb7f9", "#d3fff4"]
744 }]
745 };
746 var doughnutOptions = {
747 responsive: true
748 };
749 var ctx4 = document.getElementById("doughnutChart").getContext("2d");
750 new Chart(ctx4, { type: 'doughnut', data: doughnutData, options: doughnutOptions });
751
752 if (tickets.openCases > 0) {
753 document.getElementById("CaseSummary").className = "panel panel-warning";
754 document.getElementById("CaseSummaryHeading").className = "panel-heading";
755 document.getElementById("CaseSummaryHead").style.fontSize = "14px";
756 }
757
758 $('#CaseAnalysis').children(".ibox-content").toggleClass('sk-loading');
759 }
760 }
761 });
762 });
763 </script>
764 @*Getting transaction analysis data*@
765<script type="text/javascript">
766 var lineData;
767 $(document).ready(function () {
768 $.ajax({
769 type: 'post',
770 url: '/Kiosk/TransactionAnalysis',
771 data: { locationId: "@ViewBag.LocationId", database: "@Html.Raw(@ViewBag.Database)", serialNumber : "@Model.SerialNumber",locationGUID:"@ViewBag.LocationGUID",isV5:"@Model.isV5"},
772 traditional: true,
773 success: function (result)
774 {
775 console.log(result);
776 if (result.dataGathered) {
777 lineData = {
778 labels: [result.day[1], result.day[2], result.day[3], result.day[4], result.day[5], result.day[6], result.day[0]],
779 datasets: [
780 {
781 label: "This week",
782 backgroundColor: "rgba(26,179,148,0.5)",
783 borderColor: "rgba(26,179,148,0.7)",
784 pointBackgroundColor: "rgba(26,179,148,1)",
785 pointBorderColor: "#fff",
786 data:[result.transactions[8], result.transactions[9], result.transactions[10], result.transactions[11], result.transactions[12], result.transactions[13], @Model.SalesToday]
787 },
788 {
789 label: "Last week",
790 backgroundColor: "rgba(220,220,220,0.5)",
791 borderColor: "rgba(220,220,220,1)",
792 pointBackgroundColor: "rgba(220,220,220,1)",
793 pointBorderColor: "#fff",
794 data: [result.transactions[1], result.transactions[2], result.transactions[3], result.transactions[4], result.transactions[5], result.transactions[6], result.transactions[7]]
795 }]
796 };
797 transData(lineData);
798 }
799 else {
800 alert('Error gathering transaction data.');
801 }
802 },
803 error: function () {
804 alert('error');
805 }
806 });
807
808 var isV5 = '@ViewBag.isV5';
809
810 $('#CopyDataButton').click(function () {
811
812 var copyData = "";
813
814 if (isV5 === "False") {
815 copyData = "";
816 copyData += 'Customer Database: @ViewBag.Database\n';
817 copyData += 'Location Name: @Model.LocationName\n';
818 copyData += 'Location ID: @ViewBag.LocationId\n';
819 copyData += 'Kiosk Serial: @Model.SerialNumber\n';
820 copyData += 'Machine Group: @ViewBag.GroupId\n';
821 copyData += 'Is Server: @ViewBag.IsMaster\n';
822 copyData += 'Valet Version: @Model.valetVersion\n';
823 copyData += 'GMA: @ViewBag.HasGma\n';
824 copyData += 'Heartland Direct: @ViewBag.HasHd\n';
825 ClipboardHelper.copyText(copyData);
826 }
827 else {
828 copyData = "";
829 copyData += 'Organization: @Model.CustomerName\n'
830 copyData += 'Location Name: @Model.LocationName\n';
831 copyData += 'Kiosk Serial: @Model.SerialNumber \n';
832 copyData += 'Customer Org GUID: @ViewBag.OrgGuid\n';
833 copyData += 'Location GUID: @ViewBag.LocationGUID\n';
834 @if(Model.HwType != "NANO" && Model.Type != "VALET" && Model.HwType != "PICO"){
835 @:copyData += 'IP Address: @ViewBag.V5IP\n';
836 @:copyData += 'KskAPI: @ViewBag.KskAPIVersion\n';
837 @:copyData += 'PayAPI: @ViewBag.PayAPIVersion\n';
838 @:copyData += 'PrintAPI: @ViewBag.PrintAPIVersion\n';
839 @:copyData += 'CapAPI: @ViewBag.CapAPIVersion\n';
840 }
841 @if (@ViewBag.DeploymentSet != null) {
842 @:copyData += 'Deployment Set: @ViewBag.DeploymentSet\n';
843 @:copyData += 'Last Updated: @ViewBag.LastUpdated\n';
844 }
845
846 ClipboardHelper.copyText(copyData);
847 }
848 });
849
850 });
851
852 var ClipboardHelper = {
853
854 copyElement: function ($element) {
855 this.copyText($element.text());
856 },
857 copyText: function (text) {
858 var $tempInput = $("<textarea>");
859 $("body").append($tempInput);
860 $tempInput.val(text).select();
861 document.execCommand("copy");
862 $tempInput.remove();
863 toastr.success('Information successfully copied.');
864 }
865 };
866
867
868 function transData(data) {
869 var lineOptions = {
870 responsive: true
871 };
872 var ctx = document.getElementById("lineChart").getContext("2d");
873 new Chart(ctx, { type: 'line', data: lineData, options: lineOptions });
874 $('#TransChart').children(".ibox-content").toggleClass('sk-loading');
875 }
876
877 function ticketData(data) {
878 var sparkResize;
879 $(window).resize(function (e) {
880 clearTimeout(sparkResize);
881 });
882 }
883</script>
884
885
886<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAxDh723TH-BezgAJUztP_-kvW8mdV2BCM"></script>
887
888<script type="text/javascript">
889 // When the window has finished loading google map
890 google.maps.event.addDomListener(window, 'load', init);
891
892 function init() {
893
894 var geocoder = new google.maps.Geocoder();
895 var address = "@Model.Address @Model.City @Model.State @Model.ZipCode";
896 var latitude;
897 var longitude;
898 var mapOptions1;
899
900 geocoder.geocode({ 'address': address }, function (results, status) {
901
902 if (status === google.maps.GeocoderStatus.OK) {
903 latitude = results[0].geometry.location.lat();
904 longitude = results[0].geometry.location.lng();
905 mapOptions1 = {
906 zoom: 11,
907 center: new google.maps.LatLng(latitude, longitude),
908 // Style for Google Maps
909 styles: [{ "featureType": "water", "stylers": [{ "saturation": 43 }, { "lightness": -11 }, { "hue": "#0088ff" }] }, { "featureType": "road", "elementType": "geometry.fill", "stylers": [{ "hue": "#ff0000" }, { "saturation": -100 }, { "lightness": 99 }] }, { "featureType": "road", "elementType": "geometry.stroke", "stylers": [{ "color": "#808080" }, { "lightness": 54 }] }, { "featureType": "landscape.man_made", "elementType": "geometry.fill", "stylers": [{ "color": "#ece2d9" }] }, { "featureType": "poi.park", "elementType": "geometry.fill", "stylers": [{ "color": "#ccdca1" }] }, { "featureType": "road", "elementType": "labels.text.fill", "stylers": [{ "color": "#767676" }] }, { "featureType": "road", "elementType": "labels.text.stroke", "stylers": [{ "color": "#ffffff" }] }, { "featureType": "poi", "stylers": [{ "visibility": "off" }] }, { "featureType": "landscape.natural", "elementType": "geometry.fill", "stylers": [{ "visibility": "on" }, { "color": "#b8cb93" }] }, { "featureType": "poi.park", "stylers": [{ "visibility": "on" }] }, { "featureType": "poi.sports_complex", "stylers": [{ "visibility": "on" }] }, { "featureType": "poi.medical", "stylers": [{ "visibility": "on" }] }, { "featureType": "poi.business", "stylers": [{ "visibility": "simplified" }] }]
910 };
911 var mapElement1 = document.getElementById('map1');
912 var map1 = new google.maps.Map(mapElement1, mapOptions1);
913
914 $('#LocationRows').on('dblclick', ('tr'), function () {
915 window.location.href = "/Kiosk/" + $(this).find("#serialNumberText").text();
916 });
917
918
919 var loc = latitude + ',' + longitude;
920 var targetDate = new Date() // Current date/time of user computer
921 var timestamp = targetDate.getTime() / 1000 + targetDate.getTimezoneOffset() * 60 // Current UTC date/time expressed as seconds since midnight, January 1, 1970 UTC
922 var apikey = 'AIzaSyAxDh723TH-BezgAJUztP_-kvW8mdV2BCM'
923 var apicall = 'https://maps.googleapis.com/maps/api/timezone/json?location=' + loc + '×tamp=' + timestamp + '&key=' + apikey
924
925 var xhr = new XMLHttpRequest() // create new XMLHttpRequest2 object
926 xhr.open('GET', apicall) // open GET request
927 xhr.onload = function () {
928 if (xhr.status === 200) { // if Ajax request successful
929 var output = JSON.parse(xhr.responseText) // convert returned JSON string to JSON object
930 if (output.status === 'OK') { // if API reports everything was returned successfully
931 var offsets = output.dstOffset * 1000 + output.rawOffset * 1000 // get DST and time zone offsets in milliseconds
932 var localdate = new Date(timestamp * 1000 + offsets) // Date object containing current time
933 var timezone = output.timeZoneName
934
935 document.getElementById("timezone").innerHTML = localdate.toLocaleTimeString() + ' (' + timezone + ')';
936 }
937 }
938 else {
939 alert('Request failed. Returned status of ' + xhr.status)
940 }
941 }
942 xhr.send() // send request
943 }
944 });
945 }
946</script>
947 <script>
948 if ($('#SyncTable').length > 0) {
949 Date.prototype.toDateInputValue = (function () {
950
951 var today = new Date();
952 return today.toLocaleDateString("en-US");
953 });
954
955 Date.prototype.toDateInputBatchValue = (function () {
956 var local = new Date();
957 local.setDate(local.getDate() - 14)
958 return local.toLocaleDateString("en-US");
959 });
960 }
961 else {
962 Date.prototype.toDateInputValue = (function () {
963
964 var today = new Date();
965 return today.toLocaleDateString("en-US");
966
967 });
968 }
969 </script>