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