fix: StockMovement CHECK constraint violation — store Quantity as negative for reduce operations, pass correct MovementType from RecordLoss
Build and Deploy to Kubernetes / build-and-deploy (push) Has been cancelled

This commit is contained in:
masoodafar-web
2026-02-22 21:38:20 +03:30
parent 305b8d3fd8
commit 0fe4db5e77
3 changed files with 14 additions and 6 deletions
@@ -1,7 +1,7 @@
namespace CMSMicroservice.Application.InventoryItemCQ.Commands.ReduceInventory; namespace CMSMicroservice.Application.InventoryItemCQ.Commands.ReduceInventory;
/// <summary> /// <summary>
/// Command برای کم کردن موجودی (فروش) /// Command برای کم کردن موجودی (فروش، خسارت، مفقودی و ...)
/// </summary> /// </summary>
public record ReduceInventoryCommand : IRequest<ReduceInventoryResponseDto> public record ReduceInventoryCommand : IRequest<ReduceInventoryResponseDto>
{ {
@@ -19,4 +19,8 @@ public record ReduceInventoryCommand : IRequest<ReduceInventoryResponseDto>
public long? PerformedByUserId { get; init; } public long? PerformedByUserId { get; init; }
/// <summary>آیا از موجودی رزرو شده کم شود؟</summary> /// <summary>آیا از موجودی رزرو شده کم شود؟</summary>
public bool FromReserved { get; init; } = true; public bool FromReserved { get; init; } = true;
/// <summary>نوع حرکت انبار (پیش‌فرض: فروش)</summary>
public Domain.Enums.StockMovementType MovementType { get; init; } = Domain.Enums.StockMovementType.Sale;
/// <summary>توضیحات</summary>
public string? Note { get; init; }
} }
@@ -53,11 +53,11 @@ public class ReduceInventoryCommandHandler : IRequestHandler<ReduceInventoryComm
var stockMovement = new StockMovement var stockMovement = new StockMovement
{ {
InventoryItemId = item.Id, InventoryItemId = item.Id,
MovementType = StockMovementType.Sale, MovementType = request.MovementType,
Quantity = request.Quantity, Quantity = -request.Quantity, // منفی — CHECK constraint: QuantityAfter = QuantityBefore + Quantity
QuantityBefore = previousQuantity, QuantityBefore = previousQuantity,
QuantityAfter = item.Quantity, QuantityAfter = item.Quantity,
Note = "Sale confirmed", Note = request.Note ?? request.MovementType.ToString(),
ReferenceNumber = request.ReferenceNumber ?? $"SALE-{DateTime.UtcNow:yyyyMMddHHmmss}", ReferenceNumber = request.ReferenceNumber ?? $"SALE-{DateTime.UtcNow:yyyyMMddHHmmss}",
OrderId = request.OrderId, OrderId = request.OrderId,
DiscountOrderId = request.DiscountOrderId, DiscountOrderId = request.DiscountOrderId,
@@ -181,7 +181,9 @@ public class InventoryService : InventoryContract.InventoryContractBase
Id = inventoryItem.Id, Id = inventoryItem.Id,
Quantity = Math.Abs(difference), Quantity = Math.Abs(difference),
FromReserved = false, FromReserved = false,
ReferenceNumber = request.ReferenceNumber ReferenceNumber = request.ReferenceNumber,
MovementType = Domain.Enums.StockMovementType.AdjustmentMinus,
Note = "Stock adjustment (decrease)"
}, },
context.CancellationToken); context.CancellationToken);
@@ -332,7 +334,9 @@ public class InventoryService : InventoryContract.InventoryContractBase
Id = inventoryItem.Id, Id = inventoryItem.Id,
Quantity = request.Quantity, Quantity = request.Quantity,
FromReserved = false, FromReserved = false,
ReferenceNumber = request.ReferenceNumber ?? $"LOSS-{DateTime.UtcNow:yyyyMMddHHmmss}" ReferenceNumber = request.ReferenceNumber ?? $"LOSS-{DateTime.UtcNow:yyyyMMddHHmmss}",
MovementType = (Domain.Enums.StockMovementType)request.LossType,
Note = string.IsNullOrWhiteSpace(request.Reason) ? null : request.Reason
}, },
context.CancellationToken); context.CancellationToken);