Add invoice lifecycle migration
This commit is contained in:
@@ -0,0 +1,306 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional
|
||||
|
||||
namespace Distribution.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddOrderInvoiceLifecycle : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
// Must run before DropPrimaryKey below: OrderItems.FK_OrderId has a foreign key to
|
||||
// Orders, and MySQL requires a supporting index on that column at all times. The old
|
||||
// composite PK (FK_OrderId, FK_ItemId) was providing that support; without this index
|
||||
// created first, dropping the PK leaves FK_OrderId's constraint without an index and
|
||||
// MySQL rejects the DROP PRIMARY KEY (errno 150).
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_OrderItems_FK_OrderId",
|
||||
table: "OrderItems",
|
||||
column: "FK_OrderId");
|
||||
|
||||
migrationBuilder.DropPrimaryKey(
|
||||
name: "PK_OrderItems",
|
||||
table: "OrderItems");
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "OrderItems",
|
||||
keyColumns: new[] { "FK_ItemId", "FK_OrderId" },
|
||||
keyValues: new object[] { new Guid("23000000-0000-0000-0000-000000000001"), new Guid("33000000-0000-0000-0000-000000000001") });
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "OrderItems",
|
||||
keyColumns: new[] { "FK_ItemId", "FK_OrderId" },
|
||||
keyValues: new object[] { new Guid("23000000-0000-0000-0000-000000000003"), new Guid("33000000-0000-0000-0000-000000000001") });
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "OrderItems",
|
||||
keyColumns: new[] { "FK_ItemId", "FK_OrderId" },
|
||||
keyValues: new object[] { new Guid("23000000-0000-0000-0000-000000000002"), new Guid("33000000-0000-0000-0000-000000000002") });
|
||||
|
||||
migrationBuilder.AlterColumn<Guid>(
|
||||
name: "FK_SaleId",
|
||||
table: "Orders",
|
||||
type: "char(36)",
|
||||
nullable: true,
|
||||
collation: "ascii_general_ci",
|
||||
oldClrType: typeof(Guid),
|
||||
oldType: "char(36)")
|
||||
.OldAnnotation("Relational:Collation", "ascii_general_ci");
|
||||
|
||||
migrationBuilder.AddColumn<DateTime>(
|
||||
name: "ConfirmedAt",
|
||||
table: "Orders",
|
||||
type: "datetime(6)",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<Guid>(
|
||||
name: "ConfirmedByUserId",
|
||||
table: "Orders",
|
||||
type: "char(36)",
|
||||
nullable: true,
|
||||
collation: "ascii_general_ci");
|
||||
|
||||
migrationBuilder.AddColumn<Guid>(
|
||||
name: "CreatedByUserId",
|
||||
table: "Orders",
|
||||
type: "char(36)",
|
||||
nullable: false,
|
||||
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"),
|
||||
collation: "ascii_general_ci");
|
||||
|
||||
// Backfill every existing Order's new CreatedByUserId from its linked Sale (Order.FK_SaleId
|
||||
// was required until this migration, so every pre-existing row has one). Covers every
|
||||
// row generically, not just the two rows seeded via HasData below — otherwise any Order
|
||||
// created outside the EF seed data would keep the temporary AddColumn default
|
||||
// (Guid.Empty) and fail the FK_Orders_Users_CreatedByUserId constraint added at the end
|
||||
// of this migration.
|
||||
migrationBuilder.Sql(@"
|
||||
UPDATE `Orders` o
|
||||
INNER JOIN `Sales` s ON s.`Id` = o.`FK_SaleId`
|
||||
SET o.`CreatedByUserId` = s.`CreatedByUserId`
|
||||
WHERE o.`FK_SaleId` IS NOT NULL;");
|
||||
|
||||
migrationBuilder.AddColumn<Guid>(
|
||||
name: "InvoiceId",
|
||||
table: "Orders",
|
||||
type: "char(36)",
|
||||
nullable: true,
|
||||
collation: "ascii_general_ci");
|
||||
|
||||
migrationBuilder.AddPrimaryKey(
|
||||
name: "PK_OrderItems",
|
||||
table: "OrderItems",
|
||||
column: "Id");
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Invoices",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "char(36)", nullable: false, collation: "ascii_general_ci"),
|
||||
FK_OrderId = table.Column<Guid>(type: "char(36)", nullable: false, collation: "ascii_general_ci"),
|
||||
Status = table.Column<int>(type: "int", nullable: false),
|
||||
CreatedByUserId = table.Column<Guid>(type: "char(36)", nullable: false, collation: "ascii_general_ci"),
|
||||
PrintedAt = table.Column<DateTime>(type: "datetime(6)", nullable: true),
|
||||
PrintedByUserId = table.Column<Guid>(type: "char(36)", nullable: true, collation: "ascii_general_ci"),
|
||||
FinalizedAt = table.Column<DateTime>(type: "datetime(6)", nullable: true),
|
||||
FinalizedByUserId = table.Column<Guid>(type: "char(36)", nullable: true, collation: "ascii_general_ci"),
|
||||
TotalAmount = table.Column<decimal>(type: "decimal(65,30)", nullable: false),
|
||||
CreatedAt = table.Column<DateTime>(type: "datetime(6)", nullable: false),
|
||||
IsActive = table.Column<bool>(type: "tinyint(1)", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Invoices", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_Invoices_Orders_FK_OrderId",
|
||||
column: x => x.FK_OrderId,
|
||||
principalTable: "Orders",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_Invoices_Users_CreatedByUserId",
|
||||
column: x => x.CreatedByUserId,
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_Invoices_Users_FinalizedByUserId",
|
||||
column: x => x.FinalizedByUserId,
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_Invoices_Users_PrintedByUserId",
|
||||
column: x => x.PrintedByUserId,
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
})
|
||||
.Annotation("MySql:CharSet", "utf8mb4");
|
||||
|
||||
migrationBuilder.InsertData(
|
||||
table: "OrderItems",
|
||||
columns: new[] { "Id", "CreatedAt", "FK_ItemId", "FK_OrderId", "IsActive", "Quantity", "QuantityFulfilled", "UnitPrice" },
|
||||
values: new object[,]
|
||||
{
|
||||
{ new Guid("34000000-0000-0000-0000-000000000001"), new DateTime(2026, 8, 25, 9, 0, 0, 0, DateTimeKind.Unspecified), new Guid("23000000-0000-0000-0000-000000000001"), new Guid("33000000-0000-0000-0000-000000000001"), true, 30, 30, 60m },
|
||||
{ new Guid("34000000-0000-0000-0000-000000000002"), new DateTime(2026, 8, 25, 9, 0, 0, 0, DateTimeKind.Unspecified), new Guid("23000000-0000-0000-0000-000000000003"), new Guid("33000000-0000-0000-0000-000000000001"), true, 24, 24, 50m },
|
||||
{ new Guid("34000000-0000-0000-0000-000000000003"), new DateTime(2026, 8, 30, 10, 0, 0, 0, DateTimeKind.Unspecified), new Guid("23000000-0000-0000-0000-000000000002"), new Guid("33000000-0000-0000-0000-000000000002"), true, 10, 0, 120m }
|
||||
});
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Orders",
|
||||
keyColumn: "Id",
|
||||
keyValue: new Guid("33000000-0000-0000-0000-000000000001"),
|
||||
columns: new[] { "ConfirmedAt", "ConfirmedByUserId", "CreatedByUserId", "InvoiceId" },
|
||||
values: new object[] { null, null, new Guid("29000000-0000-0000-0000-000000000002"), null });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Orders",
|
||||
keyColumn: "Id",
|
||||
keyValue: new Guid("33000000-0000-0000-0000-000000000002"),
|
||||
columns: new[] { "ConfirmedAt", "ConfirmedByUserId", "CreatedByUserId", "InvoiceId" },
|
||||
values: new object[] { null, null, new Guid("29000000-0000-0000-0000-000000000003"), null });
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Orders_ConfirmedByUserId",
|
||||
table: "Orders",
|
||||
column: "ConfirmedByUserId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Orders_CreatedByUserId",
|
||||
table: "Orders",
|
||||
column: "CreatedByUserId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Invoices_CreatedByUserId",
|
||||
table: "Invoices",
|
||||
column: "CreatedByUserId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Invoices_FinalizedByUserId",
|
||||
table: "Invoices",
|
||||
column: "FinalizedByUserId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Invoices_FK_OrderId",
|
||||
table: "Invoices",
|
||||
column: "FK_OrderId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Invoices_PrintedByUserId",
|
||||
table: "Invoices",
|
||||
column: "PrintedByUserId");
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_Orders_Users_ConfirmedByUserId",
|
||||
table: "Orders",
|
||||
column: "ConfirmedByUserId",
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_Orders_Users_CreatedByUserId",
|
||||
table: "Orders",
|
||||
column: "CreatedByUserId",
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_Orders_Users_ConfirmedByUserId",
|
||||
table: "Orders");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_Orders_Users_CreatedByUserId",
|
||||
table: "Orders");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Invoices");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_Orders_ConfirmedByUserId",
|
||||
table: "Orders");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_Orders_CreatedByUserId",
|
||||
table: "Orders");
|
||||
|
||||
migrationBuilder.DropPrimaryKey(
|
||||
name: "PK_OrderItems",
|
||||
table: "OrderItems");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_OrderItems_FK_OrderId",
|
||||
table: "OrderItems");
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "OrderItems",
|
||||
keyColumn: "Id",
|
||||
keyValue: new Guid("34000000-0000-0000-0000-000000000001"));
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "OrderItems",
|
||||
keyColumn: "Id",
|
||||
keyValue: new Guid("34000000-0000-0000-0000-000000000002"));
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "OrderItems",
|
||||
keyColumn: "Id",
|
||||
keyValue: new Guid("34000000-0000-0000-0000-000000000003"));
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ConfirmedAt",
|
||||
table: "Orders");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ConfirmedByUserId",
|
||||
table: "Orders");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "CreatedByUserId",
|
||||
table: "Orders");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "InvoiceId",
|
||||
table: "Orders");
|
||||
|
||||
migrationBuilder.AlterColumn<Guid>(
|
||||
name: "FK_SaleId",
|
||||
table: "Orders",
|
||||
type: "char(36)",
|
||||
nullable: false,
|
||||
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"),
|
||||
collation: "ascii_general_ci",
|
||||
oldClrType: typeof(Guid),
|
||||
oldType: "char(36)",
|
||||
oldNullable: true)
|
||||
.OldAnnotation("Relational:Collation", "ascii_general_ci");
|
||||
|
||||
migrationBuilder.AddPrimaryKey(
|
||||
name: "PK_OrderItems",
|
||||
table: "OrderItems",
|
||||
columns: new[] { "FK_OrderId", "FK_ItemId" });
|
||||
|
||||
migrationBuilder.InsertData(
|
||||
table: "OrderItems",
|
||||
columns: new[] { "FK_ItemId", "FK_OrderId", "CreatedAt", "Id", "IsActive", "Quantity", "QuantityFulfilled", "UnitPrice" },
|
||||
values: new object[,]
|
||||
{
|
||||
{ new Guid("23000000-0000-0000-0000-000000000001"), new Guid("33000000-0000-0000-0000-000000000001"), new DateTime(2026, 8, 25, 9, 0, 0, 0, DateTimeKind.Unspecified), new Guid("34000000-0000-0000-0000-000000000001"), true, 30, 30, 60m },
|
||||
{ new Guid("23000000-0000-0000-0000-000000000003"), new Guid("33000000-0000-0000-0000-000000000001"), new DateTime(2026, 8, 25, 9, 0, 0, 0, DateTimeKind.Unspecified), new Guid("34000000-0000-0000-0000-000000000002"), true, 24, 24, 50m },
|
||||
{ new Guid("23000000-0000-0000-0000-000000000002"), new Guid("33000000-0000-0000-0000-000000000002"), new DateTime(2026, 8, 30, 10, 0, 0, 0, DateTimeKind.Unspecified), new Guid("34000000-0000-0000-0000-000000000003"), true, 10, 0, 120m }
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user