CreateOrderForWinnerAsync() improvements

This commit is contained in:
Loretta 2024-11-29 13:30:46 +01:00
parent 9777d3dd53
commit 3ae768d571
7 changed files with 121 additions and 43 deletions

View File

@ -60,7 +60,7 @@ public class ProductToAuctionDbTable : MgDbTableBase<ProductToAuctionMapping>
productToAuction.StartingPrice = basePrice;
productToAuction.CurrentPrice = basePrice;
productToAuction.WinnerCustomerId = 0;
productToAuction.OrderGuid = null;
productToAuction.OrderItemId = 0;
productToAuction.OrderId = 0;
productToAuction.AuctionStatus = AuctionStatus.None;

View File

@ -8,5 +8,5 @@ public interface IProductToAuctionMapping : IProductToAuctionDtoBase, ITimeStamp
public int? BiddingNumber { get; set; }
public int OrderId { get; set; }
public Guid? OrderGuid { get; set; }
public int OrderItemId { get; set; }
}

View File

@ -15,7 +15,7 @@ public partial class ProductToAuctionMapping : MgEntityBase, IProductToAuctionMa
public int AuctionId { get; set; }
public int OrderId { get; set; }
public Guid? OrderGuid { get; set; }
public int OrderItemId { get; set; }
public int WinnerCustomerId { get; set; }
public int? BiddingNumber { get; set; }

View File

@ -15,7 +15,7 @@ public class AuctionEventConsumer(IHttpContextAccessor httpContextAccessor, ILog
{
await Logger.InformationAsync($"AuctionEventConsumer.HandleEventAsync<Product>();");
var productToAuctions = await ctx.ProductToAuctions.GetByProductId(eventMessage.Entity.Id).Where(x => x.AuctionStatus == AuctionStatus.None && x.OrderGuid == null).ToListAsync();
var productToAuctions = await ctx.ProductToAuctions.GetByProductId(eventMessage.Entity.Id).Where(x => x.AuctionStatus == AuctionStatus.None && x.OrderId == 0 && x.OrderItemId == 0).ToListAsync();
foreach (var productToAuction in productToAuctions)
{

View File

@ -177,9 +177,9 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
productToAuction.WinnerCustomerId = lastAuctionBid.CustomerId;
var placeOrderResult = await auctionService.CreateOrderForWinnerAsync(productToAuction);
if (placeOrderResult is not { Success: true })
if (placeOrderResult == null || placeOrderResult.Id == 0)
{
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); (placeOrderResult is not {{ Success: true }})", null, customer);
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); (placeOrderResult == null || placeOrderResult.Id == 0)", null, customer);
//return; //TODO: EGYELŐRE HAGYJUK LEZÁRNI AKKOR IS, HA NEM SIKERÜLT AZ ORDERPLACE()! - J.
}

View File

@ -11,7 +11,13 @@ using Nop.Services.Logging;
using Nop.Services.Orders;
using Nop.Services.Payments;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
using Nop.Core.Domain.Common;
using Nop.Core.Domain.Payments;
using Nop.Core.Domain.Shipping;
using Nop.Core.Domain.Stores;
using Nop.Core.Domain.Tax;
using Nop.Services.Common;
using Nop.Services.Customers;
using Nop.Services.Shipping;
@ -26,12 +32,13 @@ public class AuctionService(
AuctionDbContext ctx,
IProductService productService,
IWorkContext workContext,
IOrderProcessingService orderProcessingService,
IShoppingCartService shoppingCartService,
//IOrderProcessingService orderProcessingService,
//IShoppingCartService shoppingCartService,
//IPaymentService paymentService,
IStoreContext storeContext,
IPaymentService paymentService,
IAddressService addressService,
ICustomerService customerService,
IOrderService orderService,
ILogger logger) : IAuctionService
{
#region Methods
@ -229,7 +236,7 @@ public class AuctionService(
return intoAddress;
}
public async Task<PlaceOrderResult> CreateOrderForWinnerAsync(ProductToAuctionMapping productToAuction)
public async Task<Order> CreateOrderForWinnerAsync(ProductToAuctionMapping productToAuction)
{
if (productToAuction is not { AuctionStatus: AuctionStatus.Sold })
{
@ -243,56 +250,53 @@ public class AuctionService(
{
currentCustomer = await workContext.GetCurrentCustomerAsync();
var billingAddress = await InsertOrUpdateBillingAddressAsync(currentCustomer);
var winnerCustomer = await customerService.GetCustomerByIdAsync(productToAuction.WinnerCustomerId);
var storeId = winnerCustomer.RegisteredInStoreId;
var billingAddress = await InsertOrUpdateBillingAddressAsync(winnerCustomer);
if (billingAddress == null)
{
logger.Error($"AuctionService.CreateOrderForWinnerAsync(); (billingAddress == null); productToAuctionId: {productToAuction.Id}", null, currentCustomer);
return null;
}
var processPaymentRequest = new ProcessPaymentRequest
var customValues = new Dictionary<string, object>
{
PaymentMethodSystemName = "Payments.CheckMoneyOrder",
CustomerId = productToAuction.WinnerCustomerId,
OrderTotal = productToAuction.CurrentPrice,
{ "PTAID", $"#{productToAuction.Id}" },
{ "AUKCIÓ", $"#{productToAuction.AuctionId}" },
{ "TÉTELSZÁM", $"#{productToAuction.SortIndex}" }
};
processPaymentRequest.CustomValues.Add("TÉTEL: ", $"#{productToAuction.SortIndex}");
if (productToAuction.BiddingNumber != null) processPaymentRequest.CustomValues.Add("BIDNUM", $"#{productToAuction.BiddingNumber}");
processPaymentRequest.CustomValues.Add("PTAID", $"#{productToAuction.Id}");
var product = await productService.GetProductByIdAsync(productToAuction.ProductId);
product.DisableBuyButton = false; //TODO: ezt automatikusan kéne false-ra állítani, mikor Assign-oljuk a ProductToAuctionItem-hez! vagy valami hasonló... - J.
if (productToAuction.BiddingNumber != null) customValues.Add("BIDNUM", $"#{productToAuction.BiddingNumber}");
var currentStore = await storeContext.GetCurrentStoreAsync();
processPaymentRequest.StoreId = currentStore.Id;
var orderTotal = productToAuction.CurrentPrice;
await logger.InformationAsync($"AuctionService.CreateOrderForWinnerAsync(); productToAuctionId: {productToAuction.Id}; currentStoreId: {currentStore.Id}", null, currentCustomer);
var order = CreateOrder(productToAuction, orderTotal, winnerCustomer, billingAddress, storeId, customValues);
await orderService.InsertOrderAsync(order);
await paymentService.GenerateOrderGuidAsync(processPaymentRequest);
//TODO: kitalálni melyik legyen... - J.
await shoppingCartService.ClearShoppingCartAsync(currentCustomer, currentStore.Id);
//var currentProductsInCart = await shoppingCartService.GetShoppingCartAsync(currentCustomer, ShoppingCartType.ShoppingCart, currentStore.Id, product.Id);
//if (currentProductsInCart != null)
//{
// foreach (var shoppingCartItem in currentProductsInCart)
// await shoppingCartService.DeleteShoppingCartItemAsync(shoppingCartItem);
//}
var cartWarnings = await shoppingCartService.AddToCartAsync(currentCustomer, product, ShoppingCartType.ShoppingCart, currentStore.Id);
if (cartWarnings.Count > 0)
if (order.Id > 0) productToAuction.OrderId = order.Id;
else
{
await logger.InformationAsync($"AuctionService.CreateOrderForWinnerAsync(); cartWarnings: {string.Join("; ", cartWarnings)}", null, currentCustomer);
logger.Warning($"AuctionService.CreateOrderForWinnerAsync(); (order.Id <= 0); productToAuctionId: {productToAuction.Id}", null, currentCustomer);
return null;
}
var placeOrderResult = await orderProcessingService.PlaceOrderAsync(processPaymentRequest);
if (!placeOrderResult.Success) return null;
var orderItem = CreateOrderItem(productToAuction, order, orderTotal);
await orderService.InsertOrderItemAsync(orderItem);
productToAuction.OrderId = placeOrderResult.PlacedOrder.Id;
productToAuction.OrderGuid = placeOrderResult.PlacedOrder.OrderGuid;
if (orderItem.Id > 0) productToAuction.OrderItemId = orderItem.Id;
else
{
logger.Warning($"AuctionService.CreateOrderForWinnerAsync(); (orderItem.Id <= 0); productToAuctionId: {productToAuction.Id}", null, currentCustomer);
return null;
}
return placeOrderResult;
//var orderNote = CreateOrderNote(order, "...");
//await orderService.InsertOrderNoteAsync(orderNote);
//if (orderNote.Id <= 0) logger.Warning($"AuctionService.CreateOrderForWinnerAsync(); (orderNote.Id <= 0); productToAuctionId: {productToAuction.Id}", null, currentCustomer); //TUDATOSAN NINCS RETURN - J.
return order;
}
catch (Exception ex)
{
@ -302,6 +306,79 @@ public class AuctionService(
return null;
}
private static OrderItem CreateOrderItem(ProductToAuctionMapping productToAuction, Order order, decimal orderTotal)
{
return new OrderItem
{
ProductId = productToAuction.ProductId,
OrderId = order.Id,
OrderItemGuid = Guid.NewGuid(),
PriceExclTax = orderTotal,
PriceInclTax = orderTotal,
UnitPriceExclTax = orderTotal,
UnitPriceInclTax = orderTotal,
Quantity = productToAuction.ProductAmount,
};
}
private static Order CreateOrder(ProductToAuctionMapping productToAuction, decimal orderTotal, Customer customer, Address billingAddress, int storeId, Dictionary<string, object> customValues)
{
return new Order
{
BillingAddressId = billingAddress.Id,
CreatedOnUtc = DateTime.UtcNow,
CurrencyRate = 1,
CustomOrderNumber = productToAuction.AuctionId + "/" + productToAuction.SortIndex,
CustomValuesXml = SerializeCustomValuesToXml(customValues),
CustomerCurrencyCode = "HUF",
CustomerId = productToAuction.WinnerCustomerId,
CustomerLanguageId = 2,
CustomerTaxDisplayType = TaxDisplayType.IncludingTax,
OrderGuid = Guid.NewGuid(),
OrderStatus = OrderStatus.Pending,
OrderTotal = orderTotal,
PaymentStatus = PaymentStatus.Pending,
PaymentMethodSystemName = "Payments.CheckMoneyOrder",
ShippingStatus = ShippingStatus.ShippingNotRequired,
StoreId = storeId,
VatNumber = customer.VatNumber,
CustomerIp = customer.LastIpAddress,
OrderSubtotalExclTax = orderTotal,
OrderSubtotalInclTax = orderTotal
};
}
private static OrderNote CreateOrderNote(Order order, string note)
{
return new OrderNote
{
CreatedOnUtc = order.CreatedOnUtc,
DisplayToCustomer = true,
OrderId = order.Id,
Note = note
};
}
private static string SerializeCustomValuesToXml(Dictionary<string, object> sourceDictionary)
{
ArgumentNullException.ThrowIfNull(sourceDictionary);
if (!sourceDictionary.Any())
return null;
var ds = new DictionarySerializer(sourceDictionary);
var xs = new XmlSerializer(typeof(DictionarySerializer));
using var textWriter = new StringWriter();
using (var xmlWriter = XmlWriter.Create(textWriter))
{
xs.Serialize(xmlWriter, ds);
}
var result = textWriter.ToString();
return result;
}
#region auctions
public async Task InsertAuctionAsync(Auction auction)
{

View File

@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Mvc;
using Nop.Core;
using Nop.Core.Domain.Orders;
using Nop.Plugin.Misc.AuctionPlugin.Domains;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities;
@ -61,5 +62,5 @@ public interface IAuctionService
Task<ProductToAuctionMapping> GetProductToAuctionMappingByIdAsync(int productToAuctionMappingId);
Task UpdateProductToAuctionMappingAsync(ProductToAuctionMapping productToAuctionMapping);
Task<PlaceOrderResult> CreateOrderForWinnerAsync(ProductToAuctionMapping productToAuctionMapping);
Task<Order> CreateOrderForWinnerAsync(ProductToAuctionMapping productToAuctionMapping);
}