diff --git a/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs b/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs
index 2336c87..eb3ff46 100644
--- a/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs
+++ b/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs
@@ -180,7 +180,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
if (placeOrderResult is not { Success: true })
{
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); (placeOrderResult is not {{ Success: true }})", null, customer);
- return;
+ //return; //TODO: EGYELŐRE HAGYJUK LEZÁRNI AKKOR IS, HA NEM SIKERÜLT AZ ORDERPLACE()! - J.
}
break;
diff --git a/Nop.Plugin.Misc.AuctionPlugin/Services/AuctionService.cs b/Nop.Plugin.Misc.AuctionPlugin/Services/AuctionService.cs
index 5ea892f..798deec 100644
--- a/Nop.Plugin.Misc.AuctionPlugin/Services/AuctionService.cs
+++ b/Nop.Plugin.Misc.AuctionPlugin/Services/AuctionService.cs
@@ -1,5 +1,6 @@
using Nop.Core;
using Nop.Core.Domain.Catalog;
+using Nop.Core.Domain.Customers;
using Nop.Core.Domain.Orders;
using Nop.Plugin.Misc.AuctionPlugin.Domains.DataLayer;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos;
@@ -9,58 +10,29 @@ using Nop.Services.Catalog;
using Nop.Services.Logging;
using Nop.Services.Orders;
using Nop.Services.Payments;
+using System.Linq;
+using Nop.Core.Domain.Common;
+using Nop.Services.Common;
+using Nop.Services.Customers;
+using Nop.Services.Shipping;
namespace Nop.Plugin.Misc.AuctionPlugin.Services;
///
/// Store pickup point service
///
-public class AuctionService : IAuctionService
+public class AuctionService(
+ AuctionDbContext ctx,
+ IProductService productService,
+ IWorkContext workContext,
+ IOrderProcessingService orderProcessingService,
+ IShoppingCartService shoppingCartService,
+ IStoreContext storeContext,
+ IPaymentService paymentService,
+ IAddressService addressService,
+ ICustomerService customerService,
+ ILogger logger) : IAuctionService
{
- #region Fields
-
- private readonly AuctionDbContext _ctx;
- private readonly IProductService _productService;
- private readonly IWorkContext _workContext;
- private readonly IPaymentService _paymentService;
- private readonly IOrderProcessingService _orderProcessingService;
- private readonly IShoppingCartService _shoppingCartService;
- private readonly IStoreContext _storeContext;
- private readonly ILogger _logger;
- #endregion
-
- #region Ctor
-
- ///
- /// Ctor
- ///
- ///
- ///
- ///
- ///
- ///
- public AuctionService(
- AuctionDbContext ctx,
- IProductService productService,
- IWorkContext workContext,
- IOrderProcessingService orderProcessingService,
- IShoppingCartService shoppingCartService,
- IStoreContext storeContext,
- IPaymentService paymentService,
- ILogger logger)
- {
- _ctx = ctx;
- _productService = productService;
- _workContext = workContext;
- _orderProcessingService = orderProcessingService;
- _shoppingCartService = shoppingCartService;
- _storeContext = storeContext;
- _paymentService = paymentService;
- _logger = logger;
- }
-
- #endregion
-
#region Methods
public static decimal GetStepAmount(decimal currentPrice)
@@ -112,29 +84,29 @@ public class AuctionService : IAuctionService
}
public async Task ResetProductToAuctionByProductId(int productId)
- => await ResetProductToAuctionAsync(await _ctx.ProductToAuctions.GetByProductId(productId).FirstOrDefaultAsync());
+ => await ResetProductToAuctionAsync(await ctx.ProductToAuctions.GetByProductId(productId).FirstOrDefaultAsync());
public Task ResetProductToAuctionByIdAsync(int productToAuctionId, decimal basePrice = 0)
- => ResetProductToAuctionAsync(_ctx.ProductToAuctions.GetById(productToAuctionId), basePrice);
+ => ResetProductToAuctionAsync(ctx.ProductToAuctions.GetById(productToAuctionId), basePrice);
public Task ResetProductToAuctionAsync(ProductToAuctionMapping productToAuction, decimal basePrice = 0)
- => _ctx.ResetProductToAuctionAsync(productToAuction, basePrice);
+ => ctx.ResetProductToAuctionAsync(productToAuction, basePrice);
public Task GetLastAuctionBidByProductToAuctionIdAsync(int productToAuctionId)
- => _ctx.GetLastAuctionBidByProductToAuctionId(productToAuctionId);
+ => ctx.GetLastAuctionBidByProductToAuctionId(productToAuctionId);
public Task GetBidsCountByProductToAuctionIdAsync(int productToAuctionId)
- => _ctx.GetBidsCountByProductToAuctionIdAsync(productToAuctionId);
+ => ctx.GetBidsCountByProductToAuctionIdAsync(productToAuctionId);
public Task RevertAuctionBidByProductToAuctionIdAsync(int productToAuctionId)
- => _ctx.RevertAuctionBidByProductToAuctionId(productToAuctionId);
+ => ctx.RevertAuctionBidByProductToAuctionId(productToAuctionId);
public async Task GetProductById(int productId)
{
- var product = await _productService.GetProductByIdAsync(productId);
+ var product = await productService.GetProductByIdAsync(productId);
if (product != null) return product;
- _logger.Error($"AuctionService.GetProductById(); (product == null)", null, await _workContext.GetCurrentCustomerAsync());
+ logger.Error($"AuctionService.GetProductById(); (product == null)", null, await workContext.GetCurrentCustomerAsync());
return null;
}
@@ -168,14 +140,14 @@ public class AuctionService : IAuctionService
public async Task GetBidByIdAsync(int bidId)
{
- return await _ctx.AuctionBids.GetByIdAsync(bidId);
+ return await ctx.AuctionBids.GetByIdAsync(bidId);
}
public async Task InsertBidAsync(AuctionBid auctionBid)
{
//if (await ValidateAuctionBid(auctionBid))
{
- await _ctx.AuctionBids.InsertAsync(auctionBid, false);
+ await ctx.AuctionBids.InsertAsync(auctionBid, false);
}
}
@@ -183,7 +155,7 @@ public class AuctionService : IAuctionService
{
//if (await ValidateAuctionBid(auctionBid))
{
- await _ctx.AuctionBids.UpdateAsync(auctionBid, false);
+ await ctx.AuctionBids.UpdateAsync(auctionBid, false);
}
}
@@ -194,51 +166,134 @@ public class AuctionService : IAuctionService
/// A task that represents the asynchronous operation
public async Task DeleteBidAsync(AuctionBid pickupPoint)
{
- await _ctx.AuctionBids.DeleteAsync(pickupPoint, false);
+ await ctx.AuctionBids.DeleteAsync(pickupPoint, false);
}
- public async Task CreateOrderForWinnerAsync(ProductToAuctionMapping auctionItem)
+ private async Task InsertOrUpdateBillingAddressAsync(Customer customer)
{
- if (auctionItem is not { AuctionStatus: AuctionStatus.Sold })
+ try
{
- await _logger.InformationAsync($"AuctionService.CreateOrderForWinnerAsync(); (auctionItem is not {{ AuctionStatus: AuctionStatus.Sold }}); auctionItemId: {auctionItem?.Id}; status: {auctionItem?.AuctionStatus}");
+ var billingAddress = await customerService.GetCustomerBillingAddressAsync(customer);
+ if (billingAddress == null)
+ {
+ billingAddress = CreateAddressFromCustomer(customer);
+ await addressService.InsertAddressAsync(billingAddress);
+
+ customer.ShippingAddressId = billingAddress.Id;
+ customer.BillingAddressId = billingAddress.Id;
+
+ await customerService.UpdateCustomerAsync(customer);
+ }
+ else
+ {
+ billingAddress = CopyAddressFromCustomer(billingAddress, customer);
+ await addressService.UpdateAddressAsync(billingAddress);
+ }
+
+ return billingAddress;
+ }
+ catch (Exception ex)
+ {
+ logger.Error($"AuctionService.InsertOrUpdateBillingAddress()", ex, customer);
+ }
+
+ return null;
+ }
+
+ private static Address CreateAddressFromCustomer(Customer customer)
+ {
+ var address = new Address();
+
+ return CopyAddressFromCustomer(address, customer);
+ }
+
+ private static Address CopyAddressFromCustomer(Address intoAddress, Customer customer)
+ {
+ intoAddress.FirstName = customer.FirstName;
+ intoAddress.LastName = customer.LastName;
+ intoAddress.Email = customer.Email;
+ intoAddress.FaxNumber = customer.Fax;
+ intoAddress.PhoneNumber = customer.Phone;
+
+ intoAddress.CountryId = customer.CountryId;
+ intoAddress.City = customer.City;
+ intoAddress.County = customer.County;
+ intoAddress.Address1 = customer.StreetAddress;
+ intoAddress.Address2 = customer.StreetAddress2;
+ intoAddress.StateProvinceId = customer.StateProvinceId;
+ intoAddress.ZipPostalCode = customer.ZipPostalCode;
+
+ intoAddress.Company = customer.Company;
+
+ return intoAddress;
+ }
+
+ public async Task CreateOrderForWinnerAsync(ProductToAuctionMapping productToAuction)
+ {
+ if (productToAuction is not { AuctionStatus: AuctionStatus.Sold })
+ {
+ await logger.InformationAsync($"AuctionService.CreateOrderForWinnerAsync(); (productToAuction is not {{ AuctionStatus: AuctionStatus.Sold }}); productToAuctionId: {productToAuction?.Id}; status: {productToAuction?.AuctionStatus}");
return null;
}
+ Customer currentCustomer = null;
+
try
{
+ currentCustomer = await workContext.GetCurrentCustomerAsync();
+
+ var billingAddress = await InsertOrUpdateBillingAddressAsync(currentCustomer);
+ if (billingAddress == null)
+ {
+ logger.Error($"AuctionService.CreateOrderForWinnerAsync(); (billingAddress == null); productToAuctionId: {productToAuction.Id}", null, currentCustomer);
+ return null;
+ }
+
var processPaymentRequest = new ProcessPaymentRequest
{
PaymentMethodSystemName = "Payments.CheckMoneyOrder",
- CustomerId = auctionItem.WinnerCustomerId,
- OrderTotal = auctionItem.CurrentPrice,
+ CustomerId = productToAuction.WinnerCustomerId,
+ OrderTotal = productToAuction.CurrentPrice,
};
-
- var currentCustomer = await _workContext.GetCurrentCustomerAsync();
- var product = await _productService.GetProductByIdAsync(auctionItem.ProductId);
- var currentStore = await _storeContext.GetCurrentStoreAsync();
+ processPaymentRequest.CustomValues.Add("ProductToAuctionMappingId", productToAuction.Id);
- //TODO: valszeg a GenerateOrderGuidAsync-ot kell használni, de nemtom egy példában láttam... - J.
- await _paymentService.GenerateOrderGuidAsync(processPaymentRequest);
+ 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.
- processPaymentRequest.CustomValues.Add("ProductToAuctionMappingId", auctionItem.Id);
+ var currentStore = await storeContext.GetCurrentStoreAsync();
+ processPaymentRequest.StoreId = currentStore.Id;
- product.DisableBuyButton = false;
+ await logger.InformationAsync($"AuctionService.CreateOrderForWinnerAsync(); productToAuctionId: {productToAuction.Id}; currentStoreId: {currentStore.Id}", null, currentCustomer);
- var cartResult = await _shoppingCartService.AddToCartAsync(currentCustomer, product, ShoppingCartType.ShoppingCart, currentStore.Id);
+ await paymentService.GenerateOrderGuidAsync(processPaymentRequest);
- var placeOrderResult = await _orderProcessingService.PlaceOrderAsync(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)
+ {
+ await logger.InformationAsync($"AuctionService.CreateOrderForWinnerAsync(); cartWarnings: {string.Join("; ", cartWarnings)}", null, currentCustomer);
+ return null;
+ }
+
+ var placeOrderResult = await orderProcessingService.PlaceOrderAsync(processPaymentRequest);
if (!placeOrderResult.Success) return null;
- auctionItem.OrderId = placeOrderResult.PlacedOrder.Id;
- auctionItem.OrderGuid = placeOrderResult.PlacedOrder.OrderGuid;
-
+ productToAuction.OrderId = placeOrderResult.PlacedOrder.Id;
+ productToAuction.OrderGuid = placeOrderResult.PlacedOrder.OrderGuid;
+
return placeOrderResult;
}
catch (Exception ex)
{
- _logger.Error($"AuctionService.CreateOrderForWinnerAsync(); Exception; auctionItemId: {auctionItem.Id}", ex);
+ logger.Error($"AuctionService.CreateOrderForWinnerAsync(); Exception; productToAuctionId: {productToAuction.Id}", ex, currentCustomer);
}
return null;
@@ -247,22 +302,22 @@ public class AuctionService : IAuctionService
#region auctions
public async Task InsertAuctionAsync(Auction auction)
{
- await _ctx.Auctions.InsertAsync(auction, false);
+ await ctx.Auctions.InsertAsync(auction, false);
}
public async Task UpdateAuctionAsync(Auction auction)
{
- await _ctx.Auctions.UpdateAsync(auction);
+ await ctx.Auctions.UpdateAsync(auction);
}
public async Task> GetAllAuctionsAsync()
{
- return await _ctx.Auctions.GetAllAuctionsAsync();
+ return await ctx.Auctions.GetAllAuctionsAsync();
}
public async Task> GetProductToAuctionsByAuctionIdAsync(int auctionId, bool onlyActiveItems)
{
- return await _ctx.ProductToAuctions.GetProductToAuctionsByAuctionId(auctionId, onlyActiveItems).ToListAsync();
+ return await ctx.ProductToAuctions.GetProductToAuctionsByAuctionId(auctionId, onlyActiveItems).ToListAsync();
}
#endregion
#endregion
@@ -276,7 +331,7 @@ public class AuctionService : IAuctionService
foreach (var auctionDtoProductToAuctionDto in auctionDto.ProductToAuctionDtos)
{
- auctionDtoProductToAuctionDto.AuctionBidDtos.AddRange(await _ctx.AuctionBids.GetByProductToAuctionId(auctionDtoProductToAuctionDto.Id).OrderByDescending(x => x.Id).Take(maxBidsCount).Select(x => new AuctionBidDto(x)).ToListAsync());
+ auctionDtoProductToAuctionDto.AuctionBidDtos.AddRange(await ctx.AuctionBids.GetByProductToAuctionId(auctionDtoProductToAuctionDto.Id).OrderByDescending(x => x.Id).Take(maxBidsCount).Select(x => new AuctionBidDto(x)).ToListAsync());
}
return auctionDto;
@@ -284,7 +339,7 @@ public class AuctionService : IAuctionService
public async Task GetAuctionDtoByIdAsync(int auctionId, bool widthProducts, bool activeProductOnly)
{
- var auction = await _ctx.Auctions.GetByIdAsync(auctionId);
+ var auction = await ctx.Auctions.GetByIdAsync(auctionId);
if (auction == null) return null;
var auctionDto = new AuctionDto(auction);
@@ -300,7 +355,7 @@ public class AuctionService : IAuctionService
public async Task GetAuctionDtoWithProductByIdAsync(int auctionId, int productId, bool activeProductOnly)
{
- var auction = await _ctx.Auctions.GetByIdAsync(auctionId);
+ var auction = await ctx.Auctions.GetByIdAsync(auctionId);
if (auction == null) return null;
var auctionDto = new AuctionDto(auction);
@@ -311,7 +366,7 @@ public class AuctionService : IAuctionService
public async Task GetProductToAuctionDtoByIdAsync(int productToAuctionId)
{
- var productToAuction = await _ctx.ProductToAuctions.GetByIdAsync(productToAuctionId);
+ var productToAuction = await ctx.ProductToAuctions.GetByIdAsync(productToAuctionId);
return productToAuction == null ? null : new ProductToAuctionDto(productToAuction);
}
@@ -328,21 +383,21 @@ public class AuctionService : IAuctionService
public async Task> GetProductToAuctionDtosByProductIdAsync(int productId)
{
- return [..await _ctx.ProductToAuctions.GetByProductId(productId).Select(x=>new ProductToAuctionDto(x)).ToListAsync()];
+ return [..await ctx.ProductToAuctions.GetByProductId(productId).Select(x=>new ProductToAuctionDto(x)).ToListAsync()];
}
public async Task GetAuctionBidDtoByIdAsync(int auctionBidId)
{
- var auctionBid = await _ctx.AuctionBids.GetByIdAsync(auctionBidId);
+ var auctionBid = await ctx.AuctionBids.GetByIdAsync(auctionBidId);
return auctionBid == null ? null : new AuctionBidDto(auctionBid);
}
public Task> GetProductToAuctionsByProductIdAsync(int productId)
- => _ctx.GetProductToAuctionsByProductIdAsync(productId);
+ => ctx.GetProductToAuctionsByProductIdAsync(productId);
public Task> GetProductToAuctionByAuctionIdAndProductIdAsync(int auctionId, int productId, bool activeProductOnly)
- => _ctx.GetProductToAuctionByAuctionIdAndProductIdAsync(auctionId, productId, activeProductOnly);
+ => ctx.GetProductToAuctionByAuctionIdAndProductIdAsync(auctionId, productId, activeProductOnly);
public async Task AssignProductToAuctionAsync(int productId, decimal startingPrice, decimal bidPrice, int auctionId)
@@ -366,11 +421,11 @@ public class AuctionService : IAuctionService
try
{
- await _ctx.ProductToAuctions.InsertAsync(mapping);
+ await ctx.ProductToAuctions.InsertAsync(mapping);
}
catch (Exception ex)
{
- await _logger.InformationAsync(ex.ToString());
+ await logger.InformationAsync(ex.ToString());
}
return mapping;
@@ -378,12 +433,12 @@ public class AuctionService : IAuctionService
public async Task GetProductToAuctionMappingByIdAsync(int productToAuctionMappingId)
{
- return await _ctx.ProductToAuctions.GetByIdAsync(productToAuctionMappingId);
+ return await ctx.ProductToAuctions.GetByIdAsync(productToAuctionMappingId);
}
public async Task UpdateProductToAuctionMappingAsync(ProductToAuctionMapping productToAuctionMapping)
{
- await _ctx.ProductToAuctions.UpdateAsync(productToAuctionMapping);
+ await ctx.ProductToAuctions.UpdateAsync(productToAuctionMapping);
}
#endregion Dtos