Michele: view timbrature, model, controller

This commit is contained in:
michele 2024-05-20 11:00:02 +02:00
parent 1f1f83fae7
commit 9e177436d5
13 changed files with 838 additions and 74 deletions

View File

@ -23,5 +23,10 @@ namespace VirtualTask.Controllers
{
return View();
}
public IActionResult VT_Page4()
{
return View();
}
}
}

View 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
View 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; }
}
}

View File

@ -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> *@

View File

@ -1,5 +1,4 @@
ah
@{
@{
Layout = "~/Views/Shared/_LayoutAreaRiservata.cshtml";
ViewData["Title"] = "Task Manager";
}

View 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>

View File

@ -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>
@{

View File

@ -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">

View 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> *@

View 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%;">&nbsp;</div>
<div style="float:left;width:57%;"><input type="submit" value="Cerca" class="agy-btn submitForm" /></div>
</div>
<div style="float:left;width:2%;">&nbsp;</div>
<div style="float:left;width:2%;">&nbsp;</div>
<div style="float:left;width:2%;">&nbsp;</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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB