diff --git a/.version b/.version index dba2145..e95f1c6 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -0.17.17.24 \ No newline at end of file +0.17.18.25 \ No newline at end of file diff --git a/NetinaShop.Api/Controller/OrderController.cs b/NetinaShop.Api/Controller/OrderController.cs index cde97b4..6d5bb97 100644 --- a/NetinaShop.Api/Controller/OrderController.cs +++ b/NetinaShop.Api/Controller/OrderController.cs @@ -17,12 +17,19 @@ public class OrderController : ICarterModule .WithDisplayName("GetOneOrder") .HasApiVersion(1.0); + group.MapPost("{id}/confirm", ConfirmOrderStepAsync) + .WithDisplayName("ConfirmOrderStep") + .HasApiVersion(1.0); + group.MapDelete("{id}", DeleteAsync) .WithDisplayName("DeleteOneOrder") .HasApiVersion(1.0); } + private async Task ConfirmOrderStepAsync(Guid id, [FromQuery] OrderStatus nextOrderStatus, [FromServices] IMediator mediator, CancellationToken cancellationToken) + => TypedResults.Ok(await mediator.Send(new ConfirmOrderStepCommand(id, nextOrderStatus), cancellationToken)); + public async Task GetAllAsync(IMediator mediator, [FromQuery]long? selectedDate, [FromQuery] OrderStatus? orderStatus, [FromQuery] OrderQueryDateFilter? dateFilter, [FromQuery] int page = 0, CancellationToken cancellationToken = default) => TypedResults.Ok(await mediator.Send(new GetOrdersQuery(Page:page, SelectedDate: selectedDate, OrderStatus:orderStatus, DateFilter:dateFilter), cancellationToken)); diff --git a/NetinaShop.Api/NetinaShop.Api.csproj b/NetinaShop.Api/NetinaShop.Api.csproj index afe3eaa..b45486a 100644 --- a/NetinaShop.Api/NetinaShop.Api.csproj +++ b/NetinaShop.Api/NetinaShop.Api.csproj @@ -6,8 +6,8 @@ enable true Linux - 0.17.16.23 - 0.17.16.23 + 0.17.18.25 + 0.17.18.25 diff --git a/NetinaShop.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs b/NetinaShop.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs index 84c735c..6897600 100644 --- a/NetinaShop.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs +++ b/NetinaShop.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs @@ -34,7 +34,7 @@ public class SubmitOrderPaymentCommandHandler : IRequestHandler().Update(order); await _repositoryWrapper.SaveChangesAsync(cancellationToken); @@ -57,7 +57,7 @@ public class SubmitOrderPaymentCommandHandler : IRequestHandler().Update(order); await _repositoryWrapper.SaveChangesAsync(cancellationToken); diff --git a/NetinaShop.Core/EntityServices/OrderHandlers/ConfirmOrderStepCommandHandler.cs b/NetinaShop.Core/EntityServices/OrderHandlers/ConfirmOrderStepCommandHandler.cs new file mode 100644 index 0000000..c20be50 --- /dev/null +++ b/NetinaShop.Core/EntityServices/OrderHandlers/ConfirmOrderStepCommandHandler.cs @@ -0,0 +1,27 @@ +namespace NetinaShop.Core.EntityServices.OrderHandlers; + +public class ConfirmOrderStepCommandHandler : IRequestHandler +{ + private readonly IRepositoryWrapper _repositoryWrapper; + + public ConfirmOrderStepCommandHandler(IRepositoryWrapper repositoryWrapper) + { + _repositoryWrapper = repositoryWrapper; + } + public async Task Handle(ConfirmOrderStepCommand request, CancellationToken cancellationToken) + { + var order = await _repositoryWrapper.SetRepository() + .TableNoTracking + .FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken); + if (order == null) + throw new AppException("Order not found", ApiResultStatusCode.NotFound); + + order.SetOrderStatus(request.NextOrderStatus); + + _repositoryWrapper.SetRepository() + .Update(order); + await _repositoryWrapper.SaveChangesAsync(cancellationToken); + + return true; + } +} \ No newline at end of file diff --git a/NetinaShop.Domain/CommandQueries/Commands/OrderCommands.cs b/NetinaShop.Domain/CommandQueries/Commands/OrderCommands.cs index e0edb71..5a4718b 100644 --- a/NetinaShop.Domain/CommandQueries/Commands/OrderCommands.cs +++ b/NetinaShop.Domain/CommandQueries/Commands/OrderCommands.cs @@ -3,5 +3,6 @@ public sealed record CreateBaseOrderCommand(Guid UserId) : IRequest; public sealed record CalculateOrderCommand(Guid OrderId , bool NamoosiCalculate = false) : IRequest; +public sealed record ConfirmOrderStepCommand(Guid OrderId , OrderStatus NextOrderStatus) : IRequest; public sealed record DeleteOrderCommand(Guid OrderId) : IRequest; \ No newline at end of file diff --git a/NetinaShop.Domain/Entities/Orders/Order.Aggregate.cs b/NetinaShop.Domain/Entities/Orders/Order.Aggregate.cs index 6696670..7bba6d3 100644 --- a/NetinaShop.Domain/Entities/Orders/Order.Aggregate.cs +++ b/NetinaShop.Domain/Entities/Orders/Order.Aggregate.cs @@ -1,4 +1,7 @@ -namespace NetinaShop.Domain.Entities.Orders; +using NetinaShop.Common.Models.Api; +using NetinaShop.Common.Models.Exception; + +namespace NetinaShop.Domain.Entities.Orders; public partial class Order { @@ -46,7 +49,7 @@ public partial class Order public void AddOrderProduct(OrderProduct orderProduct) => OrderProducts.Add(orderProduct); - public void SetSubmitOrder(OrderPaymentMethod paymentMethod) + public void SetOrderPayment(OrderPaymentMethod paymentMethod) { switch (paymentMethod) { @@ -72,6 +75,34 @@ public partial class Order } } + public void SetOrderStatus(OrderStatus orderStatus) + { + switch (orderStatus) + { + case OrderStatus.OrderBag: + throw new AppException("Order is in cart so you cant change it", ApiResultStatusCode.BadRequest); + break; + case OrderStatus.Submitted: + break; + case OrderStatus.Paid: + throw new AppException("use set payment method", ApiResultStatusCode.BadRequest); + break; + case OrderStatus.Processing: + break; + case OrderStatus.Delivered: + DeliveredAt = DateTime.Now; + break; + case OrderStatus.Done: + DoneAt = DateTime.Now; + break; + case OrderStatus.Canceled: + break; + default: + throw new ArgumentOutOfRangeException(nameof(orderStatus), orderStatus, null); + } + OrderStatus = orderStatus; + } + public void AddOrderDelivery(Guid addressId, double deliveryCost, Guid shippingId, Guid orderId) { var orderDelivery = OrderDelivery.Create(addressId, deliveryCost, shippingId, orderId); diff --git a/NetinaShop.Domain/Entities/Orders/Order.cs b/NetinaShop.Domain/Entities/Orders/Order.cs index 304a356..ba08587 100644 --- a/NetinaShop.Domain/Entities/Orders/Order.cs +++ b/NetinaShop.Domain/Entities/Orders/Order.cs @@ -60,11 +60,13 @@ public partial class Order : ApiEntity public double TaxesPrice { get; internal set; } public double TotalPrice { get; internal set; } public bool IsPayed { get; internal set; } - public DateTime PayedAt { get; internal set; } public OrderPaymentMethod PaymentMethod { get; internal set; } public OrderStatus OrderStatus { get; internal set; } + + public DateTime DeliveredAt { get; internal set; } public DateTime DoneAt { get; internal set; } public DateTime OrderAt { get; internal set; } + public DateTime PayedAt { get; internal set; } public int PreparingMinute { get; internal set; } public string DiscountCode { get; internal set; } = string.Empty; diff --git a/NetinaShop.Domain/Enums/OrderStatus.cs b/NetinaShop.Domain/Enums/OrderStatus.cs index a991d57..26f1ed2 100644 --- a/NetinaShop.Domain/Enums/OrderStatus.cs +++ b/NetinaShop.Domain/Enums/OrderStatus.cs @@ -11,12 +11,15 @@ public enum OrderStatus [Display(Name = "پرداخت شده", Description = "PAID")] Paid = 2, + [Display(Name = "درحال پردازش", Description = "PROCESSING")] + Processing = 10, + [Display(Name = "ارسال شده", Description = "DELIVERED")] - Delivered = 3, + Delivered = 20, [Display(Name = "انجام شده", Description = "DONE")] - Done = 4, + Done = 200, [Display(Name = "کنسل شده", Description = "CANCELED")] - Canceled = 5 + Canceled = 500 } \ No newline at end of file diff --git a/NetinaShop.Repository/Handlers/Orders/GetOrdersQueryHandler.cs b/NetinaShop.Repository/Handlers/Orders/GetOrdersQueryHandler.cs index 21208b6..7dc4405 100644 --- a/NetinaShop.Repository/Handlers/Orders/GetOrdersQueryHandler.cs +++ b/NetinaShop.Repository/Handlers/Orders/GetOrdersQueryHandler.cs @@ -14,8 +14,10 @@ public class GetOrdersQueryHandler : IRequestHandler> Handle(GetOrdersQuery request, CancellationToken cancellationToken) { - IQueryable orders = _repositoryWrapper.SetRepository() - .TableNoTracking; + IQueryable orders = _repositoryWrapper + .SetRepository() + .TableNoTracking + .Where(o=>o.OrderStatus != OrderStatus.OrderBag); if (request.DateFilter != null) {