using AnalyticsDAL.CustomCode.AnalysisField; using AnalyticsDAL.DTO.Analysis; using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using GB5Shared.Validation; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AnalyticsBLL.AnalysisField { public class AnalysisFieldBLL : IAnalysisFieldBLL { private readonly IAnalysisFieldDAL _dal; private readonly AutoNumber _autoNumber; private readonly IValidation _validation; public AnalysisFieldBLL(IAnalysisFieldDAL dal, AutoNumber autoNumber, IValidation validation) { _dal = dal; _autoNumber = autoNumber; _validation = validation; } public async Task GetAnalysisFields(int AnalysisFieldsId, LoginDTO login, CancellationToken ct) => await _dal.GetAnalysisFields(AnalysisFieldsId, login, ct).ConfigureAwait(false); public async Task SaveAnalysisFields(AnalysisFieldsDTO dto, LoginDTO login, CancellationToken ct) { if (dto == null) throw new ArgumentNullException(nameof(dto)); AutoNumberDTO? autoNumberDTO = null; try { dto.AnalysisFieldsTenantId = login.ClientId; dto.AnalysisFieldsModifiedById = login.UserId; dto.AnalysisFieldsModifiedOn = DateTime.UtcNow; bool isNew = dto.AnalysisFieldsId == 0; // ✅ decide BEFORE changing ID if (isNew) { autoNumberDTO = await _autoNumber.GetNumberAsync(1, "MANALYSIS", login); dto.AnalysisFieldsId = autoNumberDTO.StartNumber; // ID changes here dto.AnalysisFieldsCreatedById = login.UserId; dto.AnalysisFieldsCreatedOn = DateTime.UtcNow; } // ✅ pass isNew to DAL await _dal.SaveAnalysisFields(dto, isNew, login, ct); return isNew ? $"{SuccessResponse.SaveSuccessMessage} {dto.AnalysisFieldsId}" : $"{SuccessResponse.UpdateSuccessMessage} {dto.AnalysisFieldsId}"; } catch { if (autoNumberDTO != null && dto.AnalysisFieldsId > 0) { await _autoNumber.RollbackAutoNumber("MANALYSIS", dto.AnalysisFieldsId, login); } throw; } } public async Task GetSelectListAnalysisFields(int analysisId, CriteriaDTO criteriaDTO, LoginDTO login, CancellationToken ct) => await _dal.GetSelectListAnalysisFields(analysisId, criteriaDTO, login, ct); public async Task DeleteAnalysisFields(int AnalysisFieldsId, LoginDTO loginDTO) { try { return await _dal.DeleteAnalysisFields(AnalysisFieldsId, loginDTO); } catch (Exception) { throw; } } } }