diff --git a/.gitignore b/.gitignore index ff9bca6..84d7ce2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Specific to the EFCore-Blazor sample app *.db +*.db3 *.db-shm *.db-wal diff --git a/.idea/.idea.SteUp/.idea/dataSources.xml b/.idea/.idea.SteUp/.idea/dataSources.xml new file mode 100644 index 0000000..8b186b2 --- /dev/null +++ b/.idea/.idea.SteUp/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:$PROJECT_DIR$/SteUp.Data/design-time.db3 + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/SteUp.Data/LocalDb/AppDbContext.cs b/SteUp.Data/LocalDb/AppDbContext.cs new file mode 100644 index 0000000..a2b7389 --- /dev/null +++ b/SteUp.Data/LocalDb/AppDbContext.cs @@ -0,0 +1,27 @@ +using Microsoft.EntityFrameworkCore; +using SteUp.Shared.Core.Entities; + +namespace SteUp.Data.LocalDb; + +public class AppDbContext(DbContextOptions options) : DbContext(options) +{ + public DbSet Ispezioni => Set(); + public DbSet Schede => Set(); + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.Entity() + .HasKey(x => new { x.CodMdep, x.Data, x.Rilevatore }); + + modelBuilder.Entity() + .HasOne(x => x.Ispezione) + .WithMany(x => x.Schede) + .HasForeignKey(x => new { x.CodMdep, x.Data, x.Rilevatore }) + .OnDelete(DeleteBehavior.Cascade); + + modelBuilder.Entity() + .HasIndex(x => new { x.CodMdep, x.Data, x.Rilevatore }); + } +} \ No newline at end of file diff --git a/SteUp.Data/LocalDb/AppDbContextFactory.cs b/SteUp.Data/LocalDb/AppDbContextFactory.cs new file mode 100644 index 0000000..69c5f26 --- /dev/null +++ b/SteUp.Data/LocalDb/AppDbContextFactory.cs @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; + +namespace SteUp.Data.LocalDb; + +public class AppDbContextFactory : IDesignTimeDbContextFactory +{ + public AppDbContext CreateDbContext(string[] args) + { + var options = new DbContextOptionsBuilder() + .UseSqlite("Data Source=design-time.db3") + .Options; + + return new AppDbContext(options); + } +} \ No newline at end of file diff --git a/SteUp.Data/LocalDb/DbInitializer.cs b/SteUp.Data/LocalDb/DbInitializer.cs new file mode 100644 index 0000000..5d44b7e --- /dev/null +++ b/SteUp.Data/LocalDb/DbInitializer.cs @@ -0,0 +1,12 @@ +using Microsoft.EntityFrameworkCore; +using SteUp.Shared.Core.Interface.LocalDb; + +namespace SteUp.Data.LocalDb; + +public class DbInitializer(AppDbContext db) : IDbInitializer +{ + public async Task InitializeAsync() + { + await db.Database.MigrateAsync(); + } +} \ No newline at end of file diff --git a/SteUp.Data/LocalDb/DbPathProvider.cs b/SteUp.Data/LocalDb/DbPathProvider.cs new file mode 100644 index 0000000..f15a09b --- /dev/null +++ b/SteUp.Data/LocalDb/DbPathProvider.cs @@ -0,0 +1,17 @@ +using Microsoft.Maui.Storage; + +namespace SteUp.Data.LocalDb; + + +public interface IDbPathProvider +{ + string GetDbPath(); +} + +public class DbPathProvider : IDbPathProvider +{ + private const string DbName = "steup_db.db3"; + + public string GetDbPath() => + Path.Combine(FileSystem.AppDataDirectory, DbName); +} \ No newline at end of file diff --git a/SteUp.Data/LocalDb/EntityServices/IspezioniService.cs b/SteUp.Data/LocalDb/EntityServices/IspezioniService.cs new file mode 100644 index 0000000..a2962bb --- /dev/null +++ b/SteUp.Data/LocalDb/EntityServices/IspezioniService.cs @@ -0,0 +1,127 @@ +using Microsoft.EntityFrameworkCore; +using SteUp.Shared.Core.Entities; +using SteUp.Shared.Core.Interface.LocalDb; + +namespace SteUp.Data.LocalDb.EntityServices; + +public class IspezioniService(AppDbContext db) : IIspezioniService +{ + public Task GetIspezioneAsync(string codMdep, DateOnly data, string rilevatore) => + db.Ispezioni + .Include(x => x.Schede) + .FirstOrDefaultAsync(x => + x.CodMdep == codMdep && + x.Data == data && + x.Rilevatore == rilevatore); + + public Task> GetAllIspezioniWithSchedeAsync() => + db.Ispezioni + .Include(x => x.Schede) + .AsNoTracking() + .OrderByDescending(x => x.Data) + .ToListAsync(); + + public async Task AddIspezioneAsync(Ispezione ispezione) + { + db.Ispezioni.Add(ispezione); + await db.SaveChangesAsync(); + } + + public async Task GetOrCreateIspezioneAsync(string codMdep, DateOnly data, string rilevatore) + { + var existing = await db.Ispezioni + .Include(x => x.Schede) + .FirstOrDefaultAsync(x => + x.CodMdep == codMdep && + x.Data == data && + x.Rilevatore == rilevatore); + + if (existing != null) + return existing; + + var created = new Ispezione + { + CodMdep = codMdep, + Data = data, + Rilevatore = rilevatore + }; + + db.Ispezioni.Add(created); + await db.SaveChangesAsync(); + + return created; + } + + /// + /// Cancella l'ispezione e tutte le schede collegate. + /// + public async Task DeleteIspezioneAsync(string codMdep, DateOnly data, string rilevatore) + { + var ispezione = await db.Ispezioni + .FirstOrDefaultAsync(x => + x.CodMdep == codMdep && + x.Data == data && + x.Rilevatore == rilevatore); + + if (ispezione is null) + return false; + + db.Ispezioni.Remove(ispezione); + await db.SaveChangesAsync(); + return true; + } + + public async Task AddSchedaAsync(string codMdep, DateOnly data, string rilevatore, Scheda scheda) + { + // assicura che il parent esista + await GetOrCreateIspezioneAsync(codMdep, data, rilevatore); + + scheda.CodMdep = codMdep; + scheda.Data = data; + scheda.Rilevatore = rilevatore; + + db.Schede.Add(scheda); + await db.SaveChangesAsync(); + } + + public Task GetSchedaAsync(int schedaId) => + db.Schede + .AsNoTracking() + .FirstOrDefaultAsync(x => x.Id == schedaId); + + public Task GetSchedaWithIspezioneAsync(int schedaId) => + db.Schede + .Include(x => x.Ispezione) + .AsNoTracking() + .FirstOrDefaultAsync(x => x.Id == schedaId); + + public async Task DeleteSchedaAsync(int schedaId) + { + var scheda = await db.Schede.FirstOrDefaultAsync(x => x.Id == schedaId); + if (scheda is null) + return false; + + db.Schede.Remove(scheda); + await db.SaveChangesAsync(); + return true; + } + + /// + /// Cancella tutte le schede di una ispezione senza cancellare l'ispezione. + /// + public async Task DeleteAllSchedeOfIspezioneAsync(string codMdep, DateOnly data, string rilevatore) + { + var schede = await db.Schede + .Where(s => + s.CodMdep == codMdep && + s.Data == data && + s.Rilevatore == rilevatore) + .ToListAsync(); + + if (schede.Count == 0) + return 0; + + db.Schede.RemoveRange(schede); + return await db.SaveChangesAsync(); + } +} \ No newline at end of file diff --git a/SteUp.Data/Migrations/20260217143326_InitialCreate.Designer.cs b/SteUp.Data/Migrations/20260217143326_InitialCreate.Designer.cs new file mode 100644 index 0000000..e9a5ed8 --- /dev/null +++ b/SteUp.Data/Migrations/20260217143326_InitialCreate.Designer.cs @@ -0,0 +1,102 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SteUp.Data.LocalDb; + +#nullable disable + +namespace SteUp.Data.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20260217143326_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.13"); + + modelBuilder.Entity("SteUp.Shared.Core.Entities.Ispezione", b => + { + b.Property("CodMdep") + .HasColumnType("TEXT"); + + b.Property("Data") + .HasColumnType("TEXT"); + + b.Property("Rilevatore") + .HasColumnType("TEXT"); + + b.Property("Stato") + .HasColumnType("INTEGER"); + + b.HasKey("CodMdep", "Data", "Rilevatore"); + + b.ToTable("Ispezioni"); + }); + + modelBuilder.Entity("SteUp.Shared.Core.Entities.Scheda", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ActivityTypeId") + .HasColumnType("TEXT"); + + b.Property("CodJfas") + .HasColumnType("TEXT"); + + b.Property("CodMdep") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Data") + .HasColumnType("TEXT"); + + b.Property("DescrizioneReparto") + .HasColumnType("TEXT"); + + b.Property("Note") + .HasColumnType("TEXT"); + + b.Property("Responsabile") + .HasColumnType("TEXT"); + + b.Property("Rilevatore") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Scadenza") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("CodMdep", "Data", "Rilevatore"); + + b.ToTable("Schede"); + }); + + modelBuilder.Entity("SteUp.Shared.Core.Entities.Scheda", b => + { + b.HasOne("SteUp.Shared.Core.Entities.Ispezione", "Ispezione") + .WithMany("Schede") + .HasForeignKey("CodMdep", "Data", "Rilevatore") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ispezione"); + }); + + modelBuilder.Entity("SteUp.Shared.Core.Entities.Ispezione", b => + { + b.Navigation("Schede"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SteUp.Data/Migrations/20260217143326_InitialCreate.cs b/SteUp.Data/Migrations/20260217143326_InitialCreate.cs new file mode 100644 index 0000000..a4c815b --- /dev/null +++ b/SteUp.Data/Migrations/20260217143326_InitialCreate.cs @@ -0,0 +1,71 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace SteUp.Data.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Ispezioni", + columns: table => new + { + CodMdep = table.Column(type: "TEXT", nullable: false), + Data = table.Column(type: "TEXT", nullable: false), + Rilevatore = table.Column(type: "TEXT", nullable: false), + Stato = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Ispezioni", x => new { x.CodMdep, x.Data, x.Rilevatore }); + }); + + migrationBuilder.CreateTable( + name: "Schede", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + CodJfas = table.Column(type: "TEXT", nullable: true), + CodMdep = table.Column(type: "TEXT", nullable: false), + Data = table.Column(type: "TEXT", nullable: false), + Rilevatore = table.Column(type: "TEXT", nullable: false), + DescrizioneReparto = table.Column(type: "TEXT", nullable: true), + ActivityTypeId = table.Column(type: "TEXT", nullable: true), + Note = table.Column(type: "TEXT", nullable: true), + Responsabile = table.Column(type: "TEXT", nullable: true), + Scadenza = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Schede", x => x.Id); + table.ForeignKey( + name: "FK_Schede_Ispezioni_CodMdep_Data_Rilevatore", + columns: x => new { x.CodMdep, x.Data, x.Rilevatore }, + principalTable: "Ispezioni", + principalColumns: new[] { "CodMdep", "Data", "Rilevatore" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Schede_CodMdep_Data_Rilevatore", + table: "Schede", + columns: new[] { "CodMdep", "Data", "Rilevatore" }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Schede"); + + migrationBuilder.DropTable( + name: "Ispezioni"); + } + } +} diff --git a/SteUp.Data/Migrations/AppDbContextModelSnapshot.cs b/SteUp.Data/Migrations/AppDbContextModelSnapshot.cs new file mode 100644 index 0000000..95bc096 --- /dev/null +++ b/SteUp.Data/Migrations/AppDbContextModelSnapshot.cs @@ -0,0 +1,99 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SteUp.Data.LocalDb; + +#nullable disable + +namespace SteUp.Data.Migrations +{ + [DbContext(typeof(AppDbContext))] + partial class AppDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.13"); + + modelBuilder.Entity("SteUp.Shared.Core.Entities.Ispezione", b => + { + b.Property("CodMdep") + .HasColumnType("TEXT"); + + b.Property("Data") + .HasColumnType("TEXT"); + + b.Property("Rilevatore") + .HasColumnType("TEXT"); + + b.Property("Stato") + .HasColumnType("INTEGER"); + + b.HasKey("CodMdep", "Data", "Rilevatore"); + + b.ToTable("Ispezioni"); + }); + + modelBuilder.Entity("SteUp.Shared.Core.Entities.Scheda", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ActivityTypeId") + .HasColumnType("TEXT"); + + b.Property("CodJfas") + .HasColumnType("TEXT"); + + b.Property("CodMdep") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Data") + .HasColumnType("TEXT"); + + b.Property("DescrizioneReparto") + .HasColumnType("TEXT"); + + b.Property("Note") + .HasColumnType("TEXT"); + + b.Property("Responsabile") + .HasColumnType("TEXT"); + + b.Property("Rilevatore") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Scadenza") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("CodMdep", "Data", "Rilevatore"); + + b.ToTable("Schede"); + }); + + modelBuilder.Entity("SteUp.Shared.Core.Entities.Scheda", b => + { + b.HasOne("SteUp.Shared.Core.Entities.Ispezione", "Ispezione") + .WithMany("Schede") + .HasForeignKey("CodMdep", "Data", "Rilevatore") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ispezione"); + }); + + modelBuilder.Entity("SteUp.Shared.Core.Entities.Ispezione", b => + { + b.Navigation("Schede"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SteUp.Data/SteUp.Data.csproj b/SteUp.Data/SteUp.Data.csproj new file mode 100644 index 0000000..6efdd2f --- /dev/null +++ b/SteUp.Data/SteUp.Data.csproj @@ -0,0 +1,23 @@ + + + + net9.0 + enable + enable + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + diff --git a/SteUp.Maui/Core/CoreModule.cs b/SteUp.Maui/Core/CoreModule.cs index 1c1fe77..eb4bbf9 100644 --- a/SteUp.Maui/Core/CoreModule.cs +++ b/SteUp.Maui/Core/CoreModule.cs @@ -1,4 +1,8 @@ -using Microsoft.AspNetCore.Components.Authorization; +using System.Data; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.EntityFrameworkCore; +using SteUp.Data.LocalDb; +using SteUp.Data.LocalDb.EntityServices; using SteUp.Maui.Core.Services; using SteUp.Maui.Core.System; using SteUp.Maui.Core.System.Network; @@ -6,6 +10,7 @@ using SteUp.Shared.Core.Data; using SteUp.Shared.Core.Data.Contracts; using SteUp.Shared.Core.Interface; using SteUp.Shared.Core.Interface.IntegryApi; +using SteUp.Shared.Core.Interface.LocalDb; using SteUp.Shared.Core.Interface.System; using SteUp.Shared.Core.Interface.System.Network; using SteUp.Shared.Core.Services; @@ -40,4 +45,16 @@ public static class CoreModule builder.Services.AddScoped(provider => provider.GetRequiredService()); } + + public static void RegisterDbServices(this MauiAppBuilder builder) + { + builder.Services.AddSingleton(); + builder.Services.AddDbContext((sp, options) => + { + var dbPath = sp.GetRequiredService().GetDbPath(); + options.UseSqlite($"Filename={dbPath}"); + }); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + } } \ No newline at end of file diff --git a/SteUp.Maui/MauiProgram.cs b/SteUp.Maui/MauiProgram.cs index 278f159..f127796 100644 --- a/SteUp.Maui/MauiProgram.cs +++ b/SteUp.Maui/MauiProgram.cs @@ -46,6 +46,7 @@ namespace SteUp.Maui builder.RegisterAppServices(); builder.RegisterIntegryServices(); builder.RegisterSystemService(); + builder.RegisterDbServices(); return builder.Build(); } diff --git a/SteUp.Maui/SteUp.Maui.csproj b/SteUp.Maui/SteUp.Maui.csproj index 8c4d168..ff98470 100644 --- a/SteUp.Maui/SteUp.Maui.csproj +++ b/SteUp.Maui/SteUp.Maui.csproj @@ -95,36 +95,37 @@ - + - + - - + + - + - + - - - - - - - - + + + + + + + + - + + \ No newline at end of file diff --git a/SteUp.Shared/Components/Layout/Overlay/SaveOverlay.razor b/SteUp.Shared/Components/Layout/Overlay/SpinnerOverlay.razor similarity index 100% rename from SteUp.Shared/Components/Layout/Overlay/SaveOverlay.razor rename to SteUp.Shared/Components/Layout/Overlay/SpinnerOverlay.razor diff --git a/SteUp.Shared/Components/Pages/Ispezione.razor b/SteUp.Shared/Components/Pages/Ispezione.razor deleted file mode 100644 index 0081f5d..0000000 --- a/SteUp.Shared/Components/Pages/Ispezione.razor +++ /dev/null @@ -1,51 +0,0 @@ -@page "/ispezione" -@using SteUp.Shared.Components.Layout - - - -
- -
-
-
- - @SteupDataService.Inspection.PuntoVendita!.CodMdep - @SteupDataService.Inspection.PuntoVendita.Descrizione - - - @SteupDataService.Inspection.PuntoVendita.Indirizzo - -
-
- -
- - -
- -
- -@code { - - protected override async Task OnInitializedAsync() - { - } - -} \ No newline at end of file diff --git a/SteUp.Shared/Components/Pages/IspezionePage.razor b/SteUp.Shared/Components/Pages/IspezionePage.razor new file mode 100644 index 0000000..6f1db60 --- /dev/null +++ b/SteUp.Shared/Components/Pages/IspezionePage.razor @@ -0,0 +1,17 @@ +@page "/ispezione" +@using SteUp.Shared.Components.Layout +@using SteUp.Shared.Components.SingleElements.Card + + + +
+ +
+ +@code { + + protected override async Task OnInitializedAsync() + { + } + +} \ No newline at end of file diff --git a/SteUp.Shared/Components/Pages/Ispezioni.razor.css b/SteUp.Shared/Components/Pages/IspezionePage.razor.css similarity index 100% rename from SteUp.Shared/Components/Pages/Ispezioni.razor.css rename to SteUp.Shared/Components/Pages/IspezionePage.razor.css diff --git a/SteUp.Shared/Components/Pages/Ispezioni.razor b/SteUp.Shared/Components/Pages/Ispezioni.razor deleted file mode 100644 index 399df19..0000000 --- a/SteUp.Shared/Components/Pages/Ispezioni.razor +++ /dev/null @@ -1,9 +0,0 @@ -@page "/ispezioni" -@attribute [Authorize] -@using SteUp.Shared.Components.Layout - - - -
- -
\ No newline at end of file diff --git a/SteUp.Shared/Components/Pages/IspezioniPage.razor b/SteUp.Shared/Components/Pages/IspezioniPage.razor new file mode 100644 index 0000000..c6ce3a5 --- /dev/null +++ b/SteUp.Shared/Components/Pages/IspezioniPage.razor @@ -0,0 +1,52 @@ +@page "/ispezioni" +@attribute [Authorize] +@using SteUp.Shared.Components.Layout +@using SteUp.Shared.Components.Layout.Overlay +@using SteUp.Shared.Components.SingleElements +@using SteUp.Shared.Components.SingleElements.Card +@using SteUp.Shared.Core.Entities +@using SteUp.Shared.Core.Interface.LocalDb +@inject IIspezioniService IspezioniService + + + +
+ @if (Ispezioni.IsNullOrEmpty()) + { + + } + else + { + + + + } +
+ + + +@code{ + private List Ispezioni { get; set; } = []; + + private bool VisibleOverlay { get; set; } = true; + + protected override async Task OnInitializedAsync() + { + await LoadData(); + + VisibleOverlay = false; + StateHasChanged(); + } + + private async Task LoadData() + { + Ispezioni = await IspezioniService.GetAllIspezioniWithSchedeAsync(); + } + + private void OnClickIspezione(Ispezione ispezione) + { + SteupDataService.InspectionPageState.Ispezione = ispezione; + NavigationManager.NavigateTo("/ispezione"); + } + +} \ No newline at end of file diff --git a/SteUp.Shared/Components/Pages/IspezioniPage.razor.css b/SteUp.Shared/Components/Pages/IspezioniPage.razor.css new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/SteUp.Shared/Components/Pages/IspezioniPage.razor.css @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SteUp.Shared/Components/Pages/Login.razor b/SteUp.Shared/Components/Pages/LoginPage.razor similarity index 99% rename from SteUp.Shared/Components/Pages/Login.razor rename to SteUp.Shared/Components/Pages/LoginPage.razor index dd309d1..a3d1b10 100644 --- a/SteUp.Shared/Components/Pages/Login.razor +++ b/SteUp.Shared/Components/Pages/LoginPage.razor @@ -36,7 +36,7 @@ else diff --git a/SteUp.Shared/Components/Pages/Login.razor.css b/SteUp.Shared/Components/Pages/LoginPage.razor.css similarity index 100% rename from SteUp.Shared/Components/Pages/Login.razor.css rename to SteUp.Shared/Components/Pages/LoginPage.razor.css diff --git a/SteUp.Shared/Components/Pages/User.razor b/SteUp.Shared/Components/Pages/UserPage.razor similarity index 100% rename from SteUp.Shared/Components/Pages/User.razor rename to SteUp.Shared/Components/Pages/UserPage.razor diff --git a/SteUp.Shared/Components/Pages/User.razor.css b/SteUp.Shared/Components/Pages/UserPage.razor.css similarity index 100% rename from SteUp.Shared/Components/Pages/User.razor.css rename to SteUp.Shared/Components/Pages/UserPage.razor.css diff --git a/SteUp.Shared/Components/SingleElements/Card/InspectionCard.razor b/SteUp.Shared/Components/SingleElements/Card/InspectionCard.razor new file mode 100644 index 0000000..afcaa8c --- /dev/null +++ b/SteUp.Shared/Components/SingleElements/Card/InspectionCard.razor @@ -0,0 +1,104 @@ +@using SteUp.Shared.Core.Dto +@using SteUp.Shared.Core.Entities + +
+
+
+ @if (CompactView) + { + if (OnLoading) + { + + } + else + { + + @PuntoVendita.CodMdep - @PuntoVendita.Descrizione + + } + } + else + { + if (OnLoading) + { + + + } + else + { + + @PuntoVendita.CodMdep - @PuntoVendita.Descrizione + + + @PuntoVendita.Indirizzo + + } + } +
+
+ +
+ + +
+ +@code +{ + [Parameter] public Ispezione Ispezione { get; set; } = new(); + [Parameter] public bool CompactView { get; set; } + [Parameter] public EventCallback OnClick { get; set; } + + private PuntoVenditaDto PuntoVendita { get; set; } = new(); + + private bool OnLoading { get; set; } = true; + + protected override async Task OnParametersSetAsync() + { + OnLoading = true; + StateHasChanged(); + + var puntoVendita = SteupDataService.PuntiVenditaList.Find(x => + x.CodMdep != null && x.CodMdep.EqualsIgnoreCase(Ispezione.CodMdep) + ); + await Task.Delay(750); + + PuntoVendita = puntoVendita ?? throw new Exception("Punto vendita non trovato"); + OnLoading = false; + StateHasChanged(); + } + + private Task OnCardClick() => + OnClick.HasDelegate ? OnClick.InvokeAsync(Ispezione) : Task.CompletedTask; +} \ No newline at end of file diff --git a/SteUp.Shared/Components/Pages/Ispezione.razor.css b/SteUp.Shared/Components/SingleElements/Card/InspectionCard.razor.css similarity index 94% rename from SteUp.Shared/Components/Pages/Ispezione.razor.css rename to SteUp.Shared/Components/SingleElements/Card/InspectionCard.razor.css index a7465ba..174b01f 100644 --- a/SteUp.Shared/Components/Pages/Ispezione.razor.css +++ b/SteUp.Shared/Components/SingleElements/Card/InspectionCard.razor.css @@ -38,6 +38,11 @@ line-height: normal; } +.info-title.compactView{ + font-size: medium; + font-weight: 600; +} + .section-info { display: flex; justify-content: space-between; diff --git a/SteUp.Shared/Components/SingleElements/Card/ShopCard.razor b/SteUp.Shared/Components/SingleElements/Card/ShopCard.razor index eeeb459..d7ce958 100644 --- a/SteUp.Shared/Components/SingleElements/Card/ShopCard.razor +++ b/SteUp.Shared/Components/SingleElements/Card/ShopCard.razor @@ -1,5 +1,7 @@ -@using SteUp.Shared.Core.Dto -@using SteUp.Shared.Core.Dto.PageState +@using SteUp.Shared.Components.Layout.Overlay +@using SteUp.Shared.Core.Dto +@using SteUp.Shared.Core.Interface.LocalDb +@inject IIspezioniService IspezioniService
@@ -31,16 +33,26 @@
+ + @code { [Parameter] public PuntoVenditaDto PuntoVendita { get; set; } = null!; - private void StartInspection() + private bool VisibleOverlay { get; set; } + + private async Task StartInspection() { - SteupDataService.Inspection = new InspectionPageState - { - DateInspection = DateTime.Today, - PuntoVendita = PuntoVendita - }; + VisibleOverlay = true; + StateHasChanged(); + + SteupDataService.InspectionPageState.Ispezione = await IspezioniService.GetOrCreateIspezioneAsync( + PuntoVendita.CodMdep!, + DateOnly.FromDateTime(DateTime.Today), + UserSession.User.Username + ); + + VisibleOverlay = false; + StateHasChanged(); NavigationManager.NavigateTo("/ispezione"); } diff --git a/SteUp.Shared/Components/SingleElements/Modal/ModalFormScheda.razor b/SteUp.Shared/Components/SingleElements/Modal/ModalFormScheda.razor index a0f9c15..91c6142 100644 --- a/SteUp.Shared/Components/SingleElements/Modal/ModalFormScheda.razor +++ b/SteUp.Shared/Components/SingleElements/Modal/ModalFormScheda.razor @@ -1,6 +1,7 @@ @using SteUp.Shared.Components.Layout @using SteUp.Shared.Components.Layout.Overlay @using SteUp.Shared.Core.Dto +@using SteUp.Shared.Core.Entities @using SteUp.Shared.Core.Interface.IntegryApi @using SteUp.Shared.Core.Interface.System.Network @inject INetworkService NetworkService @@ -24,7 +25,7 @@ else { @foreach (var fasi in SteupDataService.Reparti) @@ -49,7 +50,7 @@ else { @foreach (var type in SteupDataService.TipiAttività) @@ -123,7 +124,7 @@ Scadenza @@ -135,13 +136,13 @@
@@ -159,12 +160,12 @@ - + @code { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; - private SchedaDto SchedaDto { get; set; } = new(); + private Scheda Scheda { get; set; } = new(); private bool IsNew { get; set; } private bool IsLoading { get; set; } @@ -211,7 +212,7 @@ private void SuggestActivityDescription() { - if (SchedaDto.ActivityTypeId == null) + if (Scheda.ActivityTypeId == null) { Snackbar.Add("Indicare prima il motivo", Severity.Error); return; @@ -222,12 +223,12 @@ _ = Task.Run(async () => { - var activityDescriptions = await IntegryApiService.SuggestActivityDescription(SchedaDto.ActivityTypeId); + var activityDescriptions = await IntegryApiService.SuggestActivityDescription(Scheda.ActivityTypeId); var modal = await ModalHelper.OpenSuggestActivityDescription(Dialog, activityDescriptions); if (modal is { Canceled: false, Data: not null }) - SchedaDto.Note = modal.Data!.ToString(); + Scheda.Note = modal.Data!.ToString(); VisibleOverlay = false; await InvokeAsync(StateHasChanged); diff --git a/SteUp.Shared/Components/SingleElements/NoDataAvailable.razor b/SteUp.Shared/Components/SingleElements/NoDataAvailable.razor index 4f7759f..1ee4f25 100644 --- a/SteUp.Shared/Components/SingleElements/NoDataAvailable.razor +++ b/SteUp.Shared/Components/SingleElements/NoDataAvailable.razor @@ -1,7 +1,6 @@
- - + +

@Text

diff --git a/SteUp.Shared/Core/Data/Contracts/ISteupDataService.cs b/SteUp.Shared/Core/Data/Contracts/ISteupDataService.cs index 1ef60a1..b059a55 100644 --- a/SteUp.Shared/Core/Data/Contracts/ISteupDataService.cs +++ b/SteUp.Shared/Core/Data/Contracts/ISteupDataService.cs @@ -8,7 +8,7 @@ public interface ISteupDataService Task Init(); List PuntiVenditaList { get; } - InspectionPageState Inspection { get; set; } + InspectionPageState InspectionPageState { get; set; } List Reparti { get; } List TipiAttività { get; } } \ No newline at end of file diff --git a/SteUp.Shared/Core/Data/SteupDataService.cs b/SteUp.Shared/Core/Data/SteupDataService.cs index b528ba2..cafb44c 100644 --- a/SteUp.Shared/Core/Data/SteupDataService.cs +++ b/SteUp.Shared/Core/Data/SteupDataService.cs @@ -3,16 +3,19 @@ using SteUp.Shared.Core.Data.Contracts; using SteUp.Shared.Core.Dto; using SteUp.Shared.Core.Dto.PageState; using SteUp.Shared.Core.Interface.IntegryApi; +using SteUp.Shared.Core.Interface.LocalDb; namespace SteUp.Shared.Core.Data; public class SteupDataService( IIntegrySteupService integrySteupService, - IUserSession userSession) : ISteupDataService + IUserSession userSession, + IDbInitializer dbInitializer) : ISteupDataService { - public Task Init() + public async Task Init() { - return LoadDataAsync(); + await dbInitializer.InitializeAsync(); + await LoadDataAsync(); } private async Task LoadDataAsync() @@ -24,7 +27,7 @@ public class SteupDataService( TipiAttività = await integrySteupService.RetrieveActivityType(); } - public InspectionPageState Inspection { get; set; } = new(); + public InspectionPageState InspectionPageState { get; set; } = new(); public List PuntiVenditaList { get; private set; } = []; public List Reparti { get; private set; } = []; public List TipiAttività { get; private set; } = []; diff --git a/SteUp.Shared/Core/Dto/PageState/InspectionPageState.cs b/SteUp.Shared/Core/Dto/PageState/InspectionPageState.cs index 38cda3d..05f9380 100644 --- a/SteUp.Shared/Core/Dto/PageState/InspectionPageState.cs +++ b/SteUp.Shared/Core/Dto/PageState/InspectionPageState.cs @@ -1,8 +1,8 @@ -namespace SteUp.Shared.Core.Dto.PageState; +using SteUp.Shared.Core.Entities; + +namespace SteUp.Shared.Core.Dto.PageState; public class InspectionPageState { - public DateTime DateInspection {get; set;} - - public PuntoVenditaDto? PuntoVendita {get; set;} + public Ispezione Ispezione { get; set; } = new(); } \ No newline at end of file diff --git a/SteUp.Shared/Core/Dto/SchedaDto.cs b/SteUp.Shared/Core/Dto/SchedaDto.cs deleted file mode 100644 index 5de8269..0000000 --- a/SteUp.Shared/Core/Dto/SchedaDto.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace SteUp.Shared.Core.Dto; - -public class SchedaDto -{ - public JtbFasiDto? Reparto { get; set; } - public string? ActivityTypeId { get; set; } - public string? Note { get; set; } - public string? Responsabile { get; set; } - public int Scadenza { get; set; } = 24; -} \ No newline at end of file diff --git a/SteUp.Shared/Core/Entities/Ispezione.cs b/SteUp.Shared/Core/Entities/Ispezione.cs new file mode 100644 index 0000000..c2b6d56 --- /dev/null +++ b/SteUp.Shared/Core/Entities/Ispezione.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; +using SteUp.Shared.Core.Enum; + +namespace SteUp.Shared.Core.Entities; + +public class Ispezione +{ + [Required] + public string CodMdep { get; set; } = string.Empty; + public DateOnly Data { get; set; } + [Required] + public string Rilevatore { get; set; } = string.Empty; + + public StatusEnum Stato { get; set; } = StatusEnum.InCorso; + + public List Schede { get; set; } = []; +} \ No newline at end of file diff --git a/SteUp.Shared/Core/Entities/Scheda.cs b/SteUp.Shared/Core/Entities/Scheda.cs new file mode 100644 index 0000000..d6b1363 --- /dev/null +++ b/SteUp.Shared/Core/Entities/Scheda.cs @@ -0,0 +1,51 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using SteUp.Shared.Core.Dto; + +namespace SteUp.Shared.Core.Entities; + +public class Scheda +{ + [Key] + public int Id { get; set; } + public string? CodJfas { get; set; } + + [Required] + public string CodMdep { get; set; } = string.Empty; + public DateOnly Data { get; set; } + [Required] + public string Rilevatore { get; set; } = string.Empty; + public Ispezione? Ispezione { get; set; } + + public string? DescrizioneReparto { get; set; } + public string? ActivityTypeId { get; set; } + public string? Note { get; set; } + public string? Responsabile { get; set; } + public int Scadenza { get; set; } = 24; + + [NotMapped] + public JtbFasiDto? Reparto + { + get + { + if (_reparto == null && CodJfas != null) + { + _reparto = new JtbFasiDto + { + CodJfas = CodJfas, + Descrizione = DescrizioneReparto + }; + } + return _reparto; + } + set + { + _reparto = value; + if (value == null) return; + + CodJfas = value.CodJfas; + DescrizioneReparto = value.Descrizione; + } + } + private JtbFasiDto? _reparto; +} \ No newline at end of file diff --git a/SteUp.Shared/Core/Enum/StatusEnum.cs b/SteUp.Shared/Core/Enum/StatusEnum.cs new file mode 100644 index 0000000..9c76cfe --- /dev/null +++ b/SteUp.Shared/Core/Enum/StatusEnum.cs @@ -0,0 +1,8 @@ +namespace SteUp.Shared.Core.Enum; + +public enum StatusEnum +{ + InCorso = 0, + Completata = 1, + Esporta = 2 +} \ No newline at end of file diff --git a/SteUp.Shared/Core/Helpers/StatusEnumHelper.cs b/SteUp.Shared/Core/Helpers/StatusEnumHelper.cs new file mode 100644 index 0000000..e674a7c --- /dev/null +++ b/SteUp.Shared/Core/Helpers/StatusEnumHelper.cs @@ -0,0 +1,29 @@ +using MudBlazor; +using SteUp.Shared.Core.Enum; + +namespace SteUp.Shared.Core.Helpers; + +public static class StatusEnumHelper +{ + public static string ConvertToHumanReadable(this StatusEnum enumValue) + { + return enumValue switch + { + StatusEnum.InCorso => "IN CORSO", + StatusEnum.Completata => "COMPLETATA", + StatusEnum.Esporta => "ESPORTATA", + _ => throw new ArgumentOutOfRangeException(nameof(enumValue), enumValue, null) + }; + } + + public static Color GetColor(this StatusEnum enumValue) + { + return enumValue switch + { + StatusEnum.InCorso => Color.Warning, + StatusEnum.Completata or + StatusEnum.Esporta => Color.Success, + _ => Color.Default + }; + } +} \ No newline at end of file diff --git a/SteUp.Shared/Core/Interface/LocalDb/IDbInitializer.cs b/SteUp.Shared/Core/Interface/LocalDb/IDbInitializer.cs new file mode 100644 index 0000000..7f749bc --- /dev/null +++ b/SteUp.Shared/Core/Interface/LocalDb/IDbInitializer.cs @@ -0,0 +1,6 @@ +namespace SteUp.Shared.Core.Interface.LocalDb; + +public interface IDbInitializer +{ + Task InitializeAsync(); +} \ No newline at end of file diff --git a/SteUp.Shared/Core/Interface/LocalDb/IIspezioniService.cs b/SteUp.Shared/Core/Interface/LocalDb/IIspezioniService.cs new file mode 100644 index 0000000..3e75339 --- /dev/null +++ b/SteUp.Shared/Core/Interface/LocalDb/IIspezioniService.cs @@ -0,0 +1,20 @@ +using SteUp.Shared.Core.Entities; + +namespace SteUp.Shared.Core.Interface.LocalDb; + +public interface IIspezioniService +{ + // ISPEZIONI + Task GetIspezioneAsync(string codMdep, DateOnly data, string rilevatore); + Task> GetAllIspezioniWithSchedeAsync(); + Task AddIspezioneAsync(Ispezione ispezione); + Task GetOrCreateIspezioneAsync(string codMdep, DateOnly data, string rilevatore); + Task DeleteIspezioneAsync(string codMdep, DateOnly data, string rilevatore); + + // SCHEDE + Task AddSchedaAsync(string codMdep, DateOnly data, string rilevatore, Scheda scheda); + Task GetSchedaAsync(int schedaId); + Task GetSchedaWithIspezioneAsync(int schedaId); + Task DeleteSchedaAsync(int schedaId); + Task DeleteAllSchedeOfIspezioneAsync(string codMdep, DateOnly data, string rilevatore); +} \ No newline at end of file diff --git a/SteUp.Shared/SteUp.Shared.csproj b/SteUp.Shared/SteUp.Shared.csproj index c6b4b83..e193e2c 100644 --- a/SteUp.Shared/SteUp.Shared.csproj +++ b/SteUp.Shared/SteUp.Shared.csproj @@ -18,7 +18,7 @@ - + diff --git a/SteUp.Shared/wwwroot/css/custom-mudBlazor.css b/SteUp.Shared/wwwroot/css/custom-mudBlazor.css index debf582..0c64115 100644 --- a/SteUp.Shared/wwwroot/css/custom-mudBlazor.css +++ b/SteUp.Shared/wwwroot/css/custom-mudBlazor.css @@ -22,4 +22,8 @@ .mud-picker-popover-paper { border-radius: 1em !important; +} + +.mud-skeleton{ + border-radius: .5em !important; } \ No newline at end of file diff --git a/SteUp.Shared/wwwroot/images/undraw_file-search_cbur.svg b/SteUp.Shared/wwwroot/images/undraw_file-search_cbur.svg new file mode 100644 index 0000000..7e6a1d5 --- /dev/null +++ b/SteUp.Shared/wwwroot/images/undraw_file-search_cbur.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SteUp.Web/SteUp.Web.csproj b/SteUp.Web/SteUp.Web.csproj index baf5061..e756dc8 100644 --- a/SteUp.Web/SteUp.Web.csproj +++ b/SteUp.Web/SteUp.Web.csproj @@ -8,7 +8,7 @@ - + diff --git a/SteUp.sln b/SteUp.sln index 998a4a1..583f4b3 100644 --- a/SteUp.sln +++ b/SteUp.sln @@ -9,26 +9,68 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SteUp.Shared", "SteUp.Share EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SteUp.Web", "SteUp.Web\SteUp.Web.csproj", "{A813A640-4535-4024-8FD9-1EE6B76FB2AE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SteUp.Data", "SteUp.Data\SteUp.Data.csproj", "{A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {765F13F2-2E97-4912-B774-DA38B78DC032}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {765F13F2-2E97-4912-B774-DA38B78DC032}.Debug|Any CPU.Build.0 = Debug|Any CPU {765F13F2-2E97-4912-B774-DA38B78DC032}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {765F13F2-2E97-4912-B774-DA38B78DC032}.Debug|x64.ActiveCfg = Debug|Any CPU + {765F13F2-2E97-4912-B774-DA38B78DC032}.Debug|x64.Build.0 = Debug|Any CPU + {765F13F2-2E97-4912-B774-DA38B78DC032}.Debug|x86.ActiveCfg = Debug|Any CPU + {765F13F2-2E97-4912-B774-DA38B78DC032}.Debug|x86.Build.0 = Debug|Any CPU {765F13F2-2E97-4912-B774-DA38B78DC032}.Release|Any CPU.ActiveCfg = Release|Any CPU {765F13F2-2E97-4912-B774-DA38B78DC032}.Release|Any CPU.Build.0 = Release|Any CPU {765F13F2-2E97-4912-B774-DA38B78DC032}.Release|Any CPU.Deploy.0 = Release|Any CPU + {765F13F2-2E97-4912-B774-DA38B78DC032}.Release|x64.ActiveCfg = Release|Any CPU + {765F13F2-2E97-4912-B774-DA38B78DC032}.Release|x64.Build.0 = Release|Any CPU + {765F13F2-2E97-4912-B774-DA38B78DC032}.Release|x86.ActiveCfg = Release|Any CPU + {765F13F2-2E97-4912-B774-DA38B78DC032}.Release|x86.Build.0 = Release|Any CPU {868BF270-578F-4618-9238-C41861F379DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {868BF270-578F-4618-9238-C41861F379DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {868BF270-578F-4618-9238-C41861F379DF}.Debug|x64.ActiveCfg = Debug|Any CPU + {868BF270-578F-4618-9238-C41861F379DF}.Debug|x64.Build.0 = Debug|Any CPU + {868BF270-578F-4618-9238-C41861F379DF}.Debug|x86.ActiveCfg = Debug|Any CPU + {868BF270-578F-4618-9238-C41861F379DF}.Debug|x86.Build.0 = Debug|Any CPU {868BF270-578F-4618-9238-C41861F379DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {868BF270-578F-4618-9238-C41861F379DF}.Release|Any CPU.Build.0 = Release|Any CPU + {868BF270-578F-4618-9238-C41861F379DF}.Release|x64.ActiveCfg = Release|Any CPU + {868BF270-578F-4618-9238-C41861F379DF}.Release|x64.Build.0 = Release|Any CPU + {868BF270-578F-4618-9238-C41861F379DF}.Release|x86.ActiveCfg = Release|Any CPU + {868BF270-578F-4618-9238-C41861F379DF}.Release|x86.Build.0 = Release|Any CPU {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Debug|x64.ActiveCfg = Debug|Any CPU + {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Debug|x64.Build.0 = Debug|Any CPU + {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Debug|x86.ActiveCfg = Debug|Any CPU + {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Debug|x86.Build.0 = Debug|Any CPU {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Release|Any CPU.ActiveCfg = Release|Any CPU {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Release|Any CPU.Build.0 = Release|Any CPU + {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Release|x64.ActiveCfg = Release|Any CPU + {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Release|x64.Build.0 = Release|Any CPU + {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Release|x86.ActiveCfg = Release|Any CPU + {A813A640-4535-4024-8FD9-1EE6B76FB2AE}.Release|x86.Build.0 = Release|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Debug|x64.ActiveCfg = Debug|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Debug|x64.Build.0 = Debug|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Debug|x86.ActiveCfg = Debug|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Debug|x86.Build.0 = Debug|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Release|Any CPU.Build.0 = Release|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Release|x64.ActiveCfg = Release|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Release|x64.Build.0 = Release|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Release|x86.ActiveCfg = Release|Any CPU + {A1AB9749-A367-4E5C-8A80-2D4CEF68DA59}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE