feat(LookUpSms),refactor(OrderDialog),refactor(OrdersPage)

-Add new look up sms when order status changes ( like : customer-orderDelivery lookup , manager-orderSubmit look up)
-Change order dialog style and improve responseive
-Change orders page style and improve responsive
release
Amir Hossein Khademi 2024-06-06 22:52:49 +03:30
parent e54477f226
commit 7d4301423d
5 changed files with 60 additions and 65 deletions

View File

@ -75,7 +75,6 @@
<Using Include="Netina.Core" />
<Using Include="Netina.Core.Abstracts" />
<Using Include="Netina.Core.BaseServices.Abstracts" />
<Using Include="Netina.Core.CoreServices.Abstracts" />
<Using Include="Netina.Core.CoreServices.CommandQueries.Commands" />
<Using Include="Netina.Core.Models.Api" />
<Using Include="Netina.Core.Utilities" />

View File

@ -1,24 +1,14 @@
namespace Netina.Core.EntityServices.OrderBagHandlers;
public class SubmitOrderPaymentCommandHandler : IRequestHandler<SubmitOrderPaymentCommand , SubmitOrderPaymentResponseDto>
public class SubmitOrderPaymentCommandHandler(IMediator mediator, IRepositoryWrapper repositoryWrapper, IPaymentService paymentService, ISmsService smsService, IOptionsSnapshot<SiteSettings> optionsSnapshot)
: IRequestHandler<SubmitOrderPaymentCommand , SubmitOrderPaymentResponseDto>
{
private readonly IMediator _mediator;
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly IPaymentService _paymentService;
private readonly ISmsService _smsService;
public SubmitOrderPaymentCommandHandler(IMediator mediator, IRepositoryWrapper repositoryWrapper, IPaymentService paymentService,ISmsService smsService)
{
_mediator = mediator;
_repositoryWrapper = repositoryWrapper;
_paymentService = paymentService;
_smsService = smsService;
}
public async Task<SubmitOrderPaymentResponseDto> Handle(SubmitOrderPaymentCommand request, CancellationToken cancellationToken)
{
await _mediator.Send(new CalculateOrderCommand(request.OrderId, true), cancellationToken);
var _siteSetting = optionsSnapshot.Value;
await mediator.Send(new CalculateOrderCommand(request.OrderId, true), cancellationToken);
var order = await _repositoryWrapper.SetRepository<Order>()
var order = await repositoryWrapper.SetRepository<Order>()
.TableNoTracking
.Where(o => o.Id == request.OrderId)
.FirstOrDefaultAsync(cancellationToken);
@ -34,46 +24,53 @@ public class SubmitOrderPaymentCommandHandler : IRequestHandler<SubmitOrderPayme
{
response.NeedToPayOnline = false;
order.SetOrderPayment(request.PaymentMethod);
_repositoryWrapper.SetRepository<Order>().Update(order);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);
repositoryWrapper.SetRepository<Order>().Update(order);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
if (!_siteSetting.Manager.Phone.IsNullOrEmpty())
await smsService.SendLookUpAsync(_siteSetting.Manager.Phone, "manager-submitOrder",order.FactorCode,null,null, $"{_siteSetting.Manager.FirstName} {_siteSetting.Manager.LastName}");
}
else
{
response.NeedToPayOnline = true;
var orderSDto = await _repositoryWrapper.SetRepository<Order>()
var orderSDto = await repositoryWrapper.SetRepository<Order>()
.TableNoTracking
.Where(o => o.Id == request.OrderId)
.Select(OrderMapper.ProjectToSDto)
.FirstOrDefaultAsync(cancellationToken);
if (orderSDto == null)
throw new AppException("Order not found", ApiResultStatusCode.NotFound);
response.PaymentUrl = await _paymentService.GetPaymentLinkAsync(orderSDto.TotalPrice, orderSDto.FactorCode, orderSDto.Id, orderSDto.CustomerId, orderSDto.CustomerPhoneNumber, orderSDto.CustomerFullName, cancellationToken);
response.PaymentUrl = await paymentService.GetPaymentLinkAsync(orderSDto.TotalPrice, orderSDto.FactorCode, orderSDto.Id, orderSDto.CustomerId, orderSDto.CustomerPhoneNumber, orderSDto.CustomerFullName, cancellationToken);
}
}
else if (request.PaymentMethod == OrderPaymentMethod.PayOnDoor)
{
response.NeedToPayOnline = false;
order.SetOrderPayment(request.PaymentMethod);
_repositoryWrapper.SetRepository<Order>().Update(order);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);
repositoryWrapper.SetRepository<Order>().Update(order);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
await _mediator.Send(new CreateOrUpdatePaymentCommand(null,order.FactorCode, order.TotalPrice,
await mediator.Send(new CreateOrUpdatePaymentCommand(null,order.FactorCode, order.TotalPrice,
$"پرداخت نقدی سفارش {order.FactorCode}", string.Empty, string.Empty, string.Empty,
PaymentType.PayOnDoor, PaymentStatus.Paid, order.Id
, order.CustomerId), cancellationToken);
if (!_siteSetting.Manager.Phone.IsNullOrEmpty())
await smsService.SendLookUpAsync(_siteSetting.Manager.Phone, "manager-submitOrder", order.FactorCode, null, null, $"{_siteSetting.Manager.FirstName} {_siteSetting.Manager.LastName}");
}
else if (request.PaymentMethod == OrderPaymentMethod.CardTransfer)
{
response.NeedToPayOnline = false;
order.SetOrderPayment(request.PaymentMethod);
_repositoryWrapper.SetRepository<Order>().Update(order);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);
repositoryWrapper.SetRepository<Order>().Update(order);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
await _mediator.Send(new CreateOrUpdatePaymentCommand(null,order.FactorCode, order.TotalPrice,
await mediator.Send(new CreateOrUpdatePaymentCommand(null,order.FactorCode, order.TotalPrice,
$"پرداخت نقدی سفارش {order.FactorCode}", string.Empty, string.Empty, string.Empty,
PaymentType.CardTransfer, PaymentStatus.Paid, order.Id
, order.CustomerId), cancellationToken);
if (!_siteSetting.Manager.Phone.IsNullOrEmpty())
await smsService.SendLookUpAsync(_siteSetting.Manager.Phone, "manager-submitOrder", order.FactorCode, null, null, $"{_siteSetting.Manager.FirstName} {_siteSetting.Manager.LastName}");
}
return response;

View File

@ -1,19 +1,11 @@
namespace Netina.Core.EntityServices.OrderHandlers;
public class CalculateOrderCommandHandler : IRequestHandler<CalculateOrderCommand,Order>
public class CalculateOrderCommandHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator) : IRequestHandler<CalculateOrderCommand,Order>
{
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly IMediator _mediator;
public CalculateOrderCommandHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator)
{
_repositoryWrapper = repositoryWrapper;
_mediator = mediator;
}
public async Task<Order> Handle(CalculateOrderCommand request, CancellationToken cancellationToken)
{
var order = await _mediator.Send(new GetOrderQuery(request.OrderId), cancellationToken);
var order = await mediator.Send(new GetOrderQuery(request.OrderId), cancellationToken);
if (order.OrderStatus != OrderStatus.OrderBag)
throw new AppException("Order is not in bag status and cant be calculate", ApiResultStatusCode.BadRequest);
var totalProductPrice = order.OrderProducts.Sum(op => op.ProductFee * op.Count);
@ -28,7 +20,7 @@ public class CalculateOrderCommandHandler : IRequestHandler<CalculateOrderComman
double productDiscountPrice = order.OrderProducts.Sum(op=>(op.ProductFee - op.ProductFeeWithDiscount) * op.Count);
double discountCodePrice = 0;
if (!order.DiscountCode.IsNullOrEmpty())
discountCodePrice += await _mediator.Send(new CalculateOrderDiscountCommand(order.DiscountCode, order),cancellationToken);
discountCodePrice += await mediator.Send(new CalculateOrderDiscountCommand(order.DiscountCode, order),cancellationToken);
//var taxesPrice = (((totalProductPrice - discountPrice) + totalPackingPrice + servicePrice) / 100) * _shopSettings.TaxesFee;
@ -37,8 +29,8 @@ public class CalculateOrderCommandHandler : IRequestHandler<CalculateOrderComman
order.SetTotalPrice(totalProductPrice, totalPackingPrice, servicePrice, deliveryPrice, productDiscountPrice, discountCodePrice, taxesPrice);
order.OrderProducts.Clear();
order.OrderDelivery = null;
_repositoryWrapper.SetRepository<Order>().Update(order);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);
repositoryWrapper.SetRepository<Order>().Update(order);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
return order;
}
}

View File

@ -1,28 +1,33 @@
namespace Netina.Core.EntityServices.OrderHandlers;
using MD.PersianDateTime.Standard;
public class ConfirmOrderStepCommandHandler : IRequestHandler<ConfirmOrderStepCommand, bool>
namespace Netina.Core.EntityServices.OrderHandlers;
public class ConfirmOrderStepCommandHandler(IRepositoryWrapper repositoryWrapper, ISmsService smsService) : IRequestHandler<ConfirmOrderStepCommand, bool>
{
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly ISmsService _smsService;
public ConfirmOrderStepCommandHandler(IRepositoryWrapper repositoryWrapper,ISmsService smsService)
{
_repositoryWrapper = repositoryWrapper;
_smsService = smsService;
}
public async Task<bool> Handle(ConfirmOrderStepCommand request, CancellationToken cancellationToken)
{
var order = await _repositoryWrapper.SetRepository<Order>()
var order = await repositoryWrapper.SetRepository<Order>()
.TableNoTracking
.FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken);
if (order == null)
throw new AppException("Order not found", ApiResultStatusCode.NotFound);
order.SetOrderStatus(request.NextOrderStatus);
if (request.NextOrderStatus == OrderStatus.Processing)
{
var customer = await repositoryWrapper.SetRepository<Customer>().TableNoTracking
.Where(c => c.Id == order.CustomerId)
.Select(CustomerMapper.ProjectToSDto)
.FirstOrDefaultAsync(cancellationToken);
if (customer != null)
{
await smsService.SendLookUpAsync(customer.PhoneNumber, "customer-submitOrder",
(order.TotalPrice/10).ToString("N0"),order.FactorCode,null, $"{customer.FirstName} {customer.LastName}");
}
}
if (request.NextOrderStatus == OrderStatus.Delivered)
{
var delivery = await _repositoryWrapper.SetRepository<OrderDelivery>()
var delivery = await repositoryWrapper.SetRepository<OrderDelivery>()
.TableNoTracking
.FirstOrDefaultAsync(od => od.OrderId == order.Id, cancellationToken);
if (delivery != null)
@ -30,23 +35,26 @@ public class ConfirmOrderStepCommandHandler : IRequestHandler<ConfirmOrderStepCo
if (request.TrackingCode == null || request.TrackingCode.IsNullOrEmpty())
throw new AppException("لطفا کد پیگیری ارسال را پر کنید");
delivery.SetTrackingCode(request.TrackingCode);
_repositoryWrapper.SetRepository<OrderDelivery>()
repositoryWrapper.SetRepository<OrderDelivery>()
.Update(delivery);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
}
var customer = await repositoryWrapper.SetRepository<Customer>().TableNoTracking
.Where(c => c.Id == order.CustomerId)
.Select(CustomerMapper.ProjectToSDto)
.FirstOrDefaultAsync(cancellationToken);
if (customer != null)
{
await smsService.SendLookUpAsync(customer.PhoneNumber, "customer-deliveryOrder",
order.FactorCode, request.TrackingCode,null, PersianDateTime.Today.ToLongDateString(), $"{customer.FirstName} {customer.LastName}");
}
}
switch (request.NextOrderStatus)
{
case :
break;
}
_repositoryWrapper.SetRepository<Order>()
repositoryWrapper.SetRepository<Order>()
.Update(order);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
return true;
}

View File

@ -47,7 +47,6 @@
<Using Include="Netina.Common.Models.Exception" />
<Using Include="Netina.Core.Abstracts" />
<Using Include="Netina.Core.BaseServices.Abstracts" />
<Using Include="Netina.Core.CoreServices.Abstracts" />
<Using Include="Netina.Core.CoreServices.CommandQueries.Commands" />
<Using Include="Netina.Core.CoreServices.CommandQueries.Queries" />
<Using Include="Netina.Core.EntityServices.Abstracts" />