Michele: view timbrature, model, controller
This commit is contained in:
parent
1f1f83fae7
commit
9e177436d5
@ -23,5 +23,10 @@ namespace VirtualTask.Controllers
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
public IActionResult VT_Page4()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
234
Controllers/TimbratureController.cs
Normal file
234
Controllers/TimbratureController.cs
Normal file
@ -0,0 +1,234 @@
|
||||
using ClosedXML.Excel;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Newtonsoft.Json;
|
||||
using VirtualTask.Models;
|
||||
using X.PagedList;
|
||||
|
||||
namespace VirtualTask.Controllers
|
||||
{
|
||||
public class TimbratureController : Controller
|
||||
{
|
||||
string apiUrl = string.Empty;
|
||||
string urlBase = string.Empty;
|
||||
string token = string.Empty;
|
||||
string tenant = string.Empty;
|
||||
string errMes = string.Empty;
|
||||
string admin = string.Empty;
|
||||
|
||||
HttpClient client;
|
||||
|
||||
private readonly IConfiguration _configuration;
|
||||
|
||||
public TimbratureController(IConfiguration configuration)
|
||||
{
|
||||
client = new HttpClient();
|
||||
_configuration = configuration;
|
||||
var key = _configuration["ApplicationInsights:rootUrlApi"];
|
||||
apiUrl = key;
|
||||
}
|
||||
|
||||
#region INDEX
|
||||
|
||||
public IActionResult Index(int id, int? page = 1)
|
||||
{
|
||||
SessionHelper helper = new SessionHelper(this);
|
||||
token = helper.GetStringValue("tok");
|
||||
|
||||
if (string.IsNullOrEmpty(token))
|
||||
{
|
||||
return RedirectToAction("Login2", "Login");
|
||||
}
|
||||
|
||||
apiUrl = helper.GetStringValue("apiUrl");
|
||||
admin = helper.GetStringValue("admin");
|
||||
ViewBag.Admin = admin;
|
||||
urlBase = apiUrl + "timbratureList";
|
||||
urlBase = urlBase + "?token=" + token;
|
||||
Uri baseAddress = new Uri(urlBase);
|
||||
client = new HttpClient();
|
||||
client.BaseAddress = baseAddress;
|
||||
|
||||
List<Timbratura> modelList = new List<Timbratura>();
|
||||
|
||||
HttpResponseMessage response = client.GetAsync(baseAddress).Result;
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
string data = response.Content.ReadAsStringAsync().Result;
|
||||
modelList = JsonConvert.DeserializeObject<List<Timbratura>>(data);
|
||||
|
||||
if (id != 0)
|
||||
{
|
||||
modelList = modelList.Where(s => s.id == id).ToList();
|
||||
ViewData["CurrentFilter"] = id;
|
||||
}
|
||||
else
|
||||
{
|
||||
ViewData["CurrentFilter"] = null;
|
||||
}
|
||||
if (page != null && page < 1)
|
||||
{
|
||||
page = 1;
|
||||
}
|
||||
|
||||
var pageSize = 10;
|
||||
|
||||
var shortLinks = modelList
|
||||
.OrderByDescending(s => s.id)
|
||||
.ToPagedList(page ?? 1, pageSize);
|
||||
|
||||
return View(shortLinks);
|
||||
}
|
||||
else
|
||||
{
|
||||
errMes = response.Content.ReadAsStringAsync().Result;
|
||||
helper.SetStringValue("errMsg", errMes);
|
||||
return RedirectToAction("Error");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion INDEX
|
||||
|
||||
#region DETAILS
|
||||
|
||||
public IActionResult Details(int id)
|
||||
{
|
||||
SessionHelper helper = new SessionHelper(this);
|
||||
|
||||
|
||||
token = helper.GetStringValue("tok");
|
||||
|
||||
apiUrl = helper.GetStringValue("apiUrl");
|
||||
admin = helper.GetStringValue("admin");
|
||||
ViewBag.Admin = admin;
|
||||
urlBase = apiUrl + "timbratureList";
|
||||
urlBase = urlBase + "?token=" + token;
|
||||
Uri baseAddress = new Uri(urlBase);
|
||||
client = new HttpClient();
|
||||
client.BaseAddress = baseAddress;
|
||||
|
||||
Timbratura rapp = new Timbratura();
|
||||
|
||||
List<Timbratura> modelList = new List<Timbratura>();
|
||||
|
||||
HttpResponseMessage response = client.GetAsync(baseAddress).Result;
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
string data = response.Content.ReadAsStringAsync().Result;
|
||||
modelList = JsonConvert.DeserializeObject<List<Timbratura>>(data);
|
||||
rapp = modelList.Where(x => x.id.Equals(id)).First();
|
||||
}
|
||||
else
|
||||
{
|
||||
errMes = response.Content.ReadAsStringAsync().Result;
|
||||
helper.SetStringValue("errMsg", errMes);
|
||||
return RedirectToAction("Error");
|
||||
}
|
||||
|
||||
return View(rapp);
|
||||
}
|
||||
|
||||
#endregion DETAILS
|
||||
|
||||
#region metodi interni
|
||||
|
||||
public IActionResult ExportExcel(int id)
|
||||
{
|
||||
SessionHelper helper = new SessionHelper(this);
|
||||
token = helper.GetStringValue("tok");
|
||||
if (string.IsNullOrEmpty(token))
|
||||
{
|
||||
return RedirectToAction("Login2", "Login");
|
||||
}
|
||||
|
||||
apiUrl = helper.GetStringValue("apiUrl");
|
||||
admin = helper.GetStringValue("admin");
|
||||
ViewBag.Admin = admin;
|
||||
urlBase = apiUrl + "timbratureList";
|
||||
urlBase = urlBase + "?token=" + token;
|
||||
Uri baseAddress = new Uri(urlBase);
|
||||
client = new HttpClient();
|
||||
client.BaseAddress = baseAddress;
|
||||
|
||||
List<Timbratura> modelList = new List<Timbratura>();
|
||||
|
||||
HttpResponseMessage response = client.GetAsync(baseAddress).Result;
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
string data = response.Content.ReadAsStringAsync().Result;
|
||||
|
||||
modelList = JsonConvert.DeserializeObject<List<Timbratura>>(data);
|
||||
|
||||
var workbook = new XLWorkbook();
|
||||
workbook.AddWorksheet("sheetName");
|
||||
var ws = workbook.Worksheet("sheetName");
|
||||
|
||||
int col = 1;
|
||||
|
||||
//Scrivo intestazioni colonne
|
||||
foreach (var item in modelList[0].GetType().GetProperties())
|
||||
{
|
||||
ws.Cell(1, col).Style = ws.Cell(1, col).Style.Font.SetBold();
|
||||
ws.Cell(1, col).Value = item.Name.ToString().Replace("_", " ").ToUpper();
|
||||
|
||||
col++;
|
||||
}
|
||||
|
||||
var row = 0;
|
||||
|
||||
foreach (var item in modelList)
|
||||
{
|
||||
var colonna = 1;
|
||||
//righe per ogni item nel modelList
|
||||
foreach (var prop in item.GetType().GetProperties())
|
||||
{
|
||||
//controllo se item null assegno stringa vuota
|
||||
//perchè se null da errore quando scrive l'excel
|
||||
if (prop.GetValue(item) != null)
|
||||
{
|
||||
ws.Cell(row + 2, colonna).Value = prop.GetValue(item).ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
ws.Cell(row + 2, colonna).Value = string.Empty;
|
||||
}
|
||||
colonna++;
|
||||
}
|
||||
|
||||
row++;
|
||||
}
|
||||
|
||||
//Salvo il file Excel
|
||||
var anno = DateTime.Now.Year.ToString();
|
||||
var mese = DateTime.Now.Month.ToString();
|
||||
var giorno = DateTime.Now.Day.ToString();
|
||||
var ore = DateTime.Now.Hour.ToString();
|
||||
var minuti = DateTime.Now.Minute.ToString();
|
||||
var secondi = DateTime.Now.Second.ToString();
|
||||
|
||||
var dateFile = anno + mese + giorno + ore + minuti + secondi;
|
||||
|
||||
//workbook.SaveAs($"C:\\Users\\utente\\Desktop\\ExcelVT\\buoni_{dateFile}.xlsx");
|
||||
string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
||||
//string fileName = "authors.xlsx";
|
||||
string fileName = $"Timbrature_{dateFile}.xlsx";
|
||||
using (var stream = new MemoryStream())
|
||||
{
|
||||
workbook.SaveAs(stream);
|
||||
var content = stream.ToArray();
|
||||
return File(content, contentType, fileName);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
errMes = response.Content.ReadAsStringAsync().Result;
|
||||
helper.SetStringValue("errMsg", errMes);
|
||||
return RedirectToAction("Error");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion metodi interni
|
||||
}
|
||||
}
|
||||
64
Models/Timbratura.cs
Normal file
64
Models/Timbratura.cs
Normal file
@ -0,0 +1,64 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace VirtualTask.Models
|
||||
{
|
||||
public class Timbratura
|
||||
{
|
||||
[Display(Name = "Id")]
|
||||
/// <summary>chiave primaria</summary>
|
||||
public int id { get; set; }
|
||||
|
||||
[Display(Name = "Data timbratura")]
|
||||
/// <summary>data</summary>
|
||||
public DateTime? data_timbratura { get; set; }
|
||||
|
||||
[Display(Name = "Ora inzio")]
|
||||
/// <summary>ora inizio</summary>
|
||||
public int ora_ini { get; set; }
|
||||
|
||||
[Display(Name = "Minuti inizio")]
|
||||
/// <summary>minuto inizio</summary>
|
||||
public int min_ini { get; set; }
|
||||
|
||||
[Display(Name = "Ora fine")]
|
||||
/// <summary>ora fine</summary>
|
||||
public int ora_fin { get; set; }
|
||||
|
||||
[Display(Name = "Minuti fine")]
|
||||
/// <summary>minuto fine</summary>
|
||||
public int min_fin { get; set; }
|
||||
|
||||
[Display(Name = "Commessa")]
|
||||
/// <summary>commessa</summary>
|
||||
public string? commessa { get; set; }
|
||||
|
||||
[Display(Name = "Ore viaggio")]
|
||||
/// <summary>ore viaggio</summary>
|
||||
[System.ComponentModel.DataAnnotations.Schema.Column(TypeName = "decimal(7, 2)")]
|
||||
public decimal? ore_viaggio { get; set; }
|
||||
|
||||
[Display(Name = "Totale ore")]
|
||||
/// <summary>totale ore</summary>
|
||||
[System.ComponentModel.DataAnnotations.Schema.Column(TypeName = "decimal(7, 2)")]
|
||||
public decimal? tot_ore { get; set; }
|
||||
|
||||
[Display(Name = "Giorno sett.")]
|
||||
/// <summary>giorno settimana</summary>
|
||||
public int? giorno { get; set; }
|
||||
|
||||
[Display(Name = "Azienda")]
|
||||
/// <summary>azienda</summary>
|
||||
public string? azienda { get; set; }
|
||||
|
||||
[Display(Name = "Tecnico")]
|
||||
/// <summary>tecnico</summary>
|
||||
public string? tecnico { get; set; }
|
||||
|
||||
/// <summary>cpccchk</summary>
|
||||
public string? cpccchk { get; set; }
|
||||
|
||||
[Display(Name = "Note")]
|
||||
/// <summary>note</summary>
|
||||
public string? note { get; set; }
|
||||
}
|
||||
}
|
||||
@ -3,77 +3,116 @@
|
||||
Layout = "~/Views/Shared/_LayoutAreaRiservata.cshtml";
|
||||
ViewData["Title"] = "Listino Virtual Task 2024";
|
||||
}
|
||||
<div class="center">
|
||||
@* <img src="~/assets/images/Euro.png" alt="Virtual Task App" style="width:7%;height:7%" /> *@
|
||||
<img src="~/assets/images/Immagine1.png" alt="Virtual Task App" style="width:9%;height:9%" />
|
||||
<div>
|
||||
<img src="~/assets/images/immagine1Trasp.png" alt="Virtual Task App" style="width:12%; height:12%; margin-left:50%" />
|
||||
<img src="~/assets/images/virtualTaskTS.png" alt="Virtual Task App" style="width:9%;height:9%" />
|
||||
</div>
|
||||
<div class="agy-project-wrapper agy-project-page-wrapper">
|
||||
<div class="container" style="width:100%; text-align:justify">
|
||||
<div>
|
||||
<p>
|
||||
<h4>Abbonamento Virtual Task FREE</h4>
|
||||
</p>
|
||||
2 Utenti e numero massimo anagrafiche clienti gestibili 50.
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
<h4>Abbonamento Virtual Task BASIC</h4>
|
||||
</p>
|
||||
2 Utenti e numero massimo anagrafiche clienti gestibili 200. € 30,00 mese
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
<h4>Abbonamento Virtual Task MEDIUM</h4>
|
||||
</p>
|
||||
2 Utenti e numero massimo anagrafiche clienti gestibili 500. € 40,00 mese
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
<h4>Abbonamento Virtual Task ADVANCED</h4>
|
||||
</p>
|
||||
2 Utenti e numero massimo anagrafiche clienti gestibili 1000. € 50,00 mese
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
<h4>Abbonamento Virtual Task PREMIUM</h4>
|
||||
</p>
|
||||
2 Utenti e numero massimo anagrafiche clienti gestibili illimitate. € 100,00 mese
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
Utenti/dispositivi aggiuntivi € 3,00 mese
|
||||
<br />
|
||||
pacchetto di 5 Utenti/dispositivi aggiuntivi € 10,00 mese*
|
||||
</p>
|
||||
<br />
|
||||
<p>*max 30 utenti aggiungibili. Oltre contattare <b>Polo Informatico s.r.l.</b></p>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
<b><u>Convenzione per iscritti a Confartigianato Terni. Sconto 50% su tutti i prezzi applicati a Virtual Task.</u></b>
|
||||
</p>
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
Per info e ordini inviare una email a <b>info@virtualtask.it</b>
|
||||
</p>
|
||||
<div class="row">
|
||||
<div class="row" style="float:left; width:60%;">
|
||||
<div class="col-sm-12">
|
||||
<div>
|
||||
<p>
|
||||
<h4>Abbonamento Virtual Task FREE</h4>
|
||||
</p>
|
||||
2 Utenti e numero massimo anagrafiche clienti gestibili 50.
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
<h4>Abbonamento Virtual Task BASIC</h4>
|
||||
</p>
|
||||
2 Utenti e numero massimo anagrafiche clienti gestibili 200. € 30,00 mese
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
<h4>Abbonamento Virtual Task MEDIUM</h4>
|
||||
</p>
|
||||
2 Utenti e numero massimo anagrafiche clienti gestibili 500. € 40,00 mese
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
<h4>Abbonamento Virtual Task ADVANCED</h4>
|
||||
</p>
|
||||
2 Utenti e numero massimo anagrafiche clienti gestibili 1000. € 50,00 mese
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
<h4>Abbonamento Virtual Task PREMIUM</h4>
|
||||
</p>
|
||||
2 Utenti e numero massimo anagrafiche clienti gestibili illimitate. € 100,00 mese*9
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
<b>Nuova funzionalità Time Sheet in Virtual Task</b>
|
||||
</p>
|
||||
Per ogni utente/dispositivo € 2,00 mese.
|
||||
Non attivabile nella versione free.
|
||||
</div>
|
||||
<br />
|
||||
|
||||
<div>
|
||||
<p>
|
||||
Utenti/dispositivi aggiuntivi € 3,00 mese
|
||||
<br />
|
||||
pacchetto di 5 Utenti/dispositivi aggiuntivi € 10,00 mese*
|
||||
</p>
|
||||
<br />
|
||||
<p>*max 30 utenti aggiungibili. Oltre contattare <b>Polo Informatico s.r.l.</b></p>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
<b><u>Convenzione per iscritti a Confartigianato Terni. Sconto 50% su tutti i prezzi
|
||||
applicati a Virtual Task.</u></b>
|
||||
</p>
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
Per info e ordini inviare una email a <b>info@virtualtask.it</b>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="row" style="float:right; width:40%;">
|
||||
<div class="col-sm-12">
|
||||
<div>
|
||||
<p>
|
||||
<h4>Abbonamento Virtual Task Time Sheet</h4>
|
||||
</p>
|
||||
€ 3,00 mese Utente/dispositivo
|
||||
</div>
|
||||
<br />
|
||||
<div>
|
||||
<p>
|
||||
Pacchetto sino a 5 utenti/dispositivi € 10,00 mese
|
||||
</p>
|
||||
<p>
|
||||
Oltre contattare <b>Polo Informatico s.r.l</b> e richiedere un offerta.
|
||||
</p>
|
||||
<p>
|
||||
I canoni sono anticipati e annuali.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<style>
|
||||
@* <style>
|
||||
.center {
|
||||
text-align:center;
|
||||
/* margin-left: auto;
|
||||
margin-left: 20px;
|
||||
margin-right: auto;
|
||||
width:50%; */
|
||||
width:50%;
|
||||
}
|
||||
</style>
|
||||
</style> *@
|
||||
@ -1,5 +1,4 @@
|
||||
ah
|
||||
@{
|
||||
@{
|
||||
Layout = "~/Views/Shared/_LayoutAreaRiservata.cshtml";
|
||||
ViewData["Title"] = "Task Manager";
|
||||
}
|
||||
|
||||
31
Views/Portale/VT_Page4.cshtml
Normal file
31
Views/Portale/VT_Page4.cshtml
Normal file
@ -0,0 +1,31 @@
|
||||
@{
|
||||
Layout = "~/Views/Shared/_LayoutAreaRiservata.cshtml";
|
||||
ViewData["Title"] = "Virtual Task Time Sheet";
|
||||
}
|
||||
|
||||
|
||||
|
||||
<div class="agy-project-wrapper agy-project-page-wrapper">
|
||||
<div class="container">
|
||||
<div class="col-lg-6 col-md-6 col-sm-12 col-12" style="width:100%; text-align:justify">
|
||||
<p>
|
||||
<b>Virtual Task Time Sheet</b> è un' App che permette di consuntivare i tempi di lavoro su commessa ed esportarli poi su foglio di excel tramite la soluzione web.
|
||||
Dall'applicativo web è possibile sapere, in tempo reale, su che commessa il tecnico ha timbrato e l'orario di entrata e/o uscita dall'attività che sta consuntivando.
|
||||
</p>
|
||||
<p>
|
||||
L'applicativo offre la possibilita di quantificare il tempo impiegato per una commessa, verranno quindi calcolate le ore di lavoro sulla base degli orari delle timbrarure di ingresso
|
||||
ed uscita.
|
||||
</p>
|
||||
<p>
|
||||
E' possibile imputare eventuali ore di viaggio per raggiungere il luogo di lavoro e di annotare appunti relativi alla consuntivazione temporale fatta.
|
||||
</p>
|
||||
<p>
|
||||
Ogni utente può di timbrare un solo ingresso e una sola uscita alla volta.
|
||||
</p>
|
||||
<p>
|
||||
Infine l'applicativo permette di esportare le timbrature ai fini dell'import all'interno di software di rilevazione presenze del mondo Zucchetti.
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -177,6 +177,7 @@ Purchase:
|
||||
<li><a asp-area="" asp-controller="DatiAzienda" asp-action="Index">Dati Azienda</a></li>
|
||||
<li><a asp-area="" asp-controller="CommesseVT" asp-action="Index">Commesse</a></li>
|
||||
<li><a asp-area="" asp-controller="Rapportini" asp-action="Index">Esporta buoni</a></li>
|
||||
<li><a asp-area="" asp-controller="Timbrature" asp-action="Index">Timbrature</a></li>
|
||||
<li><a asp-area="" asp-controller="Login" asp-action="Logout">Logout</a></li>
|
||||
|
||||
@{
|
||||
|
||||
@ -347,7 +347,31 @@ Purchase:
|
||||
<p>Consectetur adipiscing elit, sed do eiusmod tempor incididunt usdet labore esdt dolore magna aliqua. Quis ipsum suspendisse ultrices gravida.</p>*@
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-6 col-sm-6 col-12">
|
||||
<div class="col-lg-3 col-md-6 col-sm-6 col-13">
|
||||
<div class="agy-service-section wow fadeInUp" data-wow-delay="0.1s">
|
||||
<ul class="agy-shap-list">
|
||||
<li><img src="~/assets/images/services/01.png" alt=""></li>
|
||||
<li><img src="~/assets/images/services/02.png" alt=""></li>
|
||||
<li><img src="~/assets/images/services/03.png" alt=""></li>
|
||||
<li><img src="~/assets/images/services/04.png" alt=""></li>
|
||||
<li><img src="~/assets/images/services/05.png" alt=""></li>
|
||||
<li><img src="~/assets/images/services/06.png" alt=""></li>
|
||||
</ul>
|
||||
<div class="agy-service-icon">
|
||||
<img src="~/assets/images/Immagine1.png" alt="Virtual Task" style="width:110%;height:110%;" />
|
||||
</div>
|
||||
<div class="agy-service-text">
|
||||
<p>La soluzione standalone per la rendicontazione delle attività svolte fuori sede.<br> Ideale per piccoli Manutentori e Impiantisti</p>
|
||||
<a href="@Url.Action("VT_Page1", "Portale")" class="agy-link">
|
||||
<span class="agy-link-txt">Leggi Altro</span>
|
||||
<span class="agy-link-icon">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" viewBox="0 0 512 512" xml:space="preserve" class=""><g><g xmlns="http://www.w3.org/2000/svg"><g><path d="M506.134,241.843c-0.006-0.006-0.011-0.013-0.018-0.019l-104.504-104c-7.829-7.791-20.492-7.762-28.285,0.068 c-7.792,7.829-7.762,20.492,0.067,28.284L443.558,236H20c-11.046,0-20,8.954-20,20c0,11.046,8.954,20,20,20h423.557 l-70.162,69.824c-7.829,7.792-7.859,20.455-0.067,28.284c7.793,7.831,20.457,7.858,28.285,0.068l104.504-104 c0.006-0.006,0.011-0.013,0.018-0.019C513.968,262.339,513.943,249.635,506.134,241.843z" /></g></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g></g></svg>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-6 col-sm-6 col-12">
|
||||
<div class="agy-service-section wow fadeInUp" data-wow-delay="0.1s">
|
||||
<ul class="agy-shap-list">
|
||||
<li><img src="~/assets/images/services/01.png" alt=""></li>
|
||||
@ -359,23 +383,22 @@ Purchase:
|
||||
</ul>
|
||||
<div class="agy-service-icon">
|
||||
@* <img src="~/assets/images/services/digital-marketing.svg" alt="" /> *@
|
||||
<img src="~/assets/images/Immagine1.png" alt="Virtual Task" style="width:110%;height:110%;" />
|
||||
<img src="~/assets/images/virtualTaskTS_removebgpreview.png" alt="Virtual Task" style="width:110%;height:110%" />
|
||||
</div>
|
||||
<div class="agy-service-text">
|
||||
@* <h4><a href="javascript:void(0);">Virtual Task</a></h4>*@
|
||||
<p>La soluzione standalone per la rendicontazione delle attività svolte fuori sede.<br> Ideale per piccoli Manutentori e Impiantisti</p>
|
||||
<a href="@Url.Action("VT_Page1", "Portale")" class="agy-link">
|
||||
<p><b>Virtual Task Time Sheet</b> è un' App che permette di consuntivare i tempi di lavoro su commessa ed esportarli poi su foglio di excel tramite la soluzione web.</p>
|
||||
<a href="@Url.Action("VT_Page4", "Portale")" class="agy-link">
|
||||
<span class="agy-link-txt">Leggi Altro</span>
|
||||
<span class="agy-link-icon">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" viewBox="0 0 512 512" xml:space="preserve" class=""><g><g xmlns="http://www.w3.org/2000/svg"><g><path d="M506.134,241.843c-0.006-0.006-0.011-0.013-0.018-0.019l-104.504-104c-7.829-7.791-20.492-7.762-28.285,0.068 c-7.792,7.829-7.762,20.492,0.067,28.284L443.558,236H20c-11.046,0-20,8.954-20,20c0,11.046,8.954,20,20,20h423.557 l-70.162,69.824c-7.829,7.792-7.859,20.455-0.067,28.284c7.793,7.831,20.457,7.858,28.285,0.068l104.504-104 c0.006-0.006,0.011-0.013,0.018-0.019C513.968,262.339,513.943,249.635,506.134,241.843z" /></g></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g><g xmlns="http://www.w3.org/2000/svg"></g></g></svg>
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-6 col-sm-6 col-12">
|
||||
<div class="agy-service-section wow fadeInUp" data-wow-delay="0.2s">
|
||||
<div class="col-lg-3 col-md-6 col-sm-6 col-12">
|
||||
<div class="agy-service-section wow fadeInUp" data-wow-delay="0.1s">
|
||||
<ul class="agy-shap-list">
|
||||
<li><img src="~/assets/images/services/01.png" alt=""></li>
|
||||
<li><img src="~/assets/images/services/02.png" alt=""></li>
|
||||
@ -400,8 +423,8 @@ Purchase:
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-6 col-sm-6 col-12">
|
||||
<div class="agy-service-section wow fadeInUp" data-wow-delay="0.3s">
|
||||
<div class="col-lg-3 col-md-6 col-sm-6 col-12">
|
||||
<div class="agy-service-section wow fadeInUp" data-wow-delay="0.1s">
|
||||
<ul class="agy-shap-list">
|
||||
<li><img src="~/assets/images/services/01.png" alt=""></li>
|
||||
<li><img src="~/assets/images/services/02.png" alt=""></li>
|
||||
@ -416,7 +439,7 @@ Purchase:
|
||||
</div>
|
||||
<div class="agy-service-text">
|
||||
@*<h4><a href="javascript:void(0);">Task Manager</a></h4>*@
|
||||
<p>Il modulo integrato con Adhoc Revolution Zucchetti , sia Web che Client Server , che permette la completa gestione delle aziende di manutenzione ed impiantistiche.</p>
|
||||
<p>Il modulo integrato con Adhoc Revolution Zucchetti, Web e Client Server, che permette la completa gestione delle aziende di manutenzione ed impiantistiche.</p>
|
||||
<a href="@Url.Action("VT_Page3", "Portale")" class="agy-link">
|
||||
<span class="agy-link-txt">Leggi Altro</span>
|
||||
<span class="agy-link-icon">
|
||||
@ -426,7 +449,6 @@ Purchase:
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* <div class="col-lg-4 col-md-6 col-sm-6 col-12">
|
||||
<div class="agy-service-section wow fadeInUp" data-wow-delay="0.1s">
|
||||
<ul class="agy-shap-list">
|
||||
|
||||
157
Views/Timbrature/Details.cshtml
Normal file
157
Views/Timbrature/Details.cshtml
Normal file
@ -0,0 +1,157 @@
|
||||
@model VirtualTask.Models.Timbratura
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Dettaglio";
|
||||
Layout = "~/Views/Shared/_LayoutAreaRiservata.cshtml";
|
||||
}
|
||||
|
||||
<div class="agy-project-wrapper agy-project-page-wrapper">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="row" style="float:left; width:50%;">
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.id)</b> @Html.DisplayFor(model => model.id)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.data_timbratura)</b> @Html.DisplayFor(model => model.data_timbratura)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.ora_ini)</b> @Html.DisplayFor(model => model.ora_ini)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.min_ini)</b> @Html.DisplayFor(model => model.min_ini)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.ora_fin)</b> @Html.DisplayFor(model => model.ora_fin)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.min_fin)</b> @Html.DisplayFor(model => model.min_fin)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.commessa)</b> @Html.DisplayFor(model => model.commessa)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.ore_viaggio)</b> @Html.DisplayFor(model => model.ore_viaggio)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.giorno)</b> @Html.DisplayFor(model => model.giorno)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.tot_ore)</b> @Html.DisplayFor(model => model.tot_ore)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.azienda)</b> @Html.DisplayFor(model => model.azienda)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.tecnico)</b> @Html.DisplayFor(model => model.tecnico)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.DisplayNameFor(model => model.note)</b> @Html.DisplayFor(model => model.note)
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<b>@Html.HiddenFor(model => model.cpccchk)</b> @Html.HiddenFor(model => model.cpccchk)
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<a asp-action="Index" value="Torna alla lista" class="agy-btn submitForm">Torna alla lista</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@* <div>
|
||||
<h4>Timbratura</h4>
|
||||
<hr />
|
||||
<dl class="row">
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.id)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.id)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.data_timbratura)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.data_timbratura)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.ora_ini)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.ora_ini)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.min_ini)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.min_ini)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.ora_fin)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.ora_fin)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.min_fin)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.min_fin)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.commessa)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.commessa)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.ore_viaggio)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.ore_viaggio)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.tot_ore)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.tot_ore)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.giorno)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.giorno)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.azienda)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.azienda)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.tecnico)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.tecnico)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.cpccchk)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.cpccchk)
|
||||
</dd>
|
||||
<dt class = "col-sm-2">
|
||||
@Html.DisplayNameFor(model => model.note)
|
||||
</dt>
|
||||
<dd class = "col-sm-10">
|
||||
@Html.DisplayFor(model => model.note)
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
<div>
|
||||
@Html.ActionLink("Edit", "Edit", new { /* id = Model.PrimaryKey */ }) |
|
||||
<a asp-action="Index">Back to List</a>
|
||||
</div> *@
|
||||
212
Views/Timbrature/Index.cshtml
Normal file
212
Views/Timbrature/Index.cshtml
Normal file
@ -0,0 +1,212 @@
|
||||
@model IPagedList<VirtualTask.Models.Timbratura>
|
||||
@using X.PagedList;
|
||||
@using X.PagedList.Mvc.Core;
|
||||
@using X.PagedList.Web.Common;
|
||||
|
||||
|
||||
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Timbrature";
|
||||
Layout = "~/Views/Shared/_LayoutAreaRiservata.cshtml";
|
||||
}
|
||||
|
||||
<div class="agy-project-wrapper agy-project-page-wrapper">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
@using (Html.BeginForm())
|
||||
{
|
||||
<div>
|
||||
<div class="row">
|
||||
<div style="float:left;width:40%;padding:0 10px;">
|
||||
@Html.TextBox("id", null, new { placeholder = "Cerca per id", @class = "agy-form-field require" })
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="float:left;width:2%;"> </div>
|
||||
<div style="float:left;width:57%;"><input type="submit" value="Cerca" class="agy-btn submitForm" /></div>
|
||||
</div>
|
||||
|
||||
<div style="float:left;width:2%;"> </div>
|
||||
<div style="float:left;width:2%;"> </div>
|
||||
<div style="float:left;width:2%;"> </div>
|
||||
}
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
@using (Html.BeginForm("ExportExcel", "Timbrature"))
|
||||
{
|
||||
<div style="float:left;width:40%;padding:0 5px;">
|
||||
<input type="submit" value="Esporta excel" name="Esporta excel" class="agy-btn submitForm" />
|
||||
@* <div style="float:left;width:57%;"><input type="submit" value="Esporta excel" class="agy-btn submitForm" /></div> *@
|
||||
</div>
|
||||
}
|
||||
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Id</th>
|
||||
<th>Data timbratura</th>
|
||||
<th>Ora inizio</th>
|
||||
<th>Minuti inizio</th>
|
||||
<th>Ora fine</th>
|
||||
<th>Minuti fine</th>
|
||||
<th>Commessa</th>
|
||||
<th>Ore viaggio</th>
|
||||
<th>Totale ore</th>
|
||||
<th>Giorno sett.</th>
|
||||
<th>Tecnico</th>
|
||||
<th hidden>Azienda</th>
|
||||
<th hidden>Note</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var item in Model)
|
||||
{
|
||||
<tr>
|
||||
<td>@Html.DisplayFor(modelItem => item.id)</td>
|
||||
<td>@Html.DisplayFor(modelItem => item.data_timbratura)</td>
|
||||
<td>@Html.DisplayFor(modelItem => item.ora_ini)</td>
|
||||
<td>@Html.DisplayFor(modelItem => item.min_ini)</td>
|
||||
<td>@Html.DisplayFor(modelItem => item.ora_fin)</td>
|
||||
<td>@Html.DisplayFor(modelItem => item.min_fin)</td>
|
||||
<td>@Html.DisplayFor(modelItem => item.commessa)</td>
|
||||
<td>@Html.DisplayFor(modelItem => item.ore_viaggio)</td>
|
||||
<td>@Html.DisplayFor(modelItem => item.tot_ore)</td>
|
||||
<td>@Html.DisplayFor(modelItem => item.giorno)</td>
|
||||
<td>@Html.DisplayFor(modelItem => item.tecnico)</td>
|
||||
<td>@Html.HiddenFor(modelItem => item.azienda)</td>
|
||||
<td>@Html.HiddenFor(modelItem => item.cpccchk)</td>
|
||||
<td>@Html.HiddenFor(modelItem => item.note)</td>
|
||||
<td>
|
||||
<a href="@Url.Action("Details", "Timbrature", new { id=item.id })" title="Dettaglio" class="links">
|
||||
<img alt="Dettaglio" src="@Url.Content("~/assets/images/icons8-visualizza-file-64.png")" style="width:30px;height:30px;">
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
<br />
|
||||
<nav>
|
||||
@Html.PagedListPager(Model, page => Url.Action("index", new { page = page, searchString = @ViewData["CurrentFilter"] }), new PagedListRenderOptions()
|
||||
{
|
||||
ActiveLiElementClass = "active",
|
||||
PageClasses = new[] { "page-link" },
|
||||
LiElementClasses = new[] { "page-item" },
|
||||
UlElementClasses = new[] { "pagination", "justify-content-center", "mt-3" },
|
||||
LinkToNextPageFormat = "Successiva",
|
||||
LinkToPreviousPageFormat = "Precedente",
|
||||
MaximumPageNumbersToDisplay = 5,
|
||||
DisplayLinkToPreviousPage = PagedListDisplayMode.Always,
|
||||
DisplayLinkToNextPage = PagedListDisplayMode.Always
|
||||
})
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* <table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.id)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.data_timbratura)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.ora_ini)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.min_ini)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.ora_fin)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.min_fin)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.commessa)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.ore_viaggio)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.tot_ore)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.giorno)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.azienda)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.tecnico)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.cpccchk)
|
||||
</th>
|
||||
<th>
|
||||
@Html.DisplayNameFor(model => model.note)
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var item in Model) {
|
||||
<tr>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.id)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.data_timbratura)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.ora_ini)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.min_ini)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.ora_fin)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.min_fin)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.commessa)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.ore_viaggio)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.tot_ore)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.giorno)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.azienda)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.tecnico)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.cpccchk)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.note)
|
||||
</td>
|
||||
<td>
|
||||
@Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
|
||||
@Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
|
||||
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
|
||||
</td>
|
||||
</tr> *@
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
BIN
wwwroot/assets/images/immagine1Trasp.png
Normal file
BIN
wwwroot/assets/images/immagine1Trasp.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.3 KiB |
BIN
wwwroot/assets/images/virtualTaskTS.png
Normal file
BIN
wwwroot/assets/images/virtualTaskTS.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 382 KiB |
BIN
wwwroot/assets/images/virtualTaskTS_removebgpreview.png
Normal file
BIN
wwwroot/assets/images/virtualTaskTS_removebgpreview.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
Loading…
Reference in New Issue
Block a user