using System; using Data.SeaHavenIndustries; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace Data.SeaHavenIndustries.Migrations { [DbContext(typeof(ApplicationDbContext))] [Migration("20260723194013_AddVendorCompanyAndAudit")] public partial class AddVendorCompanyAndAudit : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AddColumn( name: "CompanyId", table: "Vendors", type: "int", nullable: true); migrationBuilder.AddColumn( name: "PreferredContact", table: "Vendors", type: "nvarchar(max)", nullable: true); migrationBuilder.CreateTable( name: "VendorCompanies", columns: table => new { Id = table.Column(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), Name = table.Column(type: "nvarchar(max)", nullable: false), NormalizedName = table.Column(type: "nvarchar(450)", nullable: false), CompanyPhone = table.Column(type: "nvarchar(max)", nullable: true), Email = table.Column(type: "nvarchar(max)", nullable: true), Address = table.Column(type: "nvarchar(max)", nullable: true), City = table.Column(type: "nvarchar(max)", nullable: true), State = table.Column(type: "nvarchar(max)", nullable: true), Zip = table.Column(type: "nvarchar(max)", nullable: true), GoogleMapsUrl = table.Column(type: "nvarchar(max)", nullable: true), IsDeleted = table.Column(type: "bit", nullable: true), createdby = table.Column(type: "nvarchar(max)", nullable: true), DeleterUserId = table.Column(type: "nvarchar(max)", nullable: true), DeletionTime = table.Column(type: "datetime2", nullable: true), CreatedDate = table.Column(type: "datetime2", nullable: true), LastModificationTime = table.Column(type: "datetime2", nullable: true), LastModifierUserId = table.Column(type: "int", nullable: true) }, constraints: table => { table.PrimaryKey("PK_VendorCompanies", x => x.Id); }); migrationBuilder.CreateTable( name: "VendorAuditLogs", columns: table => new { Id = table.Column(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), VendorId = table.Column(type: "int", nullable: false), WorkOrderId = table.Column(type: "int", nullable: true), FieldName = table.Column(type: "nvarchar(max)", nullable: true), OldValue = table.Column(type: "nvarchar(max)", nullable: true), NewValue = table.Column(type: "nvarchar(max)", nullable: true), Actor = table.Column(type: "nvarchar(max)", nullable: true), CreatedAt = table.Column(type: "datetime2", nullable: false) }, constraints: table => { table.PrimaryKey("PK_VendorAuditLogs", x => x.Id); table.ForeignKey( name: "FK_VendorAuditLogs_Vendors_VendorId", column: x => x.VendorId, principalTable: "Vendors", principalColumn: "Id", onDelete: ReferentialAction.Restrict); }); // Backfill: create one VendorCompany per distinct (case-insensitive, trimmed) legacy name. // Keep all company-owned fields from the same deterministic source vendor row. migrationBuilder.Sql(@" WITH RankedVendors AS ( SELECT v.[CompanyName] AS [Name], LOWER(LTRIM(RTRIM(v.[CompanyName]))) AS [NormalizedName], v.[CompanyPhone], v.[Email], v.[Address], v.[City], v.[State], v.[Zip], v.[GoogleMapsUrl], ROW_NUMBER() OVER ( PARTITION BY LOWER(LTRIM(RTRIM(v.[CompanyName]))) ORDER BY v.[Id] ) AS [RowNumber] FROM [Vendors] v WHERE v.[CompanyName] IS NOT NULL AND LTRIM(RTRIM(v.[CompanyName])) <> '' ) INSERT INTO [VendorCompanies] ( [Name], [NormalizedName], [CompanyPhone], [Email], [Address], [City], [State], [Zip], [GoogleMapsUrl], [CreatedDate] ) SELECT ranked.[Name], ranked.[NormalizedName], ranked.[CompanyPhone], ranked.[Email], ranked.[Address], ranked.[City], ranked.[State], ranked.[Zip], ranked.[GoogleMapsUrl], GETUTCDATE() AS [CreatedDate] FROM RankedVendors ranked WHERE ranked.[RowNumber] = 1; UPDATE v SET v.[CompanyId] = vc.[Id] FROM [Vendors] v INNER JOIN [VendorCompanies] vc ON vc.[NormalizedName] = LOWER(LTRIM(RTRIM(v.[CompanyName]))) WHERE v.[CompanyName] IS NOT NULL AND LTRIM(RTRIM(v.[CompanyName])) <> ''; "); migrationBuilder.CreateIndex( name: "IX_Vendors_CompanyId", table: "Vendors", column: "CompanyId"); migrationBuilder.CreateIndex( name: "IX_VendorAuditLogs_VendorId", table: "VendorAuditLogs", column: "VendorId"); migrationBuilder.CreateIndex( name: "IX_VendorCompanies_NormalizedName", table: "VendorCompanies", column: "NormalizedName", unique: true); migrationBuilder.AddForeignKey( name: "FK_Vendors_VendorCompanies_CompanyId", table: "Vendors", column: "CompanyId", principalTable: "VendorCompanies", principalColumn: "Id", onDelete: ReferentialAction.Restrict); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropForeignKey( name: "FK_Vendors_VendorCompanies_CompanyId", table: "Vendors"); migrationBuilder.DropIndex( name: "IX_Vendors_CompanyId", table: "Vendors"); migrationBuilder.DropIndex( name: "IX_VendorAuditLogs_VendorId", table: "VendorAuditLogs"); migrationBuilder.DropIndex( name: "IX_VendorCompanies_NormalizedName", table: "VendorCompanies"); migrationBuilder.DropTable( name: "VendorAuditLogs"); migrationBuilder.DropTable( name: "VendorCompanies"); migrationBuilder.DropColumn( name: "CompanyId", table: "Vendors"); migrationBuilder.DropColumn( name: "PreferredContact", table: "Vendors"); } } }