merge + small fixes

This commit is contained in:
Adam 2025-10-23 10:25:08 +02:00
parent 9cb032db3d
commit 2de0ec7fb0
4 changed files with 95 additions and 40 deletions

View File

@ -9,6 +9,7 @@ using Mango.Nop.Core.Extensions;
using Mango.Nop.Core.Loggers;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Nop.Core;
using Nop.Core.Domain.Customers;
using Nop.Core.Domain.Orders;
using Nop.Core.Domain.Payments;
@ -49,11 +50,13 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
private readonly INotificationService _notificationService;
private readonly ICustomerService _customerService;
private readonly IProductService _productService;
private readonly IStoreContext _storeContext;
private readonly IWorkContext _workContext;
// ... other dependencies
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());
@ -66,6 +69,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
_notificationService = notificationService;
_customerService = customerService;
_productService = productService;
_storeContext = storeContext;
_workContext = workContext;
// ... initialize other deps
}
@ -152,8 +157,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
return RedirectToAction("List", "Order");
// store attributes in GenericAttribute table
await _genericAttributeService.SaveAttributeAsync(order, nameof(IMeasurable.IsMeasurable), model.IsMeasurable);
await _genericAttributeService.SaveAttributeAsync(order, nameof(IOrderDto.DateOfReceipt), model.DateOfReceipt);
await _genericAttributeService.SaveAttributeAsync(order, nameof(IMeasurable.IsMeasurable), model.IsMeasurable, _storeContext.GetCurrentStore().Id);
await _genericAttributeService.SaveAttributeAsync(order, nameof(IOrderDto.DateOfReceipt), model.DateOfReceipt, _storeContext.GetCurrentStore().Id);
_notificationService.SuccessNotification("Custom attributes saved successfully.");
@ -171,6 +176,29 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
var customer = await _customerService.GetCustomerByIdAsync(customerId);
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
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,
CreatedOnUtc = DateTime.UtcNow,
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);
@ -350,10 +380,16 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
pageIndex: 0,
pageSize: maxResults);
var customersByCompanyName = await _customerService.GetAllCustomersAsync(
company: term,
pageIndex: 0,
pageSize: maxResults);
// Combine and deduplicate results
var allCustomers = customersByEmail
.Union(customersByFirstName)
.Union(customersByLastName)
.Union(customersByCompanyName)
.DistinctBy(c => c.Id)
.Take(maxResults)
.ToList();
@ -362,13 +398,22 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
foreach (var customer in allCustomers)
{
var fullName = await _customerService.GetCustomerFullNameAsync(customer);
var displayText = !string.IsNullOrEmpty(customer.Email)
? $"{customer.Email} ({fullName})"
: fullName;
var company = customer.Company;
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
{
label = displayText,
label = fullText,
value = customer.Id
});
}

View File

@ -381,7 +381,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 }
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.";
//here I can start preparing the file entity

View File

@ -9,8 +9,6 @@
</div>
<div class="card-body">
<!-- Order Subsection -->
<div class="form-group row">
<div class="col-12 col-md-3">
<h5><i class="fas fa-shopping-cart"></i> Order</h5>
@ -62,31 +60,33 @@
</button>
</div>
</div>
<div class="form-group row">
<div class="col-12">
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="IsMeasurable" />
<!-- Attributes Section (NO FORM TAG - just a div) -->
<div id="orderAttributesSection">
<div class="form-group row">
<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 class="col-md-9">
<nop-editor asp-for="IsMeasurable" />
<span asp-validation-for="IsMeasurable"></span>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="DateOfReceipt" />
</div>
<div class="col-md-9">
<nop-editor asp-for="DateOfReceipt" asp-template="" />
</div>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="DateOfReceipt" />
</div>
<div class="col-md-9">
<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 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>
@ -94,9 +94,6 @@
</div>
</div>
<script>
$(document).ready(function () {
var createOrderUrl = '/Admin/InnVoiceOrder/CreateOrder';
@ -107,8 +104,19 @@
var orderExists = 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
$("#saveAttributesBtn").click(function () {
$("#saveAttributesBtn").click(function (e) {
e.preventDefault();
e.stopPropagation();
$.ajax({
type: "POST",
url: "@Url.Action("SaveOrderAttributes", "CustomOrder")",
@ -125,6 +133,8 @@
alert("Error saving attributes");
}
});
return false;
});
// ========== ORDER MANAGEMENT ==========
@ -397,4 +407,4 @@
}
});
});
</script>
</script>

View File

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