Refactor sales pipeline: ShopPO, Invoice, SysConfig models
Major refactor replacing Sale/Order with ShopPO → Invoice → LoadingSheet flow. Removed legacy Sale/Order models and features; introduced ShopPO, ShopPOItem, Invoice, LoadingSheetOrder, and SysConfig models. Updated related entities, enums, repositories, and controllers. Added new migrations for schema changes and system config. Overhauled business logic and DI registrations. Updated documentation with migration plan.
This commit is contained in:
@@ -8,15 +8,17 @@ public static class OperationsDataSeed
|
||||
internal static readonly Guid ClosedSaleRunId = new("31000000-0000-0000-0000-000000000001");
|
||||
internal static readonly Guid ActiveDeliveryRunId = new("31000000-0000-0000-0000-000000000002");
|
||||
|
||||
// Kept for OperationsExtrasSeed stock movement reference (ReferenceId on MovementType.Sale)
|
||||
internal static readonly Guid Sale1Id = new("32000000-0000-0000-0000-000000000001");
|
||||
internal static readonly Guid Sale2Id = new("32000000-0000-0000-0000-000000000002");
|
||||
|
||||
internal static readonly Guid Order1Id = new("33000000-0000-0000-0000-000000000001");
|
||||
internal static readonly Guid Order2Id = new("33000000-0000-0000-0000-000000000002");
|
||||
internal static readonly Guid ShopPO1Id = new("33000000-0000-0000-0000-000000000001");
|
||||
internal static readonly Guid ShopPO2Id = new("33000000-0000-0000-0000-000000000002");
|
||||
|
||||
internal static readonly Guid OrderItem1Id = new("34000000-0000-0000-0000-000000000001");
|
||||
internal static readonly Guid OrderItem2Id = new("34000000-0000-0000-0000-000000000002");
|
||||
internal static readonly Guid OrderItem3Id = new("34000000-0000-0000-0000-000000000003");
|
||||
internal static readonly Guid ShopPOItem1Id = new("34000000-0000-0000-0000-000000000001");
|
||||
internal static readonly Guid ShopPOItem2Id = new("34000000-0000-0000-0000-000000000002");
|
||||
internal static readonly Guid ShopPOItem3Id = new("34000000-0000-0000-0000-000000000003");
|
||||
|
||||
internal static readonly Guid Invoice1Id = new("34500000-0000-0000-0000-000000000001");
|
||||
|
||||
internal static readonly Guid LoadingSheet1Id = new("35000000-0000-0000-0000-000000000001");
|
||||
|
||||
@@ -31,16 +33,12 @@ public static class OperationsDataSeed
|
||||
new DeliveryRun
|
||||
{
|
||||
Id = ClosedSaleRunId,
|
||||
RideType = RideType.Sale,
|
||||
Status = RideStatus.Closed,
|
||||
FK_VehicleId = MasterDataSeed.VanVehicleId,
|
||||
FK_DriverProfileId = MasterDataSeed.Driver1ProfileId,
|
||||
FK_RouteId = MasterDataSeed.ColomboRouteId,
|
||||
FK_SourceWarehouseId = MasterDataSeed.ColomboWarehouseId,
|
||||
Meterstart = 10500,
|
||||
Meterend = 10550,
|
||||
StartedAt = new DateTime(2026, 8, 25, 8, 0, 0),
|
||||
ActivatedAt = new DateTime(2026, 8, 25, 8, 15, 0),
|
||||
ClosedAt = new DateTime(2026, 8, 25, 14, 0, 0),
|
||||
CreatedAt = new DateTime(2026, 8, 25, 7, 30, 0),
|
||||
IsActive = true
|
||||
@@ -48,86 +46,71 @@ public static class OperationsDataSeed
|
||||
new DeliveryRun
|
||||
{
|
||||
Id = ActiveDeliveryRunId,
|
||||
RideType = RideType.Delivery,
|
||||
Status = RideStatus.Active,
|
||||
Status = RideStatus.Open,
|
||||
FK_VehicleId = MasterDataSeed.TruckVehicleId,
|
||||
FK_DriverProfileId = MasterDataSeed.Driver2ProfileId,
|
||||
FK_RouteId = MasterDataSeed.KandyRouteId,
|
||||
FK_SourceWarehouseId = MasterDataSeed.KandyWarehouseId,
|
||||
Meterstart = 20300,
|
||||
Meterend = 0,
|
||||
StartedAt = new DateTime(2026, 8, 30, 9, 0, 0),
|
||||
ActivatedAt = new DateTime(2026, 8, 30, 9, 20, 0),
|
||||
ClosedAt = null,
|
||||
CreatedAt = new DateTime(2026, 8, 30, 8, 45, 0),
|
||||
IsActive = true
|
||||
}
|
||||
);
|
||||
|
||||
modelBuilder.Entity<Sale>().HasData(
|
||||
new Sale
|
||||
modelBuilder.Entity<ShopPO>().HasData(
|
||||
new ShopPO
|
||||
{
|
||||
Id = Sale1Id,
|
||||
SaleDate = new DateTime(2026, 8, 25, 9, 0, 0),
|
||||
Id = ShopPO1Id,
|
||||
FK_StoreId = MasterDataSeed.FortStoreId,
|
||||
CreatedByUserId = MasterDataSeed.SalesRep1UserId,
|
||||
FK_RideId = ClosedSaleRunId,
|
||||
RaisedById = MasterDataSeed.SalesRep1UserId,
|
||||
InvoiceId = Invoice1Id,
|
||||
TotalAmount = 3000m,
|
||||
Status = SaleStatus.Completed,
|
||||
PaymentStatus = PaymentStatus.Paid,
|
||||
FulfillImmediately = false,
|
||||
CompletedAt = new DateTime(2026, 8, 25, 9, 30, 0),
|
||||
CreatedAt = new DateTime(2026, 8, 25, 9, 0, 0),
|
||||
IsActive = true
|
||||
},
|
||||
new Sale
|
||||
{
|
||||
Id = Sale2Id,
|
||||
SaleDate = new DateTime(2026, 8, 30, 10, 0, 0),
|
||||
FK_StoreId = MasterDataSeed.KandyStoreId,
|
||||
CreatedByUserId = MasterDataSeed.SalesRep2UserId,
|
||||
FK_RideId = ActiveDeliveryRunId,
|
||||
TotalAmount = 1200m,
|
||||
Status = SaleStatus.Pending,
|
||||
PaymentStatus = PaymentStatus.Pending,
|
||||
FulfillImmediately = false,
|
||||
CompletedAt = null,
|
||||
CreatedAt = new DateTime(2026, 8, 30, 10, 0, 0),
|
||||
IsActive = true
|
||||
}
|
||||
);
|
||||
|
||||
modelBuilder.Entity<Order>().HasData(
|
||||
new Order
|
||||
{
|
||||
Id = Order1Id,
|
||||
FK_SaleId = Sale1Id,
|
||||
OrderDate = new DateTime(2026, 8, 25, 9, 0, 0),
|
||||
FK_StoreId = MasterDataSeed.FortStoreId,
|
||||
TotalAmount = 3000m,
|
||||
Status = OrderStatus.Fulfilled,
|
||||
Status = ShopPOStatus.Fulfilled,
|
||||
ConfirmedAt = new DateTime(2026, 8, 25, 8, 30, 0),
|
||||
ConfirmedBy = MasterDataSeed.Supervisor1UserId,
|
||||
FulfilledAt = new DateTime(2026, 8, 25, 13, 0, 0),
|
||||
CreatedAt = new DateTime(2026, 8, 25, 9, 0, 0),
|
||||
IsActive = true
|
||||
},
|
||||
new Order
|
||||
new ShopPO
|
||||
{
|
||||
Id = Order2Id,
|
||||
FK_SaleId = Sale2Id,
|
||||
OrderDate = new DateTime(2026, 8, 30, 10, 0, 0),
|
||||
Id = ShopPO2Id,
|
||||
FK_StoreId = MasterDataSeed.KandyStoreId,
|
||||
RaisedById = MasterDataSeed.SalesRep2UserId,
|
||||
InvoiceId = null,
|
||||
TotalAmount = 1200m,
|
||||
Status = OrderStatus.Pending,
|
||||
Status = ShopPOStatus.Pending,
|
||||
ConfirmedAt = null,
|
||||
ConfirmedBy = null,
|
||||
FulfilledAt = null,
|
||||
CreatedAt = new DateTime(2026, 8, 30, 10, 0, 0),
|
||||
IsActive = true
|
||||
}
|
||||
);
|
||||
|
||||
modelBuilder.Entity<OrderItem>().HasData(
|
||||
new OrderItem { Id = OrderItem1Id, FK_OrderId = Order1Id, FK_ItemId = MasterDataSeed.Coke500ItemId, Quantity = 30, QuantityFulfilled = 30, UnitPrice = 60m, CreatedAt = new DateTime(2026, 8, 25, 9, 0, 0), IsActive = true },
|
||||
new OrderItem { Id = OrderItem2Id, FK_OrderId = Order1Id, FK_ItemId = MasterDataSeed.LaysClassicItemId, Quantity = 24, QuantityFulfilled = 24, UnitPrice = 50m, CreatedAt = new DateTime(2026, 8, 25, 9, 0, 0), IsActive = true },
|
||||
new OrderItem { Id = OrderItem3Id, FK_OrderId = Order2Id, FK_ItemId = MasterDataSeed.Coke1500ItemId, Quantity = 10, QuantityFulfilled = 0, UnitPrice = 120m, CreatedAt = new DateTime(2026, 8, 30, 10, 0, 0), IsActive = true }
|
||||
modelBuilder.Entity<ShopPOItem>().HasData(
|
||||
new ShopPOItem { Id = ShopPOItem1Id, FK_ShopPOId = ShopPO1Id, FK_ItemId = MasterDataSeed.Coke500ItemId, Quantity = 30, QuantityFulfilled = 30, UnitPrice = 60m, CreatedAt = new DateTime(2026, 8, 25, 9, 0, 0), IsActive = true },
|
||||
new ShopPOItem { Id = ShopPOItem2Id, FK_ShopPOId = ShopPO1Id, FK_ItemId = MasterDataSeed.LaysClassicItemId, Quantity = 24, QuantityFulfilled = 24, UnitPrice = 50m, CreatedAt = new DateTime(2026, 8, 25, 9, 0, 0), IsActive = true },
|
||||
new ShopPOItem { Id = ShopPOItem3Id, FK_ShopPOId = ShopPO2Id, FK_ItemId = MasterDataSeed.Coke1500ItemId, Quantity = 10, QuantityFulfilled = 0, UnitPrice = 120m, CreatedAt = new DateTime(2026, 8, 30, 10, 0, 0), IsActive = true }
|
||||
);
|
||||
|
||||
modelBuilder.Entity<Invoice>().HasData(
|
||||
new Invoice
|
||||
{
|
||||
Id = Invoice1Id,
|
||||
FK_ShopPOId = ShopPO1Id,
|
||||
Status = InvoiceStatus.Finalized,
|
||||
PaymentStatus = PaymentStatus.Paid,
|
||||
CreatedBy = MasterDataSeed.SalesRep1UserId,
|
||||
PrintedAt = new DateTime(2026, 8, 25, 8, 45, 0),
|
||||
PrintedBy = MasterDataSeed.SalesRep1UserId,
|
||||
FinalizedAt = new DateTime(2026, 8, 25, 9, 0, 0),
|
||||
FinalizedBy = MasterDataSeed.Supervisor1UserId,
|
||||
TotalAmount = 3000m,
|
||||
CreatedAt = new DateTime(2026, 8, 25, 8, 30, 0),
|
||||
IsActive = true
|
||||
}
|
||||
);
|
||||
|
||||
modelBuilder.Entity<LoadingSheet>().HasData(
|
||||
@@ -135,20 +118,19 @@ public static class OperationsDataSeed
|
||||
{
|
||||
Id = LoadingSheet1Id,
|
||||
FK_RideId = ClosedSaleRunId,
|
||||
FK_SourceWarehouseId = MasterDataSeed.ColomboWarehouseId,
|
||||
Status = LoadingSheetStatus.ReceiptConfirmed,
|
||||
DispatchConfirmedAt = new DateTime(2026, 8, 25, 7, 45, 0),
|
||||
DispatchConfirmedBy = MasterDataSeed.Supervisor1UserId,
|
||||
ReceiptConfirmedAt = new DateTime(2026, 8, 25, 14, 5, 0),
|
||||
ReceiptConfirmedBy = MasterDataSeed.Driver1UserId,
|
||||
Status = LoadingSheetStatus.Confirmed,
|
||||
PopulatedBy = MasterDataSeed.Supervisor1UserId,
|
||||
PopulatedAt = new DateTime(2026, 8, 25, 7, 30, 0),
|
||||
ConfirmedAt = new DateTime(2026, 8, 25, 7, 45, 0),
|
||||
ConfirmedBy = MasterDataSeed.Supervisor1UserId,
|
||||
CreatedAt = new DateTime(2026, 8, 25, 7, 30, 0),
|
||||
IsActive = true
|
||||
}
|
||||
);
|
||||
|
||||
modelBuilder.Entity<LoadingSheetItem>().HasData(
|
||||
new LoadingSheetItem { Id = LoadingSheetItem1Id, FK_LoadingSheetId = LoadingSheet1Id, FK_ItemId = MasterDataSeed.Coke500ItemId, QuantityDispatched = 50m, QuantityReceived = 50m, QuantityResolved = null },
|
||||
new LoadingSheetItem { Id = LoadingSheetItem2Id, FK_LoadingSheetId = LoadingSheet1Id, FK_ItemId = MasterDataSeed.LaysClassicItemId, QuantityDispatched = 30m, QuantityReceived = 30m, QuantityResolved = null }
|
||||
new LoadingSheetItem { Id = LoadingSheetItem1Id, FK_LoadingSheetId = LoadingSheet1Id, FK_ItemId = MasterDataSeed.Coke500ItemId, FK_WarehouseId = MasterDataSeed.ColomboWarehouseId, QuantityDispatched = 50m, CreatedAt = new DateTime(2026, 8, 25, 7, 30, 0), IsActive = true },
|
||||
new LoadingSheetItem { Id = LoadingSheetItem2Id, FK_LoadingSheetId = LoadingSheet1Id, FK_ItemId = MasterDataSeed.LaysClassicItemId, FK_WarehouseId = MasterDataSeed.ColomboWarehouseId, QuantityDispatched = 30m, CreatedAt = new DateTime(2026, 8, 25, 7, 30, 0), IsActive = true }
|
||||
);
|
||||
|
||||
modelBuilder.Entity<DeliveryTask>().HasData(
|
||||
@@ -156,7 +138,7 @@ public static class OperationsDataSeed
|
||||
{
|
||||
Id = DeliveryTask1Id,
|
||||
FK_RideId = ActiveDeliveryRunId,
|
||||
FK_OrderId = Order2Id,
|
||||
FK_ShopPOId = ShopPO2Id,
|
||||
Sequence = 1,
|
||||
Status = DeliveryTaskStatus.Pending,
|
||||
CustomerConfirmed = false,
|
||||
|
||||
Reference in New Issue
Block a user