using System.Linq; using Nop.Core.Domain.Catalog; using Nop.Core.Domain.Orders; using Nop.Services.Catalog; using Nop.Services.Common; using Nop.Services.Events; using Nop.Services.Orders; namespace Nop.Plugin.YourCompany.Measurement.Services { public class OrderPlacedConsumer : IConsumer { private readonly IGenericAttributeService _genericAttributeService; private readonly IProductService _productService; private readonly IOrderService _orderService; private readonly IProductAttributeService _productAttributeService; public OrderPlacedConsumer( IGenericAttributeService genericAttributeService, IProductService productService, IOrderService orderService, IProductAttributeService productAttributeService) { _genericAttributeService = genericAttributeService; _productService = productService; _orderService = orderService; _productAttributeService = productAttributeService; } public async Task HandleEventAsync(OrderPlacedEvent eventMessage) { var order = eventMessage.Order; var orderItems = await _orderService.GetOrderItemsAsync(order.Id); bool requiresMeasurement = false; foreach (var item in orderItems) { var product = await _productService.GetProductByIdAsync(item.ProductId); // itt pl. egy custom flag a producton, ami jelzi, hogy mérés kell hozzá // akár egy product attribute is lehet, vagy egy saját extension metódus if (product != null) { var productAttributeMappings = await _productAttributeService.GetProductAttributeMappingsByProductIdAsync(product.Id); //Product Attributes foreach (var pam in productAttributeMappings) { var attributes = await _productAttributeService.GetProductAttributeValuesAsync(pam.Id); foreach (var attr in attributes) { // you can check for specific attribute by its name or id if (attr.Name == "NeedsToBeMeasured" && attr.IsPreSelected) { requiresMeasurement = true; break; } } } } } if (requiresMeasurement) { // itt adjuk hozzá a GenericAttribute flag-et az orderhez await _genericAttributeService.SaveAttributeAsync(order, "PendingMeasurement", true); } } } }