Command.cs 1.2 KB

12345678910111213141516171819202122232425262728
  1. using Application.Abstractions.Messaging;
  2. using Domain.Entities.Store.ValueObject;
  3. using SharedKernel.Results;
  4. namespace Application.Features.Admin.Store.Order.RequestCouponsRefund;
  5. /// <summary>
  6. /// 쿠폰 단위 일괄 환불 요청 등록.
  7. ///
  8. /// 동작:
  9. /// 1. CouponCode 별 OrderRefundItem 1행씩 생성 (PostRefundAction 명시)
  10. /// 2. OrderRefund 1행 생성 — Amount = Σ OrderItem.UnitPrice (선택된 쿠폰 분)
  11. /// 3. Status=Requested 로 시작. 실제 환불은 별도 ProcessRefund 호출
  12. ///
  13. /// 검증:
  14. /// - 모든 CouponCodeID 가 OrderItem 의 MemberInventory 에 존재
  15. /// - PostRefundAction=Restore 인데 CouponCode 가 Used 면 거부 (RestoreToAvailable 가 throw 함)
  16. /// - 이미 다른 OrderRefundItem 에 등록된 CouponCodeID 거부 (unique index 위반 사전 차단)
  17. /// </summary>
  18. /// <summary>환불 요청에 포함할 개별 쿠폰 + 후처리.</summary>
  19. public sealed record CouponRefundLine(int OrderItemID, int CouponCodeID, CouponPostRefundAction PostRefundAction);
  20. public sealed record Command(
  21. int OrderID,
  22. IReadOnlyList<CouponRefundLine> Lines,
  23. string Reason,
  24. RefundReasonType ReasonType = RefundReasonType.Other
  25. ) : ICommand<Result<int>>;