From 664cee96560ad74278dba54a98a379ecebcd5ac3 Mon Sep 17 00:00:00 2001 From: Gianmarco Date: Mon, 15 Dec 2025 11:01:14 +0100 Subject: [PATCH] Tipologia cliente --- StandManager.Domain/Entita/Cliente.cs | 20 +- .../Entita/IscrizioneEvento.cs | 5 +- .../Entita/TipologiaCliente.cs | 8 + .../DAL/Context/StandManagerDbContext.cs | 1 + .../20251215095446_TipoCliente.Designer.cs | 717 ++++++++++++++++++ .../Migrations/20251215095446_TipoCliente.cs | 152 ++++ .../StandManagerDbContextModelSnapshot.cs | 77 +- .../Interfaces/IManagerService.cs | 1 + .../Interfaces/ITipologiaClienteService.cs | 6 + StandManager.Service/ManagerService.cs | 5 +- StandManager.Service/ReferenteService.cs | 2 +- .../TipologiaClienteService.cs | 16 + StandManager/Components/Pages/Footer.razor | 24 + StandManager/Components/Pages/Home.razor | 49 +- .../Components/Pages/Management/Clienti.razor | 56 +- .../Pages/Management/Clienti_Edit.razor | 18 +- .../Components/Pages/Management/Eventi.razor | 2 +- .../Components/Pages/Management/Utenti.razor | 2 +- StandManager/Model/ClienteViewModel.cs | 27 +- .../Model/IscrizioneEventoViewModel.cs | 42 +- StandManager/StandManager.csproj | 1 + StandManager/wwwroot/css/site.css | 378 +-------- 22 files changed, 1118 insertions(+), 491 deletions(-) create mode 100644 StandManager.Domain/Entita/TipologiaCliente.cs create mode 100644 StandManager.Infrastructure/Migrations/20251215095446_TipoCliente.Designer.cs create mode 100644 StandManager.Infrastructure/Migrations/20251215095446_TipoCliente.cs create mode 100644 StandManager.Service/Interfaces/ITipologiaClienteService.cs create mode 100644 StandManager.Service/TipologiaClienteService.cs create mode 100644 StandManager/Components/Pages/Footer.razor diff --git a/StandManager.Domain/Entita/Cliente.cs b/StandManager.Domain/Entita/Cliente.cs index d91cc34..fa06a19 100644 --- a/StandManager.Domain/Entita/Cliente.cs +++ b/StandManager.Domain/Entita/Cliente.cs @@ -23,26 +23,12 @@ public class Cliente : EntitaBase public List Destinazioni { get; set; } public string? Rid { get; set; } - public ClienteTipo TipologiaCliente { get; set; } + [ForeignKey(nameof(TipologiaCliente))] + public Guid? TipologiaClienteId { get; set; } + public TipologiaCliente TipologiaCliente { get; set; } public ClienteStato StatoCliente { get; set; } } -public enum ClienteTipo -{ - [Description("Alberghiero")] - Alberghiero = 0, - [Description("Ristoranti")] - Ristoranti = 1, - [Description("Pizzerie")] - Pizzerie = 2, - [Description("Wine Bar")] - WineBar = 3, - [Description("Bar")] - Bar = 4, - [Description("Ristorazione Collettiva")] - RistorazioneCollettiva = 5 -} - public enum ClienteStato { [Description("Cliente")] diff --git a/StandManager.Domain/Entita/IscrizioneEvento.cs b/StandManager.Domain/Entita/IscrizioneEvento.cs index e8eadca..4ecd7f3 100644 --- a/StandManager.Domain/Entita/IscrizioneEvento.cs +++ b/StandManager.Domain/Entita/IscrizioneEvento.cs @@ -23,7 +23,6 @@ public class IscrizioneEvento : EntitaBase public Destinazione Destinazione { get; set; } public int Partecipanti{ get; set; } public string Note{ get; set; } - public string QrCodeCode{ get; set; } public bool ScanCompleto{ get; set; } public DateTime? DataScan{ get; set; } public string? Nome{ get; set; } @@ -34,7 +33,9 @@ public class IscrizioneEvento : EntitaBase public string? Comune { get; set; } public string? Cap { get; set; } public string? RagioneSociale { get; set; } - public ClienteTipo Tipologia { get; set; } + [ForeignKey(nameof(TipologiaCliente))] + public Guid? TipologiaClienteId { get; set; } + public TipologiaCliente TipologiaCliente { get; set; } public string? EsperienzaConDAC { get; set; } public RuoloTipo Ruolo { get; set; } } diff --git a/StandManager.Domain/Entita/TipologiaCliente.cs b/StandManager.Domain/Entita/TipologiaCliente.cs new file mode 100644 index 0000000..d04fc4b --- /dev/null +++ b/StandManager.Domain/Entita/TipologiaCliente.cs @@ -0,0 +1,8 @@ +using StandManager.Domain.Entita.Base; + +namespace StandManager.Domain.Entita; + +public class TipologiaCliente : EntitaBase +{ + public string Nome { get; set; } +} diff --git a/StandManager.Infrastructure/DAL/Context/StandManagerDbContext.cs b/StandManager.Infrastructure/DAL/Context/StandManagerDbContext.cs index e43d5ae..594ab88 100644 --- a/StandManager.Infrastructure/DAL/Context/StandManagerDbContext.cs +++ b/StandManager.Infrastructure/DAL/Context/StandManagerDbContext.cs @@ -17,6 +17,7 @@ public class StandManagerDbContext : OAServiceContext public DbSet InvitoEvento { get; set; } public DbSet IscrizioneEvento { get; set; } public DbSet Referente { get; set; } + public DbSet TipologiaCliente { get; set; } public DbSet Utente { get; set; } diff --git a/StandManager.Infrastructure/Migrations/20251215095446_TipoCliente.Designer.cs b/StandManager.Infrastructure/Migrations/20251215095446_TipoCliente.Designer.cs new file mode 100644 index 0000000..f9e1a8a --- /dev/null +++ b/StandManager.Infrastructure/Migrations/20251215095446_TipoCliente.Designer.cs @@ -0,0 +1,717 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using StandManager.Infrastructure.DAL.Context; + +#nullable disable + +namespace StandManager.Infrastructure.Migrations +{ + [DbContext(typeof(StandManagerDbContext))] + [Migration("20251215095446_TipoCliente")] + partial class TipoCliente + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.11") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("StandManager.Domain.Entita.Cliente", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AgenteId") + .HasColumnType("uniqueidentifier"); + + b.Property("Cap") + .HasColumnType("nvarchar(max)"); + + b.Property("Citta") + .HasColumnType("nvarchar(max)"); + + b.Property("DataCreazione") + .HasColumnType("datetime2"); + + b.Property("DataModifica") + .HasColumnType("datetime2"); + + b.Property("Eliminato") + .HasColumnType("bit"); + + b.Property("Email") + .HasColumnType("nvarchar(max)"); + + b.Property("EmailInvito") + .HasColumnType("nvarchar(max)"); + + b.Property("IdUtenteCreazione") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteModifica") + .HasColumnType("uniqueidentifier"); + + b.Property("Indirizzo") + .HasColumnType("nvarchar(max)"); + + b.Property("NumeroTelefono") + .HasColumnType("nvarchar(max)"); + + b.Property("PartitaIva") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("RagioneSociale") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Rid") + .HasColumnType("nvarchar(max)"); + + b.Property("StatoCliente") + .HasColumnType("int"); + + b.Property("TipologiaClienteId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("AgenteId"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.HasIndex("TipologiaClienteId"); + + b.ToTable("Cliente"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Destinazione", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AgenteId") + .HasColumnType("uniqueidentifier"); + + b.Property("Cap") + .HasColumnType("nvarchar(max)"); + + b.Property("Citta") + .HasColumnType("nvarchar(max)"); + + b.Property("ClienteId") + .HasColumnType("uniqueidentifier"); + + b.Property("DataCreazione") + .HasColumnType("datetime2"); + + b.Property("DataModifica") + .HasColumnType("datetime2"); + + b.Property("Eliminato") + .HasColumnType("bit"); + + b.Property("Email") + .HasColumnType("nvarchar(max)"); + + b.Property("EmailInvito") + .HasColumnType("nvarchar(max)"); + + b.Property("IdUtenteCreazione") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteModifica") + .HasColumnType("uniqueidentifier"); + + b.Property("Indirizzo") + .HasColumnType("nvarchar(max)"); + + b.Property("NumeroTelefono") + .HasColumnType("nvarchar(max)"); + + b.Property("PartitaIva") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("RagioneSociale") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("AgenteId"); + + b.HasIndex("ClienteId"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.ToTable("Destinazione"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Evento", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DataA") + .HasColumnType("datetime2"); + + b.Property("DataCreazione") + .HasColumnType("datetime2"); + + b.Property("DataDa") + .HasColumnType("datetime2"); + + b.Property("DataModifica") + .HasColumnType("datetime2"); + + b.Property("Descrizione") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Eliminato") + .HasColumnType("bit"); + + b.Property("IdUtenteCreazione") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteModifica") + .HasColumnType("uniqueidentifier"); + + b.Property("IscrizioneA") + .HasColumnType("datetime2"); + + b.Property("IscrizioneDa") + .HasColumnType("datetime2"); + + b.Property("Luogo") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TemplateHtmlMailInvito") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TemplateHtmlMailIscrizione") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Titolo") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.ToTable("Evento"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.InvitoEvento", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClienteId") + .HasColumnType("uniqueidentifier"); + + b.Property("DataCreazione") + .HasColumnType("datetime2"); + + b.Property("DataModifica") + .HasColumnType("datetime2"); + + b.Property("Eliminato") + .HasColumnType("bit"); + + b.Property("EventoId") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteCreazione") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteModifica") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("ClienteId"); + + b.HasIndex("EventoId"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.ToTable("InvitoEvento"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.IscrizioneEvento", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Cap") + .HasColumnType("nvarchar(max)"); + + b.Property("ClienteId") + .HasColumnType("uniqueidentifier"); + + b.Property("Cognome") + .HasColumnType("nvarchar(max)"); + + b.Property("Comune") + .HasColumnType("nvarchar(max)"); + + b.Property("DataCreazione") + .HasColumnType("datetime2"); + + b.Property("DataModifica") + .HasColumnType("datetime2"); + + b.Property("DataScan") + .HasColumnType("datetime2"); + + b.Property("DestinazioneId") + .HasColumnType("uniqueidentifier"); + + b.Property("Eliminato") + .HasColumnType("bit"); + + b.Property("Email") + .HasColumnType("nvarchar(max)"); + + b.Property("EsperienzaConDAC") + .HasColumnType("nvarchar(max)"); + + b.Property("EventoId") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteCreazione") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteModifica") + .HasColumnType("uniqueidentifier"); + + b.Property("InvitoEventoId") + .HasColumnType("uniqueidentifier"); + + b.Property("Nome") + .HasColumnType("nvarchar(max)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("NumeroTelefono") + .HasColumnType("nvarchar(max)"); + + b.Property("Partecipanti") + .HasColumnType("int"); + + b.Property("Provincia") + .HasColumnType("nvarchar(max)"); + + b.Property("RagioneSociale") + .HasColumnType("nvarchar(max)"); + + b.Property("Ruolo") + .HasColumnType("int"); + + b.Property("ScanCompleto") + .HasColumnType("bit"); + + b.Property("TipologiaClienteId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("ClienteId"); + + b.HasIndex("DestinazioneId"); + + b.HasIndex("EventoId"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.HasIndex("InvitoEventoId"); + + b.HasIndex("TipologiaClienteId"); + + b.ToTable("IscrizioneEvento"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Referente", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Cognome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("DataCreazione") + .HasColumnType("datetime2"); + + b.Property("DataModifica") + .HasColumnType("datetime2"); + + b.Property("DestinazioneId") + .HasColumnType("uniqueidentifier"); + + b.Property("Eliminato") + .HasColumnType("bit"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IdUtenteCreazione") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteModifica") + .HasColumnType("uniqueidentifier"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("NumeroTelefono") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Ruolo") + .HasColumnType("int"); + + b.Property("RuoloNote") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("DestinazioneId"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.ToTable("Referente"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.TipologiaCliente", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DataCreazione") + .HasColumnType("datetime2"); + + b.Property("DataModifica") + .HasColumnType("datetime2"); + + b.Property("Eliminato") + .HasColumnType("bit"); + + b.Property("IdUtenteCreazione") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteModifica") + .HasColumnType("uniqueidentifier"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.ToTable("TipologiaCliente"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Utente", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Cognome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("DataCreazione") + .HasColumnType("datetime2"); + + b.Property("DataModifica") + .HasColumnType("datetime2"); + + b.Property("Eliminato") + .HasColumnType("bit"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IdUtenteCreazione") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteModifica") + .HasColumnType("uniqueidentifier"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Username") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.ToTable("Utente"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Cliente", b => + { + b.HasOne("StandManager.Domain.Entita.Utente", "Agente") + .WithMany() + .HasForeignKey("AgenteId"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") + .WithMany() + .HasForeignKey("IdUtenteCreazione"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteModifica") + .WithMany() + .HasForeignKey("IdUtenteModifica"); + + b.HasOne("StandManager.Domain.Entita.TipologiaCliente", "TipologiaCliente") + .WithMany() + .HasForeignKey("TipologiaClienteId"); + + b.Navigation("Agente"); + + b.Navigation("TipologiaCliente"); + + b.Navigation("UtenteCreazione"); + + b.Navigation("UtenteModifica"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Destinazione", b => + { + b.HasOne("StandManager.Domain.Entita.Utente", "Agente") + .WithMany() + .HasForeignKey("AgenteId"); + + b.HasOne("StandManager.Domain.Entita.Cliente", "Cliente") + .WithMany("Destinazioni") + .HasForeignKey("ClienteId"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") + .WithMany() + .HasForeignKey("IdUtenteCreazione"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteModifica") + .WithMany() + .HasForeignKey("IdUtenteModifica"); + + b.Navigation("Agente"); + + b.Navigation("Cliente"); + + b.Navigation("UtenteCreazione"); + + b.Navigation("UtenteModifica"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Evento", b => + { + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") + .WithMany() + .HasForeignKey("IdUtenteCreazione"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteModifica") + .WithMany() + .HasForeignKey("IdUtenteModifica"); + + b.Navigation("UtenteCreazione"); + + b.Navigation("UtenteModifica"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.InvitoEvento", b => + { + b.HasOne("StandManager.Domain.Entita.Cliente", "Cliente") + .WithMany() + .HasForeignKey("ClienteId"); + + b.HasOne("StandManager.Domain.Entita.Evento", "Evento") + .WithMany() + .HasForeignKey("EventoId"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") + .WithMany() + .HasForeignKey("IdUtenteCreazione"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteModifica") + .WithMany() + .HasForeignKey("IdUtenteModifica"); + + b.Navigation("Cliente"); + + b.Navigation("Evento"); + + b.Navigation("UtenteCreazione"); + + b.Navigation("UtenteModifica"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.IscrizioneEvento", b => + { + b.HasOne("StandManager.Domain.Entita.Cliente", "Cliente") + .WithMany() + .HasForeignKey("ClienteId"); + + b.HasOne("StandManager.Domain.Entita.Destinazione", "Destinazione") + .WithMany() + .HasForeignKey("DestinazioneId"); + + b.HasOne("StandManager.Domain.Entita.Evento", "Evento") + .WithMany() + .HasForeignKey("EventoId"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") + .WithMany() + .HasForeignKey("IdUtenteCreazione"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteModifica") + .WithMany() + .HasForeignKey("IdUtenteModifica"); + + b.HasOne("StandManager.Domain.Entita.InvitoEvento", "InvitoEvento") + .WithMany("IscrizioniEvento") + .HasForeignKey("InvitoEventoId"); + + b.HasOne("StandManager.Domain.Entita.TipologiaCliente", "TipologiaCliente") + .WithMany() + .HasForeignKey("TipologiaClienteId"); + + b.Navigation("Cliente"); + + b.Navigation("Destinazione"); + + b.Navigation("Evento"); + + b.Navigation("InvitoEvento"); + + b.Navigation("TipologiaCliente"); + + b.Navigation("UtenteCreazione"); + + b.Navigation("UtenteModifica"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Referente", b => + { + b.HasOne("StandManager.Domain.Entita.Destinazione", "Destinazione") + .WithMany("Referenti") + .HasForeignKey("DestinazioneId"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") + .WithMany() + .HasForeignKey("IdUtenteCreazione"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteModifica") + .WithMany() + .HasForeignKey("IdUtenteModifica"); + + b.Navigation("Destinazione"); + + b.Navigation("UtenteCreazione"); + + b.Navigation("UtenteModifica"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.TipologiaCliente", b => + { + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") + .WithMany() + .HasForeignKey("IdUtenteCreazione"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteModifica") + .WithMany() + .HasForeignKey("IdUtenteModifica"); + + b.Navigation("UtenteCreazione"); + + b.Navigation("UtenteModifica"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Utente", b => + { + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") + .WithMany() + .HasForeignKey("IdUtenteCreazione"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteModifica") + .WithMany() + .HasForeignKey("IdUtenteModifica"); + + b.Navigation("UtenteCreazione"); + + b.Navigation("UtenteModifica"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Cliente", b => + { + b.Navigation("Destinazioni"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Destinazione", b => + { + b.Navigation("Referenti"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.InvitoEvento", b => + { + b.Navigation("IscrizioniEvento"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/StandManager.Infrastructure/Migrations/20251215095446_TipoCliente.cs b/StandManager.Infrastructure/Migrations/20251215095446_TipoCliente.cs new file mode 100644 index 0000000..aaa465a --- /dev/null +++ b/StandManager.Infrastructure/Migrations/20251215095446_TipoCliente.cs @@ -0,0 +1,152 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace StandManager.Infrastructure.Migrations +{ + /// + public partial class TipoCliente : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "QrCodeCode", + table: "IscrizioneEvento"); + + migrationBuilder.DropColumn( + name: "Tipologia", + table: "IscrizioneEvento"); + + migrationBuilder.DropColumn( + name: "TipologiaCliente", + table: "Cliente"); + + migrationBuilder.AddColumn( + name: "TipologiaClienteId", + table: "IscrizioneEvento", + type: "uniqueidentifier", + nullable: true); + + migrationBuilder.AddColumn( + name: "TipologiaClienteId", + table: "Cliente", + type: "uniqueidentifier", + nullable: true); + + migrationBuilder.CreateTable( + name: "TipologiaCliente", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Nome = table.Column(type: "nvarchar(max)", nullable: false), + DataCreazione = table.Column(type: "datetime2", nullable: false), + DataModifica = table.Column(type: "datetime2", nullable: true), + Eliminato = table.Column(type: "bit", nullable: false), + IdUtenteCreazione = table.Column(type: "uniqueidentifier", nullable: true), + IdUtenteModifica = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_TipologiaCliente", x => x.Id); + table.ForeignKey( + name: "FK_TipologiaCliente_Utente_IdUtenteCreazione", + column: x => x.IdUtenteCreazione, + principalTable: "Utente", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_TipologiaCliente_Utente_IdUtenteModifica", + column: x => x.IdUtenteModifica, + principalTable: "Utente", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_IscrizioneEvento_TipologiaClienteId", + table: "IscrizioneEvento", + column: "TipologiaClienteId"); + + migrationBuilder.CreateIndex( + name: "IX_Cliente_TipologiaClienteId", + table: "Cliente", + column: "TipologiaClienteId"); + + migrationBuilder.CreateIndex( + name: "IX_TipologiaCliente_IdUtenteCreazione", + table: "TipologiaCliente", + column: "IdUtenteCreazione"); + + migrationBuilder.CreateIndex( + name: "IX_TipologiaCliente_IdUtenteModifica", + table: "TipologiaCliente", + column: "IdUtenteModifica"); + + migrationBuilder.AddForeignKey( + name: "FK_Cliente_TipologiaCliente_TipologiaClienteId", + table: "Cliente", + column: "TipologiaClienteId", + principalTable: "TipologiaCliente", + principalColumn: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_IscrizioneEvento_TipologiaCliente_TipologiaClienteId", + table: "IscrizioneEvento", + column: "TipologiaClienteId", + principalTable: "TipologiaCliente", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Cliente_TipologiaCliente_TipologiaClienteId", + table: "Cliente"); + + migrationBuilder.DropForeignKey( + name: "FK_IscrizioneEvento_TipologiaCliente_TipologiaClienteId", + table: "IscrizioneEvento"); + + migrationBuilder.DropTable( + name: "TipologiaCliente"); + + migrationBuilder.DropIndex( + name: "IX_IscrizioneEvento_TipologiaClienteId", + table: "IscrizioneEvento"); + + migrationBuilder.DropIndex( + name: "IX_Cliente_TipologiaClienteId", + table: "Cliente"); + + migrationBuilder.DropColumn( + name: "TipologiaClienteId", + table: "IscrizioneEvento"); + + migrationBuilder.DropColumn( + name: "TipologiaClienteId", + table: "Cliente"); + + migrationBuilder.AddColumn( + name: "QrCodeCode", + table: "IscrizioneEvento", + type: "nvarchar(max)", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "Tipologia", + table: "IscrizioneEvento", + type: "int", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "TipologiaCliente", + table: "Cliente", + type: "int", + nullable: false, + defaultValue: 0); + } + } +} diff --git a/StandManager.Infrastructure/Migrations/StandManagerDbContextModelSnapshot.cs b/StandManager.Infrastructure/Migrations/StandManagerDbContextModelSnapshot.cs index ef78c47..caea66f 100644 --- a/StandManager.Infrastructure/Migrations/StandManagerDbContextModelSnapshot.cs +++ b/StandManager.Infrastructure/Migrations/StandManagerDbContextModelSnapshot.cs @@ -78,8 +78,8 @@ namespace StandManager.Infrastructure.Migrations b.Property("StatoCliente") .HasColumnType("int"); - b.Property("TipologiaCliente") - .HasColumnType("int"); + b.Property("TipologiaClienteId") + .HasColumnType("uniqueidentifier"); b.HasKey("Id"); @@ -89,6 +89,8 @@ namespace StandManager.Infrastructure.Migrations b.HasIndex("IdUtenteModifica"); + b.HasIndex("TipologiaClienteId"); + b.ToTable("Cliente"); }); @@ -327,10 +329,6 @@ namespace StandManager.Infrastructure.Migrations b.Property("Provincia") .HasColumnType("nvarchar(max)"); - b.Property("QrCodeCode") - .IsRequired() - .HasColumnType("nvarchar(max)"); - b.Property("RagioneSociale") .HasColumnType("nvarchar(max)"); @@ -340,8 +338,8 @@ namespace StandManager.Infrastructure.Migrations b.Property("ScanCompleto") .HasColumnType("bit"); - b.Property("Tipologia") - .HasColumnType("int"); + b.Property("TipologiaClienteId") + .HasColumnType("uniqueidentifier"); b.HasKey("Id"); @@ -357,6 +355,8 @@ namespace StandManager.Infrastructure.Migrations b.HasIndex("InvitoEventoId"); + b.HasIndex("TipologiaClienteId"); + b.ToTable("IscrizioneEvento"); }); @@ -418,6 +418,40 @@ namespace StandManager.Infrastructure.Migrations b.ToTable("Referente"); }); + modelBuilder.Entity("StandManager.Domain.Entita.TipologiaCliente", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DataCreazione") + .HasColumnType("datetime2"); + + b.Property("DataModifica") + .HasColumnType("datetime2"); + + b.Property("Eliminato") + .HasColumnType("bit"); + + b.Property("IdUtenteCreazione") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteModifica") + .HasColumnType("uniqueidentifier"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.ToTable("TipologiaCliente"); + }); + modelBuilder.Entity("StandManager.Domain.Entita.Utente", b => { b.Property("Id") @@ -482,8 +516,14 @@ namespace StandManager.Infrastructure.Migrations .WithMany() .HasForeignKey("IdUtenteModifica"); + b.HasOne("StandManager.Domain.Entita.TipologiaCliente", "TipologiaCliente") + .WithMany() + .HasForeignKey("TipologiaClienteId"); + b.Navigation("Agente"); + b.Navigation("TipologiaCliente"); + b.Navigation("UtenteCreazione"); b.Navigation("UtenteModifica"); @@ -584,6 +624,10 @@ namespace StandManager.Infrastructure.Migrations .WithMany("IscrizioniEvento") .HasForeignKey("InvitoEventoId"); + b.HasOne("StandManager.Domain.Entita.TipologiaCliente", "TipologiaCliente") + .WithMany() + .HasForeignKey("TipologiaClienteId"); + b.Navigation("Cliente"); b.Navigation("Destinazione"); @@ -592,6 +636,8 @@ namespace StandManager.Infrastructure.Migrations b.Navigation("InvitoEvento"); + b.Navigation("TipologiaCliente"); + b.Navigation("UtenteCreazione"); b.Navigation("UtenteModifica"); @@ -618,6 +664,21 @@ namespace StandManager.Infrastructure.Migrations b.Navigation("UtenteModifica"); }); + modelBuilder.Entity("StandManager.Domain.Entita.TipologiaCliente", b => + { + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") + .WithMany() + .HasForeignKey("IdUtenteCreazione"); + + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteModifica") + .WithMany() + .HasForeignKey("IdUtenteModifica"); + + b.Navigation("UtenteCreazione"); + + b.Navigation("UtenteModifica"); + }); + modelBuilder.Entity("StandManager.Domain.Entita.Utente", b => { b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") diff --git a/StandManager.Service/Interfaces/IManagerService.cs b/StandManager.Service/Interfaces/IManagerService.cs index 40adf20..c2f54a9 100644 --- a/StandManager.Service/Interfaces/IManagerService.cs +++ b/StandManager.Service/Interfaces/IManagerService.cs @@ -8,6 +8,7 @@ public IInvitoEventoService InvitoEventoService{ get; set; } public IIscrizioneEventoService IscrizioneEventoService{ get; set; } public IReferenteService ReferenteService{ get; set; } + public ITipologiaClienteService TipologiaClienteService { get; set; } public IUtenteService UtenteService { get; set; } } } diff --git a/StandManager.Service/Interfaces/ITipologiaClienteService.cs b/StandManager.Service/Interfaces/ITipologiaClienteService.cs new file mode 100644 index 0000000..a576387 --- /dev/null +++ b/StandManager.Service/Interfaces/ITipologiaClienteService.cs @@ -0,0 +1,6 @@ +using OAService.Service.Servizi.Interfacce; +using StandManager.Domain.Entita; + +namespace StandManager.Service.Interfaces; + +public interface ITipologiaClienteService : ITService {} diff --git a/StandManager.Service/ManagerService.cs b/StandManager.Service/ManagerService.cs index 0b5fbfa..acaba6a 100644 --- a/StandManager.Service/ManagerService.cs +++ b/StandManager.Service/ManagerService.cs @@ -5,7 +5,8 @@ namespace StandManager.Service; public class ManagerService : IManagerService { public ManagerService(IUtenteService utenteService, IClienteService clienteService, IDestinazioneService destinazioneService, IEventoService eventoService, - IInvitoEventoService invitoEventoService, IIscrizioneEventoService iscrizioneEventoService, IReferenteService referenteService) + IInvitoEventoService invitoEventoService, IIscrizioneEventoService iscrizioneEventoService, IReferenteService referenteService, + ITipologiaClienteService tipologiaClienteService) { UtenteService = utenteService; ClienteService = clienteService; @@ -14,6 +15,7 @@ public class ManagerService : IManagerService InvitoEventoService = invitoEventoService; IscrizioneEventoService = iscrizioneEventoService; ReferenteService = referenteService; + TipologiaClienteService = tipologiaClienteService; } public IUtenteService UtenteService { get; set; } @@ -23,4 +25,5 @@ public class ManagerService : IManagerService public IInvitoEventoService InvitoEventoService{ get; set; } public IIscrizioneEventoService IscrizioneEventoService { get; set; } public IReferenteService ReferenteService { get; set; } + public ITipologiaClienteService TipologiaClienteService { get; set; } } \ No newline at end of file diff --git a/StandManager.Service/ReferenteService.cs b/StandManager.Service/ReferenteService.cs index 35f0b36..6632ad6 100644 --- a/StandManager.Service/ReferenteService.cs +++ b/StandManager.Service/ReferenteService.cs @@ -13,4 +13,4 @@ public class ReferenteService : TService, IReferenteService { _unitOfWork = unitOfWork; } -} \ No newline at end of file +} diff --git a/StandManager.Service/TipologiaClienteService.cs b/StandManager.Service/TipologiaClienteService.cs new file mode 100644 index 0000000..a9d676a --- /dev/null +++ b/StandManager.Service/TipologiaClienteService.cs @@ -0,0 +1,16 @@ +using OAService.Service.Servizi.Implementazioni; +using StandManager.Domain.Entita; +using StandManager.Service.Interfaces; +using StandManager.Service.Repository; + +namespace StandManager.Service; + +public class TipologiaClienteService : TService, ITipologiaClienteService +{ + private readonly IStandManagerUnitOfWork _unitOfWork; + + public TipologiaClienteService(IStandManagerUnitOfWork unitOfWork) : base(unitOfWork) + { + _unitOfWork = unitOfWork; + } +} \ No newline at end of file diff --git a/StandManager/Components/Pages/Footer.razor b/StandManager/Components/Pages/Footer.razor new file mode 100644 index 0000000..46dc33e --- /dev/null +++ b/StandManager/Components/Pages/Footer.razor @@ -0,0 +1,24 @@ +
+
+
+

DAC S.p.A.

+
+ C.F. / P. IVA: IT03038290171
+ Reg. Imp. di città n. 03038290171
+ R.E.A. n. BS-313463
+ Capitale Sociale € 3.000.000,00 i.v.
+
+
+ Sede legale e amministrativa
+ Via G.Marconi, n.15 - 25020 Flero (BS)
+ Tel. +39 030 256 8211
+ info@gruppodac.eu +
+
+ + + +
+
+
+
\ No newline at end of file diff --git a/StandManager/Components/Pages/Home.razor b/StandManager/Components/Pages/Home.razor index ab00847..f4f7648 100644 --- a/StandManager/Components/Pages/Home.razor +++ b/StandManager/Components/Pages/Home.razor @@ -116,9 +116,9 @@
Tipologia - - +
@@ -140,9 +140,9 @@
Destinazione - - +
Numero di partecipanti @@ -221,31 +221,6 @@ }
-
-
-
-

DAC S.p.A.

-
- C.F. / P. IVA: IT03038290171
- Reg. Imp. di città n. 03038290171
- R.E.A. n. BS-313463
- Capitale Sociale € 3.000.000,00 i.v.
-
-
- Sede legale e amministrativa
- Via G.Marconi, n.15 - 25020 Flero (BS)
- Tel. +39 030 256 8211
- info@gruppodac.eu -
-
- - - -
-
-
-
- @code { [Parameter] public Guid? invitationId { get; set; } @@ -257,7 +232,7 @@ private IEnumerable comuneList { get; set; } private IEnumerable provinciaList { get; set; } private IEnumerable destinazioniList { get; set; } - private IEnumerable> tipologiaList { get; set; } + private IEnumerable> tipologiaList { get; set; } private IEnumerable esperienzaList { get; set; } private IEnumerable> ruoloList { get; set; } @@ -283,7 +258,9 @@ provinciaList = new List() { "BS" }; esperienzaList = new List() { "Si", "No" }; var eUtils = new EnumUtils(); - tipologiaList = eUtils.GetEnumList(); + + tipologiaList = (await _managerService.TipologiaClienteService.RicercaQueryable(x => x.Eliminato == false)) + .Select(x => new LookupViewModel(x.Id, x.Nome)).ToList(); ruoloList = eUtils.GetEnumList(); } } @@ -313,11 +290,13 @@ private async Task onIscrizioneSave() { - var model = new IscrizioneEvento() { EventoId = invito.EventoId, InvitoEventoId = invito.Id, ClienteId = invito.ClienteId, DestinazioneId = iscrizione.Destinazione.Id }; + var model = new IscrizioneEvento() { + EventoId = invito.EventoId, + InvitoEventoId = invito.Id, + ClienteId = invito.ClienteId, + DestinazioneId = iscrizione.DestinazioneId }; model = iscrizione.Map(model); - - // TODO: Implementazione generazione QR Code - model.QrCodeCode = Guid.NewGuid().ToString(); + model.TipologiaCliente = await _managerService.TipologiaClienteService.RicercaPer(x => x.Id == iscrizione.TipologiaClienteId && x.Eliminato == false); await _managerService.IscrizioneEventoService.Salva(model); diff --git a/StandManager/Components/Pages/Management/Clienti.razor b/StandManager/Components/Pages/Management/Clienti.razor index 3303cd5..b5d1147 100644 --- a/StandManager/Components/Pages/Management/Clienti.razor +++ b/StandManager/Components/Pages/Management/Clienti.razor @@ -1,5 +1,6 @@ @attribute [Authorize] @page "/management/Clienti" +@using ClosedXML.Excel @using Microsoft.EntityFrameworkCore @using StandManager.Model @@ -21,6 +22,8 @@
+ + Nuovo cliente @@ -29,7 +32,7 @@
- @@ -93,4 +96,55 @@ .Select(x => (ClienteViewModel)x).ToList(); } } + + private async Task onUpload(UploadChangeEventArgs args) + { + var file = args.Files.FirstOrDefault(); + if (file == null && (!file.Name.EndsWith(".xlsx") || !file.Name.EndsWith(".xls"))) + { + await _dialogService.Alert("Il file selezionato non è nel formato corretto.", "Errore"); + return; + } + try + { + await using var uploadStream = file.OpenReadStream(10_000_000); + await using var ms = new MemoryStream(); + await uploadStream.CopyToAsync(ms); + ms.Position = 0; + + using var workbook = new XLWorkbook(ms); + var ws = workbook.Worksheet(1); + var usedRange = ws.RangeUsed(); + + var ragioniSociali = ws.RangeUsed().RowsUsed().Skip(1).Select(r => new { Rid = r.Cell(1).GetString(), RagioneSociale = r.Cell(4).GetString() }).Distinct().ToList(); + + foreach (var cliente in ragioniSociali) + { + var righeCliente = usedRange.RowsUsed().Where(r => r.Cell(1).GetString() == cliente.Rid).ToList(); + + var clienteDb = await _managerService.ClienteService.RicercaPer( + x => x.Rid == cliente.Rid && x.Eliminato == false, + includi: x => x.Include(i => i.Destinazioni), + solaLettura: false) ?? new Cliente(); + + clienteDb = mapCliente(clienteDb, righeCliente); + } + + ms.Close(); + } + catch (Exception ex) + { + var er = ex.Message; + await _dialogService.Alert("Si è verificato un errore durante l'importazione del file.", "Errore"); + } + } + + private Cliente mapCliente(Cliente model, List rows) + { + var firstRow = rows.First(); + model.Rid = firstRow.Cell(1).GetString(); + model.RagioneSociale = firstRow.Cell(4).GetString(); + + return model; + } } diff --git a/StandManager/Components/Pages/Management/Clienti_Edit.razor b/StandManager/Components/Pages/Management/Clienti_Edit.razor index a5b97a3..c6caeaa 100644 --- a/StandManager/Components/Pages/Management/Clienti_Edit.razor +++ b/StandManager/Components/Pages/Management/Clienti_Edit.razor @@ -88,11 +88,11 @@
Agente - +
Tipologia - +
Stato @@ -174,7 +174,7 @@ private ClienteViewModel cliente { get; set; } = new(); private IEnumerable agenti { get; set; } = new List(); - private List> tipologiaCliente { get; set; } = new List>(); + private List tipologiaCliente { get; set; } = new(); private List> statoCliente { get; set; } = new List>(); RadzenDataGrid destinazioniGrid; @@ -197,11 +197,11 @@ agenti = (await _managerService.UtenteService.RicercaQueryable(x => x.Eliminato == false, ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome))) .Select(x => (UtenteViewModel)x).ToList(); var eUtils = new EnumUtils(); - tipologiaCliente = eUtils.GetEnumList(); + tipologiaCliente = (await _managerService.TipologiaClienteService.RicercaQueryable(ordinamento: x => x.OrderBy(y => y.Nome))).Select(x => (TipologiaClienteViewModel)x).ToList(); statoCliente = eUtils.GetEnumList(); if (ClienteId.GetValueOrDefault() != Guid.Empty) - cliente = await _managerService.ClienteService.RicercaPer(x => x.Id == ClienteId, includi: x => x.Include(y => y.Agente).Include(y => y.Destinazioni).ThenInclude(z => z.Agente)); + cliente = await _managerService.ClienteService.RicercaPer(x => x.Id == ClienteId, includi: x => x.Include(y => y.Agente).Include(y => y.TipologiaCliente).Include(y => y.Destinazioni).ThenInclude(z => z.Agente)); else cliente = new ClienteViewModel(); @@ -234,6 +234,12 @@ 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 }; @@ -260,7 +266,7 @@ { await _dialogService.OpenAsync($"Destinazione {destinazione.RagioneSociale}", new Dictionary() { { "destinazioneId", destinazione.Id }, { "clienteId", cliente.Id } }, editNewDialogOption); } - + /// /// Apre il dialog per creare una nuova destinazione collegata al cliente. /// diff --git a/StandManager/Components/Pages/Management/Eventi.razor b/StandManager/Components/Pages/Management/Eventi.razor index 1cfb7ef..7658514 100644 --- a/StandManager/Components/Pages/Management/Eventi.razor +++ b/StandManager/Components/Pages/Management/Eventi.razor @@ -29,7 +29,7 @@
- diff --git a/StandManager/Components/Pages/Management/Utenti.razor b/StandManager/Components/Pages/Management/Utenti.razor index 2757ba2..a153aa6 100644 --- a/StandManager/Components/Pages/Management/Utenti.razor +++ b/StandManager/Components/Pages/Management/Utenti.razor @@ -27,7 +27,7 @@
- diff --git a/StandManager/Model/ClienteViewModel.cs b/StandManager/Model/ClienteViewModel.cs index 0fcb7c0..0e3e7a7 100644 --- a/StandManager/Model/ClienteViewModel.cs +++ b/StandManager/Model/ClienteViewModel.cs @@ -2,10 +2,11 @@ using System.ComponentModel.DataAnnotations; namespace StandManager.Model; + public class ClienteViewModel { public Guid Id { get; set; } - [Required(ErrorMessage ="La ragione sociale è obbligatoria")] + [Required(ErrorMessage = "La ragione sociale è obbligatoria")] public string RagioneSociale { get; set; } [Required(ErrorMessage = "La Partita IVA")] public string PartitaIva { get; set; } @@ -21,8 +22,8 @@ public class ClienteViewModel public List Destinazioni { get; set; } public string Rid { get; set; } - public ClienteTipo TipologiaCliente { get; set; } - public int TipologiaClienteInt { get; set; } + public TipologiaClienteViewModel TipologiaCliente { get; set; } + public Guid? TipologiaClienteId { get; set; } public ClienteStato StatoCliente { get; set; } public int StatoClienteInt { get; set; } @@ -47,7 +48,7 @@ public class ClienteViewModel RagioneSociale = model.RagioneSociale, Rid = model.Rid, TipologiaCliente = model.TipologiaCliente, - TipologiaClienteInt = (int)model.TipologiaCliente, + TipologiaClienteId = model.TipologiaCliente?.Id ?? Guid.Empty, StatoCliente = model.StatoCliente, StatoClienteInt = (int)model.StatoCliente }; @@ -64,7 +65,6 @@ public class ClienteViewModel model.EmailInvito = EmailInvito; model.NumeroTelefono = NumeroTelefono; model.Rid = Rid; - model.TipologiaCliente = (ClienteTipo)TipologiaClienteInt; model.StatoCliente = (ClienteStato)StatoClienteInt; return model; @@ -84,3 +84,20 @@ public class ClienteViewModel return model; } } + +public class TipologiaClienteViewModel +{ + public Guid Id { get; set; } + public string Nome { get; set; } + + public static implicit operator TipologiaClienteViewModel(TipologiaCliente model) + { + return model == null + ? null + : new TipologiaClienteViewModel() + { + Id = model.Id, + Nome = model.Nome + }; + } +} diff --git a/StandManager/Model/IscrizioneEventoViewModel.cs b/StandManager/Model/IscrizioneEventoViewModel.cs index 7e6c503..2fbf9ec 100644 --- a/StandManager/Model/IscrizioneEventoViewModel.cs +++ b/StandManager/Model/IscrizioneEventoViewModel.cs @@ -11,13 +11,12 @@ public class IscrizioneEventoViewModel public ClienteViewModel Cliente { get; set; } [Required(ErrorMessage = "La destinazione è obbligatoria")] - public DestinazioneViewModel Destinazione { get; set; } + public Guid DestinazioneId { get; set; } [Range(1, int.MaxValue, ErrorMessage = "Inserire un numero di partecipanti validi")] public int Partecipanti { get; set; } [Required(ErrorMessage = "Le note sono obbligatorie")] public string Note { get; set; } - public string QrCodeCode { get; set; } public bool ScanCompleto { get; set; } public DateTime? DataScan { get; set; } [Required(ErrorMessage = "Il nome è obbigatorio")] @@ -38,10 +37,8 @@ public class IscrizioneEventoViewModel public string RagioneSociale { get; set; } [Required(ErrorMessage = "Il campo è obbigatorio")] public string EsperienzaConDAC { get; set; } - - public ClienteTipo Tipologia { get; set; } [Required(ErrorMessage = "La tipologia è obbigatoria")] - public int? TipologiaInt { get; set; } + public Guid TipologiaClienteId { get; set; } public RuoloTipo Ruolo { get; set; } [Required(ErrorMessage = "Il ruolo è obbigatorio")] public int? RuoloInt { get; set; } @@ -49,43 +46,10 @@ public class IscrizioneEventoViewModel public bool PresaVisioneDatiPersonali { get; set; } - public static implicit operator IscrizioneEventoViewModel(IscrizioneEvento model) - { - return model == null - ? null - : new IscrizioneEventoViewModel() - { - Id = model.Id, - Evento = model.Evento, - InvitoEvento = model.InvitoEvento, - Cliente = model.Cliente, - Destinazione = model.Destinazione, - Partecipanti = model.Partecipanti, - Note = model.Note, - QrCodeCode = model.QrCodeCode, - ScanCompleto = model.ScanCompleto, - DataScan = model.DataScan, - Nome = model.Nome, - Cognome = model.Cognome, - Email = model.Email, - NumeroTelefono = model.NumeroTelefono, - Provincia = model.Provincia, - Comune = model.Comune, - Cap = model.Cap, - RagioneSociale = model.RagioneSociale, - EsperienzaConDAC = model.EsperienzaConDAC, - Tipologia = model.Tipologia, - TipologiaInt = (int)model.Tipologia, - Ruolo = model.Ruolo, - RuoloInt = (int)model.Ruolo, - }; - } - public IscrizioneEvento Map(IscrizioneEvento model) { model.Partecipanti = Partecipanti; model.Note = Note; - model.QrCodeCode = QrCodeCode; model.ScanCompleto = ScanCompleto; model.DataScan = DataScan; model.Nome = Nome; @@ -97,8 +61,6 @@ public class IscrizioneEventoViewModel model.Cap = Cap; model.RagioneSociale = RagioneSociale; model.EsperienzaConDAC = EsperienzaConDAC; - model.Tipologia = (ClienteTipo)TipologiaInt; - model.Ruolo = (RuoloTipo)RuoloInt; return model; } diff --git a/StandManager/StandManager.csproj b/StandManager/StandManager.csproj index 6a87646..0069e53 100644 --- a/StandManager/StandManager.csproj +++ b/StandManager/StandManager.csproj @@ -8,6 +8,7 @@ + diff --git a/StandManager/wwwroot/css/site.css b/StandManager/wwwroot/css/site.css index ec3d641..6acf808 100644 --- a/StandManager/wwwroot/css/site.css +++ b/StandManager/wwwroot/css/site.css @@ -1,376 +1,8 @@ -html { - font-size: 14px; +.footer { + font-size: 0.875rem; /* stesso size Tabler */ } -@media (min-width: 768px) { - html { - font-size: 16px; - } -} - -.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { - box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; -} - -html { - position: relative; - min-height: 100%; -} - -body { - margin-bottom: 60px; -} - -:root { - --tblr-primary: #90bd22 !important; -} - -.card-selectable { - min-height: 240px; - display: flex; - flex-direction: column; - justify-content: flex-end; /* permette di vedere prima l'immagine poi il titolo in fondo */ - margin-bottom: 20px; /* spazio tra le righe */ - overflow: visible; -} - -.card-selectable-opt { - display: flex; - flex-direction: column; - justify-content: flex-end; /* permette di vedere prima l'immagine poi il titolo in fondo */ - margin-bottom: 20px; /* spazio tra le righe */ - overflow: visible; -} - -.card-widget-image-vert-s { - background-size: contain; /* Cambiato da auto 100% a cover */ - background-position: center; - background-repeat: no-repeat; - height: 50px; - min-height: 50px; - max-height: 50px; - border-radius: 8px 8px 0 0; - overflow: hidden; /* Nasconde tutto ciò che esce dal box */ -} -.card-widget-image-vert-m { - background-size: contain; /* Cambiato da auto 100% a cover */ - background-position: center; - background-repeat: no-repeat; - height: 100px; - min-height: 100px; - max-height: 100px; - border-radius: 8px 8px 0 0; - overflow: hidden; /* Nasconde tutto ciò che esce dal box */ -} - -.card-widget-image-vert-l { - background-size: contain; /* Cambiato da auto 100% a cover */ - background-position: center; - background-repeat: no-repeat; - height: 150px; - min-height: 150px; - max-height: 150px; - border-radius: 8px 8px 0 0; - overflow: hidden; /* Nasconde tutto ciò che esce dal box */ -} - -.card-widget-image-vert-xl { - background-size: contain; /* Cambiato da auto 100% a cover */ - background-position: center; - background-repeat: no-repeat; - height: 200px; - min-height: 200px; - max-height: 200px; - border-radius: 8px 8px 0 0; - overflow: hidden; /* Nasconde tutto ciò che esce dal box */ -} - - -.card-widget-title { - width: 100%; - background: #f5f5f5 !important; - color: #222 !important; - display: block; - padding: 8px 16px; - border-radius: 0 0 8px 8px; - margin: 0; - min-height: 44px; - border-top: 1px solid #ececec; - box-shadow: 0 1px 4px rgba(0,0,0,0.04); - transition: background 0.2s; - /* Aggiungi: - margin-bottom per separare la card dalla riga sotto - */ - margin-bottom: 2px; -} - -.card-widget-image { - background-size:cover; - background-position:center; - height:75px; - min-height:75px; - max-height:75px; -} - -.card-widget { - height:75px; - min-height:75px; - max-height:75px; -} - -.card-color-preview-s { - height: 50px; - min-height: 50px; - max-height: 50px; - border-radius: 8px 8px 0 0; - width: 100%; - /* Così come l'immagine: parte alta della card */ - box-shadow: 0 1px 4px rgba(0,0,0,0.04); -} - -.card-color-preview-m { - height: 100px; - min-height: 100px; - max-height: 100px; - border-radius: 8px 8px 0 0; - width: 100%; - /* Così come l'immagine: parte alta della card */ - box-shadow: 0 1px 4px rgba(0,0,0,0.04); -} -.card-color-preview-l { - height: 150px; - min-height: 150px; - max-height: 150px; - border-radius: 8px 8px 0 0; - width: 100%; - /* Così come l'immagine: parte alta della card */ - box-shadow: 0 1px 4px rgba(0,0,0,0.04); -} -.card-color-preview-xl { - height: 200px; - min-height: 200px; - max-height: 200px; - border-radius: 8px 8px 0 0; - width: 100%; - /* Così come l'immagine: parte alta della card */ - box-shadow: 0 1px 4px rgba(0,0,0,0.04); -} - -.optSelected{ - border: 3px solid green !important; -} - -.timeline{ - position:relative; - padding-left: 32px; -} -.timeline-step { - position:relative; - margin-bottom:24px; - min-height:36px; -} -.timeline-step:last-child { - margin-bottom:0; -} -.timeline-flag { - position:absolute; - left:-28px; - top:3px; - width:20px; - height:20px; - border-radius:50%; - background:#e0e0e0; - border:2px solid #bbb; - display:inline-block; - transition:background 0.2s, border 0.2s; - text-align:center; - font-size:14px; - line-height:18px; -} -.timeline-step.completed{ - cursor: pointer; -} - -.timeline-step.completed .timeline-flag { - background:#28a745; - border-color:#1e7e34; - color:#fff; -} -.timeline-step .timeline-flag:after{ - content: '\2713'; - opacity:0; - transition:opacity 0.2s; - font-weight:bold; - display:block; -} -.timeline-step.completed .timeline-flag:after{ - opacity:1; -} - - -/*Allargo la dimensione della pagina*/ -@media (min-width: 1400px) { - .container, .container-lg, .container-md, .container-sm, .container-xl, .container-xxl { - max-width: 90%; + .footer i[class^="fa-"], + .footer i[class*=" fa-"] { + font-size: 1em; } -} - -/*Mirino*/ -/* === Contenitore principale === */ -.trim-stage.compact{ - position:relative; - width:min(560px, 100%); - margin:0 auto; - height:240px; /* Altezza compatta */ - background:#fff; - border:1px solid #e5e7eb; - border-radius:16px; - box-shadow:0 4px 12px rgba(0,0,0,.06); -} - -/* === Immagine centrale === */ -.trim-image{ - position:absolute; - inset:20% 22%; /* margini interni */ - max-width:56%; - max-height:60%; - object-fit:contain; - background:#fff; - border:1px dashed #cbd5e1; - border-radius:12px; -} - -/* === Controlli (pillole) === */ -.trim-ctrl{ - position:absolute; - display:flex; - align-items:center; - gap:.5rem; - padding:.25rem .5rem; - background:#ffffffd9; - border:1px solid #e5e7eb; - border-radius:999px; - box-shadow:0 2px 6px rgba(0,0,0,.06); -} - -/* Etichette "Sopra/Sotto/Sinistra/Destra" */ -.trim-label{ - font-size:.75rem; - font-weight:600; - color:#334155; - margin:0; -} - -/* Wrapper per select + unità */ -.trim-input{ - display:flex; - align-items:center; - gap:.25rem; -} - -/* Dropdown compatto */ -.trim-input .form-control{ - min-width: 120px; -} - -/* Etichetta "mm" */ -.unit-label{ - font-size:.75rem; - font-weight:500; - color:#475569; -} - -/* === Posizionamenti attorno all’immagine === */ -.trim-ctrl-top { top:0; left:50%; transform:translate(-50%,-40%); } -.trim-ctrl-bottom{ bottom:0; left:50%; transform:translate(-50%,40%); } -.trim-ctrl-left { left:0; top:50%; transform:translate(-40%,-50%); } -.trim-ctrl-right { right:0; top:50%; transform:translate(40%,-50%); } - -/* === Responsività (mobile) === */ -@media (max-width: 576px){ - .trim-stage.compact{ - height:auto; - padding-bottom: 260px; /* spazio per i controlli sotto */ - } - .trim-ctrl{ - position:static; - transform:none; - margin:.35rem auto 0; - width:min(420px, 92%); - justify-content:space-between; - } -} - -.trim-stage.compact .trim-image{ - position:absolute; - top:50%; - left:50%; - transform:translate(-50%, -50%); /* centra in entrambi gli assi */ - max-width:56%; - max-height:60%; - width:auto; - height:auto; - object-fit:contain; - background:#fff; - border:1px dashed #cbd5e1; - border-radius:12px; -} - -/* (facoltativo) se vuoi leggermente più grande o più piccolo */ -@media (min-width: 768px){ - .trim-stage.compact .trim-image{ - max-width:60%; - max-height:70%; - } -} - -.step-no-border{ - padding-left: 0 !important; - border-left: 0 !important; -} - -.modal-config{ - margin-left: 20px !important; - margin-right: 20px !important; -} - -@media (min-width: 576px) { - .modal-config{ - max-width: 97% !important; - } -} - -.reset-flash { - --flash-color: var(--tblr-info, rgb(var(--bs-info-rgb, 58,167,255))); - outline: 2px solid var(--flash-color); - border-radius: .6rem; - - will-change: box-shadow, transform, opacity; - - animation: resetFlashSmooth 1.6s cubic-bezier(.22,.61,.36,.50) both; -} - -@keyframes resetFlashSmooth { - - 0% { - box-shadow: 0 0 0 .75rem color-mix(in srgb, var(--flash-color) 45%, transparent); - transform: translateZ(0) scale(1.01); - opacity: 1; - } - - 35% { - box-shadow: 0 0 0 .55rem color-mix(in srgb, var(--flash-color) 32%, transparent); - transform: scale(1.005); - } - - 70% { - box-shadow: 0 0 0 .25rem color-mix(in srgb, var(--flash-color) 18%, transparent); - transform: scale(1); - } - - 100% { - box-shadow: 0 0 0 0 color-mix(in srgb, var(--flash-color) 0%, transparent); - opacity: 1; - } -} -