diff --git a/.idea/config/applicationhost.config b/.idea/config/applicationhost.config index 2620127..340b771 100644 --- a/.idea/config/applicationhost.config +++ b/.idea/config/applicationhost.config @@ -156,7 +156,7 @@ - + diff --git a/StandManager.Domain/Entita/Cliente.cs b/StandManager.Domain/Entita/Cliente.cs index fa06a19..a18d457 100644 --- a/StandManager.Domain/Entita/Cliente.cs +++ b/StandManager.Domain/Entita/Cliente.cs @@ -18,6 +18,10 @@ public class Cliente : EntitaBase [ForeignKey(nameof(Agente))] public Guid? AgenteId { get; set; } public Utente Agente { get; set; } + + [ForeignKey(nameof(Capoarea))] + public Guid? CapoareaId { get; set; } + public Utente Capoarea { get; set; } [InverseProperty(nameof(Destinazione.Cliente))] public List Destinazioni { get; set; } diff --git a/StandManager.Domain/Entita/Feature.cs b/StandManager.Domain/Entita/Feature.cs index 85aad86..c39cc87 100644 --- a/StandManager.Domain/Entita/Feature.cs +++ b/StandManager.Domain/Entita/Feature.cs @@ -17,5 +17,6 @@ public enum FeatureType Insert = 0, Edit, Delete, + Capoarea = 50, AdminGlobal = 100 } diff --git a/StandManager.Domain/Entita/Utente.cs b/StandManager.Domain/Entita/Utente.cs index a2fa6b1..3ee75ea 100644 --- a/StandManager.Domain/Entita/Utente.cs +++ b/StandManager.Domain/Entita/Utente.cs @@ -20,6 +20,10 @@ public class Utente : EntitaBase [ForeignKey(nameof(Ruolo))] public Guid? RuoloId { get; set; } public Ruolo Ruolo { get; set; } + + [ForeignKey(nameof(Capoarea))] + public Guid? CapoareaId { get; set; } + public Utente Capoarea { get; set; } public override string ToString() { diff --git a/StandManager.Infrastructure/Migrations/20251217125158_Capoarea.Designer.cs b/StandManager.Infrastructure/Migrations/20251217125158_Capoarea.Designer.cs new file mode 100644 index 0000000..9425021 --- /dev/null +++ b/StandManager.Infrastructure/Migrations/20251217125158_Capoarea.Designer.cs @@ -0,0 +1,1022 @@ +// +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("20251217125158_Capoarea")] + partial class Capoarea + { + /// + 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("CapoareaId") + .HasColumnType("uniqueidentifier"); + + 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("CapoareaId"); + + 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("CodiceFiscale") + .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.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.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DataCreazione") + .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("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Ordinamento") + .HasColumnType("int"); + + b.Property("SezioneId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.HasIndex("SezioneId"); + + b.ToTable("Feature"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.InvitoEvento", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClienteId") + .HasColumnType("uniqueidentifier"); + + b.Property("CodiceFornito") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + 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("GiornoPresenza") + .HasColumnType("datetime2"); + + b.Property("IdUtenteCreazione") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteModifica") + .HasColumnType("uniqueidentifier"); + + b.Property("InvitoEventoId") + .HasColumnType("uniqueidentifier"); + + b.Property("Nome") + .HasColumnType("nvarchar(max)"); + + b.Property("Note") + .HasColumnType("nvarchar(max)"); + + b.Property("NumeroTelefono") + .HasColumnType("nvarchar(max)"); + + b.Property("Partecipanti") + .HasColumnType("int"); + + b.Property("PartitaIva") + .HasColumnType("nvarchar(max)"); + + 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.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DataCreazione") + .HasColumnType("datetime2"); + + b.Property("DataModifica") + .HasColumnType("datetime2"); + + b.Property("Eliminato") + .HasColumnType("bit"); + + b.Property("IdFeature") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteCreazione") + .HasColumnType("uniqueidentifier"); + + b.Property("IdUtenteModifica") + .HasColumnType("uniqueidentifier"); + + b.Property("RuoloId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("IdFeature"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.HasIndex("RuoloId"); + + b.ToTable("Permission"); + }); + + 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.Ruolo", 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("Ruolo"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Sezione", 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.Property("Ordinamento") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.ToTable("Sezione"); + }); + + 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("CapoareaId") + .HasColumnType("uniqueidentifier"); + + b.Property("CodiceAgente") + .HasColumnType("nvarchar(max)"); + + 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("RuoloId") + .HasColumnType("uniqueidentifier"); + + b.Property("Username") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("CapoareaId"); + + b.HasIndex("IdUtenteCreazione"); + + b.HasIndex("IdUtenteModifica"); + + b.HasIndex("RuoloId"); + + 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", "Capoarea") + .WithMany() + .HasForeignKey("CapoareaId"); + + 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("Capoarea"); + + 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.Feature", b => + { + 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.Sezione", "Sezione") + .WithMany("Features") + .HasForeignKey("SezioneId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Sezione"); + + 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.Permission", b => + { + b.HasOne("StandManager.Domain.Entita.Feature", "Feature") + .WithMany() + .HasForeignKey("IdFeature") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + 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.Ruolo", "Ruolo") + .WithMany("Permessi") + .HasForeignKey("RuoloId"); + + b.Navigation("Feature"); + + b.Navigation("Ruolo"); + + 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.Ruolo", 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.Sezione", 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.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", "Capoarea") + .WithMany() + .HasForeignKey("CapoareaId"); + + 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.Ruolo", "Ruolo") + .WithMany("Utenti") + .HasForeignKey("RuoloId"); + + b.Navigation("Capoarea"); + + b.Navigation("Ruolo"); + + 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"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Ruolo", b => + { + b.Navigation("Permessi"); + + b.Navigation("Utenti"); + }); + + modelBuilder.Entity("StandManager.Domain.Entita.Sezione", b => + { + b.Navigation("Features"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/StandManager.Infrastructure/Migrations/20251217125158_Capoarea.cs b/StandManager.Infrastructure/Migrations/20251217125158_Capoarea.cs new file mode 100644 index 0000000..c82476d --- /dev/null +++ b/StandManager.Infrastructure/Migrations/20251217125158_Capoarea.cs @@ -0,0 +1,79 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace StandManager.Infrastructure.Migrations +{ + /// + public partial class Capoarea : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "CapoareaId", + table: "Utente", + type: "uniqueidentifier", + nullable: true); + + migrationBuilder.AddColumn( + name: "CapoareaId", + table: "Cliente", + type: "uniqueidentifier", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_Utente_CapoareaId", + table: "Utente", + column: "CapoareaId"); + + migrationBuilder.CreateIndex( + name: "IX_Cliente_CapoareaId", + table: "Cliente", + column: "CapoareaId"); + + migrationBuilder.AddForeignKey( + name: "FK_Cliente_Utente_CapoareaId", + table: "Cliente", + column: "CapoareaId", + principalTable: "Utente", + principalColumn: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_Utente_Utente_CapoareaId", + table: "Utente", + column: "CapoareaId", + principalTable: "Utente", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Cliente_Utente_CapoareaId", + table: "Cliente"); + + migrationBuilder.DropForeignKey( + name: "FK_Utente_Utente_CapoareaId", + table: "Utente"); + + migrationBuilder.DropIndex( + name: "IX_Utente_CapoareaId", + table: "Utente"); + + migrationBuilder.DropIndex( + name: "IX_Cliente_CapoareaId", + table: "Cliente"); + + migrationBuilder.DropColumn( + name: "CapoareaId", + table: "Utente"); + + migrationBuilder.DropColumn( + name: "CapoareaId", + table: "Cliente"); + } + } +} diff --git a/StandManager.Infrastructure/Migrations/StandManagerDbContextModelSnapshot.cs b/StandManager.Infrastructure/Migrations/StandManagerDbContextModelSnapshot.cs index 1e343d4..bae2cc4 100644 --- a/StandManager.Infrastructure/Migrations/StandManagerDbContextModelSnapshot.cs +++ b/StandManager.Infrastructure/Migrations/StandManagerDbContextModelSnapshot.cs @@ -34,6 +34,9 @@ namespace StandManager.Infrastructure.Migrations b.Property("Cap") .HasColumnType("nvarchar(max)"); + b.Property("CapoareaId") + .HasColumnType("uniqueidentifier"); + b.Property("Citta") .HasColumnType("nvarchar(max)"); @@ -85,6 +88,8 @@ namespace StandManager.Infrastructure.Migrations b.HasIndex("AgenteId"); + b.HasIndex("CapoareaId"); + b.HasIndex("IdUtenteCreazione"); b.HasIndex("IdUtenteModifica"); @@ -633,6 +638,9 @@ namespace StandManager.Infrastructure.Migrations .ValueGeneratedOnAdd() .HasColumnType("uniqueidentifier"); + b.Property("CapoareaId") + .HasColumnType("uniqueidentifier"); + b.Property("CodiceAgente") .HasColumnType("nvarchar(max)"); @@ -676,6 +684,8 @@ namespace StandManager.Infrastructure.Migrations b.HasKey("Id"); + b.HasIndex("CapoareaId"); + b.HasIndex("IdUtenteCreazione"); b.HasIndex("IdUtenteModifica"); @@ -691,6 +701,10 @@ namespace StandManager.Infrastructure.Migrations .WithMany() .HasForeignKey("AgenteId"); + b.HasOne("StandManager.Domain.Entita.Utente", "Capoarea") + .WithMany() + .HasForeignKey("CapoareaId"); + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") .WithMany() .HasForeignKey("IdUtenteCreazione"); @@ -705,6 +719,8 @@ namespace StandManager.Infrastructure.Migrations b.Navigation("Agente"); + b.Navigation("Capoarea"); + b.Navigation("TipologiaCliente"); b.Navigation("UtenteCreazione"); @@ -946,6 +962,10 @@ namespace StandManager.Infrastructure.Migrations modelBuilder.Entity("StandManager.Domain.Entita.Utente", b => { + b.HasOne("StandManager.Domain.Entita.Utente", "Capoarea") + .WithMany() + .HasForeignKey("CapoareaId"); + b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") .WithMany() .HasForeignKey("IdUtenteCreazione"); @@ -958,6 +978,8 @@ namespace StandManager.Infrastructure.Migrations .WithMany("Utenti") .HasForeignKey("RuoloId"); + b.Navigation("Capoarea"); + b.Navigation("Ruolo"); b.Navigation("UtenteCreazione"); diff --git a/StandManager.Service/FeatureService.cs b/StandManager.Service/FeatureService.cs new file mode 100644 index 0000000..e28ecae --- /dev/null +++ b/StandManager.Service/FeatureService.cs @@ -0,0 +1,13 @@ +using OAService.Service.Servizi.Implementazioni; +using StandManager.Domain.Entita; +using StandManager.Service.Interfaces; +using StandManager.Service.Repository; + +namespace StandManager.Service; + +public class FeatureService : TService, IFeatureService +{ + public FeatureService(IStandManagerUnitOfWork unitOfWork) : base(unitOfWork) + { + } +} \ No newline at end of file diff --git a/StandManager.Service/Interfaces/IClienteService.cs b/StandManager.Service/Interfaces/IClienteService.cs index 304c17f..8ea8720 100644 --- a/StandManager.Service/Interfaces/IClienteService.cs +++ b/StandManager.Service/Interfaces/IClienteService.cs @@ -5,4 +5,4 @@ namespace StandManager.Service.Interfaces; public interface IClienteService : ITService { -} +} \ No newline at end of file diff --git a/StandManager.Service/Interfaces/IFeatureService.cs b/StandManager.Service/Interfaces/IFeatureService.cs new file mode 100644 index 0000000..11507ce --- /dev/null +++ b/StandManager.Service/Interfaces/IFeatureService.cs @@ -0,0 +1,9 @@ +using OAService.Service.Repository; +using OAService.Service.Servizi.Interfacce; +using StandManager.Domain.Entita; + +namespace StandManager.Service.Interfaces; + +public interface IFeatureService : ITService +{ +} \ No newline at end of file diff --git a/StandManager.Service/Interfaces/IManagerService.cs b/StandManager.Service/Interfaces/IManagerService.cs index c2f54a9..2eea438 100644 --- a/StandManager.Service/Interfaces/IManagerService.cs +++ b/StandManager.Service/Interfaces/IManagerService.cs @@ -5,9 +5,13 @@ public IClienteService ClienteService{ get; set; } public IDestinazioneService DestinazioneService{ get; set; } public IEventoService EventoService{ get; set; } + public IFeatureService FeatureService{ get; set; } public IInvitoEventoService InvitoEventoService{ get; set; } public IIscrizioneEventoService IscrizioneEventoService{ get; set; } + public IPermissionService PermissionService{ get; set; } public IReferenteService ReferenteService{ get; set; } + public IRuoloService RuoloService{ get; set; } + public ISezioneService SezioneService{ get; set; } public ITipologiaClienteService TipologiaClienteService { get; set; } public IUtenteService UtenteService { get; set; } } diff --git a/StandManager.Service/Interfaces/IPermissionService.cs b/StandManager.Service/Interfaces/IPermissionService.cs new file mode 100644 index 0000000..a622939 --- /dev/null +++ b/StandManager.Service/Interfaces/IPermissionService.cs @@ -0,0 +1,9 @@ +using OAService.Service.Repository; +using OAService.Service.Servizi.Interfacce; +using StandManager.Domain.Entita; + +namespace StandManager.Service.Interfaces; + +public interface IPermissionService : ITService +{ +} \ No newline at end of file diff --git a/StandManager.Service/Interfaces/IRuoloService.cs b/StandManager.Service/Interfaces/IRuoloService.cs new file mode 100644 index 0000000..c00359e --- /dev/null +++ b/StandManager.Service/Interfaces/IRuoloService.cs @@ -0,0 +1,9 @@ +using OAService.Service.Repository; +using OAService.Service.Servizi.Interfacce; +using StandManager.Domain.Entita; + +namespace StandManager.Service.Interfaces; + +public interface IRuoloService : ITService +{ +} \ No newline at end of file diff --git a/StandManager.Service/Interfaces/ISezioneService.cs b/StandManager.Service/Interfaces/ISezioneService.cs new file mode 100644 index 0000000..b1dd943 --- /dev/null +++ b/StandManager.Service/Interfaces/ISezioneService.cs @@ -0,0 +1,9 @@ +using OAService.Service.Repository; +using OAService.Service.Servizi.Interfacce; +using StandManager.Domain.Entita; + +namespace StandManager.Service.Interfaces; + +public interface ISezioneService : ITService +{ +} \ No newline at end of file diff --git a/StandManager.Service/ManagerService.cs b/StandManager.Service/ManagerService.cs index acaba6a..e3fb2dd 100644 --- a/StandManager.Service/ManagerService.cs +++ b/StandManager.Service/ManagerService.cs @@ -6,7 +6,7 @@ public class ManagerService : IManagerService { public ManagerService(IUtenteService utenteService, IClienteService clienteService, IDestinazioneService destinazioneService, IEventoService eventoService, IInvitoEventoService invitoEventoService, IIscrizioneEventoService iscrizioneEventoService, IReferenteService referenteService, - ITipologiaClienteService tipologiaClienteService) + ITipologiaClienteService tipologiaClienteService, IFeatureService featureService, IPermissionService permissionService, IRuoloService ruoloService, ISezioneService sezioneService) { UtenteService = utenteService; ClienteService = clienteService; @@ -16,14 +16,22 @@ public class ManagerService : IManagerService IscrizioneEventoService = iscrizioneEventoService; ReferenteService = referenteService; TipologiaClienteService = tipologiaClienteService; + FeatureService = featureService; + PermissionService = permissionService; + RuoloService = ruoloService; + SezioneService = sezioneService; } public IUtenteService UtenteService { get; set; } public IClienteService ClienteService { get; set; } public IDestinazioneService DestinazioneService { get; set; } public IEventoService EventoService { get; set; } + public IFeatureService FeatureService { get; set; } public IInvitoEventoService InvitoEventoService{ get; set; } public IIscrizioneEventoService IscrizioneEventoService { get; set; } + public IPermissionService PermissionService { get; set; } public IReferenteService ReferenteService { get; set; } + public IRuoloService RuoloService { get; set; } + public ISezioneService SezioneService { get; set; } public ITipologiaClienteService TipologiaClienteService { get; set; } } \ No newline at end of file diff --git a/StandManager.Service/PermissionService.cs b/StandManager.Service/PermissionService.cs new file mode 100644 index 0000000..8e7486d --- /dev/null +++ b/StandManager.Service/PermissionService.cs @@ -0,0 +1,13 @@ +using OAService.Service.Servizi.Implementazioni; +using StandManager.Domain.Entita; +using StandManager.Service.Interfaces; +using StandManager.Service.Repository; + +namespace StandManager.Service; + +public class PermissionService : TService, IPermissionService +{ + public PermissionService(IStandManagerUnitOfWork unitOfWork) : base(unitOfWork) + { + } +} \ No newline at end of file diff --git a/StandManager.Service/RuoloService.cs b/StandManager.Service/RuoloService.cs new file mode 100644 index 0000000..43f82cb --- /dev/null +++ b/StandManager.Service/RuoloService.cs @@ -0,0 +1,13 @@ +using OAService.Service.Servizi.Implementazioni; +using StandManager.Domain.Entita; +using StandManager.Service.Interfaces; +using StandManager.Service.Repository; + +namespace StandManager.Service; + +public class RuoloService : TService, IRuoloService +{ + public RuoloService(IStandManagerUnitOfWork unitOfWork) : base(unitOfWork) + { + } +} \ No newline at end of file diff --git a/StandManager.Service/SezioneService.cs b/StandManager.Service/SezioneService.cs new file mode 100644 index 0000000..63f9a3a --- /dev/null +++ b/StandManager.Service/SezioneService.cs @@ -0,0 +1,13 @@ +using OAService.Service.Servizi.Implementazioni; +using StandManager.Domain.Entita; +using StandManager.Service.Interfaces; +using StandManager.Service.Repository; + +namespace StandManager.Service; + +public class SezioneService : TService, ISezioneService +{ + public SezioneService(IStandManagerUnitOfWork unitOfWork) : base(unitOfWork) + { + } +} \ No newline at end of file diff --git a/StandManager/Components/Layout/MainLayout.razor b/StandManager/Components/Layout/MainLayout.razor index ac4f993..ccc3d32 100644 --- a/StandManager/Components/Layout/MainLayout.razor +++ b/StandManager/Components/Layout/MainLayout.razor @@ -43,40 +43,14 @@
@@ -99,20 +73,4 @@ base.OnInitializedAsync(); currentUrl = NavManager.ToBaseRelativePath(NavManager.Uri); } - - private string GetActiveClass(string href) - { - string currentClean = currentUrl.Split("management").Last(); - string hrefClean = href.Split("management").Last(); - - - if (currentClean.Contains("?")) - currentClean = currentClean.Substring(0, currentClean.IndexOf("?")); - - var isActive = (currentClean.Contains(hrefClean, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(hrefClean) - || (string.IsNullOrEmpty(hrefClean) && string.IsNullOrEmpty(currentClean))); - - return isActive ? "active" : ""; - } - } \ No newline at end of file diff --git a/StandManager/Components/Layout/NavMenu.razor b/StandManager/Components/Layout/NavMenu.razor deleted file mode 100644 index 6c00167..0000000 --- a/StandManager/Components/Layout/NavMenu.razor +++ /dev/null @@ -1,94 +0,0 @@ -@implements IDisposable - -@inject NavigationManager NavigationManager - - - - - - - -@code { - private string? currentUrl; - - protected override void OnInitialized() - { - currentUrl = NavigationManager.ToBaseRelativePath(NavigationManager.Uri); - NavigationManager.LocationChanged += OnLocationChanged; - } - - private void OnLocationChanged(object? sender, LocationChangedEventArgs e) - { - currentUrl = NavigationManager.ToBaseRelativePath(e.Location); - StateHasChanged(); - } - - public void Dispose() - { - NavigationManager.LocationChanged -= OnLocationChanged; - } - - public void onLogoutPressed() - { - var a = ""; - } -} - diff --git a/StandManager/Components/Layout/NavMenu.razor.css b/StandManager/Components/Layout/NavMenu.razor.css deleted file mode 100644 index 16700eb..0000000 --- a/StandManager/Components/Layout/NavMenu.razor.css +++ /dev/null @@ -1,125 +0,0 @@ -.navbar-toggler { - appearance: none; - cursor: pointer; - width: 3.5rem; - height: 2.5rem; - color: white; - position: absolute; - top: 0.5rem; - right: 1rem; - border: 1px solid rgba(255, 255, 255, 0.1); - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1); -} - -.navbar-toggler:checked { - background-color: rgba(255, 255, 255, 0.5); -} - -.top-row { - height: 3.5rem; - background-color: rgba(0,0,0,0.4); -} - -.navbar-brand { - font-size: 1.1rem; -} - -.bi { - display: inline-block; - position: relative; - width: 1.25rem; - height: 1.25rem; - margin-right: 0.75rem; - top: -1px; - background-size: cover; -} - -.bi-house-door-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); -} - -.bi-plus-square-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); -} - -.bi-list-nested-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); -} - -.bi-lock-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath d='M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2zM5 8h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1z'/%3E%3C/svg%3E"); -} - -.bi-person-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-person' viewBox='0 0 16 16'%3E%3Cpath d='M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4Zm-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664h10Z'/%3E%3C/svg%3E"); -} - -.bi-person-badge-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-person-badge' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 2a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1h-3zM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0z'/%3E%3Cpath d='M4.5 0A2.5 2.5 0 0 0 2 2.5V14a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V2.5A2.5 2.5 0 0 0 11.5 0h-7zM3 2.5A1.5 1.5 0 0 1 4.5 1h7A1.5 1.5 0 0 1 13 2.5v10.795a4.2 4.2 0 0 0-.776-.492C11.392 12.387 10.063 12 8 12s-3.392.387-4.224.803a4.2 4.2 0 0 0-.776.492V2.5z'/%3E%3C/svg%3E"); -} - -.bi-person-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-person-fill' viewBox='0 0 16 16'%3E%3Cpath d='M3 14s-1 0-1-1 1-4 6-4 6 3 6 4-1 1-1 1H3Zm5-6a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z'/%3E%3C/svg%3E"); -} - -.bi-arrow-bar-left-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-arrow-bar-left' viewBox='0 0 16 16'%3E%3Cpath d='M12.5 15a.5.5 0 0 1-.5-.5v-13a.5.5 0 0 1 1 0v13a.5.5 0 0 1-.5.5ZM10 8a.5.5 0 0 1-.5.5H3.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L3.707 7.5H9.5a.5.5 0 0 1 .5.5Z'/%3E%3C/svg%3E"); -} - -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item ::deep .nav-link { - color: #d7d7d7; - background: none; - border: none; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - width: 100%; - } - -.nav-item ::deep a.active { - background-color: rgba(255,255,255,0.37); - color: white; -} - -.nav-item ::deep .nav-link:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} - -.nav-scrollable { - display: none; -} - -.navbar-toggler:checked ~ .nav-scrollable { - display: block; -} - -@media (min-width: 641px) { - .navbar-toggler { - display: none; - } - - .nav-scrollable { - /* Never collapse the sidebar for wide screens */ - display: block; - - /* Allow sidebar to scroll for tall menus */ - height: calc(100vh - 3.5rem); - overflow-y: auto; - } -} diff --git a/StandManager/Components/NavigationItem.razor b/StandManager/Components/NavigationItem.razor new file mode 100644 index 0000000..588f129 --- /dev/null +++ b/StandManager/Components/NavigationItem.razor @@ -0,0 +1,31 @@ + + +@code{ + [Parameter] public string currentUrl { get; set; } = ""; + [Parameter] public string requiredUrl { get; set; } = "/"; + [Parameter] public string destination { get; set; } = "/"; + [Parameter] public string iconName { get; set; } = "fa-user"; + [Parameter] public string title { get; set; } + + private string GetActiveClass() + { + var currentClean = currentUrl.Split("management").Last(); + var hrefClean = requiredUrl.Split("management").Last(); + + if (currentClean.Contains("?")) + currentClean = currentClean.Substring(0, currentClean.IndexOf("?")); + + var isActive = (currentClean.Contains(hrefClean, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(hrefClean) + || (string.IsNullOrEmpty(hrefClean) && string.IsNullOrEmpty(currentClean))); + + return isActive ? "active" : ""; + } + +} \ No newline at end of file diff --git a/StandManager/Components/Pages/Account/Login.razor b/StandManager/Components/Pages/Account/Login.razor index 832aa1e..c8306d5 100644 --- a/StandManager/Components/Pages/Account/Login.razor +++ b/StandManager/Components/Pages/Account/Login.razor @@ -9,6 +9,7 @@ @using StandManager.Infrastructure.DAL.Context @using StandManager.Model @using System.Security.Claims +@using Microsoft.EntityFrameworkCore @using StandManager.Service.Interfaces @inject IHttpContextAccessor HttpContextAccessor @@ -66,7 +67,8 @@ /// private async Task HandleValidSubmit(EditContext args) { - var user = await _managerService.UtenteService.RicercaPer(x => x.Email == model.Email); + var user = await _managerService.UtenteService.RicercaPer(x => x.Email == model.Email, + includi:x => x.Include(y => y.Ruolo)); var hasher = new PasswordHasher(); if (user == null || @@ -81,7 +83,8 @@ { new Claim(ClaimTypes.Name, user.Email), new Claim(ClaimTypes.Role, "Admin"), - new Claim("UserId", user.Id.ToString()) + new Claim("UserId", user.Id.ToString()), + new Claim("RoleId", user.RuoloId?.ToString()) }; var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); diff --git a/StandManager/Components/Pages/Management/Clienti_Edit.razor b/StandManager/Components/Pages/Management/Clienti_Edit.razor index ac5cedd..788f474 100644 --- a/StandManager/Components/Pages/Management/Clienti_Edit.razor +++ b/StandManager/Components/Pages/Management/Clienti_Edit.razor @@ -169,18 +169,19 @@ @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 List tipologiaCliente { get; set; } = new(); - private List> statoCliente { get; set; } = new List>(); + private List> statoCliente { get; set; } = new(); RadzenDataGrid destinazioniGrid; private string pageTitle => cliente?.Id == Guid.Empty ? "Nuovo cliente" : "Modifica cliente"; - private DialogOptions editNewDialogOption { get; set; } = new DialogOptions() + private DialogOptions editNewDialogOption { get; set; } = new() { Resizable = false, Draggable = false, @@ -194,7 +195,19 @@ /// protected override async Task OnInitializedAsync() { - agenti = (await _managerService.UtenteService.RicercaQueryable(x => x.Eliminato == false, ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome))) + 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)); + + var isAdmin = ruolo?.Permessi.Where(x => x.Eliminato == false)?.Any(x => x.Feature.Type == FeatureType.AdminGlobal) ?? false; + agenti = ruolo == null + ? [await _managerService.UtenteService.RicercaPer(x => x.Id == idClaim)] + : (await _managerService.UtenteService.RicercaQueryable( + x => x.Eliminato == false && (isAdmin || x.CapoareaId == idClaim), + includi: x => x.Include(y => y.Capoarea), + ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome))) .Select(x => (UtenteViewModel)x).ToList(); var eUtils = new EnumUtils(); tipologiaCliente = (await _managerService.TipologiaClienteService.RicercaQueryable(ordinamento: x => x.OrderBy(y => y.Nome))).Select(x => (TipologiaClienteViewModel)x).ToList(); @@ -225,8 +238,6 @@ /// private async Task onClienteSave() { - var idClaim = await MembershipUtils.GetUserId(auth); - var model = await _managerService.ClienteService.RicercaPer(x => x.Id == cliente.Id, solaLettura: false) ?? new Cliente() { Destinazioni = new List() }; diff --git a/StandManager/Components/Pages/Management/Ruoli.razor b/StandManager/Components/Pages/Management/Ruoli.razor new file mode 100644 index 0000000..261f890 --- /dev/null +++ b/StandManager/Components/Pages/Management/Ruoli.razor @@ -0,0 +1,97 @@ +@attribute [Authorize] +@page "/management/Ruoli" +@using ClosedXML.Excel +@using Microsoft.EntityFrameworkCore +@using StandManager.Model +@using System.Threading.Tasks + +@rendermode InteractiveServer + +@inject AuthenticationStateProvider auth + +Ruoli + +
+ +
+
+
+
+ +
Overview
+

Ruoli

+
+ +
+
+
+ + + + + + + + + + +
+
+
+
+
+
+
+ +@code { + List ruoli; + + /// + /// Carica l’elenco dei clienti non eliminati, includendo l’agente, + /// e prepara i dati per la visualizzazione in pagina. + /// + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + ruoli = (await _managerService.RuoloService.RicercaQueryable( + x => x.Eliminato == false, + ordinamento: x => x.OrderBy(y => y.Nome))) + .Select(x => (RuoloViewModel)x).ToList(); + } + + /// + /// Apre la pagina di modifica per il cliente selezionato. + /// + private async Task EditRow(RuoloViewModel ruolo) + { + _navManager.NavigateTo($"/management/Ruoli/Modifica/{ruolo.Id}"); + } + + /// + /// Chiede conferma ed elimina il cliente scelto; se confermato, + /// aggiorna la lista ricaricandola dal database. + /// + private async Task DeleteRow(RuoloViewModel ruolo) + { + var ok = await _dialogService.Confirm($"Vuoi davvero eliminare il ruolo {ruolo.Nome}?", "Conferma eliminazione", new ConfirmOptions { OkButtonText = "Sì", CancelButtonText = "No", Width = "400px" }); + + if (ok == true) + { + await _managerService.RuoloService.Elimina(ruolo.Id, await MembershipUtils.GetUserId(auth)); + ruoli = (await _managerService.RuoloService.RicercaQueryable(x => x.Eliminato == false)) + .Select(x => (RuoloViewModel)x).ToList(); + } + } +} diff --git a/StandManager/Components/Pages/Management/Ruoli_Edit.razor b/StandManager/Components/Pages/Management/Ruoli_Edit.razor new file mode 100644 index 0000000..912fb18 --- /dev/null +++ b/StandManager/Components/Pages/Management/Ruoli_Edit.razor @@ -0,0 +1,175 @@ +@attribute [Authorize] +@rendermode InteractiveServer + +@page "/management/Ruoli/Modifica" +@page "/management/Ruoli/Modifica/{RuoloId:guid}" + +@using Microsoft.AspNetCore.Identity +@using Microsoft.EntityFrameworkCore +@using StandManager.Model +@inject AuthenticationStateProvider auth + +@pageTitle + +
+ + + + +
+
+
+
+
+
+
+ + + +
+
+
+ Nome + +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+ + + + + + + + + + + + +
+
+
+
+
+ +@code { + [Parameter] + public Guid? RuoloId { get; set; } + + [SupplyParameterFromForm] + private RuoloViewModel? ruolo { get; set; } = new(); + private List permessi { get; set; } = new(); + private RadzenDataGrid permessiGrid { get; set; } + + private string pageTitle => ruolo?.Id == Guid.Empty ? "Nuovo ruolo" : "Modifica ruolo"; + + /// + /// Recupera l’utente da modificare se è stato passato un ID, + /// altrimenti inizializza un nuovo modello vuoto. + /// + protected override async Task OnInitializedAsync() + { + ruolo = RuoloId.GetValueOrDefault() != Guid.Empty + ? await _managerService.RuoloService.RicercaPer(x => x.Id == RuoloId) + : new RuoloViewModel(); + + var sections = (await + _managerService.SezioneService.RicercaQueryable(x => x.Eliminato == false, includi: x => x.Include(y => y.Features))).ToList(); + var permissions = await _managerService.PermissionService.RicercaQueryable(x => x.Ruolo.Id == ruolo.Id && x.Eliminato == false); + + permessi = []; + foreach (var section in sections) + permessi.AddRange(section.Features.Where(x => !x.Eliminato).Select(x => new PermissionRowViewModel(section, x, permissions)).ToList()); + } + + void OnRender(DataGridRenderEventArgs args) + { + if (!args.FirstRender) return; + args.Grid.Groups.Add(new GroupDescriptor(){ Property = "Nome", SortOrder = SortOrder.Descending }); + StateHasChanged(); + } + + /// + /// Salva l’utente: recupera o crea il modello, applica le modifiche dalla UI, + /// gestisce l’hash della password se inserita e registra tutto a database + /// usando l’ID dell’utente autenticato. + /// + private async Task onRuoloSave() + { + var idClaim = await MembershipUtils.GetUserId(auth); + + var model = await _managerService.RuoloService.RicercaPer(x => x.Id == ruolo.Id, solaLettura: false) + ?? new Ruolo(); + + model.Nome = ruolo.Nome; + + await _managerService.RuoloService.Salva(model, idClaim); + _navManager.NavigateTo("/management/Ruoli"); + } + + /// + /// Torna all’elenco ruoli senza applicare altre azioni. + /// + private void backToHome() + { + _navManager.NavigateTo("/management/Ruoli"); + } + + private async Task onSelected(bool selected, PermissionRowViewModel permissionRow) + { + var idClaim = await MembershipUtils.GetUserId(auth); + var ruoloPermission = await _managerService.PermissionService.RicercaPer( + x => x.RuoloId == ruolo.Id && x.IdFeature == permissionRow.IdFeature && x.Eliminato == false, + includi: x => x.Include(y => y.Ruolo).Include(y => y.Feature), + solaLettura: false); + if (ruoloPermission == null && selected) + { + var permission = new Permission() + { + RuoloId = ruolo.Id, + IdFeature = permissionRow.IdFeature + }; + await _managerService.PermissionService.Salva(permission, idClaim); + } + else + { + await _managerService.PermissionService.Elimina(ruoloPermission?.Id ?? Guid.Empty, idClaim); + } + permissionRow.Selected = selected; + } + +} diff --git a/StandManager/Components/Pages/Management/Utenti.razor b/StandManager/Components/Pages/Management/Utenti.razor index a153aa6..96d15b8 100644 --- a/StandManager/Components/Pages/Management/Utenti.razor +++ b/StandManager/Components/Pages/Management/Utenti.razor @@ -1,5 +1,6 @@ @attribute [Authorize] @page "/management/Utenti" +@using Microsoft.EntityFrameworkCore @rendermode InteractiveServer @@ -35,8 +36,10 @@ + + - +