Refine sale fulfillment
This commit is contained in:
@@ -153,20 +153,13 @@ public class SaleService(
|
|||||||
if (request.TotalAmount > threshold) return null;
|
if (request.TotalAmount > threshold) return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var saleStatus = request.FulfillImmediately ? SaleStatus.Completed : SaleStatus.Pending;
|
|
||||||
var orderStatus = request.FulfillImmediately ? OrderStatus.Fulfilled : OrderStatus.Pending;
|
|
||||||
var fulfilledAt = request.FulfillImmediately ? DateTime.Now : (DateTime?)null;
|
|
||||||
|
|
||||||
var sale = new Models.Sale
|
var sale = new Models.Sale
|
||||||
{
|
{
|
||||||
FK_StoreId = request.StoreId,
|
FK_StoreId = request.StoreId,
|
||||||
SaleDate = request.SaleDate,
|
SaleDate = request.SaleDate,
|
||||||
CreatedByUserId = userId,
|
CreatedByUserId = userId,
|
||||||
FK_RideId = request.RideId,
|
FK_RideId = request.RideId,
|
||||||
TotalAmount = request.TotalAmount,
|
FulfillImmediately = request.FulfillImmediately
|
||||||
Status = saleStatus,
|
|
||||||
FulfillImmediately = request.FulfillImmediately,
|
|
||||||
CompletedAt = request.FulfillImmediately ? DateTime.Now : null
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var orderItems = new List<Models.OrderItem>();
|
var orderItems = new List<Models.OrderItem>();
|
||||||
@@ -179,7 +172,6 @@ public class SaleService(
|
|||||||
{
|
{
|
||||||
FK_ItemId = item.ItemId,
|
FK_ItemId = item.ItemId,
|
||||||
Quantity = item.Quantity,
|
Quantity = item.Quantity,
|
||||||
QuantityFulfilled = request.FulfillImmediately ? item.Quantity : 0,
|
|
||||||
UnitPrice = unitPrice.Value
|
UnitPrice = unitPrice.Value
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -189,14 +181,14 @@ public class SaleService(
|
|||||||
FK_SaleId = sale.Id,
|
FK_SaleId = sale.Id,
|
||||||
FK_StoreId = request.StoreId,
|
FK_StoreId = request.StoreId,
|
||||||
OrderDate = request.SaleDate,
|
OrderDate = request.SaleDate,
|
||||||
TotalAmount = request.TotalAmount,
|
|
||||||
Status = orderStatus,
|
|
||||||
FulfilledAt = fulfilledAt
|
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach (var orderItem in orderItems)
|
foreach (var orderItem in orderItems)
|
||||||
orderItem.FK_OrderId = order.Id;
|
orderItem.FK_OrderId = order.Id;
|
||||||
|
|
||||||
|
// For a van sale against a specific ride, sell whatever quantity is actually on that
|
||||||
|
// vehicle instead of rejecting the whole sale over one short item — the sale is always a
|
||||||
|
// clean, completed sale of what's handed over, never a "partially fulfilled" order.
|
||||||
Guid? vehicleId = null;
|
Guid? vehicleId = null;
|
||||||
if (request.FulfillImmediately && request.RideId.HasValue)
|
if (request.FulfillImmediately && request.RideId.HasValue)
|
||||||
{
|
{
|
||||||
@@ -207,11 +199,29 @@ public class SaleService(
|
|||||||
foreach (var item in orderItems)
|
foreach (var item in orderItems)
|
||||||
{
|
{
|
||||||
var balance = await stockRepo.GetBalanceAsync(item.FK_ItemId, vehicleId.Value);
|
var balance = await stockRepo.GetBalanceAsync(item.FK_ItemId, vehicleId.Value);
|
||||||
if (balance is null || balance.Quantity < item.Quantity)
|
item.Quantity = Math.Min(item.Quantity, (int)(balance?.Quantity ?? 0));
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var item in orderItems)
|
||||||
|
item.QuantityFulfilled = request.FulfillImmediately ? item.Quantity : 0;
|
||||||
|
|
||||||
|
if (request.FulfillImmediately)
|
||||||
|
{
|
||||||
|
sale.Status = SaleStatus.Completed;
|
||||||
|
sale.CompletedAt = DateTime.Now;
|
||||||
|
order.Status = OrderStatus.Fulfilled;
|
||||||
|
order.FulfilledAt = DateTime.Now;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sale.Status = SaleStatus.Pending;
|
||||||
|
order.Status = OrderStatus.Pending;
|
||||||
|
}
|
||||||
|
|
||||||
|
sale.TotalAmount = orderItems.Sum(i => i.Quantity * i.UnitPrice);
|
||||||
|
order.TotalAmount = sale.TotalAmount;
|
||||||
|
|
||||||
await uow.BeginAsync(ct);
|
await uow.BeginAsync(ct);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -221,10 +231,10 @@ public class SaleService(
|
|||||||
|
|
||||||
if (vehicleId.HasValue)
|
if (vehicleId.HasValue)
|
||||||
{
|
{
|
||||||
foreach (var item in orderItems)
|
foreach (var item in orderItems.Where(i => i.QuantityFulfilled > 0))
|
||||||
{
|
{
|
||||||
var balance = await stockRepo.GetBalanceAsync(item.FK_ItemId, vehicleId.Value);
|
var balance = await stockRepo.GetBalanceAsync(item.FK_ItemId, vehicleId.Value);
|
||||||
balance!.Quantity -= item.Quantity;
|
balance!.Quantity -= item.QuantityFulfilled;
|
||||||
balance.UpdatedAt = DateTime.Now;
|
balance.UpdatedAt = DateTime.Now;
|
||||||
stockRepo.UpdateBalance(balance);
|
stockRepo.UpdateBalance(balance);
|
||||||
|
|
||||||
@@ -233,7 +243,7 @@ public class SaleService(
|
|||||||
FK_ItemId = item.FK_ItemId,
|
FK_ItemId = item.FK_ItemId,
|
||||||
FromLocationId = vehicleId.Value,
|
FromLocationId = vehicleId.Value,
|
||||||
FromLocationType = LocationType.Vehicle,
|
FromLocationType = LocationType.Vehicle,
|
||||||
Quantity = item.Quantity,
|
Quantity = item.QuantityFulfilled,
|
||||||
Type = MovementType.Sale,
|
Type = MovementType.Sale,
|
||||||
ReferenceId = order.Id
|
ReferenceId = order.Id
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user