using GB5Shared.DTO.Framework.Login; using GB5Shared.Resource.Response; using Microsoft.Extensions.Logging; using TCMSBLL.Interfaces; using TCMSDAL.DTO; using TCMSDAL.Interfaces; namespace TCMSBLL.Implementations; /// /// Business logic for MTCMSPROJECT. /// Validates uniqueness of ProjectCode per tenant before save. /// public class TCMSProjectBLL : ITCMSProjectBLL { private readonly ITCMSProjectDAL _Dal; private readonly ILogger _Logger; public TCMSProjectBLL(ITCMSProjectDAL dal, ILogger logger) { _Dal = dal; _Logger = logger; } public async Task GetProjectAsync( int projectId, LoginDTO login, CancellationToken ct) => await _Dal.GetProjectAsync(projectId, login, ct).ConfigureAwait(false); public async Task> GetProjectListAsync( string? projectType, string? status, bool? isActive, LoginDTO login, CancellationToken ct) => await _Dal.GetProjectListAsync(projectType, status, isActive, login, ct).ConfigureAwait(false); public async Task> GetSelectListAsync( LoginDTO login, CancellationToken ct) => await _Dal.GetSelectListAsync(login, ct).ConfigureAwait(false); public async Task SaveProjectAsync( TCMSProjectDTO dto, LoginDTO login, CancellationToken ct) { try { // Validation if (string.IsNullOrWhiteSpace(dto.ProjectCode)) return "Project Code is required."; if (string.IsNullOrWhiteSpace(dto.ProjectName)) return "Project Name is required."; bool codeExists = await _Dal.CodeExistsAsync(dto.ProjectCode, dto.ProjectId > 0 ? dto.ProjectId : null, login, ct).ConfigureAwait(false); if (codeExists) return $"Project Code '{dto.ProjectCode}' already exists."; bool isNew = dto.ProjectId == 0; if (isNew) { int newId = await _Dal.SaveProjectAsync(dto, login, ct).ConfigureAwait(false); return $"{SuccessResponse.SaveSuccessMessage} {newId}"; } else { await _Dal.UpdateProjectAsync(dto, login, ct).ConfigureAwait(false); return SuccessResponse.UpdateSuccess; } } catch (Exception ex) { _Logger.LogError(ex, "SaveProject failed for code {Code}", dto.ProjectCode); throw; } } }