improvements, fixes, etc...

This commit is contained in:
Loretta 2025-10-13 14:18:08 +02:00
parent 294b1e0970
commit e1f28f7fe8
19 changed files with 398 additions and 109 deletions

View File

@ -1,8 +1,11 @@
using AyCode.Core.Extensions; using AyCode.Core.Extensions;
using AyCode.Utils.Extensions;
using FruitBank.Common.Entities;
using FruitBank.Common.Interfaces; using FruitBank.Common.Interfaces;
using LinqToDB.Mapping; using LinqToDB.Mapping;
using Mango.Nop.Core.Dtos; using Mango.Nop.Core.Dtos;
using Mango.Nop.Core.Interfaces; using Mango.Nop.Core.Interfaces;
using Newtonsoft.Json;
using Nop.Core; using Nop.Core;
using Nop.Core.Domain.Catalog; using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Common; using Nop.Core.Domain.Common;
@ -10,13 +13,12 @@ using Nop.Core.Domain.Orders;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Globalization; using System.Globalization;
using System.Linq.Expressions; using System.Linq.Expressions;
using Newtonsoft.Json;
namespace FruitBank.Common.Dtos; namespace FruitBank.Common.Dtos;
public class OrderDto : MgOrderDto<OrderItemDto, ProductDto>, IOrderDto public class OrderDto : MgOrderDto<OrderItemDto, ProductDto>, IOrderDto
{ {
[NotColumn] [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
private static Expression<Func<OrderDto, GenericAttribute, bool>> RelationWithGenericAttribute => (orderDto, genericAttribute) => private static Expression<Func<OrderDto, GenericAttribute, bool>> RelationWithGenericAttribute => (orderDto, genericAttribute) =>
orderDto.Id == genericAttribute.EntityId && genericAttribute.KeyGroup == nameof(Order); orderDto.Id == genericAttribute.EntityId && genericAttribute.KeyGroup == nameof(Order);
@ -24,6 +26,26 @@ public class OrderDto : MgOrderDto<OrderItemDto, ProductDto>, IOrderDto
[Association(ThisKey = nameof(Id), OtherKey = nameof(GenericAttribute.EntityId), ExpressionPredicate = nameof(RelationWithGenericAttribute), CanBeNull = true)] [Association(ThisKey = nameof(Id), OtherKey = nameof(GenericAttribute.EntityId), ExpressionPredicate = nameof(RelationWithGenericAttribute), CanBeNull = true)]
public List<GenericAttribute> GenericAttributes { get; set; } public List<GenericAttribute> GenericAttributes { get; set; }
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public bool IsMeasured => OrderItemDtos.All(oi => oi.IsMeasured);
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public bool IsMeasurable
{
get => OrderItemDtos.Any(oi => oi.IsMeasurable);
set => throw new Exception($"OrderDto.IsMeasurable not set");
}
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public DateTime DateOfReceipt
{
get
{
var dateOfReceipt = GenericAttributes.SingleOrDefault(x => x.Key == nameof(IOrderDto.DateOfReceipt))?.Value ?? string.Empty;
return dateOfReceipt.IsNullOrWhiteSpace() ? CreatedOnUtc : CommonHelper.To<DateTime>(dateOfReceipt);
}
}
public OrderDto() :base() public OrderDto() :base()
{ } { }
public OrderDto(int orderId) : base(orderId) public OrderDto(int orderId) : base(orderId)

View File

@ -11,9 +11,9 @@ using Nop.Core.Domain.Orders;
namespace FruitBank.Common.Dtos; namespace FruitBank.Common.Dtos;
public class OrderItemDto : MgOrderItemDto<ProductDto>, IOrderItemDto, IMeasuringNetWeight public class OrderItemDto : MgOrderItemDto<ProductDto>, IOrderItemDto
{ {
[NotColumn] [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
private static Expression<Func<OrderItemDto, GenericAttribute, bool>> RelationWithGenericAttribute => (orderItemDto, genericAttribute) => private static Expression<Func<OrderItemDto, GenericAttribute, bool>> RelationWithGenericAttribute => (orderItemDto, genericAttribute) =>
orderItemDto.Id == genericAttribute.EntityId && genericAttribute.KeyGroup == nameof(OrderItem); orderItemDto.Id == genericAttribute.EntityId && genericAttribute.KeyGroup == nameof(OrderItem);
@ -24,20 +24,28 @@ public class OrderItemDto : MgOrderItemDto<ProductDto>, IOrderItemDto, IMeasurin
[Association(ThisKey = nameof(Id), OtherKey = nameof(OrderItemPallet.OrderItemId), CanBeNull = true)] [Association(ThisKey = nameof(Id), OtherKey = nameof(OrderItemPallet.OrderItemId), CanBeNull = true)]
public List<OrderItemPallet> OrderItemPallets { get; set; } public List<OrderItemPallet> OrderItemPallets { get; set; }
[NotColumn] [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
[JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public double NetWeight public double NetWeight
{ {
get => CommonHelper.To<double>(GenericAttributes?.FirstOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))?.Value ?? "0"); get => CommonHelper.To<double>(GenericAttributes.SingleOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))?.Value ?? "0");
set set
{ {
//Direkt legyen exception! - J. //Direkt legyen exception! - J.
var ga = GenericAttributes?.FirstOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))!; var ga = GenericAttributes?.SingleOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))!;
ga.Value = value.ToString(CultureInfo.InvariantCulture); ga.Value = value.ToString(CultureInfo.InvariantCulture);
} }
} }
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public bool IsMeasured => OrderItemPallets.All(oip => oip.IsMeasured);
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public bool IsMeasurable
{
get => ProductDto!.IsMeasurable;
set => throw new Exception($"OrderItemDto.IsMeasurable not set");
}
public OrderItemDto() : base() public OrderItemDto() : base()
{ {
} }

View File

@ -1,15 +1,43 @@
using FruitBank.Common.Interfaces; using FruitBank.Common.Interfaces;
using LinqToDB.Mapping;
using Mango.Nop.Core.Dtos; using Mango.Nop.Core.Dtos;
using Newtonsoft.Json;
using Nop.Core;
using Nop.Core.Domain.Catalog; using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Common;
using Nop.Core.Domain.Orders;
using System.Globalization;
using System.Linq.Expressions;
namespace FruitBank.Common.Dtos; namespace FruitBank.Common.Dtos;
public class ProductDto : MgProductDto, IProductDto public class ProductDto : MgProductDto, IProductDto
{ {
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
private static Expression<Func<ProductDto, GenericAttribute, bool>> RelationWithGenericAttribute => (orderItemDto, genericAttribute) =>
orderItemDto.Id == genericAttribute.EntityId && genericAttribute.KeyGroup == nameof(Product);
[Association(ThisKey = nameof(Id), OtherKey = nameof(GenericAttribute.EntityId), ExpressionPredicate = nameof(RelationWithGenericAttribute), CanBeNull = true)]
public List<GenericAttribute> GenericAttributes { get; set; }
public ProductDto() :base() public ProductDto() :base()
{ } { }
public ProductDto(int productId) : base(productId) public ProductDto(int productId) : base(productId)
{ } { }
public ProductDto(Product product) : base(product) public ProductDto(Product product) : base(product)
{ } { }
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public bool IsMeasurable
{
get => CommonHelper.To<bool>(GenericAttributes.SingleOrDefault(x => x.Key == nameof(IMeasurable.IsMeasurable))?.Value ?? "false");
set
{
//Direkt legyen exception! - J.
var ga = GenericAttributes.SingleOrDefault(x => x.Key == nameof(IMeasurable.IsMeasurable))!;
ga.Value = value.ToString();
}
}
} }

View File

@ -14,7 +14,7 @@ public class OrderItemPallet : MeasuringItemPalletBase, IOrderItemPallet
set => ForeignItemId = value; set => ForeignItemId = value;
} }
[LinqToDB.Mapping.Association(ThisKey = nameof(OrderItemId), OtherKey = nameof(OrderItem.Id), CanBeNull = true)] [Association(ThisKey = nameof(OrderItemId), OtherKey = nameof(OrderItem.Id), CanBeNull = true)]
public OrderItem? OrderItem { get; set; } public OrderItem? OrderItem { get; set; }
public override double CalculateNetWeight() => base.CalculateNetWeight(); public override double CalculateNetWeight() => base.CalculateNetWeight();

View File

@ -31,6 +31,9 @@
<Reference Include="AyCode.Services"> <Reference Include="AyCode.Services">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Utils">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll</HintPath>
</Reference>
<Reference Include="Mango.Nop.Core"> <Reference Include="Mango.Nop.Core">
<HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll</HintPath> <HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll</HintPath>
</Reference> </Reference>

View File

@ -6,6 +6,7 @@ namespace FruitBank.Common.Interfaces;
public interface ICustomOrderSignalREndpointCommon public interface ICustomOrderSignalREndpointCommon
{ {
Task<List<OrderDto>?> GetAllOrderDtos(); Task<List<OrderDto>?> GetAllOrderDtos();
Task<OrderDto?> GetOrderDtoById(int orderId);
Task<List<OrderDto>?> GetPendingOrderDtos(); Task<List<OrderDto>?> GetPendingOrderDtos();
Task<List<OrderDto>?> GetAllByIds(int[] orderIds);
Task<OrderDto?> GetOrderDtoById(int orderId);
} }

View File

@ -2,5 +2,5 @@
public interface IMeasured public interface IMeasured
{ {
bool IsMeasured { get; set; } bool IsMeasured { get; }
} }

View File

@ -4,7 +4,7 @@ using Mango.Nop.Core.Interfaces;
namespace FruitBank.Common.Interfaces; namespace FruitBank.Common.Interfaces;
public interface IOrderDto : IMgOrderDto<OrderItemDto, ProductDto> public interface IOrderDto : IMgOrderDto<OrderItemDto, ProductDto>, IMeasured, IMeasurable
{ {
DateTime DateOfReceipt { get; }
} }

View File

@ -6,7 +6,7 @@ using Nop.Core.Domain.Catalog;
namespace FruitBank.Common.Interfaces; namespace FruitBank.Common.Interfaces;
public interface IOrderItemDto : IMgOrderItemDto<ProductDto> public interface IOrderItemDto : IMgOrderItemDto<ProductDto>, IMeasuringNetWeight, IMeasured, IMeasurable
{ {
public List<OrderItemPallet> OrderItemPallets { get; set; } public List<OrderItemPallet> OrderItemPallets { get; set; }
public void InitializeOrderItemPallets(List<OrderItemPallet> orderItemPallets); public void InitializeOrderItemPallets(List<OrderItemPallet> orderItemPallets);

View File

@ -2,7 +2,7 @@
namespace FruitBank.Common.Interfaces; namespace FruitBank.Common.Interfaces;
public interface IProductDto : IMgProductDto public interface IProductDto : IMgProductDto, IMeasurable
{ {
} }

View File

@ -47,6 +47,7 @@ public class SignalRTags : AcSignalRTags
public const int GetAllOrderDtos = 111; public const int GetAllOrderDtos = 111;
public const int GetOrderDtoById = 112; public const int GetOrderDtoById = 112;
public const int GetAllByIdList = 114;
public const int GetPendingOrderDtos = 115; public const int GetPendingOrderDtos = 115;
public const int AuthenticateUser = 160; public const int AuthenticateUser = 160;

View File

@ -35,17 +35,6 @@ public sealed class OrderClientTests
Assert.IsTrue(orderDtos.All(o => o.OrderItemDtos.All(oi => oi.ProductDto != null && oi.ProductDto.Id == oi.ProductId))); Assert.IsTrue(orderDtos.All(o => o.OrderItemDtos.All(oi => oi.ProductDto != null && oi.ProductDto.Id == oi.ProductId)));
} }
[TestMethod]
public async Task GetPendingOrderDtos()
{
var pendingOrderDtos = await _signalRClient.GetPendingOrderDtos();
Assert.IsNotNull(pendingOrderDtos);
Assert.IsTrue(pendingOrderDtos.All(o => o.OrderStatus == OrderStatus.Pending));
Assert.IsTrue(pendingOrderDtos.Count != 0);
}
[TestMethod] [TestMethod]
[DataRow(1)] [DataRow(1)]
[DataRow(2)] [DataRow(2)]
@ -59,4 +48,27 @@ public sealed class OrderClientTests
Assert.IsTrue(orderDto.OrderStatusId >= 10); Assert.IsTrue(orderDto.OrderStatusId >= 10);
Assert.IsTrue(orderDto.CustomOrderNumber == orderId.ToString()); Assert.IsTrue(orderDto.CustomOrderNumber == orderId.ToString());
} }
[TestMethod]
public async Task GetPendingOrderDtos()
{
var pendingOrderDtos = await _signalRClient.GetPendingOrderDtos();
Assert.IsNotNull(pendingOrderDtos);
Assert.IsTrue(pendingOrderDtos.All(o => o.OrderStatus == OrderStatus.Pending));
Assert.IsTrue(pendingOrderDtos.Count != 0);
}
[TestMethod]
[DataRow(new int[] {1,2,4,7})]
public async Task GetOrderDtoById(int[] orderIds)
{
var orderDtoList = await _signalRClient.GetAllByIds(orderIds);
Assert.IsNotNull(orderDtoList);
Assert.IsTrue(orderDtoList.Count == orderIds.Length);
Assert.IsTrue(orderDtoList.All(x => orderIds.Contains(x.Id)));
}
} }

View File

@ -0,0 +1,15 @@
namespace FruitBankHybrid.Shared.Models;
public class MeasuringDateSelectorModel
{
public int ShippingId { get; set; }
public DateTime DateTime { get; set; }
public bool IsMeasured { get; set; }
public MeasuringDateSelectorModel(int shippingId, DateTime dateTime, bool isMeasured)
{
ShippingId = shippingId;
DateTime = dateTime;
IsMeasured = isMeasured;
}
}

View File

@ -10,21 +10,21 @@
<div style="margin-top: 50px;"> <div style="margin-top: 50px;">
<DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100"> <DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
<DxFormLayoutItem Caption="Érkezés dátuma" ColSpanMd="2" CaptionCssClass="@(SelectedShipping != null && _shippingDates.Where(x => DaysEqual(x.DateTime, SelectedShipping.ShippingDate)).All(x => x.IsMeasured) ? "text-success" : "")"> <DxFormLayoutItem Caption="Érkezés dátuma" ColSpanMd="2" CaptionCssClass="@(SelectedShipping != null && _measuringDates.Where(x => MeasuringService.DaysEqual(x.DateTime, SelectedShipping.ShippingDate)).All(x => x.IsMeasured) ? "text-success" : "")">
<DxDateEdit CssClass="cw-320" <DxDateEdit CssClass="cw-320"
DisplayFormat="m" DisplayFormat="m"
Format="m" Format="m"
Context="ctxShippingDate" Context="ctxShippingDate"
Date="@(SelectedShipping?.ShippingDate.Date ?? DateTime.Now.Date)" Date="@(SelectedShipping?.ShippingDate.Date ?? DateTime.Now.Date)"
CustomDisabledDate="@OnCustomDisabledDate" CustomDisabledDate="@OnCustomDisabledMeasuringDate"
DateChanged="@((DateTime newValue) => OnSelectedShippingDateChanged(newValue))" DateChanged="@((DateTime newValue) => OnMeasuringDateChanged(newValue))"
InputId="deDisabledDates"> InputId="deDisabledDates">
<DayCellTemplate> <DayCellTemplate>
@{ @{
var cssClass = GetShippingDateCssClassNames(ctxShippingDate); var cssClass = GetMeasuringDateCssClassNames(ctxShippingDate);
if (!cssClass.IsNullOrWhiteSpace()) if (!cssClass.IsNullOrWhiteSpace())
{ {
<a class="@GetShippingDateCssClassNames(ctxShippingDate)">@ctxShippingDate.Day.ToString()</a> <a class="@GetMeasuringDateCssClassNames(ctxShippingDate)">@ctxShippingDate.Day.ToString()</a>
} }
else else
{ {

View File

@ -5,6 +5,8 @@ using FruitBank.Common.Entities;
using FruitBank.Common.Helpers; using FruitBank.Common.Helpers;
using FruitBank.Common.Interfaces; using FruitBank.Common.Interfaces;
using FruitBank.Common.Models; using FruitBank.Common.Models;
using FruitBankHybrid.Shared.Models;
using FruitBankHybrid.Shared.Services;
using FruitBankHybrid.Shared.Services.Loggers; using FruitBankHybrid.Shared.Services.Loggers;
using FruitBankHybrid.Shared.Services.SignalRs; using FruitBankHybrid.Shared.Services.SignalRs;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
@ -13,19 +15,6 @@ using ILogger = Mango.Nop.Core.Loggers.ILogger;
namespace FruitBankHybrid.Shared.Pages namespace FruitBankHybrid.Shared.Pages
{ {
public class ShippingDateModel
{
public int ShippingId { get; set; }
public DateTime DateTime { get; set; }
public bool IsMeasured { get; set; }
public ShippingDateModel(int shippingId, DateTime dateTime, bool isMeasured)
{
ShippingId = shippingId;
DateTime = dateTime;
IsMeasured = isMeasured;
}
}
public partial class MeasuringIn : ComponentBase public partial class MeasuringIn : ComponentBase
{ {
[Inject] public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; } [Inject] public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; }
@ -40,10 +29,9 @@ namespace FruitBankHybrid.Shared.Pages
private ShippingDocument? SelectedShippingDocument { get; set; } private ShippingDocument? SelectedShippingDocument { get; set; }
private ShippingItem? SelectedShippingItem { get; set; } private ShippingItem? SelectedShippingItem { get; set; }
DateTime DateTimeValue { get; set; } = DateTime.Today;
protected bool BtnSaveEnabled { get; set; } protected bool BtnSaveEnabled { get; set; }
private List<ShippingDateModel> _shippingDates = null!; private List<MeasuringDateSelectorModel> _measuringDates = null!;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
@ -58,76 +46,25 @@ namespace FruitBankHybrid.Shared.Pages
{ {
var shippings = await FruitBankSignalRClient.GetNotMeasuredShippings() ?? []; var shippings = await FruitBankSignalRClient.GetNotMeasuredShippings() ?? [];
_shippingDates = shippings.Select(shipping => new ShippingDateModel(shipping.Id, shipping.ShippingDate.Date, shipping.IsAllMeasured)).ToList(); _measuringDates = shippings.Select(shipping => new MeasuringDateSelectorModel(shipping.Id, shipping.ShippingDate.Date, shipping.IsAllMeasured)).ToList();
NotMeasuredShippings = shippings.Where(shipping => DaysEqual(shipping.ShippingDate.Date, dateTime)).ToList(); NotMeasuredShippings = shippings.Where(shipping => MeasuringService.DaysEqual(shipping.ShippingDate.Date, dateTime)).ToList();
SelectedShipping = NotMeasuredShippings.FirstOrDefault(); SelectedShipping = NotMeasuredShippings.FirstOrDefault();
} }
private async Task OnSelectedShippingDateChanged(DateTime selectedDateTime) private async Task OnMeasuringDateChanged(DateTime selectedDateTime)
=> await RefreshShippingsFromDb(selectedDateTime); => await RefreshShippingsFromDb(selectedDateTime);
private void OnCustomDisabledDate(CalendarCustomDisabledDateEventArgs args)
=> args.IsDisabled = !_shippingDates.Exists(shippingDateModel => DaysEqual(shippingDateModel.DateTime, args.Date));
private string GetShippingDateCssClassNames(DateTime date) private void OnCustomDisabledMeasuringDate(CalendarCustomDisabledDateEventArgs args)
{ => MeasuringService.OnCustomDisabledDate(args, _measuringDates);
if (_shippingDates.Exists(shipping => !shipping.IsMeasured && shipping.DateTime.Date <= DateTime.Now.Date && DaysEqual(shipping.DateTime, date)))
return "fw-bold text-danger";
if (_shippingDates.Exists(shipping => shipping.IsMeasured && DaysEqual(shipping.DateTime, date))) private string GetMeasuringDateCssClassNames(DateTime date)
return "fw-bold text-success"; => MeasuringService.GetShippingDateCssClassNames(date, _measuringDates);
if (_shippingDates.Exists(shipping => !shipping.IsMeasured && DaysEqual(shipping.DateTime, date)))
return "fw-bold";
return string.Empty;
}
private static bool DaysEqual(DateTime date1, DateTime date2)
=> (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
private string GetShippingPalletsCssClassNames(string fieldName, ShippingItemPallet shippingItemPallet) private string GetShippingPalletsCssClassNames(string fieldName, ShippingItemPallet shippingItemPallet)
{ => MeasuringService.GetCustomItemPalletsCssClassNames(fieldName, shippingItemPallet, SelectedShippingItem!.IsMeasurable);
//if (shippingItemPallet.NetWeight < 0) return "text-danger";
switch (fieldName)
{
case nameof(ShippingItemPallet.TareWeight):
return IsShippingitemPalletMeasuredAndValid(shippingItemPallet) ? "text-success" :
(shippingItemPallet.TareWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : "");
break;
case nameof(ShippingItemPallet.PalletWeight):
return IsShippingitemPalletMeasuredAndValid(shippingItemPallet) ? "text-success" :
(shippingItemPallet.PalletWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : "");
break;
case nameof(ShippingItemPallet.Quantity):
return IsShippingitemPalletMeasuredAndValid(shippingItemPallet) ? "text-success" :
(shippingItemPallet.Quantity < 0 ? "text-danger" : "");
break;
case nameof(ShippingItemPallet.GrossWeight):
return IsShippingitemPalletMeasuredAndValid(shippingItemPallet) ? "text-success" :
(shippingItemPallet.GrossWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : "");
break;
case nameof(ShippingItemPallet.NetWeight):
return IsShippingitemPalletMeasuredAndValid(shippingItemPallet) ? "text-success" :
(shippingItemPallet.NetWeight < 0 ? "text-danger" : "");
break;
}
//if (_shippingDates.Exists(shipping => !shipping.IsMeasured && shipping.DateTime.Date <= DateTime.Now.Date && DaysEqual(shipping.DateTime, date)))
// return "fw-bold text-danger";
//if (_shippingDates.Exists(shipping => shipping.IsMeasured && DaysEqual(shipping.DateTime, date)))
// return "fw-bold text-success";
//if (_shippingDates.Exists(shipping => !shipping.IsMeasured && DaysEqual(shipping.DateTime, date)))
// return "fw-bold";
return string.Empty;
}
private void OnSelectedShippingChanged(SelectedDataItemChangedEventArgs<Shipping> eventArgs) private void OnSelectedShippingChanged(SelectedDataItemChangedEventArgs<Shipping> eventArgs)
{ {
SelectedShippingDocument = eventArgs.DataItem?.ShippingDocuments?.FirstOrDefault(); SelectedShippingDocument = eventArgs.DataItem?.ShippingDocuments?.FirstOrDefault();
@ -152,7 +89,7 @@ namespace FruitBankHybrid.Shared.Pages
SelectedShippingDocument!.IsAllMeasured = SelectedShippingDocument.ShippingItems?.All(si => si.IsMeasured) ?? false; SelectedShippingDocument!.IsAllMeasured = SelectedShippingDocument.ShippingItems?.All(si => si.IsMeasured) ?? false;
SelectedShipping!.IsAllMeasured = SelectedShipping.ShippingDocuments?.All(sd => sd.IsAllMeasured) ?? false; SelectedShipping!.IsAllMeasured = SelectedShipping.ShippingDocuments?.All(sd => sd.IsAllMeasured) ?? false;
var shippingDate = _shippingDates.FirstOrDefault(shipping => shipping.ShippingId == SelectedShipping.Id); var shippingDate = _measuringDates.FirstOrDefault(shipping => shipping.ShippingId == SelectedShipping.Id);
if (shippingDate != null) shippingDate.IsMeasured = SelectedShipping.IsAllMeasured; if (shippingDate != null) shippingDate.IsMeasured = SelectedShipping.IsAllMeasured;
MeasuringValuesHelper.SetShippingItemTotalMeasuringValues(shippingItem); MeasuringValuesHelper.SetShippingItemTotalMeasuringValues(shippingItem);
@ -232,7 +169,7 @@ namespace FruitBankHybrid.Shared.Pages
private bool IsShippingitemPalletMeasuredAndValid(ShippingItemPallet shippingItemPallet) private bool IsShippingitemPalletMeasuredAndValid(ShippingItemPallet shippingItemPallet)
=> shippingItemPallet.IsMeasuredAndValid(SelectedShippingItem!.IsMeasurable); => MeasuringService.IsCustomItemPalletMeasuredAndValid(shippingItemPallet, SelectedShippingItem!.IsMeasurable);
private async Task HandleValidSubmit() private async Task HandleValidSubmit()
{ {

View File

@ -1,6 +1,136 @@
@page "/MeasuringOut" @page "/MeasuringOut"
@using AyCode.Utils.Extensions
@using FruitBank.Common.Dtos
@using FruitBank.Common.Entities
@using FruitBankHybrid.Shared.Services
<h3>Kimenő mérés</h3> <h3>Kimenő mérés</h3>
<div style="margin-top: 50px;">
<DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
<DxFormLayoutItem Caption="Átvétel dátuma" ColSpanMd="2" CaptionCssClass="@(SelectedOrder != null && _measuringDates.Where(x => MeasuringService.DaysEqual(x.DateTime, SelectedOrder.DateOfReceipt)).All(x => x.IsMeasured) ? "text-success" : "")">
<DxDateEdit CssClass="cw-320"
DisplayFormat="m"
Format="m"
Context="ctxOrderDate"
Date="@(SelectedOrder?.DateOfReceipt.Date ?? DateTime.Now.Date)"
CustomDisabledDate="@OnCustomDisabledMeasuringDate"
DateChanged="@((DateTime newValue) => OnMeasuringDateChanged(newValue))"
InputId="deDisabledDates">
<DayCellTemplate>
@{
var cssClass = GetMeasuringDateCssClassNames(ctxOrderDate);
if (!cssClass.IsNullOrWhiteSpace())
{
<a class="@GetMeasuringDateCssClassNames(ctxOrderDate)">@ctxOrderDate.Day.ToString()</a>
}
else
{
<a>@ctxOrderDate.Day.ToString()</a>
}
}
</DayCellTemplate>
</DxDateEdit>
</DxFormLayoutItem>
<DxFormLayoutItem Caption="Átvétel időpontja:" ColSpanMd="2" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
<DxComboBox Data="@SelectedDayOrders"
@bind-Value="@SelectedOrder"
Text="Válasszon időpontot..."
ValueFieldName="@nameof(OrderDto.Id)"
TextFieldName="@nameof(OrderDto.DateOfReceipt)"
CssClass="cw-480"
Context="ctxOrder"
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<OrderDto> args) => OnSelectedOrderChanged(args))"
InputId="cbOrders">
<ItemDisplayTemplate>
<span class="@(ctxOrder.DataItem.IsMeasured ? "text-success" : "")">@ctxOrder.DisplayText</span>
</ItemDisplayTemplate>
</DxComboBox>
</DxFormLayoutItem>
@*<DxFormLayoutItem Caption="Partner:" ColSpanMd="3" CaptionCssClass="@(SelectedShippingDocument?.IsAllMeasured == true ? "text-success" : "")">
<DxComboBox Data="@SelectedShipping?.ShippingDocuments"
@bind-Value="@SelectedShippingDocument"
Text="Select partner"
ValueFieldName="@nameof(ShippingDocument.Id)"
TextFieldName="@(nameof(ShippingDocument.Partner) + '.' + nameof(Partner.Name))"
CssClass="cw-480"
Context="ctxShippingDocument"
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingDocument> args) => OnSelectedShippingDocumentChanged(args))"
InputId="cbShippingDocument">
<ItemDisplayTemplate>
<span class="@(ctxShippingDocument.DataItem.IsAllMeasured ? "text-success" : "")">@ctxShippingDocument.DisplayText</span>
</ItemDisplayTemplate>
</DxComboBox>
</DxFormLayoutItem>
<DxFormLayoutItem Caption="Termék:" ColSpanMd="5" CaptionCssClass="@(SelectedShippingItem?.IsMeasured == true ? "text-success" : "")">
<DxComboBox Data="@SelectedShippingDocument?.ShippingItems"
@bind-Value="@SelectedShippingItem"
Text="Select item"
ValueFieldName="@nameof(ShippingItem.Id)"
TextFieldName="@(nameof(ShippingItem.Name))"
CssClass="cw-480"
Context="ctxShippingitem"
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingItem> args) => OnSelectedShippingItemChanged(args))"
InputId="cbShippingItem">
<ItemDisplayTemplate>
<span class="@(ctxShippingitem.DataItem.IsMeasured ? "text-success" : "")">@ctxShippingitem.DisplayText)</span>
</ItemDisplayTemplate>
</DxComboBox>
</DxFormLayoutItem> *@
</DxFormLayout>
<div style="margin-top: 50px;">
<DxAccordion Data="@SelectedOrder?.OrderItemDtos"
ExpandMode="AccordionExpandMode.Single"
ExpandCollapseAction="AccordionExpandCollapseAction.HeaderClick"
AnimationType="LayoutAnimationType.Slide">
<DataMappings>
<DxAccordionDataMapping Text="ProductName" Children="OrderItemPallets"></DxAccordionDataMapping>
<DxAccordionDataMapping Text="OrderItemId" Level="1"></DxAccordionDataMapping>
</DataMappings>
<ItemHeaderTextTemplate>
@{
string text = "empty";
if (context.Level == 0)
{
text = ((OrderItemDto)(context.DataItem)).ProductName + " dfgdfsg";
}
else if (context.Level == 1)
{
text = ((OrderItemPallet)(context.DataItem)).OrderItemId.ToString() + " dfgdfsg";
}
}
<span>@text</span>
</ItemHeaderTextTemplate>
</DxAccordion>
@* <DxAccordionItem>
<ContentTemplate>
<div class="py-3 px-3" tabindex="0">
aaa
@(((OrderItemPallet)context.DataItem).Id.ToString())
</div>
</ContentTemplate>
</DxAccordionItem>
*@
@* <DxAccordion Data="@Data"
ShowFilterPanel="true"
RootItemExpandButtonDisplayMode="AccordionExpandButtonDisplayMode.End"
SubItemExpandButtonIconCssClass="accordion-icon icon-square-plus"
SubItemCollapseButtonIconCssClass="accordion-icon icon-square-minus">
<DataMappings>
<DxAccordionDataMapping Text="Name"
Key="Id"
ParentKey="CategoryId"/>
</DataMappings>
</DxAccordion>
*@
</div>
</div>
@code { @code {
} }

View File

@ -1,5 +1,11 @@
using AyCode.Core.Loggers; using AyCode.Core.Loggers;
using DevExpress.Blazor;
using FruitBank.Common.Dtos;
using FruitBank.Common.Entities;
using FruitBank.Common.Models; using FruitBank.Common.Models;
using FruitBankHybrid.Shared.Models;
using FruitBankHybrid.Shared.Services;
using FruitBankHybrid.Shared.Services.Loggers;
using FruitBankHybrid.Shared.Services.SignalRs; using FruitBankHybrid.Shared.Services.SignalRs;
using Mango.Nop.Core.Loggers; using Mango.Nop.Core.Loggers;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
@ -18,5 +24,70 @@ namespace FruitBankHybrid.Shared.Pages
[Inject] public required LoggedInModel LoggedInModel { get; set; } [Inject] public required LoggedInModel LoggedInModel { get; set; }
private ILogger _logger = null!; private ILogger _logger = null!;
private string _errorText;
private List<OrderDto> SelectedDayOrders { get; set; } = null!;
private OrderDto? SelectedOrder { get; set; }
private OrderItemDto? SelectedOrderItem { get; set; }
private List<MeasuringDateSelectorModel> _measuringDates = null!;
protected override async Task OnInitializedAsync()
{
_logger = new LoggerClient<MeasuringOut>(LogWriters.ToArray());
_logger.Info("OnInitializedAsync");
await RefreshOrdersFromDb(DateTime.Now);
await base.OnInitializedAsync();
}
private async Task RefreshOrdersFromDb(DateTime dateTime)
{
var orders = await FruitBankSignalRClient.GetPendingOrderDtos() ?? [];
_measuringDates = orders.Select(order => new MeasuringDateSelectorModel(order.Id, order.DateOfReceipt, order.IsMeasured)).ToList();
SelectedDayOrders = orders.Where(order => MeasuringService.DaysEqual(order.DateOfReceipt, dateTime)).ToList();
SelectedOrder = SelectedDayOrders.FirstOrDefault();
foreach (var order in SelectedDayOrders)
{
foreach (var orderItem in order.OrderItemDtos.Where(orderItem => orderItem.OrderItemPallets.Count == 0))
{
orderItem.OrderItemPallets.Add(new OrderItemPallet
{
OrderItemId = orderItem.Id,
//OrderItem = orderItem,
});
orderItem.OrderItemPallets.Add(new OrderItemPallet
{
OrderItemId = orderItem.Id,
//OrderItem = orderItem,
});
}
}
}
private async Task OnMeasuringDateChanged(DateTime selectedDateTime)
=> await RefreshOrdersFromDb(selectedDateTime);
private void OnCustomDisabledMeasuringDate(CalendarCustomDisabledDateEventArgs args)
=> MeasuringService.OnCustomDisabledDate(args, _measuringDates);
private string GetMeasuringDateCssClassNames(DateTime date)
=> MeasuringService.GetShippingDateCssClassNames(date, _measuringDates);
private string GetOrderItemPalletsCssClassNames(string fieldName, OrderItemPallet orderItemPallet)
=> MeasuringService.GetCustomItemPalletsCssClassNames(fieldName, orderItemPallet, SelectedOrderItem!.IsMeasurable);
private bool IsOrderItemPalletMeasuredAndValid(OrderItemPallet orderItemPallet)
=> MeasuringService.IsCustomItemPalletMeasuredAndValid(orderItemPallet, SelectedOrderItem!.IsMeasurable);
private void OnSelectedOrderChanged(SelectedDataItemChangedEventArgs<OrderDto> eventArgs)
{
//SelectedOrderItem = eventArgs.DataItem?.OrderItemDtos?.FirstOrDefault();
}
} }
} }

View File

@ -0,0 +1,57 @@
using DevExpress.Blazor;
using FruitBank.Common.Entities;
using FruitBankHybrid.Shared.Models;
namespace FruitBankHybrid.Shared.Services;
public class MeasuringService
{
public static bool DaysEqual(DateTime date1, DateTime date2)
=> (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
public static void OnCustomDisabledDate(CalendarCustomDisabledDateEventArgs args, List<MeasuringDateSelectorModel> measuringDates)
=> args.IsDisabled = !measuringDates.Exists(shippingDateModel => DaysEqual(shippingDateModel.DateTime, args.Date));
public static string GetShippingDateCssClassNames(DateTime date, List<MeasuringDateSelectorModel> measuringDates)
{
if (measuringDates.Exists(shipping => !shipping.IsMeasured && shipping.DateTime.Date <= DateTime.Now.Date && DaysEqual(shipping.DateTime, date)))
return "fw-bold text-danger";
if (measuringDates.Exists(shipping => shipping.IsMeasured && DaysEqual(shipping.DateTime, date)))
return "fw-bold text-success";
if (measuringDates.Exists(shipping => !shipping.IsMeasured && DaysEqual(shipping.DateTime, date)))
return "fw-bold";
return string.Empty;
}
public static string GetCustomItemPalletsCssClassNames(string fieldName, MeasuringItemPalletBase shippingItemPallet, bool isMeasurable)
{
//if (shippingItemPallet.NetWeight < 0) return "text-danger";
switch (fieldName)
{
case nameof(ShippingItemPallet.TareWeight):
return IsCustomItemPalletMeasuredAndValid(shippingItemPallet, isMeasurable) ? "text-success" : (shippingItemPallet.TareWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : "");
break;
case nameof(ShippingItemPallet.PalletWeight):
return IsCustomItemPalletMeasuredAndValid(shippingItemPallet, isMeasurable) ? "text-success" : (shippingItemPallet.PalletWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : "");
break;
case nameof(ShippingItemPallet.Quantity):
return IsCustomItemPalletMeasuredAndValid(shippingItemPallet, isMeasurable) ? "text-success" : (shippingItemPallet.Quantity < 0 ? "text-danger" : "");
break;
case nameof(ShippingItemPallet.GrossWeight):
return IsCustomItemPalletMeasuredAndValid(shippingItemPallet, isMeasurable) ? "text-success" : (shippingItemPallet.GrossWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : "");
break;
case nameof(ShippingItemPallet.NetWeight):
return IsCustomItemPalletMeasuredAndValid(shippingItemPallet, isMeasurable) ? "text-success" : (shippingItemPallet.NetWeight < 0 ? "text-danger" : "");
break;
}
return string.Empty;
}
public static bool IsCustomItemPalletMeasuredAndValid(MeasuringItemPalletBase customItemPallet, bool isMeasurable)
=> customItemPallet.IsMeasuredAndValid(isMeasurable);
}

View File

@ -133,6 +133,10 @@ namespace FruitBankHybrid.Shared.Services.SignalRs
public Task<List<OrderDto>?> GetPendingOrderDtos() public Task<List<OrderDto>?> GetPendingOrderDtos()
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetPendingOrderDtos); => GetAllAsync<List<OrderDto>>(SignalRTags.GetPendingOrderDtos);
public Task<List<OrderDto>?> GetAllByIds(int[] orderIds)
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetAllByIdList, [orderIds]);
#endregion Orders #endregion Orders
} }
} }