using System; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace CMSMicroservice.Infrastructure.Persistence.Migrations { /// public partial class AddInventorySystem : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "Warehouses", schema: "CMS", columns: table => new { Id = table.Column(type: "bigint", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), Code = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), Address = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), IsDefault = table.Column(type: "bit", nullable: false, defaultValue: false), IsActive = table.Column(type: "bit", nullable: false, defaultValue: true), Created = table.Column(type: "datetime2", nullable: false), CreatedBy = table.Column(type: "nvarchar(max)", nullable: true), LastModified = table.Column(type: "datetime2", nullable: true), LastModifiedBy = table.Column(type: "nvarchar(max)", nullable: true), IsDeleted = table.Column(type: "bit", nullable: false) }, constraints: table => { table.PrimaryKey("PK_Warehouses", x => x.Id); }); migrationBuilder.CreateTable( name: "InventoryItems", schema: "CMS", columns: table => new { Id = table.Column(type: "bigint", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), ProductId = table.Column(type: "bigint", nullable: true), DiscountProductId = table.Column(type: "bigint", nullable: true), ProductType = table.Column(type: "int", nullable: false), Quantity = table.Column(type: "int", nullable: false, defaultValue: 0), ReservedQuantity = table.Column(type: "int", nullable: false, defaultValue: 0), LowStockThreshold = table.Column(type: "int", nullable: false, defaultValue: 10), ReorderPoint = table.Column(type: "int", nullable: false, defaultValue: 5), MaxStockLevel = table.Column(type: "int", nullable: false, defaultValue: 1000), LastRestockedAt = table.Column(type: "datetime2", nullable: true), LastSoldAt = table.Column(type: "datetime2", nullable: true), WarehouseId = table.Column(type: "bigint", nullable: false, defaultValue: 1L), Created = table.Column(type: "datetime2", nullable: false), CreatedBy = table.Column(type: "nvarchar(max)", nullable: true), LastModified = table.Column(type: "datetime2", nullable: true), LastModifiedBy = table.Column(type: "nvarchar(max)", nullable: true), IsDeleted = table.Column(type: "bit", nullable: false) }, constraints: table => { table.PrimaryKey("PK_InventoryItems", x => x.Id); table.CheckConstraint("CK_InventoryItem_ProductReference", "(ProductId IS NOT NULL AND DiscountProductId IS NULL) OR (ProductId IS NULL AND DiscountProductId IS NOT NULL)"); table.CheckConstraint("CK_InventoryItem_ProductType_Match", "(ProductType = 1 AND ProductId IS NOT NULL) OR (ProductType = 2 AND DiscountProductId IS NOT NULL)"); table.CheckConstraint("CK_InventoryItem_Quantity_NonNegative", "Quantity >= 0"); table.CheckConstraint("CK_InventoryItem_ReservedQuantity_LessOrEqualQuantity", "ReservedQuantity <= Quantity"); table.CheckConstraint("CK_InventoryItem_ReservedQuantity_NonNegative", "ReservedQuantity >= 0"); table.ForeignKey( name: "FK_InventoryItems_DiscountProducts_DiscountProductId", column: x => x.DiscountProductId, principalSchema: "CMS", principalTable: "DiscountProducts", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_InventoryItems_Products_ProductId", column: x => x.ProductId, principalSchema: "CMS", principalTable: "Products", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_InventoryItems_Warehouses_WarehouseId", column: x => x.WarehouseId, principalSchema: "CMS", principalTable: "Warehouses", principalColumn: "Id", onDelete: ReferentialAction.Restrict); }); migrationBuilder.CreateTable( name: "StockMovements", schema: "CMS", columns: table => new { Id = table.Column(type: "bigint", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), InventoryItemId = table.Column(type: "bigint", nullable: false), MovementType = table.Column(type: "int", nullable: false), Quantity = table.Column(type: "int", nullable: false), QuantityBefore = table.Column(type: "int", nullable: false), QuantityAfter = table.Column(type: "int", nullable: false), OrderId = table.Column(type: "bigint", nullable: true), DiscountOrderId = table.Column(type: "bigint", nullable: true), ReferenceNumber = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), Note = table.Column(type: "nvarchar(500)", maxLength: 500, nullable: true), PerformedByUserId = table.Column(type: "bigint", nullable: true), Created = table.Column(type: "datetime2", nullable: false), CreatedBy = table.Column(type: "nvarchar(max)", nullable: true), LastModified = table.Column(type: "datetime2", nullable: true), LastModifiedBy = table.Column(type: "nvarchar(max)", nullable: true), IsDeleted = table.Column(type: "bit", nullable: false) }, constraints: table => { table.PrimaryKey("PK_StockMovements", x => x.Id); table.CheckConstraint("CK_StockMovement_QuantityAfter_Calculation", "QuantityAfter = QuantityBefore + Quantity"); table.CheckConstraint("CK_StockMovement_QuantityAfter_NonNegative", "QuantityAfter >= 0"); table.CheckConstraint("CK_StockMovement_QuantityBefore_NonNegative", "QuantityBefore >= 0"); table.ForeignKey( name: "FK_StockMovements_InventoryItems_InventoryItemId", column: x => x.InventoryItemId, principalSchema: "CMS", principalTable: "InventoryItems", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.InsertData( schema: "CMS", table: "Warehouses", columns: new[] { "Id", "Address", "Code", "Created", "CreatedBy", "IsActive", "IsDefault", "IsDeleted", "LastModified", "LastModifiedBy", "Name" }, values: new object[] { 1L, "تهران - انبار مرکزی فروشگاه", "WH-001", new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), "System", true, true, false, null, null, "انبار اصلی" }); migrationBuilder.CreateIndex( name: "IX_InventoryItems_DiscountProductId", schema: "CMS", table: "InventoryItems", column: "DiscountProductId"); migrationBuilder.CreateIndex( name: "IX_InventoryItems_ProductId", schema: "CMS", table: "InventoryItems", column: "ProductId"); migrationBuilder.CreateIndex( name: "IX_InventoryItems_ProductType_Quantity", schema: "CMS", table: "InventoryItems", columns: new[] { "ProductType", "Quantity" }); migrationBuilder.CreateIndex( name: "IX_InventoryItems_WarehouseId", schema: "CMS", table: "InventoryItems", column: "WarehouseId"); migrationBuilder.CreateIndex( name: "IX_StockMovements_Created", schema: "CMS", table: "StockMovements", column: "Created"); migrationBuilder.CreateIndex( name: "IX_StockMovements_DiscountOrderId", schema: "CMS", table: "StockMovements", column: "DiscountOrderId", filter: "[DiscountOrderId] IS NOT NULL"); migrationBuilder.CreateIndex( name: "IX_StockMovements_InventoryItemId", schema: "CMS", table: "StockMovements", column: "InventoryItemId"); migrationBuilder.CreateIndex( name: "IX_StockMovements_Item_Type_Date", schema: "CMS", table: "StockMovements", columns: new[] { "InventoryItemId", "MovementType", "Created" }); migrationBuilder.CreateIndex( name: "IX_StockMovements_MovementType", schema: "CMS", table: "StockMovements", column: "MovementType"); migrationBuilder.CreateIndex( name: "IX_StockMovements_OrderId", schema: "CMS", table: "StockMovements", column: "OrderId", filter: "[OrderId] IS NOT NULL"); migrationBuilder.CreateIndex( name: "IX_StockMovements_ReferenceNumber", schema: "CMS", table: "StockMovements", column: "ReferenceNumber", filter: "[ReferenceNumber] IS NOT NULL"); migrationBuilder.CreateIndex( name: "IX_Warehouses_Code_Unique", schema: "CMS", table: "Warehouses", column: "Code", unique: true); migrationBuilder.CreateIndex( name: "IX_Warehouses_IsActive", schema: "CMS", table: "Warehouses", column: "IsActive"); migrationBuilder.CreateIndex( name: "IX_Warehouses_IsDefault", schema: "CMS", table: "Warehouses", column: "IsDefault", filter: "[IsDefault] = 1"); } /// protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( name: "StockMovements", schema: "CMS"); migrationBuilder.DropTable( name: "InventoryItems", schema: "CMS"); migrationBuilder.DropTable( name: "Warehouses", schema: "CMS"); } } }