diff --git a/.claude/settings.local.json b/.claude/settings.local.json index dc5d2c9a..d1ba595c 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -73,7 +73,8 @@ "WebFetch(domain:www.ekaer-feladas.hu)", "WebFetch(domain:net.jogtar.hu)", "WebFetch(domain:www.itrack.hu)", - "WebFetch(domain:docplayer.hu)" + "WebFetch(domain:docplayer.hu)", + "WebFetch(domain:supportcenter.devexpress.com)" ] } } diff --git a/FruitBank.Common/Entities/ShippingDocument.cs b/FruitBank.Common/Entities/ShippingDocument.cs index e75ff104..56ff0450 100644 --- a/FruitBank.Common/Entities/ShippingDocument.cs +++ b/FruitBank.Common/Entities/ShippingDocument.cs @@ -15,6 +15,7 @@ public sealed class ShippingDocument : MgEntityBase, IShippingDocument { public int PartnerId { get; set; } public int? ShippingId { get; set; } + public int? PartnerDepotId { get; set; } public string DocumentIdNumber { get; set; } public string PdfFileName { get; set; } @@ -32,6 +33,12 @@ public sealed class ShippingDocument : MgEntityBase, IShippingDocument [Association(ThisKey = nameof(PartnerId), OtherKey = nameof(Partner.Id), CanBeNull = true)] public Partner? Partner { get; set; } + // Csak az EKÁER felrakodási címhez kell. SZÁNDÉKOSAN nincs benne semelyik alapértelmezett loadRelations-ben: + // kizárólag a generálás/reconciliation kéri explicit `LoadWith(sd => sd.PartnerDepot)`-tal, így a többi + // lekérdezést/sorosítást nem terheli (betöltetlenül null marad). Legacy szállítólevélnél PartnerDepotId = null. + [Association(ThisKey = nameof(PartnerDepotId), OtherKey = nameof(PartnerDepot.Id), CanBeNull = true)] + public PartnerDepot? PartnerDepot { get; set; } + [Association(ThisKey = nameof(Id), OtherKey = nameof(ShippingItem.ShippingDocumentId), CanBeNull = true)] public List? ShippingItems { get; set; } diff --git a/FruitBank.Common/Interfaces/IShippingDocument.cs b/FruitBank.Common/Interfaces/IShippingDocument.cs index 7a8a997d..cdc12125 100644 --- a/FruitBank.Common/Interfaces/IShippingDocument.cs +++ b/FruitBank.Common/Interfaces/IShippingDocument.cs @@ -9,7 +9,8 @@ public interface IShippingDocument: IEntityInt, ITimeStampInfo//, IMeasured { public int PartnerId { get; set; } public int? ShippingId { get; set; } - + public int? PartnerDepotId { get; set; } + public string DocumentIdNumber { get; set; } public string PdfFileName { get; set; } diff --git a/FruitBank.Common/Services/Ekaer/ShippingToEkaerMapper.cs b/FruitBank.Common/Services/Ekaer/ShippingToEkaerMapper.cs index c8044da9..44b6d51b 100644 --- a/FruitBank.Common/Services/Ekaer/ShippingToEkaerMapper.cs +++ b/FruitBank.Common/Services/Ekaer/ShippingToEkaerMapper.cs @@ -147,8 +147,9 @@ public sealed class ShippingToEkaerMapper : IShippingToEkaerMapper LoadLocation = company.Site, UnloadLocation = BuildCustomerLocation(customer), Lines = lines, - // Kimenőnél a VEVŐ veszi át / viszi el az árut → ő a fuvarozó. - CarrierName = customer?.Company, + // Kimenőnél NEM töltjük a szállítmányozót: a vevő maga viszi el, és a vevő MÁR a címzett (destinationName) — + // külön fuvarozót nem tartunk nyilván; a carrierText opcionális (a NAV nem követeli) → üresen hagyjuk. + CarrierName = null, // A vonó jármű (rendszám) a customer-hez még nincs bekötve → üresen marad, a felrakodás megkezdéséig pótolandó // (a validátor warningolja). Amint bekötik, a Vehicle is innen jön. }; diff --git a/FruitBankHybrid.Shared/Components/GridShippingDocument.razor b/FruitBankHybrid.Shared/Components/GridShippingDocument.razor index c8cdbd3d..c8e55b8e 100644 --- a/FruitBankHybrid.Shared/Components/GridShippingDocument.razor +++ b/FruitBankHybrid.Shared/Components/GridShippingDocument.razor @@ -1,4 +1,4 @@ -@using AyCode.Blazor.Components.Components.Grids +@using AyCode.Blazor.Components.Components.Grids @using AyCode.Utils.Extensions @using FruitBank.Common.Dtos @using FruitBank.Common.Entities @@ -26,24 +26,65 @@ - - - - - - - - - + + @{ + var sdPd = (ShippingDocument)context.DataItem; + @(PartnersDictById.GetValueOrDefault(sdPd.PartnerId)?.Name) + } + + + @{ + var sdPe = (ShippingDocument)context.EditModel; + } + + + + + + + + - + + + @{ + var sdD = (ShippingDocument)context.DataItem; + var depotD = PartnersDictById.GetValueOrDefault(sdD.PartnerId)?.PartnerDepots?.FirstOrDefault(d => d.Id == sdD.PartnerDepotId); + +
@depotD?.Name
+ } +
+ + @{ + var sdE = (ShippingDocument)context.EditModel; + var depotsE = PartnersDictById.GetValueOrDefault(sdE.PartnerId)?.PartnerDepots ?? new List(); + } + + + + + + + +
+ _logger = null!; private int _activeTabIndex; - protected override async Task OnInitializedAsync() + // Partner-lookup ID szerint a cella-templatekhez (a ReloadDataFromDb tölti) — renderenkénti lineáris keresés helyett. + private Dictionary PartnersDictById = new(); + + protected override async Task OnInitializedAsync() { _logger = new LoggerClient(LogWriters.ToArray()); @@ -223,9 +267,13 @@ { if (Shippings == null && ParentDataItem is Shipping shippingParent) Shippings = [shippingParent]; if (Partners == null && ParentDataItem is Partner partnerParent) Partners = [partnerParent]; - return; } + // Partner-lookup ID szerint a cella-templatekhez (O(1) a renderenkénti FirstOrDefault helyett), a Partners véglegesülése után. + PartnersDictById = Partners?.ToDictionary(p => p.Id) ?? new(); + + if (!IsMasterGrid) return; + if (Grid == null) return; using (await ObjectLock.GetSemaphore().UseWaitAsync()) @@ -269,6 +317,16 @@ EditItemsEnabled = true; } + // Cascade: a Partner-combo ValueChanged-je. Beírjuk az új partnert; ha a partnernek PONTOSAN EGY telephelye van, + // arra auto-állunk, különben nullázzuk (a régi nem az új partneré); majd újrarenderelünk → a Telephely-combo frissül. + void OnPartnerChanged(ShippingDocument sd, int partnerId) + { + sd.PartnerId = partnerId; + var depots = PartnersDictById.GetValueOrDefault(partnerId)?.PartnerDepots; + sd.PartnerDepotId = depots?.Count == 1 ? depots[0].Id : null; + StateHasChanged(); + } + protected async Task OnActiveTabChanged(int activeTabIndex) { _activeTabIndex = activeTabIndex; diff --git a/FruitBankHybrid.Shared/Pages/Ekaer.razor b/FruitBankHybrid.Shared/Pages/Ekaer.razor index 3ccbae1a..cf949742 100644 --- a/FruitBankHybrid.Shared/Pages/Ekaer.razor +++ b/FruitBankHybrid.Shared/Pages/Ekaer.razor @@ -20,7 +20,7 @@ - + diff --git a/FruitBankHybrid.Shared/Pages/Ekaer.razor.cs b/FruitBankHybrid.Shared/Pages/Ekaer.razor.cs index 8c7a66bb..eb3c769b 100644 --- a/FruitBankHybrid.Shared/Pages/Ekaer.razor.cs +++ b/FruitBankHybrid.Shared/Pages/Ekaer.razor.cs @@ -58,8 +58,8 @@ public partial class Ekaer : ComponentBase { try { - //_needsCompletionCount = await FruitBankSignalRClient.GetEkaerHistoryCount(EkaerHistoryFilter.NeedsCompletion); - _needsCompletionCount = await FruitBankSignalRClient.GetEkaerHistoryCount(EkaerHistoryFilter.ToSubmit); + _needsCompletionCount = await FruitBankSignalRClient.GetEkaerHistoryCount(EkaerHistoryFilter.NeedsCompletion); + //_needsCompletionCount = await FruitBankSignalRClient.GetEkaerHistoryCount(EkaerHistoryFilter.ToSubmit); StateHasChanged(); } catch (Exception ex)