Compare commits

...

5 Commits

Author SHA1 Message Date
Loretta 69a6cd5053 fixes 2024-11-22 11:31:45 +01:00
Loretta 5b15c2d52d merge 2024-11-22 10:39:51 +01:00
Loretta 476f668ff6 improvements 2024-11-22 10:35:16 +01:00
Loretta 9086ec28c9 Merge branch 'main' of https://git2.aycode.com/Adam/Mango.Nop.Plugins 2024-11-22 06:43:09 +01:00
Loretta f583cbe51f improvements 2024-11-22 06:42:59 +01:00
16 changed files with 197 additions and 83 deletions

View File

@ -120,8 +120,9 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Controllers
{ {
//AuctionDto = TODO: ??? - J. //AuctionDto = TODO: ??? - J.
ProductName = viewModel.ProductName, ProductName = viewModel.ProductName,
BidPrice = viewModel.BidPrice.ToString(), CurrentPrice = viewModel.BidPrice,
NextStepAmount = viewModel.NextStepAmount.ToString() NextStepAmount = viewModel.NextStepAmount,
NextBidPrice = viewModel.BidPrice + viewModel.NextStepAmount
}.ToJson() }.ToJson()
}; };
var jsonMessage = JsonConvert.SerializeObject(bid, Formatting.Indented, var jsonMessage = JsonConvert.SerializeObject(bid, Formatting.Indented,

View File

@ -105,28 +105,27 @@ public class AuctionPublicViewComponent : NopViewComponent
var productId = productDetailsModel.Id; var productId = productDetailsModel.Id;
var productToAuctionDtoMappings = await _auctionService.GetProductToAuctionDtosByProductIdAsync(productId); var productToAuction = (await _auctionService.GetProductToAuctionDtosByProductIdAsync(productId)).FirstOrDefault();
if (productToAuctionDtoMappings.Count == 0) if (productToAuction == null)
{ {
return Content(string.Empty); return Content(string.Empty);
} }
var auctionDto = (await _auctionService.GetAuctionDtoByIdAsync(productToAuctionDtoMappings.FirstOrDefault()!.AuctionId)); var auctionDto = (await _auctionService.GetAuctionDtoByIdAsync(productToAuction.AuctionId));
auctionDto.ProductToAuctionDtos.AddRange(productToAuctionDtoMappings); auctionDto.ProductToAuctionDtos.Add(productToAuction);
var productBidBoxViewModel = new ProductBidBoxViewModel(auctionDto); var productBidBoxViewModel = new ProductBidBoxViewModel(auctionDto);
//List<ProductToAuctionMapping> productToAuctionId = await _auctionService.GetProductToAuctionByAuctionIdAndProductIdAsync(auctionId, productDetailsModel.Id); //List<ProductToAuctionMapping> productToAuctionId = await _auctionService.GetProductToAuctionByAuctionIdAndProductIdAsync(auctionId, productDetailsModel.Id);
AuctionStatus status = productToAuctionDtoMappings.FirstOrDefault()!.AuctionStatus; AuctionStatus status = productToAuction.AuctionStatus;
bool isActive = status.HasFlag(AuctionStatus.Active); //bool isActive = status == AuctionStatus.Active || status == AuctionStatus.FirstWarning || status == AuctionStatus.SecondWarning;
bool isFirstWarning = status.HasFlag(AuctionStatus.FirstWarning); //bool isFirstWarning = status == AuctionStatus.FirstWarning;
productBidBoxViewModel.IsAdmin = await _customerService.IsAdminAsync(customer); productBidBoxViewModel.IsAdmin = await _customerService.IsAdminAsync(customer);
productBidBoxViewModel.IsGuest = await _customerService.IsGuestAsync(customer); productBidBoxViewModel.IsGuest = await _customerService.IsGuestAsync(customer);
//productBidBoxViewModel.AuctionClosed = auction.Closed; productBidBoxViewModel.AuctionClosed = auctionDto.Closed;
productBidBoxViewModel.AuctionStatus = status;
//productBidBoxViewModel.IsItemActive = isActive;
productBidBoxViewModel.WidgetZone = widgetZone; productBidBoxViewModel.WidgetZone = widgetZone;
productBidBoxViewModel.BasePrice = productDetailsModel.ProductPrice.OldPriceValue; productBidBoxViewModel.BasePrice = productDetailsModel.ProductPrice.OldPriceValue;
productBidBoxViewModel.CurrentPrice = productDetailsModel.ProductPrice.PriceValue; productBidBoxViewModel.CurrentPrice = productDetailsModel.ProductPrice.PriceValue;
@ -134,8 +133,8 @@ public class AuctionPublicViewComponent : NopViewComponent
//productBidBoxViewModel.AuctionId = auctionId; //productBidBoxViewModel.AuctionId = auctionId;
productBidBoxViewModel.CustomerId = customer.Id; productBidBoxViewModel.CustomerId = customer.Id;
productBidBoxViewModel.ProductId = productDetailsModel.Id; productBidBoxViewModel.ProductId = productDetailsModel.Id;
productBidBoxViewModel.LicitStep = 50000; //add calculation productBidBoxViewModel.LicitStep = AuctionService.GetStepAmount(productToAuction.CurrentPrice); //add calculation
productBidBoxViewModel.BidPrice = productDetailsModel.ProductPrice.PriceValue + productBidBoxViewModel.LicitStep; productBidBoxViewModel.NextBidPrice = productToAuction.CurrentPrice + productBidBoxViewModel.LicitStep;
return View("~/Plugins/Misc.AuctionPlugin/Views/PublicProductBidBox.cshtml", productBidBoxViewModel); return View("~/Plugins/Misc.AuctionPlugin/Views/PublicProductBidBox.cshtml", productBidBoxViewModel);

View File

@ -7,7 +7,7 @@
Active: 1, Active: 1,
FirstWarning: 2, FirstWarning: 2,
SecondWarning: 4, SecondWarning: 4,
SoldOut: 8, Sold: 8,
NotSold: 16 NotSold: 16
}); });

View File

@ -25,7 +25,7 @@
bidNotification: function (data) { bidNotification: function (data) {
console.log(data); console.log(data);
var myObject = JSON.parse(data); var myObject = JSON.parse(data);
toastr.success(`<div class="item bidToast"><p>${myObject.bidPrice}</p><p>${myObject.productName}</p></div>`, "New bid arrived", { toastr.success(`<div class="item bidToast"><p>${myObject.currentPrice}</p><p>${myObject.productName}</p></div>`, "New bid arrived", {
"closeButton": true, "closeButton": true,
"positionClass": "toast-bottom-right", "positionClass": "toast-bottom-right",
"newestOnTop": true, "newestOnTop": true,
@ -48,11 +48,40 @@
{ {
refreshPublicBidBox(myObject); refreshPublicBidBox(myObject);
} }
},
ProductToAuctionStatusNotification: function (data) {
console.log(data);
var myObject = JSON.parse(data);
var auctionDto = myObject.auctionDto;
var productToAuctionDto = myObject.auctionDto.productToAuctionDtos[0];
toastr.success(`<div class="item bidToast"><p>${productToAuctionDto.auctionStatus}</p><p>${productToAuctionDto.id}</p></div>`, "Status changed", {
"closeButton": true,
"positionClass": "toast-bottom-right",
"newestOnTop": true,
"progressBar": true,
"preventDuplicates": false,
"onclick": null,
"showDuration": "30000",
"hideDuration": "1000",
"timeOut": "5000",
"extendedTimeOut": "1000",
"showEasing": "swing",
"hideEasing": "linear",
"showMethod": animation,
"hideMethod": "fadeOut"
});
$('.toast-success').css("background-color", "#4caf50");
// var publicProductBidBox = document.getElementById("publicProductBidBox");
// if (publicProductBidBox)
// {
// refreshPublicBidBox(myObject);
// }
}, },
openItemMessage: function (data) { openItemMessage: function (data) {
var myObject = JSON.parse(data); var myObject = JSON.parse(data);
toastr.success(`<div class="item bidToast"><p>${myObject.bidPrice}</p><p>${myObject.productName}</p></div>`, "Item auction is OPENED!", { toastr.success(`<div class="item bidToast"><p>${myObject.nextBidPrice}</p><p>${myObject.productName}</p></div>`, "Item auction is OPENED!", {
"closeButton": true, "closeButton": true,
"positionClass": "toast-bottom-right", "positionClass": "toast-bottom-right",
"newestOnTop": true, "newestOnTop": true,

View File

@ -12,7 +12,7 @@ public interface IProductToAuctionDtoBase : IMgModelDtoBase
public AuctionStatus AuctionStatus { get; set; } public AuctionStatus AuctionStatus { get; set; }
public decimal StartingPrice { get; set; } public decimal StartingPrice { get; set; }
public decimal BidPrice { get; set; } public decimal CurrentPrice { get; set; }
public int ProductAmount { get; set; } public int ProductAmount { get; set; }

View File

@ -1,6 +1,8 @@
using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos.Interfaces; using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos.Interfaces;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities; using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities.Interfaces;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums; using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums;
using Nop.Plugin.Misc.AuctionPlugin.Services;
namespace Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos; namespace Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos;
@ -12,28 +14,40 @@ public class ProductToAuctionDto : IProductToAuctionDto
public int WinnerCustomerId { get; set; } public int WinnerCustomerId { get; set; }
public AuctionStatus AuctionStatus { get; set; } public AuctionStatus AuctionStatus { get; set; }
public decimal StartingPrice { get; set; } public decimal StartingPrice { get; set; }
public decimal BidPrice { get; set; } public decimal CurrentPrice { get; set; }
public int ProductAmount { get; set; } public int ProductAmount { get; set; }
public int SortIndex { get; set; } public int SortIndex { get; set; }
/// <summary>
/// EGYELŐRE NE HASZNÁLD!!! - J.
/// </summary>
public decimal StepAmount { get; set; }
public List<AuctionBidDto> AuctionBidDtos { get; } = []; public List<AuctionBidDto> AuctionBidDtos { get; } = [];
public bool IsActiveItem => AuctionStatus is AuctionStatus.Active or AuctionStatus.FirstWarning or AuctionStatus.SecondWarning; public bool IsActiveItem => AuctionStatus is AuctionStatus.Active or AuctionStatus.FirstWarning or AuctionStatus.SecondWarning;
public ProductToAuctionDto() public ProductToAuctionDto() { }
{ public ProductToAuctionDto(ProductToAuctionMapping productToAuction) : this(productToAuction, 0/*AuctionService.GetStepAmount(productToAuction.BidPrice)*/) { }
}
public ProductToAuctionDto(ProductToAuctionMapping productToAuction) /// <summary>
///
/// </summary>
/// <param name="productToAuction"></param>
/// <param name="stepAmount">EGYELŐRE NE HASZNÁLD!!! - J.</param>
public ProductToAuctionDto(ProductToAuctionMapping productToAuction, decimal stepAmount) : this()
{ {
if (productToAuction == null) return; if (productToAuction == null) return;
if (stepAmount > 0) StepAmount = stepAmount;
//else StepAmount = AuctionService.GetStepAmount(productToAuction.BidPrice);
Id = productToAuction.Id; Id = productToAuction.Id;
ProductId = productToAuction.ProductId; ProductId = productToAuction.ProductId;
AuctionId = productToAuction.AuctionId; AuctionId = productToAuction.AuctionId;
AuctionStatus = productToAuction.AuctionStatus; AuctionStatus = productToAuction.AuctionStatus;
StartingPrice = productToAuction.StartingPrice; StartingPrice = productToAuction.StartingPrice;
BidPrice = productToAuction.BidPrice; CurrentPrice = productToAuction.CurrentPrice;
ProductAmount = productToAuction.ProductAmount; ProductAmount = productToAuction.ProductAmount;
} }
@ -46,7 +60,7 @@ public class ProductToAuctionDto : IProductToAuctionDto
mainEntity.AuctionId = AuctionId; mainEntity.AuctionId = AuctionId;
mainEntity.AuctionStatus = AuctionStatus; mainEntity.AuctionStatus = AuctionStatus;
mainEntity.StartingPrice = StartingPrice; mainEntity.StartingPrice = StartingPrice;
mainEntity.BidPrice = BidPrice; mainEntity.CurrentPrice = CurrentPrice;
mainEntity.ProductAmount = ProductAmount; mainEntity.ProductAmount = ProductAmount;
return mainEntity; return mainEntity;

View File

@ -12,8 +12,8 @@ public partial class Auction: MgEntityBase, IAuction
{ {
public string AuctionName { get; set; } public string AuctionName { get; set; }
[NotMapped] //[NotMapped]
[NotColumn] //[NotColumn]
public AuctionType AuctionType{ get; set; } public AuctionType AuctionType{ get; set; }
public DateTime StartDateUtc { get; set; } public DateTime StartDateUtc { get; set; }

View File

@ -14,12 +14,12 @@ public partial class ProductToAuctionMapping : MgEntityBase, IProductToAuctionMa
public int AuctionId { get; set; } public int AuctionId { get; set; }
public int WinnerCustomerId { get; set; } public int WinnerCustomerId { get; set; }
[NotMapped] //[NotMapped]
[NotColumn] //[NotColumn]
public AuctionStatus AuctionStatus { get; set; } public AuctionStatus AuctionStatus { get; set; }
public decimal StartingPrice { get; set; } public decimal StartingPrice { get; set; }
public decimal BidPrice { get; set; } public decimal CurrentPrice { get; set; }
public int ProductAmount { get; set; } = 1; public int ProductAmount { get; set; } = 1;
public int SortIndex { get; set; } public int SortIndex { get; set; }

View File

@ -17,6 +17,6 @@ public enum AuctionStatus : byte
Active = 1, Active = 1,
FirstWarning = 2, FirstWarning = 2,
SecondWarning = 4, SecondWarning = 4,
SoldOut = 8, Sold = 8,
NotSold = 16 NotSold = 16
} }

View File

@ -15,8 +15,9 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs.Messages
public class BidNotificationMessage : AuctionNotificationBase public class BidNotificationMessage : AuctionNotificationBase
{ {
public string ProductName { get; set; } public string ProductName { get; set; }
public string BidPrice { get; set; } public decimal CurrentPrice { get; set; }
public string NextStepAmount { get; set; } public decimal NextBidPrice { get; set; }
public decimal NextStepAmount { get; set; }
public BidNotificationMessage() { } public BidNotificationMessage() { }
public BidNotificationMessage(AuctionDto auctionDto):base(auctionDto) { } public BidNotificationMessage(AuctionDto auctionDto):base(auctionDto) { }

View File

@ -11,6 +11,9 @@ using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums;
namespace Nop.Plugin.Misc.AuctionPlugin.Hubs namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
{ {
//- FirstWarning, SecondWarning,
//- ProductToAuctionDto ne lista legyen
//- GetFullAuctionDto
//- SortIndex //- SortIndex
//- Rátettem egy unique-ot az AuctionId és a ProductId-ra!!! //- Rátettem egy unique-ot az AuctionId és a ProductId-ra!!!
//- Új field-ek a db-be! pl.: WinnerCustomerId, stb... //- Új field-ek a db-be! pl.: WinnerCustomerId, stb...
@ -50,9 +53,11 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
return; return;
} }
await _logger.InformationAsync($"SignalRMessageHandler.HandleMessage(); jsonData: {message.Data}");
if (message.SenderId <= 0 || message.SenderId != (await _workContext.GetCurrentCustomerAsync()).Id) if (message.SenderId <= 0 || message.SenderId != (await _workContext.GetCurrentCustomerAsync()).Id)
{ {
_logger.Error($"SignalRMessageHandler.HandleMessage(); message.SenderId <= 0 || message.SenderId != (await _workContext.GetCurrentCustomerAsync()).Id"); _logger.Error($"SignalRMessageHandler.HandleMessage(); message.SenderId <= 0 || message.SenderId != (await _workContext.GetCurrentCustomerAsync()).Id; SenderId: {message.SenderId}");
return; return;
} }
@ -63,13 +68,13 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
await HandleBidRequest(message.SenderId, message.Data.JsonTo<AuctionBidRequest>()); await HandleBidRequest(message.SenderId, message.Data.JsonTo<AuctionBidRequest>());
break; break;
case "OpenItemRequestMessage": case "AuctionProductStatusRequest":
await HandleProductToAuctionStatusChangedRequest(message.SenderId, message.Data.JsonTo<AuctionProductStatusRequest>()); await HandleProductToAuctionStatusChangedRequest(message.SenderId, message.Data.JsonTo<AuctionProductStatusRequest>());
break; break;
// Add other message types here // Add other message types here
default: default:
await _logger.ErrorAsync("SignalRMessageHandler.HandleMessage(); Unknown message type"); await _logger.ErrorAsync($"SignalRMessageHandler.HandleMessage(); Unknown message type; MessageType: {message.MessageType}");
break; break;
} }
} }
@ -92,7 +97,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
var auction = await _auctionService.GetAuctionDtoByProductToAuctionIdAsync(auctionProductStatusRequest.ProductToAuctionId); var auction = await _auctionService.GetAuctionDtoByProductToAuctionIdAsync(auctionProductStatusRequest.ProductToAuctionId);
if (auction == null || auction.Closed) if (auction == null || auction.Closed)
{ {
_logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); auction == null || auction.Closed"); _logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); auction == null || auction.Closed;");
return; return;
} }
@ -105,18 +110,18 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
switch (auctionProductStatusRequest.AuctionStatus) switch (auctionProductStatusRequest.AuctionStatus)
{ {
case AuctionStatus.Sold:
productToAuction.AuctionStatus = productToAuction.CurrentPrice == productToAuction.StartingPrice ? AuctionStatus.NotSold : AuctionStatus.Sold;
break;
case AuctionStatus.NotSold:
_logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); auctionProductStatusRequest.AuctionStatus == AuctionStatus.NotSold");
break;
case AuctionStatus.FirstWarning: case AuctionStatus.FirstWarning:
productToAuction.AuctionStatus = AuctionStatus.FirstWarning; //AuctionStatus.Active | AuctionStatus.FirstWarning;
break;
case AuctionStatus.SecondWarning: case AuctionStatus.SecondWarning:
productToAuction.AuctionStatus = AuctionStatus.SecondWarning; //AuctionStatus.Active | AuctionStatus.SecondWarning;
break;
case AuctionStatus.None: case AuctionStatus.None:
case AuctionStatus.Active: case AuctionStatus.Active:
case AuctionStatus.SoldOut:
case AuctionStatus.NotSold:
default: default:
auctionProductStatusRequest.AuctionStatus = auctionProductStatusRequest.AuctionStatus; productToAuction.AuctionStatus = auctionProductStatusRequest.AuctionStatus;
break; break;
} }
@ -128,7 +133,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
SenderId = senderId, SenderId = senderId,
Data = new ProductToAuctionStatusNotification(await _auctionService.GetAuctionDtoByProductToAuctionIdAsync(productToAuction.Id, true)) Data = new ProductToAuctionStatusNotification(await _auctionService.GetAuctionDtoByProductToAuctionIdAsync(productToAuction.Id, true))
{ {
ToasterMessage = string.Empty, //TODO: - J. ToasterMessage = "string.Empty", //TODO: - J.
}.ToJson() }.ToJson()
}; };
@ -200,10 +205,13 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
await _productService.UpdateProductAsync(product); await _productService.UpdateProductAsync(product);
activeProductAuction.StartingPrice = product.OldPrice; activeProductAuction.StartingPrice = product.OldPrice;
activeProductAuction.BidPrice = product.Price; activeProductAuction.CurrentPrice = product.Price;
await _auctionService.UpdateProductToAuctionMappingAsync(activeProductAuction); await _auctionService.UpdateProductToAuctionMappingAsync(activeProductAuction);
// Optionally broadcast to all clients var stepAmount = AuctionService.GetStepAmount(auctionBid.BidPrice);
var nextBidPrice = auctionBid.BidPrice + stepAmount;
//stepAmount = GetStepAmount(nextBidPrice); //Direkt van 2x, különben a sávváltásoknál lehet gond! - J.
var bid = new MessageWrapper var bid = new MessageWrapper
{ {
MessageType = "bidNotification", MessageType = "bidNotification",
@ -211,9 +219,9 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
Data = new BidNotificationMessage(await _auctionService.GetAuctionDtoByProductToAuctionIdAsync(activeProductAuction.Id, true)) Data = new BidNotificationMessage(await _auctionService.GetAuctionDtoByProductToAuctionIdAsync(activeProductAuction.Id, true))
{ {
ProductName = auctionBid.ProductId.ToString(), ProductName = auctionBid.ProductId.ToString(),
BidPrice = auctionBid.BidPrice.ToString(CultureInfo.InvariantCulture), CurrentPrice = auctionBid.BidPrice,
NextStepAmount = "50000", //TODO: - J. NextStepAmount = stepAmount,
NextBidPrice = nextBidPrice,
ToasterMessage = string.Empty, //TODO: - J. ToasterMessage = string.Empty, //TODO: - J.
}.ToJson() }.ToJson()
}; };

View File

@ -28,7 +28,7 @@ public class ProductToAuctionMappingBuilder : NopEntityBuilder<ProductToAuctionM
.WithColumn(nameof(ProductToAuctionMapping.AuctionStatus)).AsByte().NotNullable() //enum??? - J. .WithColumn(nameof(ProductToAuctionMapping.AuctionStatus)).AsByte().NotNullable() //enum??? - J.
.WithColumn(nameof(ProductToAuctionMapping.StartingPrice)).AsInt32().NotNullable() .WithColumn(nameof(ProductToAuctionMapping.StartingPrice)).AsInt32().NotNullable()
.WithColumn(nameof(ProductToAuctionMapping.BidPrice)).AsInt32().NotNullable() .WithColumn(nameof(ProductToAuctionMapping.CurrentPrice)).AsInt32().NotNullable()
.WithColumn(nameof(ProductToAuctionMapping.ProductAmount)).AsInt32().NotNullable().WithDefaultValue(1) .WithColumn(nameof(ProductToAuctionMapping.ProductAmount)).AsInt32().NotNullable().WithDefaultValue(1)
.WithColumn(nameof(ProductToAuctionMapping.SortIndex)).AsInt32().NotNullable().WithDefaultValue(0) .WithColumn(nameof(ProductToAuctionMapping.SortIndex)).AsInt32().NotNullable().WithDefaultValue(0)

View File

@ -20,14 +20,15 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Models
[System.Text.Json.Serialization.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore]
public ProductToAuctionDto FirstProductToAuction { get; set; } public ProductToAuctionDto FirstProductToAuction { get; set; }
public int ProductId { get; set; }
public int ProductToAuctionId { get; set; } public int ProductToAuctionId { get; set; }
public bool IsAdmin { get; set; } public bool IsAdmin { get; set; }
public bool IsGuest { get; set; } public bool IsGuest { get; set; }
public int AuctionId { get; set; } public int AuctionId { get; set; }
public bool IsItemActive { get; set; } public bool AuctionClosed { get; set; }
public bool IsItemActive => FirstProductToAuction.IsActiveItem;
public AuctionStatus AuctionStatus { get; set; }
public int ProductId { get; set; }
public int CustomerId { get; set; } public int CustomerId { get; set; }
public string WidgetZone { get; set; } public string WidgetZone { get; set; }
@ -42,7 +43,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Models
#region visible #region visible
public decimal LicitStep { get; set; } public decimal LicitStep { get; set; }
public decimal? CurrentPrice { get; set; } public decimal? CurrentPrice { get; set; }
public decimal BidPrice { get; set; } public decimal NextBidPrice { get; set; }
#endregion visible #endregion visible
@ -56,9 +57,6 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Models
AuctionId = auctionDto.Id; AuctionId = auctionDto.Id;
ProductId = FirstProductToAuction.ProductId; ProductId = FirstProductToAuction.ProductId;
ProductToAuctionId = FirstProductToAuction.Id; ProductToAuctionId = FirstProductToAuction.Id;
IsItemActive = FirstProductToAuction.IsActiveItem;
} }
} }
} }

View File

@ -5,6 +5,7 @@ using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities; using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums; using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums;
using Nop.Services.Logging; using Nop.Services.Logging;
using Org.BouncyCastle.Crypto;
namespace Nop.Plugin.Misc.AuctionPlugin.Services; namespace Nop.Plugin.Misc.AuctionPlugin.Services;
@ -68,6 +69,48 @@ public class AuctionService : IAuctionService
#region Methods #region Methods
public static decimal GetStepAmount(decimal currentPrice)
{
return currentPrice switch
{
>= 0 and < 100000 => 10000, //Ezt csak hasraütésszerűen adtam meg!!! - J.
//100 000 - 1 000 000
>= 100000 and < 200000 => 10000,
>= 200000 and < 500000 => 20000,
>= 500000 and < 1000000 => 50000,
//1 000 000 - 10 000 000
>= 1000000 and < 2000000 => 100000,
>= 2000000 and < 5000000 => 200000,
>= 5000000 and < 10000000 => 500000,
//10 000 000 - 100 000 000
>= 10000000 and < 20000000 => 1000000,
>= 20000000 and < 50000000 => 2000000,
>= 50000000 and < 100000000 => 5000000,
//100 000 000 - ~
>= 100000000 and < 200000000 => 10000000,
_ => 20000000
};
//100 000 Ft 200 000 Ft között 10 000 Ft-tal
//200 000 Ft 500 000 Ft között 20 000 Ft-tal
//500 000 Ft 1 000 000 Ft között 50 000 Ft-tal
//1 000 000 Ft 2 000 000 Ft között 100 000 Ft-tal
//2 000 000 Ft 5 000 000 Ft között 200 000 Ft-tal
//5 000 000 Ft 10 000 000 Ft között 500 000 Ft-tal
//10 000 000 Ft 20 000 000 Ft között 1 000 000 Ft-tal
//20 000 000 Ft 50 000 000 Ft között 2 000 000 Ft-tal
//50 000 000 Ft 100 000 000 Ft között 5 000 000 Ft-tal
//100 000 000 Ft 200 000 000 Ft között 10 000 000 Ft-tal
//200 000 000 Ft fölött 20 000 000 Ft-tal
}
private async Task<bool> ValidateAuctionBid(AuctionBid auctionBid) private async Task<bool> ValidateAuctionBid(AuctionBid auctionBid)
{ {
//auctionBid.CustomerId = (await _workContext.GetCurrentCustomerAsync()).Id; //elvileg megnézi cache-ben, csak utána DB-zik! - J. //auctionBid.CustomerId = (await _workContext.GetCurrentCustomerAsync()).Id; //elvileg megnézi cache-ben, csak utána DB-zik! - J.
@ -163,10 +206,25 @@ public class AuctionService : IAuctionService
#endregion #endregion
#region Dtots #region Dtots
public async Task<AuctionDto> GetAuctionDtoByIdAsync(int auctionId)
public async Task<AuctionDto> GetAuctionDtoByIdAsync(int auctionId, bool widthProducts = false)
{ {
var auction = await _ctx.Auctions.GetByIdAsync(auctionId); var auction = await _ctx.Auctions.GetByIdAsync(auctionId);
return auction == null ? null : new AuctionDto(auction); if (auction == null) return null;
var auctionDto = new AuctionDto(auction);
if (widthProducts)
{
auctionDto.ProductToAuctionDtos.AddRange((await GetProductToAuctionDtosByAuctionId(auctionId)));
}
return auctionDto;
}
public async Task<List<ProductToAuctionDto>> GetProductToAuctionDtosByAuctionId(int auctionId)
{
return (await GetProductToAuctionsByAuctionIdAsync(auctionId)).Select(x => new ProductToAuctionDto(x)).ToList();
} }
public async Task<AuctionDto> GetAuctionDtoWithProductByIdAsync(int auctionId, int productId, bool activeProductOnly = false) public async Task<AuctionDto> GetAuctionDtoWithProductByIdAsync(int auctionId, int productId, bool activeProductOnly = false)
@ -232,7 +290,7 @@ public class AuctionService : IAuctionService
{ {
ProductId = productId, ProductId = productId,
StartingPrice = startingPrice, StartingPrice = startingPrice,
BidPrice = bidPrice, CurrentPrice = bidPrice,
ProductAmount = 1, ProductAmount = 1,
AuctionStatus = AuctionStatus.None, AuctionStatus = AuctionStatus.None,
AuctionId = auctionId AuctionId = auctionId

View File

@ -11,6 +11,9 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Services;
/// </summary> /// </summary>
public interface IAuctionService public interface IAuctionService
{ {
//decimal GetStepAmount(decimal currentPrice);
/// <summary> /// <summary>
/// Gets all bids /// Gets all bids
/// </summary> /// </summary>
@ -38,7 +41,8 @@ public interface IAuctionService
Task<List<ProductToAuctionMapping>> GetProductToAuctionsByAuctionIdAsync(int auctionId, bool onlyActiveItems = false); Task<List<ProductToAuctionMapping>> GetProductToAuctionsByAuctionIdAsync(int auctionId, bool onlyActiveItems = false);
Task<AuctionDto> GetAuctionDtoByIdAsync(int auctionId); Task<AuctionDto> GetAuctionDtoByIdAsync(int auctionId, bool widthProducts = false);
Task<List<ProductToAuctionDto>> GetProductToAuctionDtosByAuctionId(int auctionId);
Task<AuctionDto> GetAuctionDtoWithProductByIdAsync(int auctionId, int productId, bool activeProductOnly); Task<AuctionDto> GetAuctionDtoWithProductByIdAsync(int auctionId, int productId, bool activeProductOnly);

View File

@ -1,4 +1,6 @@
@model ProductBidBoxViewModel @using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums
@using Nop.Web.Framework.TagHelpers.Shared
@model ProductBidBoxViewModel
@* @inject IJsonHelper JsonHelper; *@ @* @inject IJsonHelper JsonHelper; *@
@* @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(myObj) as String) *@ @* @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(myObj) as String) *@
@ -22,12 +24,12 @@
<span id="licitStepText" class="value">@String.Format("{0:c}", Model.LicitStep)</span> <span id="licitStepText" class="value">@String.Format("{0:c}", Model.LicitStep)</span>
</div> </div>
<div> <div>
<button id="signalRBidButton" class="btn btn-success" style="text-transform: uppercase;" type="button"> <button id="signalRBidButton" class="btn btn-success" style="text-transform: uppercase;" type="button" disabled="@(!Model.IsItemActive)">
Bid @String.Format("{0:c}", Model.BidPrice) Bid @String.Format("{0:c}", Model.NextBidPrice)
</button> </button>
@* <button id="bidButton" class="btn btn-success"> @* <button id="bidButton" class="btn btn-success">
Bid @String.Format("{0:c}", Model.BidPrice) Bid @String.Format("{0:c}", Model.NextBidPrice)
</button> *@ </button> *@
</div> </div>
</div> </div>
@ -49,11 +51,11 @@
@{ @{
if(Model.IsItemActive) if(Model.IsItemActive)
{ {
<button id="signalRFirstWarningButton" class="btn btn-warning" style="text-transform: uppercase;" type="button"> <button id="signalRFirstWarningButton" class="btn btn-warning" style="text-transform: uppercase;" type="button" disabled="@((byte)Model.AuctionStatus >= (byte)AuctionStatus.FirstWarning))">
First warning First warning
</button> </button>
<button id="signalRFirstWarningButton" class="btn btn-warning" style="text-transform: uppercase;" type="button"> <button id="signalRSecondWarningButton" class="btn btn-warning" style="text-transform: uppercase;" type="button" disabled="@((byte)Model.AuctionStatus >= (byte)AuctionStatus.SecondWarning))">
First warning Second warning
</button> </button>
<button id="signalRCloseItemButton" class="btn btn-secondary" style="text-transform: uppercase;" type="button"> <button id="signalRCloseItemButton" class="btn btn-secondary" style="text-transform: uppercase;" type="button">
Deactivate item Deactivate item
@ -121,7 +123,7 @@
var bidMessage = { var bidMessage = {
ProductAuctionMappingId: bidBoxPageViewModel.ProductToAuctionId, ProductAuctionMappingId: bidBoxPageViewModel.ProductToAuctionId,
AuctionId: bidBoxPageViewModel.AuctionId, AuctionId: bidBoxPageViewModel.AuctionId,
BidPrice: bidBoxPageViewModel.BidPrice, BidPrice: bidBoxPageViewModel.NextBidPrice,
ProductId: bidBoxPageViewModel.ProductId, ProductId: bidBoxPageViewModel.ProductId,
CustomerId: bidBoxPageViewModel.CustomerId CustomerId: bidBoxPageViewModel.CustomerId
}; };
@ -175,7 +177,7 @@
// Create the message object // Create the message object
var auctionMessage = { var auctionMessage = {
ProductAuctionId: bidBoxPageViewModel.ProductToAuctionId, ProductToAuctionId: bidBoxPageViewModel.ProductToAuctionId,
AuctionStatus: auctionStatus AuctionStatus: auctionStatus
}; };
@ -203,18 +205,18 @@
var licitStepElement = document.getElementById("licitStepText"); var licitStepElement = document.getElementById("licitStepText");
if (widgetPriceElement) { if (widgetPriceElement) {
widgetPriceElement.textContent = HUFFormatter.format(data.bidPrice); // Update the price widgetPriceElement.textContent = HUFFormatter.format(data.currentPrice); // Update the price
licitStepElement.textContent = HUFFormatter.format(data.nextStepAmount); licitStepElement.textContent = HUFFormatter.format(data.nextStepAmount);
bidBoxPageViewModel.BidPrice = Number(data.bidPrice) + Number(data.nextStepAmount); bidBoxPageViewModel.NextBidPrice = Number(data.nextBidPrice);
budButtonElement.textContent = "Bid " + HUFFormatter.format(bidBoxPageViewModel.BidPrice); budButtonElement.textContent = "Bid " + HUFFormatter.format(bidBoxPageViewModel.NextBidPrice);
// if (bidBoxPageViewModel.CustomerId == data.CustomerId) { // if (bidBoxPageViewModel.CustomerId == data.CustomerId) {
// } // }
console.log(`WidgetPrice updated to: ${data.bidPrice}, next bid is ${bidBoxPageViewModel.BidPrice}`); console.log(`WidgetPrice updated to: ${data.currentPrice}, next bid is ${bidBoxPageViewModel.NextBidPrice}`);
budButtonElement.disabled = false; budButtonElement.disabled = false;
} else { } else {
console.warn("Element with ID 'WidgetPrice' not found in the DOM."); console.warn("Element with ID 'WidgetPrice' not found in the DOM.");