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:
Kalana B. Thilakarathna
2026-09-17 10:03:22 +05:30
parent 6c40421b2d
commit 93f2f1bd3b
83 changed files with 11274 additions and 2538 deletions
+1 -11
View File
@@ -4,8 +4,7 @@ namespace Distribution.Models
{
public class DeliveryRun : Template
{
public RideType RideType { get; set; }
public RideStatus Status { get; set; } = RideStatus.Draft;
public RideStatus Status { get; set; } = RideStatus.Open;
public Guid FK_VehicleId { get; set; }
[ForeignKey("FK_VehicleId")]
@@ -15,19 +14,10 @@ namespace Distribution.Models
[ForeignKey("FK_DriverProfileId")]
public DriverProfile DriverProfile { get; set; }
public Guid FK_RouteId { get; set; }
[ForeignKey("FK_RouteId")]
public Route Route { get; set; }
public Guid FK_SourceWarehouseId { get; set; }
[ForeignKey("FK_SourceWarehouseId")]
public Warehouse SourceWarehouse { get; set; }
public int Meterstart { get; set; }
public int Meterend { get; set; }
public DateTime? StartedAt { get; set; }
public DateTime? ActivatedAt { get; set; }
public DateTime? ClosedAt { get; set; }
}
}
+3 -3
View File
@@ -8,9 +8,9 @@ namespace Distribution.Models
[ForeignKey("FK_RideId")]
public DeliveryRun Ride { get; set; }
public Guid FK_OrderId { get; set; }
[ForeignKey("FK_OrderId")]
public Order Order { get; set; }
public Guid FK_ShopPOId { get; set; }
[ForeignKey("FK_ShopPOId")]
public ShopPO ShopPO { get; set; }
public int Sequence { get; set; }
public DeliveryTaskStatus Status { get; set; } = DeliveryTaskStatus.Pending;
+13 -9
View File
@@ -3,15 +3,14 @@ namespace Distribution.Models
public enum LocationType
{ Warehouse, Vehicle, External }
public enum KycStatus { Pending,Verified, Rejected }
public enum MovementType { Sale, CustomerReturn, Transfer, Damage, Adjustment, Load, PurchaseReceipt, PurchaseReturn }
public enum KycStatus { Pending, Verified, Rejected }
public enum LoadingSheetStatus { Pending, DispatchConfirmed, ReceiptConfirmed, DiscrepancyFlagged, Resolved }
public enum MovementType { Sale, CustomerReturn, Transfer, Damage, Adjustment, Load, PurchaseReceipt, PurchaseReturn }
public enum RideType { Delivery, Sale }
public enum LoadingSheetStatus { Planned, Confirmed }
public enum RideStatus { Draft, Open, Active, CancelRequested, Cancelled, Closed }
public enum RideStatus { Open, Cancelled, Closed }
public enum CancelRequestType { VehicleBreakdown, DriverUnavailable, RouteIssue, Other }
@@ -19,16 +18,15 @@ namespace Distribution.Models
public enum PurchaseOrderStatus { Issued, PartiallyReceived, Received, Closed, Cancelled }
public enum SaleStatus { Pending, Completed, Cancelled }
public enum ShopPOStatus { Pending, PartiallyFulfilled, Fulfilled, Cancelled }
public enum OrderStatus { Pending, PartiallyFulfilled, Fulfilled, Cancelled }
public enum InvoiceStatus { Draft, Printed, Finalized }
public enum PaymentStatus { Pending, PartiallyPaid, Paid }
public enum PaymentMethod { Cash, Credit }
public enum DeliveryTaskStatus
{ Pending, Delivered, PartiallyDelivered, Failed}
public enum DeliveryTaskStatus { Pending, Delivered, PartiallyDelivered, Failed }
public enum ReturnMode { CreditDeduction, ItemExchange }
@@ -41,4 +39,10 @@ namespace Distribution.Models
public enum SupplierClaimIssueType { Damaged, Short, Expired, WrongItem, Other }
public enum SupplierClaimResolutionType { Replacement, Credit, Refund, PriceAdjustment }
/// <summary>
/// ModeA: Invoice auto-created when ShopPO is confirmed.
/// ModeB: Invoice created as a separate explicit step.
/// </summary>
public enum InvoiceCreationMode { ModeA, ModeB }
}
+26
View File
@@ -0,0 +1,26 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace Distribution.Models
{
public class Invoice : Template
{
public Guid FK_ShopPOId { get; set; }
[ForeignKey("FK_ShopPOId")]
public ShopPO ShopPO { get; set; }
public InvoiceStatus Status { get; set; } = InvoiceStatus.Draft;
public PaymentStatus PaymentStatus { get; set; } = PaymentStatus.Pending;
public Guid CreatedBy { get; set; }
public DateTime? PrintedAt { get; set; }
public Guid? PrintedBy { get; set; }
public DateTime? FinalizedAt { get; set; }
public Guid? FinalizedBy { get; set; }
public decimal TotalAmount { get; set; }
public ICollection<Payment> Payments { get; set; } = new List<Payment>();
}
}
+6 -8
View File
@@ -8,17 +8,15 @@ namespace Distribution.Models
[ForeignKey("FK_RideId")]
public DeliveryRun Ride { get; set; }
public Guid FK_SourceWarehouseId { get; set; }
[ForeignKey("FK_SourceWarehouseId")]
public Warehouse SourceWarehouse { get; set; }
public LoadingSheetStatus Status { get; set; } = LoadingSheetStatus.Planned;
public LoadingSheetStatus Status { get; set; } = LoadingSheetStatus.Pending;
public Guid PopulatedBy { get; set; }
public DateTime PopulatedAt { get; set; }
public DateTime? DispatchConfirmedAt { get; set; }
public Guid? DispatchConfirmedBy { get; set; }
public DateTime? ReceiptConfirmedAt { get; set; }
public Guid? ReceiptConfirmedBy { get; set; }
public DateTime? ConfirmedAt { get; set; }
public Guid? ConfirmedBy { get; set; }
public List<LoadingSheetItem> Items { get; set; } = [];
public List<LoadingSheetOrder> Orders { get; set; } = [];
}
}
+9 -5
View File
@@ -2,10 +2,8 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace Distribution.Models
{
public class LoadingSheetItem
public class LoadingSheetItem : Template
{
public Guid Id { get; set; } = Guid.NewGuid();
public Guid FK_LoadingSheetId { get; set; }
[ForeignKey("FK_LoadingSheetId")]
public LoadingSheet LoadingSheet { get; set; }
@@ -14,8 +12,14 @@ namespace Distribution.Models
[ForeignKey("FK_ItemId")]
public Item Item { get; set; }
public Guid FK_WarehouseId { get; set; }
[ForeignKey("FK_WarehouseId")]
public Warehouse Warehouse { get; set; }
public Guid? FK_ShopPOItemId { get; set; }
[ForeignKey("FK_ShopPOItemId")]
public ShopPOItem? ShopPOItem { get; set; }
public decimal QuantityDispatched { get; set; }
public decimal? QuantityReceived { get; set; }
public decimal? QuantityResolved { get; set; }
}
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace Distribution.Models
{
public class LoadingSheetOrder
{
public Guid FK_LoadingSheetId { get; set; }
[ForeignKey("FK_LoadingSheetId")]
public LoadingSheet LoadingSheet { get; set; }
public Guid FK_ShopPOId { get; set; }
[ForeignKey("FK_ShopPOId")]
public ShopPO ShopPO { get; set; }
}
}
-21
View File
@@ -1,21 +0,0 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace Distribution.Models
{
public class Order : Template
{
public Guid FK_SaleId { get; set; }
[ForeignKey("FK_SaleId")]
public Sale Sale { get; set; }
public DateTime OrderDate { get; set; }
public Guid FK_StoreId { get; set; }
[ForeignKey("FK_StoreId")]
public Store Store { get; set; }
public decimal TotalAmount { get; set; }
public OrderStatus Status { get; set; } = OrderStatus.Pending;
public DateTime? FulfilledAt { get; set; }
public ICollection<OrderItem> OrderItems { get; set; } = new List<OrderItem>();
}
}
+3 -7
View File
@@ -4,13 +4,9 @@ namespace Distribution.Models
{
public class Payment : Template
{
public Guid FK_SaleId { get; set; }
[ForeignKey("FK_SaleId")]
public Sale Sale { get; set; }
public Guid FK_StoreId { get; set; }
[ForeignKey("FK_StoreId")]
public Store Store { get; set; }
public Guid FK_InvoiceId { get; set; }
[ForeignKey("FK_InvoiceId")]
public Invoice Invoice { get; set; }
public decimal Amount { get; set; }
public PaymentMethod Method { get; set; }
-27
View File
@@ -1,27 +0,0 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace Distribution.Models
{
public class Sale : Template
{
public DateTime SaleDate { get; set; }
public Guid FK_StoreId { get; set; }
[ForeignKey("FK_StoreId")]
public Store Store { get; set; }
public Guid CreatedByUserId { get; set; }
[ForeignKey("CreatedByUserId")]
public User CreatedByUser { get; set; }
public Guid? FK_RideId { get; set; }
[ForeignKey("FK_RideId")]
public DeliveryRun? Ride { get; set; }
public decimal TotalAmount { get; set; }
public SaleStatus Status { get; set; } = SaleStatus.Pending;
public PaymentStatus PaymentStatus { get; set; } = PaymentStatus.Pending;
public bool FulfillImmediately { get; set; }
public DateTime? CompletedAt { get; set; }
}
}
+3 -3
View File
@@ -8,9 +8,9 @@ namespace Distribution.Models
/// </summary>
public class SaleReturn : Template
{
public Guid FK_OrderId { get; set; }
[ForeignKey("FK_OrderId")]
public Order Order { get; set; }
public Guid FK_ShopPOId { get; set; }
[ForeignKey("FK_ShopPOId")]
public ShopPO ShopPO { get; set; }
public ReturnMode Mode { get; set; }
+3 -3
View File
@@ -10,9 +10,9 @@ namespace Distribution.Models
[ForeignKey("FK_SchemeId")]
public Scheme Scheme { get; set; }
public Guid? FK_OrderId { get; set; }
[ForeignKey("FK_OrderId")]
public Order? Order { get; set; }
public Guid? FK_ShopPOId { get; set; }
[ForeignKey("FK_ShopPOId")]
public ShopPO? ShopPO { get; set; }
/// <summary>Placeholder for the future field-invoice module — no FieldInvoice entity exists yet.</summary>
public Guid? FieldInvoiceId { get; set; }
+25
View File
@@ -0,0 +1,25 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace Distribution.Models
{
public class ShopPO : Template
{
public Guid FK_StoreId { get; set; }
[ForeignKey("FK_StoreId")]
public Store Store { get; set; }
public Guid RaisedById { get; set; }
public Guid? InvoiceId { get; set; }
public decimal TotalAmount { get; set; }
public ShopPOStatus Status { get; set; } = ShopPOStatus.Pending;
public DateTime? ConfirmedAt { get; set; }
public Guid? ConfirmedBy { get; set; }
public DateTime? FulfilledAt { get; set; }
public ICollection<ShopPOItem> Items { get; set; } = new List<ShopPOItem>();
}
}
@@ -1,15 +1,17 @@
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations.Schema;
namespace Distribution.Models
{
public class OrderItem : Template
public class ShopPOItem : Template
{
public Guid FK_OrderId { get; set; }
[ForeignKey("FK_OrderId")]
public Order Order { get; set; }
public Guid FK_ShopPOId { get; set; }
[ForeignKey("FK_ShopPOId")]
public ShopPO ShopPO { get; set; }
public Guid FK_ItemId { get; set; }
[ForeignKey("FK_ItemId")]
public Item Item { get; set; }
public int Quantity { get; set; }
public int QuantityFulfilled { get; set; } = 0;
public decimal UnitPrice { get; set; }
+10
View File
@@ -0,0 +1,10 @@
namespace Distribution.Models
{
public class SysConfig
{
public string Key { get; set; }
public string Value { get; set; }
public DateTime UpdatedAt { get; set; } = DateTime.Now;
public Guid? UpdatedBy { get; set; }
}
}