@page "{id:int}" @model Admin.Pages.Store.Order.DetailModel @using Domain.Entities.Store.ValueObject @{ ViewData["Title"] = "주문 상세"; }

@ViewData["Title"]


@if (Model.Data is null) {
주문 정보를 불러올 수 없습니다.
} else { var d = Model.Data; var subtotal = d.Items.Sum(i => i.LineTotal); var statusText = Admin.Pages.Store.Order.IndexModel.StatusToText(d.Status); var statusBadgeClass = d.Status switch { OrderStatus.Paid or OrderStatus.Delivered => "text-bg-success", OrderStatus.Pending or OrderStatus.Preparing or OrderStatus.Shipped => "text-bg-warning", OrderStatus.Cancelled or OrderStatus.Refunded => "text-bg-danger", OrderStatus.Exchanged => "text-bg-info", _ => "text-bg-secondary" };
주문번호
@d.OrderNumber
@statusText
결제일자: @(d.PaidAt?.ToString("yyyy-MM-dd HH:mm") ?? "-")
주문자 정보
구매자 @d.MemberEmail (Member#@d.MemberID)
후원 채널 @(d.ChannelName ?? "(미선택)")
@if (!string.IsNullOrEmpty(d.CancelReason)) {
취소 사유: @d.CancelReason
} @if (!string.IsNullOrEmpty(d.RefundReason)) {
환불 사유: @d.RefundReason
}

주문 상품 @d.Items.Count 건
@foreach (var i in d.Items) { }
상품 유형 단가 수량 합계
@i.ProductName @if (i.CouponCodes.Count > 0) {
} else if (!string.IsNullOrEmpty(i.IssuedCouponCode)) { @* fallback — MemberInventory 데이터가 없는 옛 주문 *@
CODE: @i.IssuedCouponCode
}
@i.TypeText @i.UnitPrice.ToString("N0") @i.Quantity @i.LineTotal.ToString("N0")

결제 합계
상품 금액 @subtotal.ToString("N0") P
총 결제 금액 @d.TotalAmount.ToString("N0") P

수익 배분 결제 시점 동결
ANTOOZA 몫
@d.PlatformFeeAmount.ToString("N0")
게임사 정산금
@d.GameRevenueAmount.ToString("N0")
채널 보상금
@d.ChannelRewardAmount.ToString("N0")

@if (d.Shipment is not null) {
배송 정보
상태 @d.Shipment.Status
택배사 @(d.Shipment.Carrier ?? "-")
송장번호 @(d.Shipment.TrackingNumber ?? "-")
출고일시 @(d.Shipment.ShippedAt?.ToString("yyyy-MM-dd HH:mm") ?? "-")
배송완료 @(d.Shipment.DeliveredAt?.ToString("yyyy-MM-dd HH:mm") ?? "-")

} @if (d.Status is OrderStatus.Pending or OrderStatus.Paid or OrderStatus.Preparing or OrderStatus.Shipped or OrderStatus.Delivered) {
환불 요청 등록
@Html.AntiForgeryToken()

} @if (d.Refunds.Any()) {
환불 이력 @d.Refunds.Count 건
@foreach (var r in d.Refunds) { }
# 유형 상태 금액 사유 포함 쿠폰 관리자 메모 요청일 완료일 처리
@r.ID @r.Type @r.Status @r.Amount.ToString("N0") @r.Reason @if (r.Coupons.Count == 0) { - } else {
@foreach (var c in r.Coupons) { var actionBadge = c.Action switch { CouponPostRefundAction.Restore => "text-bg-success", CouponPostRefundAction.Expire => "text-bg-secondary", _ => "text-bg-light" }; var actionText = c.Action switch { CouponPostRefundAction.Restore => "회수", CouponPostRefundAction.Expire => "만료", _ => c.Action.ToString() }; @c.Code (@actionText) }
}
@(r.AdminMemo ?? "-") @r.RequestedAt.ToString("yyyy-MM-dd HH:mm") @(r.ResolvedAt?.ToString("yyyy-MM-dd HH:mm") ?? "-") @if (r.Status == RefundStatus.Requested) {
@Html.AntiForgeryToken()
}
}



@* OrderItem 별 쿠폰 코드 상세 모달 — 상품 행의 "상세 보기" button 으로 트리거. 모달 자체가 form — 체크된 쿠폰을 일괄 환불 요청으로 등록. 환불 후 처리(회수/만료) 는 모달 footer 의 select 로 통일 적용. *@ @foreach (var i in d.Items.Where(x => x.CouponCodes.Count > 0)) { } }