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 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

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