Compare commits

...

3 Commits

Author SHA1 Message Date
Adam 16dbfb18e2 small fixes 2025-10-23 11:23:08 +02:00
Adam 236e2c6a03 Merge branch '4.80' of https://git.aycode.com/Adam/Mango.Nop.Plugins into 4.80 2025-10-23 10:26:20 +02:00
Adam 2de0ec7fb0 merge + small fixes 2025-10-23 10:25:08 +02:00
5 changed files with 116 additions and 48 deletions

View File

@ -9,6 +9,7 @@ using Mango.Nop.Core.Extensions;
using Mango.Nop.Core.Loggers; using Mango.Nop.Core.Loggers;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json; using Newtonsoft.Json;
using Nop.Core;
using Nop.Core.Domain.Customers; using Nop.Core.Domain.Customers;
using Nop.Core.Domain.Orders; using Nop.Core.Domain.Orders;
using Nop.Core.Domain.Payments; using Nop.Core.Domain.Payments;
@ -49,11 +50,13 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
private readonly INotificationService _notificationService; private readonly INotificationService _notificationService;
private readonly ICustomerService _customerService; private readonly ICustomerService _customerService;
private readonly IProductService _productService; private readonly IProductService _productService;
private readonly IStoreContext _storeContext;
private readonly IWorkContext _workContext;
// ... other dependencies // ... other dependencies
private readonly ILogger _logger; private readonly ILogger _logger;
public CustomOrderController(FruitBankDbContext fruitBankDbContext, IOrderService orderService, IOrderModelFactory orderModelFactory, ICustomOrderSignalREndpointServer customOrderSignalREndpoint, IPermissionService permissionService, IGenericAttributeService genericAttributeService, INotificationService notificationService, ICustomerService customerService, IProductService productService, IEnumerable<IAcLogWriterBase> logWriters) public CustomOrderController(FruitBankDbContext fruitBankDbContext, IOrderService orderService, IOrderModelFactory orderModelFactory, ICustomOrderSignalREndpointServer customOrderSignalREndpoint, IPermissionService permissionService, IGenericAttributeService genericAttributeService, INotificationService notificationService, ICustomerService customerService, IProductService productService, IEnumerable<IAcLogWriterBase> logWriters, IStoreContext storeContext, IWorkContext workContext)
{ {
_logger = new Logger<CustomOrderController>(logWriters.ToArray()); _logger = new Logger<CustomOrderController>(logWriters.ToArray());
@ -66,6 +69,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
_notificationService = notificationService; _notificationService = notificationService;
_customerService = customerService; _customerService = customerService;
_productService = productService; _productService = productService;
_storeContext = storeContext;
_workContext = workContext;
// ... initialize other deps // ... initialize other deps
} }
@ -152,8 +157,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
return RedirectToAction("List", "Order"); return RedirectToAction("List", "Order");
// store attributes in GenericAttribute table // store attributes in GenericAttribute table
await _genericAttributeService.SaveAttributeAsync(order, nameof(IMeasurable.IsMeasurable), model.IsMeasurable); await _genericAttributeService.SaveAttributeAsync(order, nameof(IMeasurable.IsMeasurable), model.IsMeasurable, _storeContext.GetCurrentStore().Id);
await _genericAttributeService.SaveAttributeAsync(order, nameof(IOrderDto.DateOfReceipt), model.DateOfReceipt); await _genericAttributeService.SaveAttributeAsync(order, nameof(IOrderDto.DateOfReceipt), model.DateOfReceipt, _storeContext.GetCurrentStore().Id);
_notificationService.SuccessNotification("Custom attributes saved successfully."); _notificationService.SuccessNotification("Custom attributes saved successfully.");
@ -171,6 +176,29 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
var customer = await _customerService.GetCustomerByIdAsync(customerId); var customer = await _customerService.GetCustomerByIdAsync(customerId);
if (customer == null) return RedirectToAction("List"); if (customer == null) return RedirectToAction("List");
var billingAddress = await _customerService.GetCustomerBillingAddressAsync(customer);
if(billingAddress == null)
{
//let's see if he has any address at all
var addresses = await _customerService.GetAddressesByCustomerIdAsync(customer.Id);
if(addresses != null && addresses.Count > 0)
{
//set the first one as billing
billingAddress = addresses[0];
customer.BillingAddressId = billingAddress.Id;
await _customerService.UpdateCustomerAsync(customer);
}
else
{
//no address at all, cannot create order
_logger.Error($"Cannot create order for customer {customer.Id}, no billing address found.");
return RedirectToAction("List");
}
}
//var currency = await _workContext.GetWorkingCurrencyAsync();
//customer.CurrencyId = currency.Id;
// Parse products // Parse products
var orderProducts = string.IsNullOrEmpty(orderProductsJson) ? [] : JsonConvert.DeserializeObject<List<OrderProductItem>>(orderProductsJson); var orderProducts = string.IsNullOrEmpty(orderProductsJson) ? [] : JsonConvert.DeserializeObject<List<OrderProductItem>>(orderProductsJson);
@ -188,7 +216,9 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
ShippingStatus = ShippingStatus.ShippingNotRequired, ShippingStatus = ShippingStatus.ShippingNotRequired,
CreatedOnUtc = DateTime.UtcNow, CreatedOnUtc = DateTime.UtcNow,
BillingAddressId = customer.BillingAddressId ?? 0, BillingAddressId = customer.BillingAddressId ?? 0,
ShippingAddressId = customer.ShippingAddressId ShippingAddressId = customer.ShippingAddressId,
PaymentMethodSystemName = "Payments.CheckMoneyOrder", // Default payment method
CustomerCurrencyCode = "HUF", // TODO: GET Default currency - A.
}; };
var productDtosById = await _dbContext.ProductDtos.GetAllByIds(orderProducts.Select(op => op.Id)).ToDictionaryAsync(p => p.Id, prodDto => prodDto); var productDtosById = await _dbContext.ProductDtos.GetAllByIds(orderProducts.Select(op => op.Id)).ToDictionaryAsync(p => p.Id, prodDto => prodDto);
@ -350,10 +380,16 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
pageIndex: 0, pageIndex: 0,
pageSize: maxResults); pageSize: maxResults);
var customersByCompanyName = await _customerService.GetAllCustomersAsync(
company: term,
pageIndex: 0,
pageSize: maxResults);
// Combine and deduplicate results // Combine and deduplicate results
var allCustomers = customersByEmail var allCustomers = customersByEmail
.Union(customersByFirstName) .Union(customersByFirstName)
.Union(customersByLastName) .Union(customersByLastName)
.Union(customersByCompanyName)
.DistinctBy(c => c.Id) .DistinctBy(c => c.Id)
.Take(maxResults) .Take(maxResults)
.ToList(); .ToList();
@ -362,13 +398,22 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
foreach (var customer in allCustomers) foreach (var customer in allCustomers)
{ {
var fullName = await _customerService.GetCustomerFullNameAsync(customer); var fullName = await _customerService.GetCustomerFullNameAsync(customer);
var displayText = !string.IsNullOrEmpty(customer.Email) var company = customer.Company;
? $"{customer.Email} ({fullName})"
: fullName; if (string.IsNullOrEmpty(fullName))
fullName = "[No name]";
if(string.IsNullOrEmpty(company))
company = "[No company]";
string fullText = $"{company} ({fullName}), {customer.Email}";
//var displayText = !string.IsNullOrEmpty(customer.Email)
// ? $"{customer.Email}, {customer.Company} ({fullName})"
// : fullName;
result.Add(new result.Add(new
{ {
label = displayText, label = fullText,
value = customer.Id value = customer.Id
}); });
} }

View File

@ -1,6 +1,8 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Nop.Core; using Nop.Core;
using Nop.Core.Domain.Orders; using Nop.Core.Domain.Orders;
using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
using Nop.Plugin.Misc.FruitBankPlugin.Services; using Nop.Plugin.Misc.FruitBankPlugin.Services;
using Nop.Services.Catalog; using Nop.Services.Catalog;
using Nop.Services.Common; using Nop.Services.Common;
@ -29,6 +31,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
private readonly IProductService _productService; private readonly IProductService _productService;
private readonly InnVoiceOrderService _innVoiceOrderService; private readonly InnVoiceOrderService _innVoiceOrderService;
private readonly IGenericAttributeService _genericAttributeService; private readonly IGenericAttributeService _genericAttributeService;
private readonly FruitBankDbContext _dbContext;
public InnVoiceOrderController( public InnVoiceOrderController(
IOrderService orderService, IOrderService orderService,
@ -38,7 +41,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
ICountryService countryService, ICountryService countryService,
IProductService productService, IProductService productService,
InnVoiceOrderService innVoiceOrderService, InnVoiceOrderService innVoiceOrderService,
IGenericAttributeService genericAttributeService) IGenericAttributeService genericAttributeService,
FruitBankDbContext dbContext)
{ {
_orderService = orderService; _orderService = orderService;
_workContext = workContext; _workContext = workContext;
@ -48,6 +52,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
_productService = productService; _productService = productService;
_innVoiceOrderService = innVoiceOrderService; _innVoiceOrderService = innVoiceOrderService;
_genericAttributeService = genericAttributeService; _genericAttributeService = genericAttributeService;
_dbContext = dbContext;
} }
/// <summary> /// <summary>
@ -75,6 +80,12 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
// Get shipping address // Get shipping address
var shippingAddress = await _customerService.GetCustomerShippingAddressAsync(customer); var shippingAddress = await _customerService.GetCustomerShippingAddressAsync(customer);
if (shippingAddress == null)
{
shippingAddress = billingAddress;
}
var shippingCountry = shippingAddress != null var shippingCountry = shippingAddress != null
? await _countryService.GetCountryByAddressAsync(shippingAddress) ? await _countryService.GetCountryByAddressAsync(shippingAddress)
: null; : null;
@ -92,8 +103,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
MegrendelestombID = 1, // Configure this based on your setup MegrendelestombID = 1, // Configure this based on your setup
MegrendelesKelte = order.CreatedOnUtc.ToLocalTime(), MegrendelesKelte = order.CreatedOnUtc.ToLocalTime(),
Hatarido = DateTime.Now.AddDays(7), // 7 days delivery time Hatarido = DateTime.Now.AddDays(7), // 7 days delivery time
Devizanem = order.CustomerCurrencyCode, Devizanem = "HUF", //TODO get real deault - A.
FizetesiMod = order.PaymentMethodSystemName, FizetesiMod = order.PaymentMethodSystemName ?? "átutalás",
Email = billingAddress.Email, Email = billingAddress.Email,
Telefon = billingAddress.PhoneNumber, Telefon = billingAddress.PhoneNumber,
MegrendelesSzamStr = order.Id.ToString() MegrendelesSzamStr = order.Id.ToString()
@ -113,7 +124,9 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
var orderItems = await _orderService.GetOrderItemsAsync(order.Id); var orderItems = await _orderService.GetOrderItemsAsync(order.Id);
foreach (var item in orderItems) foreach (var item in orderItems)
{ {
var product = await _productService.GetProductByIdAsync(item.ProductId); //var productDTO = await _productService.GetProductByIdAsync(item.ProductId);
var product = _dbContext.ProductDtos.GetById(item.ProductId);
//string unit = product != null && product.IsMeasurable ? "kg" : "kt";
orderRequest.AddItem(new InnVoiceOrderItem orderRequest.AddItem(new InnVoiceOrderItem
{ {
@ -122,8 +135,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
Brutto = true, Brutto = true,
EgysegAr = item.UnitPriceInclTax, EgysegAr = item.UnitPriceInclTax,
Mennyiseg = item.Quantity, Mennyiseg = item.Quantity,
MennyisegEgyseg = "db", MennyisegEgyseg = "kt",
CikkSzam = product?.Sku CikkSzam = ""
}); });
} }

View File

@ -379,7 +379,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
// save partner information to partners table { Id, Name, TaxId, CertificationNumber, PostalCode, Country, State, County, City, Street } // save partner information to partners table { Id, Name, TaxId, CertificationNumber, PostalCode, Country, State, County, City, Street }
if (partnerId != null) if (partnerId != null)
{ {
string partnerAnalysisPrompt = "Extract the sender information from this document, and return them as JSON: name, taxId, certificationNumber, postalCode, country, state, county, city, street. " + string partnerAnalysisPrompt = "Extract the partner information from this document, and return them as JSON: name, taxId, certificationNumber, postalCode, country, state, county, city, street. " +
"If you can't find information of any of these, return null value for that field."; "If you can't find information of any of these, return null value for that field.";
//here I can start preparing the file entity //here I can start preparing the file entity

View File

@ -9,8 +9,6 @@
</div> </div>
<div class="card-body"> <div class="card-body">
<!-- Order Subsection --> <!-- Order Subsection -->
<div class="form-group row"> <div class="form-group row">
<div class="col-12 col-md-3"> <div class="col-12 col-md-3">
<h5><i class="fas fa-shopping-cart"></i> Order</h5> <h5><i class="fas fa-shopping-cart"></i> Order</h5>
@ -62,31 +60,33 @@
</button> </button>
</div> </div>
</div> </div>
<div class="form-group row">
<div class="col-12"> <!-- Attributes Section (NO FORM TAG - just a div) -->
<div class="form-group row"> <div id="orderAttributesSection">
<div class="col-md-3"> <div class="form-group row">
<nop-label asp-for="IsMeasurable" /> <div class="col-12">
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="IsMeasurable" />
</div>
<div class="col-md-9">
<nop-editor asp-for="IsMeasurable" asp-template="" />
</div>
</div> </div>
<div class="col-md-9"> <div class="form-group row">
<nop-editor asp-for="IsMeasurable" /> <div class="col-md-3">
<span asp-validation-for="IsMeasurable"></span> <nop-label asp-for="DateOfReceipt" />
</div>
<div class="col-md-9">
<nop-editor asp-for="DateOfReceipt" asp-template="" />
</div>
</div> </div>
</div> <div class="form-group row">
<div class="form-group row"> <div class="col-md-12 text-right">
<div class="col-md-3"> <button type="button" id="saveAttributesBtn" class="btn btn-primary">
<nop-label asp-for="DateOfReceipt" /> <i class="fa fa-save"></i> Save Attributes
</div> </button>
<div class="col-md-9"> </div>
<nop-editor asp-for="DateOfReceipt" />
<span asp-validation-for="DateOfReceipt"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-12 text-right">
<button type="button" id="saveAttributesBtn" class="btn btn-primary">
<i class="fa fa-save"></i> Save Attributes
</button>
</div> </div>
</div> </div>
</div> </div>
@ -94,9 +94,6 @@
</div> </div>
</div> </div>
<script> <script>
$(document).ready(function () { $(document).ready(function () {
var createOrderUrl = '/Admin/InnVoiceOrder/CreateOrder'; var createOrderUrl = '/Admin/InnVoiceOrder/CreateOrder';
@ -107,8 +104,19 @@
var orderExists = false; var orderExists = false;
var invoiceExists = false; var invoiceExists = false;
// Remove validation from these specific fields
$('#@Html.IdFor(m => m.IsMeasurable)').rules('remove');
$('#@Html.IdFor(m => m.DateOfReceipt)').rules('remove');
// Also set data-val to false
$('#@Html.IdFor(m => m.IsMeasurable)').attr('data-val', 'false');
$('#@Html.IdFor(m => m.DateOfReceipt)').attr('data-val', 'false');
// Save Order Attributes // Save Order Attributes
$("#saveAttributesBtn").click(function () { $("#saveAttributesBtn").click(function (e) {
e.preventDefault();
e.stopPropagation();
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: "@Url.Action("SaveOrderAttributes", "CustomOrder")", url: "@Url.Action("SaveOrderAttributes", "CustomOrder")",
@ -125,6 +133,8 @@
alert("Error saving attributes"); alert("Error saving attributes");
} }
}); });
return false;
}); });
// ========== ORDER MANAGEMENT ========== // ========== ORDER MANAGEMENT ==========

View File

@ -24,7 +24,7 @@ public class PluginNopStartup : INopStartup
feature.AddPolicy( feature.AddPolicy(
"AllowBlazorClient", "AllowBlazorClient",
apiPolicy => apiPolicy apiPolicy => apiPolicy
.WithOrigins("https://localhost:7144") .WithOrigins(["https://localhost:7144", "measuringtest.fruitbank.hu", "https://localhost:60589"])
.AllowAnyHeader() .AllowAnyHeader()
.AllowAnyMethod() .AllowAnyMethod()
.AllowCredentials() .AllowCredentials()