From 8eb87863419ec3174dbfd64aa81e60540a26be1a Mon Sep 17 00:00:00 2001 From: "HOME-LAPTOP\\kshkulev" Date: Fri, 28 Nov 2025 09:54:41 +0900 Subject: [PATCH] Add metering device entity --- Hcs.WebApp/Data/Hcs/HcsDbContext.cs | 2 + Hcs.WebApp/Data/Hcs/MeteringDevice.cs | 17 + ...004959_AddMeteringDeviceEntity.Designer.cs | 421 ++++++++++++++++++ .../20251128004959_AddMeteringDeviceEntity.cs | 46 ++ .../Migrations/HcsDbContextModelSnapshot.cs | 39 ++ Hcs.WebApp/Data/Hcs/Operation.cs | 2 + 6 files changed, 527 insertions(+) create mode 100644 Hcs.WebApp/Data/Hcs/MeteringDevice.cs create mode 100644 Hcs.WebApp/Data/Hcs/Migrations/20251128004959_AddMeteringDeviceEntity.Designer.cs create mode 100644 Hcs.WebApp/Data/Hcs/Migrations/20251128004959_AddMeteringDeviceEntity.cs diff --git a/Hcs.WebApp/Data/Hcs/HcsDbContext.cs b/Hcs.WebApp/Data/Hcs/HcsDbContext.cs index 7d76910..afb31d3 100644 --- a/Hcs.WebApp/Data/Hcs/HcsDbContext.cs +++ b/Hcs.WebApp/Data/Hcs/HcsDbContext.cs @@ -21,6 +21,8 @@ namespace Hcs.WebApp.Data.Hcs public DbSet Accounts { get; set; } + public DbSet MeteringDevices { get; set; } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder diff --git a/Hcs.WebApp/Data/Hcs/MeteringDevice.cs b/Hcs.WebApp/Data/Hcs/MeteringDevice.cs new file mode 100644 index 0000000..db3478c --- /dev/null +++ b/Hcs.WebApp/Data/Hcs/MeteringDevice.cs @@ -0,0 +1,17 @@ +namespace Hcs.WebApp.Data.Hcs +{ + public class MeteringDevice + { + public int Id { get; set; } + + public Guid? HcsId { get; set; } + + public string? ThirdPartyId { get; set; } + + public DateTime? SyncedAt { get; set; } + + public int? LastSyncOperationId { get; set; } + + public virtual Operation? LastSyncOperation { get; set; } + } +} diff --git a/Hcs.WebApp/Data/Hcs/Migrations/20251128004959_AddMeteringDeviceEntity.Designer.cs b/Hcs.WebApp/Data/Hcs/Migrations/20251128004959_AddMeteringDeviceEntity.Designer.cs new file mode 100644 index 0000000..7975ded --- /dev/null +++ b/Hcs.WebApp/Data/Hcs/Migrations/20251128004959_AddMeteringDeviceEntity.Designer.cs @@ -0,0 +1,421 @@ +// +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable +namespace Hcs.WebApp.Data.Hcs.Migrations +{ + [DbContext(typeof(HcsDbContext))] + [Migration("20251128004959_AddMeteringDeviceEntity")] + public partial class AddMeteringDeviceEntity + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Account", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("HcsId") + .HasColumnType("uniqueidentifier"); + + b.Property("LastSyncOperationId") + .HasColumnType("int"); + + b.Property("SyncedAt") + .HasColumnType("datetime2"); + + b.Property("ThirdPartyId") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("LastSyncOperationId"); + + b.ToTable("Accounts"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Campaign", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Args") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndedAt") + .HasColumnType("datetime2"); + + b.Property("FailureReason") + .HasColumnType("nvarchar(max)"); + + b.Property("InitiatorId") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Progress") + .HasColumnType("int"); + + b.Property("StartedAt") + .HasColumnType("datetime2"); + + b.Property("Step") + .HasColumnType("int"); + + b.Property("Type") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.FileToParse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("FileName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("LastParseOperationId") + .HasColumnType("int"); + + b.Property("ParsedAt") + .HasColumnType("datetime2"); + + b.Property("Path") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("UploadedAt") + .HasColumnType("datetime2"); + + b.Property("UploaderId") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("LastParseOperationId"); + + b.ToTable("FilesToParse"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.House", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("FiasId") + .HasColumnType("uniqueidentifier"); + + b.Property("HcsId") + .HasColumnType("uniqueidentifier"); + + b.Property("IsMkd") + .HasColumnType("bit"); + + b.Property("IsZhd") + .HasColumnType("bit"); + + b.Property("LastSyncOperationId") + .HasColumnType("int"); + + b.Property("SyncedAt") + .HasColumnType("datetime2"); + + b.Property("ThirdPartyId") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("FiasId") + .IsUnique() + .HasFilter("[FiasId] IS NOT NULL"); + + b.HasIndex("LastSyncOperationId"); + + b.ToTable("Houses"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.MeteringDevice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("HcsId") + .HasColumnType("uniqueidentifier"); + + b.Property("LastSyncOperationId") + .HasColumnType("int"); + + b.Property("SyncedAt") + .HasColumnType("datetime2"); + + b.Property("ThirdPartyId") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("LastSyncOperationId"); + + b.ToTable("MeteringDevices"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Operation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CampaignId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndedAt") + .HasColumnType("datetime2"); + + b.Property("ExportGuid") + .HasColumnType("nvarchar(max)"); + + b.Property("FailureReason") + .HasColumnType("nvarchar(max)"); + + b.Property("MessageGuid") + .HasColumnType("nvarchar(max)"); + + b.Property("StartedAt") + .HasColumnType("datetime2"); + + b.Property("Type") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("CampaignId"); + + b.ToTable("Operations"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Registry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("IsCommon") + .HasColumnType("bit"); + + b.Property("LastSyncOperationId") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Number") + .HasColumnType("int"); + + b.Property("SyncedAt") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("LastSyncOperationId"); + + b.ToTable("Registries"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.RegistryElement", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("GUID") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("RegistryId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("RegistryId"); + + b.ToTable("Elements"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.SupplyContract", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("HcsId") + .HasColumnType("uniqueidentifier"); + + b.Property("LastSyncOperationId") + .HasColumnType("int"); + + b.Property("SyncedAt") + .HasColumnType("datetime2"); + + b.Property("ThirdPartyId") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("LastSyncOperationId"); + + b.ToTable("SupplyContracts"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Account", b => + { + b.HasOne("Hcs.WebApp.Data.Hcs.Operation", "LastSyncOperation") + .WithMany("Accounts") + .HasForeignKey("LastSyncOperationId"); + + b.Navigation("LastSyncOperation"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.FileToParse", b => + { + b.HasOne("Hcs.WebApp.Data.Hcs.Operation", "LastParseOperation") + .WithMany("FilesToParse") + .HasForeignKey("LastParseOperationId"); + + b.Navigation("LastParseOperation"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.House", b => + { + b.HasOne("Hcs.WebApp.Data.Hcs.Operation", "LastSyncOperation") + .WithMany("Houses") + .HasForeignKey("LastSyncOperationId"); + + b.Navigation("LastSyncOperation"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.MeteringDevice", b => + { + b.HasOne("Hcs.WebApp.Data.Hcs.Operation", "LastSyncOperation") + .WithMany("MeteringDevices") + .HasForeignKey("LastSyncOperationId"); + + b.Navigation("LastSyncOperation"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Operation", b => + { + b.HasOne("Hcs.WebApp.Data.Hcs.Campaign", "Campaign") + .WithMany("Operations") + .HasForeignKey("CampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Campaign"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Registry", b => + { + b.HasOne("Hcs.WebApp.Data.Hcs.Operation", "LastSyncOperation") + .WithMany("Registries") + .HasForeignKey("LastSyncOperationId"); + + b.Navigation("LastSyncOperation"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.RegistryElement", b => + { + b.HasOne("Hcs.WebApp.Data.Hcs.Registry", "Registry") + .WithMany("Elements") + .HasForeignKey("RegistryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Registry"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.SupplyContract", b => + { + b.HasOne("Hcs.WebApp.Data.Hcs.Operation", "LastSyncOperation") + .WithMany("SupplyContracts") + .HasForeignKey("LastSyncOperationId"); + + b.Navigation("LastSyncOperation"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Campaign", b => + { + b.Navigation("Operations"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Operation", b => + { + b.Navigation("Accounts"); + + b.Navigation("FilesToParse"); + + b.Navigation("Houses"); + + b.Navigation("MeteringDevices"); + + b.Navigation("Registries"); + + b.Navigation("SupplyContracts"); + }); + + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Registry", b => + { + b.Navigation("Elements"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Hcs.WebApp/Data/Hcs/Migrations/20251128004959_AddMeteringDeviceEntity.cs b/Hcs.WebApp/Data/Hcs/Migrations/20251128004959_AddMeteringDeviceEntity.cs new file mode 100644 index 0000000..1120db2 --- /dev/null +++ b/Hcs.WebApp/Data/Hcs/Migrations/20251128004959_AddMeteringDeviceEntity.cs @@ -0,0 +1,46 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable +namespace Hcs.WebApp.Data.Hcs.Migrations +{ + /// + public partial class AddMeteringDeviceEntity : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "MeteringDevices", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + HcsId = table.Column(type: "uniqueidentifier", nullable: true), + ThirdPartyId = table.Column(type: "nvarchar(max)", nullable: true), + SyncedAt = table.Column(type: "datetime2", nullable: true), + LastSyncOperationId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_MeteringDevices", x => x.Id); + table.ForeignKey( + name: "FK_MeteringDevices_Operations_LastSyncOperationId", + column: x => x.LastSyncOperationId, + principalTable: "Operations", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_MeteringDevices_LastSyncOperationId", + table: "MeteringDevices", + column: "LastSyncOperationId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "MeteringDevices"); + } + } +} diff --git a/Hcs.WebApp/Data/Hcs/Migrations/HcsDbContextModelSnapshot.cs b/Hcs.WebApp/Data/Hcs/Migrations/HcsDbContextModelSnapshot.cs index 34faff7..27d397e 100644 --- a/Hcs.WebApp/Data/Hcs/Migrations/HcsDbContextModelSnapshot.cs +++ b/Hcs.WebApp/Data/Hcs/Migrations/HcsDbContextModelSnapshot.cs @@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; #nullable disable + namespace Hcs.WebApp.Data.Hcs.Migrations { [DbContext(typeof(HcsDbContext))] @@ -162,6 +163,33 @@ namespace Hcs.WebApp.Data.Hcs.Migrations b.ToTable("Houses"); }); + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.MeteringDevice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("HcsId") + .HasColumnType("uniqueidentifier"); + + b.Property("LastSyncOperationId") + .HasColumnType("int"); + + b.Property("SyncedAt") + .HasColumnType("datetime2"); + + b.Property("ThirdPartyId") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("LastSyncOperationId"); + + b.ToTable("MeteringDevices"); + }); + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Operation", b => { b.Property("Id") @@ -312,6 +340,15 @@ namespace Hcs.WebApp.Data.Hcs.Migrations b.Navigation("LastSyncOperation"); }); + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.MeteringDevice", b => + { + b.HasOne("Hcs.WebApp.Data.Hcs.Operation", "LastSyncOperation") + .WithMany("MeteringDevices") + .HasForeignKey("LastSyncOperationId"); + + b.Navigation("LastSyncOperation"); + }); + modelBuilder.Entity("Hcs.WebApp.Data.Hcs.Operation", b => { b.HasOne("Hcs.WebApp.Data.Hcs.Campaign", "Campaign") @@ -365,6 +402,8 @@ namespace Hcs.WebApp.Data.Hcs.Migrations b.Navigation("Houses"); + b.Navigation("MeteringDevices"); + b.Navigation("Registries"); b.Navigation("SupplyContracts"); diff --git a/Hcs.WebApp/Data/Hcs/Operation.cs b/Hcs.WebApp/Data/Hcs/Operation.cs index ec4cfe2..65aa622 100644 --- a/Hcs.WebApp/Data/Hcs/Operation.cs +++ b/Hcs.WebApp/Data/Hcs/Operation.cs @@ -56,6 +56,8 @@ namespace Hcs.WebApp.Data.Hcs public virtual ICollection Accounts { get; set; } = []; + public virtual ICollection MeteringDevices { get; set; } = []; + [NotMapped] public bool Completed => EndedAt.HasValue;