diff --git a/TecniStamp/TecniStamp.sln b/TecniStamp/TecniStamp.sln index 092a759..27de0db 100644 --- a/TecniStamp/TecniStamp.sln +++ b/TecniStamp/TecniStamp.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.14.36915.13 +# Visual Studio Version 18 +VisualStudioVersion = 18.1.11304.174 d18.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TecniStamp", "TecniStamp\TecniStamp.csproj", "{CFA3D1CC-936B-4DF5-B2AE-A46A8616501A}" EndProject diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Clienti.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Clienti.razor index 4faf851..80694ed 100644 --- a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Clienti.razor +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Clienti.razor @@ -1,7 +1,98 @@ @page "/anagrafiche/clienti" +@using Microsoft.EntityFrameworkCore +@using TecniStamp.Domain +@using TecniStamp.Model.Commesse +@using TecniStamp.Model.Common +@using TecniStamp.Utils + +@rendermode InteractiveServer +@inject AuthenticationStateProvider auth Clienti + + +
+
+
+
+ +
+
+
+ + + + + + + + + + + + +
+
+
+
+
+
+
@code { - + List clienti; + RadzenDataGrid clientiGrid; + public List BreadcrumbList { get; set; } = new(); + + /// + /// Carica l’elenco dei clienti non eliminati, includendo l’agente, + /// e prepara i dati per la visualizzazione in pagina. + /// + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + clienti = (await _managerService.ClienteService.RicercaQueryable( + x => x.Eliminato == false, + ordinamento: x => x.OrderBy(y => y.RagioneSociale))) + .ToList(); + + BreadcrumbList = await BreadcrumbUtils.BuildBreadcrumbByFeature(_managerService, "Clienti_Insert"); + } + + /// + /// Apre la pagina di modifica per il cliente selezionato. + /// + private async Task EditRow(ClienteViewModel cliente) + { + _navManager.NavigateTo($"/Anagrafiche/Clienti/Modifica/{cliente.Id}"); + } + + /// + /// Chiede conferma ed elimina il cliente scelto; se confermato, + /// aggiorna la lista ricaricandola dal database. + /// + private async Task DeleteRow(ClienteViewModel cliente) + { + var ok = await _dialogService.Confirm($"Vuoi davvero eliminare il cliente {cliente.RagioneSociale}?", "Conferma eliminazione", new ConfirmOptions { OkButtonText = "Sì", CancelButtonText = "No", Width = "400px" }); + + if (ok == true) + { + await _managerService.ClienteService.Elimina(cliente.Id, await MembershipUtils.GetUserId(auth)); + clienti = (await _managerService.ClienteService.RicercaQueryable(x => x.Eliminato == false, ordinamento: x => x.OrderBy(y => y.RagioneSociale))) + .ToList(); + } + } + } \ No newline at end of file diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Clienti_Edit.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Clienti_Edit.razor new file mode 100644 index 0000000..1414843 --- /dev/null +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Clienti_Edit.razor @@ -0,0 +1,172 @@ +@page "/Anagrafiche/Clienti/Modifica" +@page "/Anagrafiche/Clienti/Modifica/{ClientiId:guid}" +@using TecniStamp.Domain +@using TecniStamp.Model.Commesse +@using TecniStamp.Model.Common +@using TecniStamp.Utils + +@pageTitle + +@rendermode InteractiveServer + +
+
+
+
+

@pageTitle

+
+
+
+
+
+
+
+ + + +
+
+ +
+ Ragione Sociale + + +
+ +
+ Partita Iva + + +
+ +
+ Email + + +
+ +
+ Numero di Telefono + + +
+
+ +
+ +
+ Via + + +
+ +
+ Numero Civico + + +
+ +
+ Citta + + +
+ +
+ Provincia + + +
+
+ +
+ +
+ CAP + + +
+
+ +
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ +@code { + [Parameter] public Guid? ClientiId { get; set; } + + public ClienteViewModel Model { get; set; } = new(); + private string pageTitle => Model?.Id == Guid.Empty ? "Nuovo Cliente" : $"Modifica Cliente {Model.RagioneSociale}"; + + public List BreadcrumbList { get; set; } = new(); + + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + Model = ClientiId.GetValueOrDefault() == Guid.Empty + ? new ClienteViewModel() + : await _managerService.ClienteService.RicercaPer(x => x.Id == ClientiId); + + BreadcrumbList = await BreadcrumbUtils.BuildBreadcrumbByFeature(_managerService, "Clienti_Insert", "Modifica", "/Anagrafiche/Clienti"); + } + + /// + /// Salva il cliente: recupera o crea il modello, applica i dati dalla UI, + /// collega l’agente, crea una destinazione di default se è un nuovo cliente + /// e poi salva usando l’ID dell’utente loggato, tornando alla lista clienti. + /// + private async Task onClienteSave() + { + try + { + var state = await _auth.GetAuthenticationStateAsync(); + var idClaim = state.User.FindFirst("UserId")?.Value; + if (string.IsNullOrEmpty(idClaim)) + { + // gestisci errore (utente non autenticato o claim mancante) + return; + } + + var model = await _managerService.ClienteService.RicercaPer(x => x.Id == Model.Id, solaLettura: false) + ?? new Cliente(); + + model = Model.Map(model); + + var clienteSalvato = await _managerService.ClienteService.Salva(model, Guid.Parse(idClaim)); + _navManager.NavigateTo($"/Anagrafiche/Clienti"); + } + catch (Exception ex) + { + await _dialogService.Alert("Si è verificato un'errore", "Errore", new AlertOptions() { OkButtonText = "Continua" }); + } + } + + /// + /// Torna all’elenco clienti senza applicare altre azioni. + /// + private void backToHome() + { + _navManager.NavigateTo("/Anagrafiche/Clienti"); + } +} diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni_Edit.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni_Edit.razor index 7a8bfc8..a00f517 100644 --- a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni_Edit.razor +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni_Edit.razor @@ -48,12 +48,12 @@
-
+
-
+
diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Macchinari_Edit.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Macchinari_Edit.razor index 8844f05..41e807a 100644 --- a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Macchinari_Edit.razor +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Macchinari_Edit.razor @@ -41,12 +41,12 @@
-
+
-
+
diff --git a/TecniStamp/TecniStamp/Components/Pages/Tempi/Tempi.razor b/TecniStamp/TecniStamp/Components/Pages/Tempi/Tempi.razor new file mode 100644 index 0000000..6a501e4 --- /dev/null +++ b/TecniStamp/TecniStamp/Components/Pages/Tempi/Tempi.razor @@ -0,0 +1,55 @@ +@page "/tempi" +@using Microsoft.EntityFrameworkCore +@using TecniStamp.Model.Tempi +@using TecniStamp.Model.Common +@using TecniStamp.Utils + +@rendermode InteractiveServer +@inject AuthenticationStateProvider auth + +Tempi + + +
+
+
+
+
+
+
+ + + + + + + + + + + +
+
+
+
+
+
+
+ +@code { + List tempi; + RadzenDataGrid tempiGrid; + public List BreadcrumbList { get; set; } = new(); + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + + + BreadcrumbList = await BreadcrumbUtils.BuildBreadcrumbByFeature(_managerService, "Tempi_Info"); + } + +} \ No newline at end of file diff --git a/TecniStamp/TecniStamp/Model/Commesse/ClienteViewModel.cs b/TecniStamp/TecniStamp/Model/Commesse/ClienteViewModel.cs index 820a190..c3dfaf1 100644 --- a/TecniStamp/TecniStamp/Model/Commesse/ClienteViewModel.cs +++ b/TecniStamp/TecniStamp/Model/Commesse/ClienteViewModel.cs @@ -1,18 +1,40 @@ -using TecniStamp.Domain; +using Microsoft.IdentityModel.Abstractions; +using System.ComponentModel.DataAnnotations; +using System.Security.Cryptography; +using TecniStamp.Domain; namespace TecniStamp.Model.Commesse; public class ClienteViewModel : BaseViewModel { + [Required(ErrorMessage = "La ragione sociale è obbligatoria")] public string RagioneSociale { get; set; } + + [Required(ErrorMessage = "la partita iva è obbligatoria")] public string PartitaIva { get; set; } + + [Required(ErrorMessage = "il numero di telefono è obbligatorio")] public string Telefono { get; set; } + + [Required(ErrorMessage = "la mail è obbligatoria")] + [EmailAddress(ErrorMessage = "Formato email non valido")] public string Email { get; set; } + + [Required(ErrorMessage = "il CAP è obbligatoria")] public string CAP { get; set; } + + [Required(ErrorMessage = "la città è obbligatoria")] public string Citta { get; set; } + + [Required(ErrorMessage = "il numero civico è obbligatoria")] public string NumeroCivico { get; set; } + + [Required(ErrorMessage = "la via è obbligatoria")] public string Via { get; set; } + + [Required(ErrorMessage = "la provincia è obbligatoria")] public string Provincia { get; set; } + public string? Note { get; set; } public Guid? ComuneId { get; set; } public ComuneIstatViewModel Comune { get; set; } @@ -43,4 +65,20 @@ public class ClienteViewModel : BaseViewModel Id = model.Id }; } + + public Cliente Map(Cliente model) + { + model.RagioneSociale = RagioneSociale; + model.PartitaIva = PartitaIva; + model.Citta = Citta; + model.Email = Email; + model.Telefono = Telefono; + model.Citta = Citta; + model.CAP = CAP; + model.Provincia = Provincia; + model.Via = Via; + model.NumeroCivico = NumeroCivico; + + return model; + } } \ No newline at end of file diff --git a/TecniStamp/TecniStamp/Model/Tempi/TempiViewModel.cs b/TecniStamp/TecniStamp/Model/Tempi/TempiViewModel.cs new file mode 100644 index 0000000..90e4281 --- /dev/null +++ b/TecniStamp/TecniStamp/Model/Tempi/TempiViewModel.cs @@ -0,0 +1,17 @@ +using TecniStamp.Model.Commesse; + +namespace TecniStamp.Model.Tempi; + +public class TempiViewModel +{ + public string Operatore { get; set; } + public string Commessa { get; set; } + public string Prodotto { get; set; } + public string Lavorazione { get; set; } + public DateTime DataInizio { get; set; } + public DateTime DataFine { get; set; } + public decimal TempoTotale { get; set; } + + + +}