merge + small fixes
This commit is contained in:
parent
9cb032db3d
commit
2de0ec7fb0
|
|
@ -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
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 }
|
// 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
|
||||||
|
|
|
||||||
|
|
@ -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,6 +60,9 @@
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Attributes Section (NO FORM TAG - just a div) -->
|
||||||
|
<div id="orderAttributesSection">
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
|
|
@ -69,8 +70,7 @@
|
||||||
<nop-label asp-for="IsMeasurable" />
|
<nop-label asp-for="IsMeasurable" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
<nop-editor asp-for="IsMeasurable" />
|
<nop-editor asp-for="IsMeasurable" asp-template="" />
|
||||||
<span asp-validation-for="IsMeasurable"></span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
|
|
@ -78,8 +78,7 @@
|
||||||
<nop-label asp-for="DateOfReceipt" />
|
<nop-label asp-for="DateOfReceipt" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
<nop-editor asp-for="DateOfReceipt" />
|
<nop-editor asp-for="DateOfReceipt" asp-template="" />
|
||||||
<span asp-validation-for="DateOfReceipt"></span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
|
|
@ -92,11 +91,9 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</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 ==========
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue