From ad7d5813cb70b86aa569a49de47f14229d0c5f67 Mon Sep 17 00:00:00 2001 From: Loretta Date: Fri, 12 Jun 2026 09:00:26 +0200 Subject: [PATCH] =?UTF-8?q?EK=C3=81ER:=20add=20warning/error=20distinction?= =?UTF-8?q?,=20status,=20and=20filters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Validation now distinguishes blocking errors from warnings; only errors block submission, warnings are shown but allow progress. - Introduced EkaerSeverity, EkaerValidationMessage, and severity-aware extensions for validation results. - Extended EkaerHistory.Status with GeneratedWithWarning and SentWithMissingData; added EkaerStatusExtensions for status categorization. - Added EkaerHistoryFilter for server-side filtering; updated SignalR and controller interfaces accordingly. - UI now displays error/warning messages with color/icons, supports new status tabs/filters, and restricts XML copying to submittable records. - Refactored validation and error handling to use new severity logic; updated comments and minor code for clarity. --- .../Nav/Ekaer/EkaerSubmitService.cs | 5 ++- .../Nav/Ekaer/EkaerTradeCardValidator.cs | 10 +++-- .../Nav/Ekaer/EkaerValidationMessage.cs | 37 +++++++++++++++++++ 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 AyCode.Services/Nav/Ekaer/EkaerValidationMessage.cs diff --git a/AyCode.Services/Nav/Ekaer/EkaerSubmitService.cs b/AyCode.Services/Nav/Ekaer/EkaerSubmitService.cs index 0b23a30..3954287 100644 --- a/AyCode.Services/Nav/Ekaer/EkaerSubmitService.cs +++ b/AyCode.Services/Nav/Ekaer/EkaerSubmitService.cs @@ -22,9 +22,10 @@ public sealed class EkaerSubmitService : IEkaerSubmitService { ArgumentNullException.ThrowIfNull(operations); - // 1) Validáció — bármilyen hiba esetén NEM küldünk; a teljes hibalistát visszaadjuk. + // 1) Validáció — csak BLOKKOLÓ (error) szintű hiba esetén NEM küldünk; a warning (pl. hiányzó rendszám, + // ami a felrakodásig pótolható) nem blokkol. A teljes üzenetlistát visszaadjuk (warningostul). var errors = _validator.Validate(operations); - if (errors.Count > 0) + if (errors.HasErrors()) return EkaerSubmitResult.Invalid(errors); // 2) Request összeállítás. A Header/User példányt itt kell létrehozni (a generált ctor csak a diff --git a/AyCode.Services/Nav/Ekaer/EkaerTradeCardValidator.cs b/AyCode.Services/Nav/Ekaer/EkaerTradeCardValidator.cs index bbacb86..97aa306 100644 --- a/AyCode.Services/Nav/Ekaer/EkaerTradeCardValidator.cs +++ b/AyCode.Services/Nav/Ekaer/EkaerTradeCardValidator.cs @@ -84,7 +84,9 @@ public sealed class EkaerTradeCardValidator : IEkaerTradeCardValidator } // 3) Üzleti szabályok (az XSD nem jelöli [Required]-ként, de a NAV megköveteli). - if (tradeCard.Vehicle is null) errors.Add(Error($"{path}.vehicle", "a vonó jármű (rendszám) kötelező — rendszám nélkül a NAV elutasítja a bejelentést")); + // A rendszám a NAV-nál legkésőbb a felrakodás megkezdéséig pótolható — a bejelentéskor NEM kötelező, + // ezért hiánya WARNING (a bejelentés beküldhető), nem blokkoló error. Lásd EKAER_OPERATIONS.md (create→finalize). + if (tradeCard.Vehicle is null) errors.Add(Warning($"{path}.vehicle", "a vonó jármű (rendszám) hiányzik — legkésőbb a felrakodás megkezdéséig pótolandó")); if (tradeCard.Items.Count == 0) errors.Add(Error($"{path}.items", "legalább egy tétel szükséges")); RequireText(tradeCard.SellerName, $"{path}.sellerName", "a feladó (eladó) neve kötelező", errors); @@ -117,7 +119,7 @@ public sealed class EkaerTradeCardValidator : IEkaerTradeCardValidator Validator.TryValidateProperty(property.GetValue(instance), context, local); foreach (var result in local) - errors.Add(new ValidationResult($"{path}.{property.Name}: {result.ErrorMessage}", result.MemberNames)); + errors.Add(new EkaerValidationMessage(EkaerSeverity.Error, $"{path}.{property.Name}: {result.ErrorMessage}")); } } @@ -127,5 +129,7 @@ public sealed class EkaerTradeCardValidator : IEkaerTradeCardValidator errors.Add(Error(path, message)); } - private static ValidationResult Error(string path, string message) => new($"{path}: {message}"); + private static EkaerValidationMessage Error(string path, string message) => new(EkaerSeverity.Error, $"{path}: {message}"); + + private static EkaerValidationMessage Warning(string path, string message) => new(EkaerSeverity.Warning, $"{path}: {message}"); } diff --git a/AyCode.Services/Nav/Ekaer/EkaerValidationMessage.cs b/AyCode.Services/Nav/Ekaer/EkaerValidationMessage.cs new file mode 100644 index 0000000..a2cf304 --- /dev/null +++ b/AyCode.Services/Nav/Ekaer/EkaerValidationMessage.cs @@ -0,0 +1,37 @@ +using System.ComponentModel.DataAnnotations; + +namespace AyCode.Services.Nav.Ekaer; + +/// Az EKÁER validációs üzenet súlyossága. +public enum EkaerSeverity +{ + /// Nem blokkoló — a bejelentés beküldhető, de valamit pótolni kell (pl. a rendszám a felrakodásig). + Warning, + + /// Blokkoló — a NAV elutasítaná; beküldés előtt javítandó. + Error, +} + +/// +/// Súlyossággal (warning/error) bővített validációs eredmény. A -ból származik, +/// így a meglévő fogyasztók (akik csak az ErrorMessage-et használják) változatlanul működnek; aki a +/// szintet is akarja, a -t / a GetSeverity() kiterjesztést használja. +/// +public sealed class EkaerValidationMessage(EkaerSeverity severity, string message) : ValidationResult(message) +{ + public EkaerSeverity Severity { get; } = severity; +} + +/// Súlyosság-segédek a validációs eredmény-listához. +public static class EkaerValidationExtensions +{ + /// A súlyosság; egy sima (nem ) eredmény konzervatívan . + public static EkaerSeverity GetSeverity(this ValidationResult result) + => result is EkaerValidationMessage m ? m.Severity : EkaerSeverity.Error; + + /// Van-e blokkoló (error) szintű üzenet — ennek alapján NEM küldhető a bejelentés. + public static bool HasErrors(this IEnumerable results) => results.Any(r => r.GetSeverity() == EkaerSeverity.Error); + + /// Van-e warning szintű üzenet (a beküldést nem blokkolja, de pótlandó). + public static bool HasWarnings(this IEnumerable results) => results.Any(r => r.GetSeverity() == EkaerSeverity.Warning); +}