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:
@@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 }
|
||||
}
|
||||
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
@@ -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; } = [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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; }
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user