using GB5Shared.DTO.Ice; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using IceImportDAL.DTO.IceImportPipeline; using IceImportDAL.Query.IceMapValidationRule; namespace IceImportBLL.Validators; // Key="IFSC_BANKBRANCH" — always registered (DI-scanned like every IRowValidator) but inert unless // the pipeline is told to invoke it for a given IceMap: that opt-in check reads // MICEMAPVALIDATIONRULE via IIceMapValidationRuleDAL.GetEnabledValidatorKeysAsync (see // IceImportPipeline.ValidateAsync). Never runs for a map that hasn't explicitly opted in. public class IfscBankBranchValidator : IRowValidator { public string Key => "IFSC_BANKBRANCH"; private readonly IQueryExecutor _qe; public IfscBankBranchValidator(IQueryExecutor qe) => _qe = qe; public async Task> ValidateAsync( MappedEntityRowDTO row, IceMapDTO mapDefinition, ParsedImportDataSetDTO parsedData, LoginDTO login, CancellationToken ct) { var errors = new List(); // Looks for a resolved field literally named "IFSC" — the IceMap admin must map some // source column to a destination member named IFSC for this opt-in validator to apply. var ifscEntry = row.Fields.FirstOrDefault( kvp => string.Equals(kvp.Key, "IFSC", StringComparison.OrdinalIgnoreCase)); var ifsc = ifscEntry.Value?.ToString(); if (string.IsNullOrWhiteSpace(ifsc)) return errors; var count = await _qe.ExecuteScalarAsync( login, IceMapValidationRuleQB.EXISTS_IFSC, new { Ifsc = ifsc }, cancellationToken: ct) .ConfigureAwait(false); if (count == 0) { errors.Add(new IceImportFieldErrorDTO { RowNumber = row.RowNumber, EntityCode = row.EntityCode, FieldName = "IFSC", Message = $"IFSC code '{ifsc}' was not found in MBANKBRANCH.", Severity = IceImportSeverity.Error }); } return errors; } }