@attribute [Authorize] @rendermode InteractiveServer @page "/management/Clienti/Modifica" @page "/management/Clienti/Modifica/{ClienteId:guid}" @using Microsoft.AspNetCore.Identity @using Microsoft.EntityFrameworkCore @using StandManager.Model @inject AuthenticationStateProvider auth @pageTitle
Anagrafica
Ragione Sociale
Partita Iva
Email
Numero di Telefono
Email di invito
Tipologia Gestionale
Tipologia
Stato
Agente
Capoarea
@if (cliente.Id != Guid.Empty) {
Destinazioni
}
@code { [Parameter] public Guid? ClienteId { get; set; } public Guid idClaim { get; set; } [SupplyParameterFromForm] private ClienteViewModel cliente { get; set; } = new(); private IEnumerable agenti { get; set; } = new List(); private IEnumerable capiarea { get; set; } = new List(); private List tipologiaCliente { get; set; } = new(); private List> statoCliente { get; set; } = new(); RadzenDataGrid destinazioniGrid; private bool isAdmin { get; set; } = false; private Guid capoareaId { get; set; } = Guid.Empty; private string pageTitle => cliente?.Id == Guid.Empty ? "Nuovo cliente" : "Modifica cliente"; private DialogOptions editNewDialogOption { get; set; } = new() { Resizable = false, Draggable = false, Width = "900px" }; /// /// Inizializza la pagina: carica gli agenti, le tipologie cliente /// e, se presente l’ID, recupera il cliente con agente e destinazioni, /// registrando anche l’evento di chiusura del dialog. /// protected override async Task OnInitializedAsync() { idClaim = await MembershipUtils.GetUserId(auth); var idRuolo = await MembershipUtils.GetRoleId(auth); var ruolo = await _managerService.RuoloService.RicercaPer( x => x.Id == idRuolo && x.Permessi.Any(y => y.Feature.Type == FeatureType.Capoarea || y.Feature.Type == FeatureType.AdminGlobal), includi:x => x.Include(y => y.Permessi).ThenInclude(z => z.Feature)); isAdmin = ruolo?.Permessi.Where(x => x.Eliminato == false)?.Any(x => x.Feature.Type == FeatureType.AdminGlobal) ?? false; if (ClienteId.GetValueOrDefault() != Guid.Empty) cliente = await _managerService.ClienteService.RicercaPer(x => x.Id == ClienteId, includi: x => x.Include(y => y.Agente).Include(y => y.Capoarea).Include(y => y.TipologiaCliente).Include(y => y.Destinazioni).ThenInclude(z => z.Agente)); else cliente = new ClienteViewModel(); capoareaId = cliente.CapoareaId.GetValueOrDefault(); capiarea = isAdmin ? (await _managerService.UtenteService.RicercaQueryable( x => x.Eliminato == false && x.IsCapoarea, ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome))) .Select(x => (UtenteViewModel)x).ToList() : [await _managerService.UtenteService.RicercaPer(x => x.Id == cliente.CapoareaId)]; agenti = cliente.CapoareaId == idClaim || isAdmin ? (await _managerService.UtenteService.RicercaQueryable( x => x.Eliminato == false && (isAdmin || x.CapoareaId == idClaim) && !x.IsCapoarea && x.CapoareaId == cliente.CapoareaId, includi: x => x.Include(y => y.Capoarea), ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome))) .Select(x => (UtenteViewModel)x).ToList() : [await _managerService.UtenteService.RicercaPer(x => x.Id == cliente.AgenteId)]; var eUtils = new EnumUtils(); tipologiaCliente = (await _managerService.TipologiaClienteService.RicercaQueryable(ordinamento: x => x.OrderBy(y => y.Nome))).Select(x => (TipologiaClienteViewModel)x).ToList(); statoCliente = eUtils.GetEnumList(); _dialogService.OnClose += onDialogClose; } /// /// Alla chiusura del dialog ricarica da database le destinazioni /// del cliente aggiornando la lista in schermata. /// private async void onDialogClose(dynamic result) { cliente.Destinazioni = (await _managerService.DestinazioneService.RicercaQueryable(x => x.Eliminato == false && x.ClienteId == cliente.Id, includi: x => x.Include(y => y.Agente))) .Select(x => (DestinazioneViewModel)x).ToList(); } /// /// 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() { var model = await _managerService.ClienteService.RicercaPer(x => x.Id == cliente.Id, solaLettura: false) ?? new Cliente() { Destinazioni = new List() }; model = cliente.Map(model); if (cliente.AgenteId.GetValueOrDefault() != Guid.Empty) model.Agente = await _managerService.UtenteService.RicercaPer(x => x.Id == cliente.AgenteId); if (cliente.TipologiaClienteId.GetValueOrDefault() != Guid.Empty) { model.TipologiaClienteId = cliente.TipologiaClienteId; model.TipologiaCliente = await _managerService.TipologiaClienteService.RicercaPer(x => x.Id == cliente.TipologiaClienteId); } if (cliente.Id == Guid.Empty) { var destinazione = new Destinazione() { Cliente = model }; destinazione = cliente.GetDestinazione(destinazione); model.Destinazioni.Add(destinazione); } await _managerService.ClienteService.Salva(model, idClaim); _navManager.NavigateTo("/management/Clienti"); } /// /// Torna alla pagina di elenco clienti senza salvare altre modifiche. /// private void backToHome() { _navManager.NavigateTo("/management/Clienti"); } /// /// Apre il dialog di modifica per la destinazione selezionata. /// private async Task EditDestinazione(DestinazioneViewModel destinazione) { await _dialogService.OpenAsync($"Destinazione {destinazione.RagioneSociale}", new Dictionary() { { "destinazioneId", destinazione.Id }, { "clienteId", cliente.Id }, { "canSetAgente", (cliente.CapoareaId == idClaim) || isAdmin }, { "capoareaId", capoareaId } }, editNewDialogOption); } /// /// Apre il dialog per creare una nuova destinazione collegata al cliente. /// private async Task onNuovaDestinazionePressed() { await _dialogService.OpenAsync($"Nuova destinazione", new Dictionary() { { "clienteId", cliente.Id }, { "canSetAgente", (cliente.CapoareaId == idClaim) || isAdmin }, { "capoareaId", capoareaId } }, editNewDialogOption); } /// /// Chiede conferma, elimina la destinazione scelta se confermato /// e ricarica l’elenco delle destinazioni del cliente. /// private async Task DeleteDestinazione(DestinazioneViewModel destinazione) { var ok = await _dialogService.Confirm($"Vuoi davvero eliminare la destinazione {cliente.RagioneSociale}?", "Conferma eliminazione", new ConfirmOptions { OkButtonText = "Sì", CancelButtonText = "No", Width = "400px" }); if (ok == true) { await _managerService.DestinazioneService.Elimina(destinazione.Id, await MembershipUtils.GetUserId(auth)); cliente.Destinazioni = (await _managerService.DestinazioneService.RicercaQueryable(x => x.Eliminato == false && x.ClienteId == cliente.Id, includi: x => x.Include(y => y.Agente))) .Select(x => (DestinazioneViewModel)x).ToList(); } } /// /// Aggiorna la drop di agenti in base al valore di capoarea /// private async Task OnCapoareaChange(object value) { var capoId = Guid.Empty; if (Guid.TryParse(value.ToString(), out capoId)) { capoareaId = capoId; cliente.AgenteId = null; agenti = cliente.CapoareaId == idClaim || isAdmin ? (await _managerService.UtenteService.RicercaQueryable( x => x.Eliminato == false && (isAdmin || x.CapoareaId == idClaim) && !x.IsCapoarea && x.CapoareaId == capoareaId, includi: x => x.Include(y => y.Capoarea), ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome))) .Select(x => (UtenteViewModel)x).ToList() : [await _managerService.UtenteService.RicercaPer(x => x.Id == cliente.AgenteId)]; } } }