318 lines
15 KiB
Plaintext
318 lines
15 KiB
Plaintext
@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 l’invio 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();
|
||
}
|
||
}
|
||
} |