Files
StandManager/StandManager/Components/Pages/Component_Registrazione.razor

318 lines
15 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@using StandManager.Model
@using Microsoft.EntityFrameworkCore;
@rendermode InteractiveServer
<EditForm Model="iscrizione" OnValidSubmit="onIscrizioneSave" FormName="iscrizioneForm">
<DataAnnotationsValidator />
<div class="col-12">
<div class="row">
<div class="col-12 mb-3">
<RadzenFormField Text="Codice cliente o Partita IVA" Variant="Variant.Flat" Style="width: 100%;">
<RadzenTextBox Style="width: 100%" aria-label="Codice cliente o Partita IVA" @bind-Value="@iscrizione.PartitaIva" Change="@(args => onCodiceFornitoChanged(args))" />
</RadzenFormField>
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<RadzenFormField Text="Nome" Variant="Variant.Flat" Style="width: 100%;">
<RadzenTextBox Style="width: 100%" aria-label="Nome" @bind-Value="@iscrizione.Nome" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.Nome)" />
</div>
<div class="col-6 mb-3">
<RadzenFormField Text="Cognome" Variant="Variant.Flat" Style="width: 100%;">
<RadzenTextBox Style="width: 100%" aria-label="Cognome" @bind-Value="@iscrizione.Cognome" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.Cognome)" />
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<RadzenFormField Text="E-mail" Variant="Variant.Flat" Style="width: 100%;">
<RadzenTextBox Style="width: 100%" aria-label="Email" @bind-Value="@iscrizione.Email" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.Email)" />
</div>
<div class="col-6 mb-3">
<RadzenFormField Text="Telefono" Variant="Variant.Flat" Style="width: 100%;">
<RadzenTextBox Style="width: 100%" aria-label="NumeroTelefono" @bind-Value="@iscrizione.NumeroTelefono" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.NumeroTelefono)" />
</div>
</div>
<div class="row">
<div class="col-4 mb-3">
<RadzenFormField Text="Provincia" Variant="Variant.Flat" Style="width: 100%;">
<RadzenDropDown TValue="Guid ?" @bind-Value="@iscrizione.ProvinciaId" Change="@(args => onProvinciaChanged(args))" Style="width: 100%" TextProperty="Info" ValueProperty="Id" Placeholder="Seleziona la provincia"
Data="@provList" Size="ButtonSize.Small" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.ProvinciaId)" />
</div>
<div class="col-4 mb-3">
<RadzenFormField Text="CAP" Variant="Variant.Flat" Style="width: 100%;">
<RadzenTextBox Style="width: 100%" aria-label="Cap" @bind-Value="@iscrizione.Cap" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.Cap)" />
</div>
<div class="col-4 mb-3">
<RadzenFormField Text="Comune" Variant="Variant.Flat" Style="width: 100%;">
<RadzenDropDown TValue="Guid ?" @bind-Value="@iscrizione.ComuneId" Style="width: 100%" TextProperty="Info" ValueProperty="Id" Placeholder="Seleziona il comune"
Data="@comuniList" Size="ButtonSize.Small" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.ComuneId)" />
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<RadzenFormField Text="Ragione Sociale" Variant="Variant.Flat" Style="width: 100%;">
<RadzenTextBox Style="width: 100%" aria-label="Nome" @bind-Value="@iscrizione.RagioneSociale" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.RagioneSociale)" />
</div>
<div class="col-6 mb-3">
<RadzenFormField Text="Tipologia" Variant="Variant.Flat" Style="width: 100%;">
<RadzenDropDown @bind-Value="@iscrizione.TipologiaClienteId" TValue="Guid ?" Style="width: 100%" TextProperty="Description" ValueProperty="Key" Placeholder="Seleziona la tipologia"
Data="@tipologiaList" Size="ButtonSize.Small" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.TipologiaClienteId)" />
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<RadzenFormField Text="Hai già avuto un'esperienza con DAC?" Variant="Variant.Flat" Style="width: 100%;">
<RadzenDropDown @bind-Value="@iscrizione.EsperienzaConDAC" Style="width: 100%" TextProperty="" Placeholder="Scegli dal menù"
Data="@esperienzaList" Size="ButtonSize.Small" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.EsperienzaConDAC)" />
</div>
<div class="col-6 mb-3">
<RadzenFormField Text="Ruolo" Variant="Variant.Flat" Style="width: 100%;">
<RadzenDropDown @bind-Value="@iscrizione.RuoloInt" TValue="int?" Style="width: 100%" TextProperty="Description" ValueProperty="Key" Placeholder="Seleziona il ruolo"
Data="@ruoloList" Size="ButtonSize.Small" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.RuoloInt)" />
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<RadzenFormField Text="Giorno presenza" Variant="Variant.Flat" Style="width: 100%;">
<RadzenDatePicker @bind-Value=@iscrizione.GiornoPresenza Name="GiornoPresenza" ShowCalendarWeek ShowTime="false"
DateFormat="dd/MM/yyyy" Min="inizioEvento" Max="fineEvento" InitialViewDate="inizioEvento" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.GiornoPresenza)" />
</div>
</div>
<div class="row">
@if (hasCliente)
{
<div class="col-6 mb-3">
<RadzenFormField Text="Destinazione" Variant="Variant.Flat" Style="width: 100%;">
<RadzenDropDown @bind-Value="@iscrizione.DestinazioneId" TValue="Guid ?" Style="width: 100%" ValueProperty="Id" TextProperty="Info" Placeholder="Seleziona la destinazione"
Data="@destinazioniList" Size="ButtonSize.Small" />
</RadzenFormField>
</div>
}
<div class=@(hasCliente ? "col-6 mb-3" : "col-12 mb-3")>
<RadzenFormField Text="Note" Variant="Variant.Flat" Style="width: 100%; border: none !important; box-shadow: none !important; background-color: transparent !important;">
<RadzenTextArea @bind-Value="@iscrizione.Note" Style="width: 100%;" Rows="1" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.Note)" />
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<div class="d-flex align-items-center mb-2">
<RadzenCheckBox class="form-check-input" @bind-Value="presaVisionePrivacy" Name="presaVisionePrivacy" TValue="bool" />
<label class="rz-ms-2" for="presaVisionePrivacy" style="cursor: pointer;">
Presa visione dell'informativa Privacy* (<a href="https://www.iubenda.com/privacy-policy/8106534" target="_blank">leggi</a>)
</label>
</div>
<div class="d-flex align-items-center">
<RadzenCheckBox class="form-check-input" @bind-Value="presaVisioneDatiPersonali" Name="presaVisioneDatiPersonali" TValue="bool" />
<label class="rz-ms-2" for="presaVisioneDatiPersonali" style="cursor: pointer;">
Autorizzazione al trattamento dati*<br />
I dati forniti saranno utilizzati esclusivamente per linvio del biglietto. (<a href="https://www.gruppodac.eu/tutela-e-privacy/" target="_blank">leggi</a>)
</label>
</div>
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<button type="submit" class="btn btn-danger w-100" disabled="@(!presaVisionePrivacy || !presaVisioneDatiPersonali)">
Invia
</button>
</div>
</div>
</div>
</EditForm>
@code {
[Parameter] public InvitoEventoViewModel invito { get; set; }
[Parameter] public bool hasCliente { get; set; }
[Parameter] public Func<object?, IscrizioneEvento, Task>? OnSubmitCompletedAsync { get; set; }
[SupplyParameterFromForm]
private IscrizioneEventoViewModel iscrizione { get; set; } = new();
private IEnumerable<DestinazioneViewModel> destinazioniList { get; set; }
private IEnumerable<LookupViewModel<Guid>> tipologiaList { get; set; }
private IEnumerable<string> esperienzaList { get; set; }
private IEnumerable<LookupViewModel<int>> ruoloList { get; set; }
private List<ProvinciaViewModel> provList { get; set; }
private List<ComuneIstatViewModel> comuniList { get; set; }
private bool presaVisionePrivacy { get; set; }
private bool presaVisioneDatiPersonali { get; set; }
private DateTime inizioEvento { get; set; }
private DateTime fineEvento { get; set; }
protected override async Task OnInitializedAsync()
{
base.OnInitializedAsync();
var eUtils = new EnumUtils();
var destinazioniIds = invito.IscrizioniEvento?.Select(x => x.DestinazioneId).ToList() ?? new List<Guid?>();
destinazioniList = (await _managerService.DestinazioneService.RicercaQueryable(filtro: x => x.ClienteId == invito.ClienteId && !destinazioniIds.Any(y => y == x.Id))).Select(x => (DestinazioneViewModel)x).ToList();
esperienzaList = new List<string>() { "Si", "No" };
tipologiaList = (await _managerService.TipologiaClienteService.RicercaQueryable(x => x.Eliminato == false, ordinamento: x => x.OrderBy(y => y.Nome)))
.Select(x => new LookupViewModel<Guid>(x.Id, x.Nome)).ToList();
ruoloList = eUtils.GetEnumList<RuoloTipo>();
provList = (await _managerService.ProvinciaIstatService.RicercaQueryable(
x => x.Eliminato == false,
ordinamento: x => x.OrderBy(y => y.Provincia)))
.Select(x => (ProvinciaViewModel)x).ToList();
var evento = invito.EventoId.HasValue
? await _managerService.EventoService.RicercaPer(x => x.Id == invito.EventoId)
: (await _managerService.EventoService.RicercaQueryable(x => x.DataA > DateTime.Now,
ordinamento: y => y.OrderBy(z => z.DataA))).FirstOrDefault();
inizioEvento = evento?.DataDa ?? DateTime.Now.AddDays(-7);
fineEvento = evento?.DataA ?? DateTime.Now.AddDays(7);
if (!hasCliente)
NoCliente();
else
HasCliente();
}
/// <summary>
/// Funzione di salvataggio, mappa i dati e aggiunge gli ids per le FK
/// </summary>
private async Task onIscrizioneSave()
{
var userId = await MembershipUtils.GetUserId(_auth);
var model = new IscrizioneEvento()
{
EventoId = invito.EventoId,
InvitoEventoId = invito.Id,
ClienteId = invito.ClienteId,
DestinazioneId = iscrizione.DestinazioneId,
TipologiaClienteId = iscrizione.TipologiaClienteId,
IdUtenteCreazione = userId != Guid.Empty ? userId : null
};
model = iscrizione.Map(model);
var saved = await _managerService.IscrizioneEventoService.Salva(model);
if (OnSubmitCompletedAsync is not null)
{
await OnSubmitCompletedAsync(this, saved);
}
_navManager.NavigateTo($"/Grazie");
}
/// <summary>
/// Imposta i dati cliente al cambio della Partita IVA
/// </summary>
public async Task SetDatiCliente()
{
iscrizione.DestinazioneId = invito.DestinazioneId;
iscrizione.ClienteId = invito.ClienteId;
iscrizione.RagioneSociale = invito.RagioneSociale;
StateHasChanged();
var destinazioniIds = invito.IscrizioniEvento?.Select(x => x.DestinazioneId).ToList() ?? new List<Guid?>();
destinazioniList = (await _managerService.DestinazioneService.RicercaQueryable(filtro: x => x.ClienteId == invito.ClienteId && !destinazioniIds.Any(y => y == x.Id)))
.Select(x => (DestinazioneViewModel)x).ToList();
}
public void NoCliente()
{
destinazioniList = new List<DestinazioneViewModel>() { new() { RagioneSociale = "--Nessuna" } };
iscrizione.EsperienzaConDAC = "No";
}
public void HasCliente()
{
iscrizione.EsperienzaConDAC = "Si";
}
/// <summary>
/// Aggiorna i comuni in base alla provincia selezionata
/// </summary>
private async Task onProvinciaChanged(object args)
{
Guid parsed;
Guid.TryParse(args.ToString(), out parsed);
var prov = await _managerService.ProvinciaIstatService.RicercaPer(x => x.Id == parsed);
if (prov == null)
{
await _dialogService.Alert("La provincia indicata non è presente", "Errore", new ConfirmOptions() { OkButtonText = "Ok" });
return;
}
iscrizione.ProvinciaId = prov.Id;
iscrizione.ComuneId = null;
comuniList = (await _managerService.ComuneIstatService.RicercaQueryable(x => x.Provincia == prov.Sigla))
.Select(x => (ComuneIstatViewModel)x).ToList();
}
/// <summary>
/// Serve per aggiornare i dati del form se ci troviamo nella situazione in cui il cliente è salvato a db
/// Attiva la compilazione solo se siamo nel form e da UI chi compila ci dice che è già stato cliente
/// </summary>
private async Task onCodiceFornitoChanged(string text)
{
if (!hasCliente) return;
var codiceFornito = text;
invito.CodiceFornito = codiceFornito;
var destinazione = (await _managerService.DestinazioneService.RicercaPer(
x => x.PartitaIva == codiceFornito || x.CodiceFiscale == codiceFornito || x.Rid == codiceFornito || x.Cliente.Rid == codiceFornito,
includi: x => x.Include(y => y.Cliente)));
if (destinazione == null || string.IsNullOrEmpty(text))
{
await _dialogService.Alert("Non è stato trovato il clente (Codice cliente/Partita IVA non presente)", "Errore", new ConfirmOptions() { OkButtonText = "Ok" });
}
else
{
invito.ClienteId = destinazione.ClienteId;
invito.DestinazioneId = destinazione.Id;
invito.CodiceFornito = codiceFornito;
invito.RagioneSociale = destinazione.Cliente?.RagioneSociale ?? string.Empty;
await SetDatiCliente();
}
}
}