using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using PayRollBLL.Common; using PayRollDAL.CustomeCode.GratuityGroup; using PayRollDAL.DTO.GratuityGroup; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PayRollBLL.GratuityGroup { public class GratuityGroupBLL : IGratuityGroupBLL { private readonly IGratuityGroupDAL _GratuityGroupDAL; private readonly AutoNumber _AutoNumber; private readonly IQueryExecutor _QueryExecutor; private readonly IEntityValidationClient _EntityValidationClient; public GratuityGroupBLL( IGratuityGroupDAL IGratuityGroupDAL, AutoNumber autoNumber, IQueryExecutor queryExecutor, IEntityValidationClient entityValidationClient) { _GratuityGroupDAL = IGratuityGroupDAL; _AutoNumber = autoNumber; _QueryExecutor = queryExecutor; _EntityValidationClient = entityValidationClient; } public async Task GetSelectListGratuityGroup(int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO, bool IsCount = false) { try { return await _GratuityGroupDAL.GetSelectListGratuityGroup(FirstNumber, MaxResult, CriteriaDTO, LoginDTO, IsCount); } catch (Exception) { throw; } } // ── Get single record ───────────────────────────────────────────── public async Task GetGratuityGroup(int GratuityGroupId, LoginDTO LoginDTO) { return await _GratuityGroupDAL.GetGratuityGroup(GratuityGroupId, LoginDTO).ConfigureAwait(false); } // ── Save (insert or update) ─────────────────────────────────────── public async Task SaveGratuityGroup(GratuityGroupDTO GratuityGroupDTO, LoginDTO LoginDTO) { if (GratuityGroupDTO == null) throw new ArgumentNullException(nameof(GratuityGroupDTO)); // GB4 parity: ValidationSvc.ValidateGratuityGroup is called before the save is // attempted — if the validator says no, abort without touching the DAL/transaction. var (isValid, errorMessage) = await _EntityValidationClient .ValidateAsync("GratuityGroupBaseUri", GratuityGroupDTO, LoginDTO) .ConfigureAwait(false); if (!isValid) return errorMessage ?? "Gratuity group validation failed."; bool isNew = GratuityGroupDTO.GratuityGroupId == 0; AutoNumberDTO? autoNumberDTO = null; var trans = await _QueryExecutor.BeginTransactionAsync(LoginDTO).ConfigureAwait(false); try { if (isNew) { int count = 1 + (GratuityGroupDTO.GratuityGroupDetailArray?.Count ?? 0); autoNumberDTO = await _AutoNumber.GetNumberAsync(count, "GRATUITYGROUP", LoginDTO) .ConfigureAwait(false); GratuityGroupDTO.GratuityGroupId = autoNumberDTO.StartNumber; GratuityGroupDTO.GratuityGroupCreatedById = LoginDTO.UserId; GratuityGroupDTO.GratuityGroupCreatedOn = DateTime.UtcNow; if (GratuityGroupDTO.GratuityGroupDetailArray != null) { int tmpCount = 1; foreach (var detail in GratuityGroupDTO.GratuityGroupDetailArray) { detail.GratuityGroupDetailId = autoNumberDTO.StartNumber + tmpCount; detail.GratuityGroupId = GratuityGroupDTO.GratuityGroupId; tmpCount++; } } } GratuityGroupDTO.GratuityGroupModifiedById = LoginDTO.UserId; GratuityGroupDTO.GratuityGroupModifiedOn = DateTime.UtcNow; int rows = isNew ? await _GratuityGroupDAL.SaveGratuityGroup(GratuityGroupDTO, LoginDTO, trans).ConfigureAwait(false) : await _GratuityGroupDAL.UpdateGratuityGroup(GratuityGroupDTO, LoginDTO, trans).ConfigureAwait(false); await _QueryExecutor.CommitAsync(trans).ConfigureAwait(false); if (rows <= 0) return isNew ? "Failed to save gratuity group." : "Failed to update gratuity group."; return isNew ? $"Details Saved Successfully With Id :{GratuityGroupDTO.GratuityGroupId}" : $"Details Updated Successfully With Id :{GratuityGroupDTO.GratuityGroupId}"; } catch (Exception) { await _QueryExecutor.RollbackAsync(trans).ConfigureAwait(false); if (autoNumberDTO != null) await _AutoNumber.RollbackAutoNumber("GRATUITYGROUP", autoNumberDTO.StartNumber, LoginDTO) .ConfigureAwait(false); throw; } } // ── Delete ──────────────────────────────────────────────────────── public async Task DeleteGratuityGroup(int GratuityGroupId, LoginDTO LoginDTO) { return await _GratuityGroupDAL.DeleteGratuityGroup(GratuityGroupId, LoginDTO).ConfigureAwait(false); } // ── List ────────────────────────────────────────────────────────── public async Task GetGratuityGroupList(CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { try { return await _GratuityGroupDAL.GetGratuityGroupList(CriteriaDTO, LoginDTO) .ConfigureAwait(false); } catch (Exception) { throw; } } } }