From 752eb3e07741f89f976c1a06988272448a8bbfb6 Mon Sep 17 00:00:00 2001 From: Oussema Saafi Date: Tue, 3 Feb 2026 14:34:40 +0100 Subject: [PATCH] commit lavorazioni --- .../Interfaces/ILavorazioneService.cs | 9 ++ .../Interfaces/IManagerService.cs | 1 + .../TecniStamp.Service/LavorazioneService.cs | 13 ++ .../TecniStamp.Service/ManagerService.cs | 4 +- TecniStamp/TecniStamp.sln | 3 + .../Pages/Anagrafiche/Lavorazioni.razor | 92 +++++++++++- .../Pages/Anagrafiche/Lavorazioni_Edit.razor | 134 ++++++++++++++++++ .../Components/Pages/Anagrafiche/Ruoli.razor | 41 ++++-- .../Pages/Anagrafiche/Ruoli_Edit.razor | 7 +- .../TecniStamp/Model/LavorazioneViewModel.cs | 53 +++++++ 10 files changed, 344 insertions(+), 13 deletions(-) create mode 100644 TecniStamp/TecniStamp.Service/Interfaces/ILavorazioneService.cs create mode 100644 TecniStamp/TecniStamp.Service/LavorazioneService.cs create mode 100644 TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni_Edit.razor create mode 100644 TecniStamp/TecniStamp/Model/LavorazioneViewModel.cs diff --git a/TecniStamp/TecniStamp.Service/Interfaces/ILavorazioneService.cs b/TecniStamp/TecniStamp.Service/Interfaces/ILavorazioneService.cs new file mode 100644 index 0000000..14b6e40 --- /dev/null +++ b/TecniStamp/TecniStamp.Service/Interfaces/ILavorazioneService.cs @@ -0,0 +1,9 @@ +using OAService.Service.Repository; +using OAService.Service.Servizi.Interfacce; +using TecniStamp.Domain; + +namespace TecniStamp.Service.Interfaces; + +public interface ILavorazioneService : ITService +{ +} \ No newline at end of file diff --git a/TecniStamp/TecniStamp.Service/Interfaces/IManagerService.cs b/TecniStamp/TecniStamp.Service/Interfaces/IManagerService.cs index 97336f2..df83a17 100644 --- a/TecniStamp/TecniStamp.Service/Interfaces/IManagerService.cs +++ b/TecniStamp/TecniStamp.Service/Interfaces/IManagerService.cs @@ -9,4 +9,5 @@ public interface IManagerService ISezioneService SezioneService { get; set; } IUserService UtenteService { get; set; } IMacchinarioService MacchinarioService { get; set; } + ILavorazioneService LavorazioneService { get; set; } } \ No newline at end of file diff --git a/TecniStamp/TecniStamp.Service/LavorazioneService.cs b/TecniStamp/TecniStamp.Service/LavorazioneService.cs new file mode 100644 index 0000000..747dc1d --- /dev/null +++ b/TecniStamp/TecniStamp.Service/LavorazioneService.cs @@ -0,0 +1,13 @@ +using OAService.Service.Servizi.Implementazioni; +using TecniStamp.Domain; +using TecniStamp.Service.Interfaces; +using TecniStamp.Service.Repository; + +namespace TecniStamp.Service; + +public class LavorazioneService : TService, ILavorazioneService +{ + public LavorazioneService(ITecniStampUnitOfWork unitOfWork) : base(unitOfWork) + { + } +} \ No newline at end of file diff --git a/TecniStamp/TecniStamp.Service/ManagerService.cs b/TecniStamp/TecniStamp.Service/ManagerService.cs index a3a5f06..2c08292 100644 --- a/TecniStamp/TecniStamp.Service/ManagerService.cs +++ b/TecniStamp/TecniStamp.Service/ManagerService.cs @@ -5,7 +5,7 @@ namespace TecniStamp.Service; public class ManagerService : IManagerService { public ManagerService(IUserService userService, ISezioneService sezioneService, IPermissionService permissionService, IRuoloService ruoloService, - IFeatureService featureService, IMacchinarioService macchinarioService, ICommessaService commessaService) + IFeatureService featureService, IMacchinarioService macchinarioService, ICommessaService commessaService, ILavorazioneService lavorazioneService) { UtenteService = userService; SezioneService = sezioneService; @@ -14,6 +14,7 @@ public class ManagerService : IManagerService FeatureService = featureService; MacchinarioService = macchinarioService; CommessaService = commessaService; + LavorazioneService = lavorazioneService; } public ICommessaService CommessaService { get; set; } @@ -23,4 +24,5 @@ public class ManagerService : IManagerService public ISezioneService SezioneService { get; set; } public IUserService UtenteService { get; set; } public IMacchinarioService MacchinarioService { get; set; } + public ILavorazioneService LavorazioneService { get; set; } } \ No newline at end of file diff --git a/TecniStamp/TecniStamp.sln b/TecniStamp/TecniStamp.sln index 7fd0a6f..092a759 100644 --- a/TecniStamp/TecniStamp.sln +++ b/TecniStamp/TecniStamp.sln @@ -37,4 +37,7 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A54D2BE1-E74F-43DA-B84A-8B16EC6B4098} + EndGlobalSection EndGlobal diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni.razor index f50332b..6306b45 100644 --- a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni.razor +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni.razor @@ -1,7 +1,97 @@ @page "/anagrafiche/lavorazioni" +@using Microsoft.EntityFrameworkCore +@using TecniStamp.Model +@using TecniStamp.Model.Common +@using TecniStamp.Utils + +@rendermode InteractiveServer +@inject AuthenticationStateProvider auth Lavorazioni + + +
+
+
+
+ +
+
+
+ + + + + + + + + + + +
+
+
+
+
+
+
@code { - + List lavorazioni; + RadzenDataGrid lavorazioniGrid; + public List BreadcrumbList { get; set; } = new(); + + /// + /// Carica la lista delle lavorazioni non eliminate, ordinandoli per descrizione. + /// + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + lavorazioni = (await _managerService.LavorazioneService.RicercaQueryable( + x => x.Eliminato == false, + ordinamento: x => x.OrderBy(y => y.Descrizione))) + .Select(x => (LavorazioneViewModel)x).ToList(); + + BreadcrumbList = await BreadcrumbUtils.BuildBreadcrumbByFeature(_managerService, "Lavorazioni_Insert"); + } + + /// + /// Apre la pagina di modifica per la lavorazione selezionata. + /// + private async Task EditRow(LavorazioneViewModel lavorazione) + { + _navManager.NavigateTo($"/Anagrafiche/Lavorazioni/Modifica/{lavorazione.Id}"); + } + + /// + /// Chiede conferma ed elimina la lavorazione; se confermato, aggiorna la lista + /// ricaricandola dal database. + /// + private async Task DeleteRow(LavorazioneViewModel lavorazione) + { + var ok = await _dialogService.Confirm($"Vuoi davvero eliminare la lavorazioen {lavorazione.Descrizione}?", "Conferma eliminazione", new ConfirmOptions { OkButtonText = "Sì", CancelButtonText = "No", Width = "400px" }); + + if (ok == true) + { + await _managerService.LavorazioneService.Elimina(lavorazione.Id, await MembershipUtils.GetUserId(auth)); + lavorazioni = (await _managerService.LavorazioneService.RicercaQueryable( + x => x.Eliminato == false, + ordinamento: x => x.OrderBy(y => y.Descrizione))) + .Select(x => (LavorazioneViewModel)x).ToList(); + } + } + } \ No newline at end of file diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni_Edit.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni_Edit.razor new file mode 100644 index 0000000..7a8bfc8 --- /dev/null +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Lavorazioni_Edit.razor @@ -0,0 +1,134 @@ +@page "/Anagrafiche/Lavorazioni/Modifica" +@page "/Anagrafiche/Lavorazioni/Modifica/{LavorazioneId:guid}" +@using TecniStamp.Domain +@using TecniStamp.Model +@using TecniStamp.Model.Common +@using TecniStamp.Utils + +@pageTitle + +@rendermode InteractiveServer + +
+
+
+
+

@pageTitle

+
+
+
+
+
+
+
+ + + +
+
+ +
+ Descrizione + + +
+ +
+ Codice + + +
+ +
+ Costo Orario + + +
+ +
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+ +@code { + [Parameter] public Guid? LavorazioneId { get; set; } + + public LavorazioneViewModel Model { get; set; } = new(); + private string pageTitle => Model?.Id == Guid.Empty ? "Nuova Lavorazione" : $"Modifica Lavorazione {Model.Descrizione}"; + + public List BreadcrumbList { get; set; } = new(); + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + Model = LavorazioneId.GetValueOrDefault() == Guid.Empty + ? new LavorazioneViewModel() + : await _managerService.LavorazioneService.RicercaPer(x => x.Id == LavorazioneId); + + BreadcrumbList = await BreadcrumbUtils.BuildBreadcrumbByFeature(_managerService, "Lavorazioni_Insert", "Modifica", "/Anagrafiche/Lavorazioni"); + } + + /// + /// Salva la lavorazione: recupera o crea il modello, applica le modifiche dalla UI + /// usando l’ID dell’utente autenticato. + /// + private async Task onLavorazioneSave() + { + 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.LavorazioneService.RicercaPer(x => x.Id == Model.Id, solaLettura: false) + ?? new Lavorazione(); + + model = Model.Map(model); + + //Provvisorio + model.ChiaveEsterna = "ChiaveEsterna"; + model.CodiceColore = "colore"; + model.Sovrapponibile = false; + + var lavorazioneSalvata = await _managerService.LavorazioneService.Salva(model, Guid.Parse(idClaim)); + _navManager.NavigateTo($"/Anagrafiche/Lavorazioni"); + } + catch (Exception ex) + { + await _dialogService.Alert("Si è verificato un'errore", "Errore", new AlertOptions() { OkButtonText = "Continua" }); + } + } + + /// + /// Torna all’elenco macchinari senza applicare altre azioni. + /// + private void backToHome() + { + _navManager.NavigateTo("/Anagrafiche/Lavorazioni"); + } + +} diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruoli.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruoli.razor index 119c5c7..ad3318c 100644 --- a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruoli.razor +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruoli.razor @@ -1,19 +1,18 @@ @page "/anagrafiche/ruoli" @using Microsoft.EntityFrameworkCore @using TecniStamp.Model +@using TecniStamp.Model.Common +@using TecniStamp.Utils +@inject AuthenticationStateProvider auth @rendermode InteractiveServer Ruoli + -
- -
-
+
+
+ @code { List ruoli; RadzenDataGrid ruoliGrid; + public List BreadcrumbList { get; set; } = new(); /// /// Carica la lista dei ruoli non eliminati, ordinandoli per nome. @@ -62,6 +63,8 @@ includi: x => x.Include(y => y.UtenteCreazione), ordinamento: x => x.OrderBy(y => y.Nome))) .Select(x => (RuoloViewModel)x).ToList(); + + BreadcrumbList = await BreadcrumbUtils.BuildBreadcrumbByFeature(_managerService, "ruoli_Insert"); } /// @@ -71,4 +74,22 @@ { _navManager.NavigateTo($"/Anagrafiche/ruoli/Modifica/{ruolo.Id}"); } + + /// + /// Chiede conferma ed elimina l’utente; se confermato, aggiorna la lista + /// ricaricandola dal database. + /// + private async Task DeleteRow(RuoloViewModel ruolo) + { + var ok = await _dialogService.Confirm($"Vuoi davvero eliminare il ruolo {ruolo.Nome}?", "Conferma eliminazione", new ConfirmOptions { OkButtonText = "Sì", CancelButtonText = "No", Width = "400px" }); + + if (ok == true) + { + await _managerService.RuoloService.Elimina(ruolo.Id, await MembershipUtils.GetUserId(auth)); + ruoli = (await _managerService.RuoloService.RicercaQueryable( + x => x.Eliminato == false, + ordinamento: x => x.OrderBy(y => y.Nome))) + .Select(x => (RuoloViewModel)x).ToList(); + } + } } diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruoli_Edit.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruoli_Edit.razor index c365bdb..cb486e1 100644 --- a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruoli_Edit.razor +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruoli_Edit.razor @@ -3,10 +3,12 @@ @using Microsoft.EntityFrameworkCore @using TecniStamp.Domain @using TecniStamp.Model +@using TecniStamp.Model.Common @using TecniStamp.Utils @rendermode InteractiveServer @inject AuthenticationStateProvider auth + @pageTitle @@ -24,7 +26,7 @@
-
+
@@ -95,6 +97,7 @@ public RuoloViewModel Model { get; set; } = new(); private List permessi { get; set; } = new(); private RadzenDataGrid permessiGrid { get; set; } + public List BreadcrumbList { get; set; } = new(); private string pageTitle => Model?.Id == Guid.Empty ? "Nuovo Ruolo" : $"Modifica Ruolo {Model}"; @@ -113,6 +116,8 @@ permessi = []; foreach (var section in sections) permessi.AddRange(section.Features.Where(x => !x.Eliminato).Select(x => new PermissionRowViewModel(section, x, permissions)).ToList()); + + BreadcrumbList = await BreadcrumbUtils.BuildBreadcrumbByFeature(_managerService, "Ruoli_Insert", "Modifica", "/Anagrafiche/Ruoli"); } /// diff --git a/TecniStamp/TecniStamp/Model/LavorazioneViewModel.cs b/TecniStamp/TecniStamp/Model/LavorazioneViewModel.cs new file mode 100644 index 0000000..56f9cd3 --- /dev/null +++ b/TecniStamp/TecniStamp/Model/LavorazioneViewModel.cs @@ -0,0 +1,53 @@ +using System.ComponentModel.DataAnnotations; +using TecniStamp.Domain; + +namespace TecniStamp.Model; + +public class LavorazioneViewModel : BaseViewModel +{ + + [Required(ErrorMessage = "La descrizione è obbligatoria")] + public string Descrizione { get; set; } + + [Required(ErrorMessage = "il costo orario è obbligatorio")] + public float? CostoOrario { get; set; } + + [Required(ErrorMessage = "il codice è obbligatorio")] + public string Codice { get; set; } + + public string ChiaveEsterna { get; set; } + public string CodiceColore { get; set; } + public bool Sovrapponibile { get; set; } + + public override void Validate() + { + } + + public static implicit operator LavorazioneViewModel(Lavorazione model) + { + return model == null + ? null + : new LavorazioneViewModel() + { + Id = model.Id, + Descrizione = model.Descrizione, + CostoOrario = model.CostoOrario, + Codice = model.Codice, + ChiaveEsterna = model.ChiaveEsterna, + CodiceColore = model.CodiceColore, + Sovrapponibile = model.Sovrapponibile + }; + } + + public Lavorazione Map(Lavorazione model) + { + model.Descrizione = Descrizione; + model.CostoOrario = CostoOrario; + model.Codice = Codice; + model.ChiaveEsterna = ChiaveEsterna; + model.Sovrapponibile = Sovrapponibile; + model.CodiceColore = CodiceColore; + + return model; + } +} \ No newline at end of file