feat: Implement withdrawal reports query and service integration

This commit is contained in:
masoodafar-web
2025-12-04 17:29:10 +03:30
parent abda623519
commit 5e3112d71f
7 changed files with 515 additions and 276 deletions
@@ -1,5 +1,7 @@
using CMSMicroservice.Application.Common.Interfaces;
using CMSMicroservice.Domain.Enums;
using Microsoft.EntityFrameworkCore;
using ValidationException = FluentValidation.ValidationException;
namespace CMSMicroservice.Application.UserOrderCQ.Commands.UpdateOrderStatus;
@@ -18,36 +20,37 @@ public class UpdateOrderStatusCommandHandler : IRequestHandler<UpdateOrderStatus
public async Task<UpdateOrderStatusResponseDto> Handle(UpdateOrderStatusCommand request, CancellationToken cancellationToken)
{
// TODO: پیاده‌سازی تغییر وضعیت سفارش
// 1. پیدا کردن سفارش:
// - await _context.UserOrders.FirstOrDefaultAsync(o => o.Id == request.OrderId)
// - بررسی null و پرتاب NotFoundException
//
// 2. بررسی‌های انتقال وضعیت (State Transition Validation):
// - نمی‌توان از Delivered به Cancelled رفت
// - نمی‌توان از Cancelled به سایر وضعیت‌ها رفت
// - الگوی معمول: Pending → Processing → Shipped → Delivered
// - Cancelled می‌تواند از Pending, Processing, Shipped باشد
//
// 3. تغییر وضعیت:
// - order.DeliveryStatus = request.NewStatus
// - اگر Description داریم: order.DeliveryDescription = request.Description
// - تنظیم تاریخ‌های مربوطه:
// * اگر NewStatus == Delivered → order.DeliveredAt = DateTime.UtcNow
// * اگر NewStatus == Shipped → order.ShippedAt = DateTime.UtcNow
// * اگر NewStatus == Processing → order.ProcessedAt = DateTime.UtcNow
//
// 4. ذخیره و Log:
// - await _context.SaveChangesAsync(cancellationToken)
// - _logger.LogInformation("Order {OrderId} status changed to {NewStatus}", request.OrderId, request.NewStatus)
//
// 5. برگشت Response:
// - Success = true
// - Message = "وضعیت سفارش با موفقیت تغییر کرد"
// - CurrentStatus = order.DeliveryStatus
//
// نکته: برای validation دقیق‌تر، می‌توان یک State Machine برای انتقال‌های مجاز تعریف کرد
var order = await _context.UserOrders
.FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken);
throw new NotImplementedException("UpdateOrderStatus needs implementation");
if (order == null)
{
throw new NotFoundException(nameof(order), request.OrderId);
}
var oldStatus = order.DeliveryStatus;
// قوانین ساده انتقال وضعیت: از Cancelled نمی‌توان خارج شد
if (oldStatus == DeliveryStatus.Cancelled)
{
throw new ValidationException("امکان تغییر وضعیت سفارش لغو شده وجود ندارد");
}
order.DeliveryStatus = request.NewStatus;
await _context.SaveChangesAsync(cancellationToken);
_logger.LogInformation(
"Order {OrderId} status changed from {OldStatus} to {NewStatus}",
request.OrderId,
oldStatus,
request.NewStatus);
return new UpdateOrderStatusResponseDto
{
Success = true,
Message = "وضعیت سفارش با موفقیت تغییر کرد",
CurrentStatus = order.DeliveryStatus
};
}
}