@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
Ragione Sociale
Partita Iva
Email
Numero di Telefono
Email di invito
Tipologia Gestionale
Tipologia
Stato
@if (cliente.Id != Guid.Empty)
{
}
@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)];
}
}
}