using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.EntityHandler; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using PayRollDAL.CustomeCode.PayConfiguration; using PayRollDAL.DTO.PayConfiguration; using static GB5Shared.GB5Constant.Constant; namespace PayRollBLL.PayConfiguration { public class PayConfigurationBLL : IPayConfigurationBLL { private readonly IPayConfigurationDAL _payConfigurationDAL; private readonly AutoNumber _AutoNumber; private readonly IQueryExecutor _QueryExecutor; private readonly BaseEntityAppService _baseEntityAppService; public PayConfigurationBLL(IPayConfigurationDAL payConfigurationDAL, AutoNumber autoNumber, IQueryExecutor queryExecutor, BaseEntityAppService baseEntityAppService) { _payConfigurationDAL = payConfigurationDAL; _AutoNumber = autoNumber; _QueryExecutor = queryExecutor; _baseEntityAppService = baseEntityAppService; } public async Task GetSelectListPayConfiguration(int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO, bool IsCount) { try { return await _payConfigurationDAL.GetSelectListPayConfiguration(FirstNumber, MaxResult, CriteriaDTO, LoginDTO, IsCount); } catch (Exception) { throw; } } public async Task GetPayConfiguration(int PayConfigurationId, LoginDTO LoginDTO) { try { return await _payConfigurationDAL.GetPayConfiguration(PayConfigurationId, LoginDTO); } catch (Exception) { throw; } } public async Task SavePayConfiguration(PayConfigurationDTO PayConfigurationDTO, LoginDTO LoginDTO) { try { if (PayConfigurationDTO == null) throw new ArgumentNullException(nameof(PayConfigurationDTO)); bool isNew = PayConfigurationDTO.PayConfigurationId == 0; // Pre-Transaction: AutoNumber for header + each detail row (matches GB4: Count = 1 + DetailArray.Count) int count = 1 + PayConfigurationDTO.PayConfigurationDetailArray.Count; var autoNumber = await _AutoNumber.GetNumberAsync(count, "PAYCONFIGURATION", LoginDTO); var trans = await _QueryExecutor.BeginTransactionAsync(LoginDTO); try { await _baseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTPAYCONFIGURATION, EventTypeConstant.SAVEPAYCONFIGURATIONEVENTTYPEID, PayConfigurationDTO, LoginDTO, async tx => { if (isNew) { PayConfigurationDTO.PayConfigurationId = autoNumber.StartNumber; PayConfigurationDTO.PayConfigurationCreatedById = LoginDTO.UserId; PayConfigurationDTO.PayConfigurationCreatedOn = DateTime.UtcNow; } else { // GB4 delete-then-reinsert strategy for child detail rows on update await _payConfigurationDAL.DeletePayConfigurationDetail(PayConfigurationDTO.PayConfigurationId, LoginDTO, tx); } PayConfigurationDTO.PayConfigurationModifiedById = LoginDTO.UserId; PayConfigurationDTO.PayConfigurationModifiedOn = DateTime.UtcNow; int tmpCount = 1; foreach (var detail in PayConfigurationDTO.PayConfigurationDetailArray) { detail.PayConfigurationId = PayConfigurationDTO.PayConfigurationId; detail.PayConfigurationDetailId = autoNumber.StartNumber + tmpCount; tmpCount++; } if (isNew) { await _payConfigurationDAL.SavePayConfiguration(PayConfigurationDTO, LoginDTO, tx); } else { await _payConfigurationDAL.UpdatePayConfiguration(PayConfigurationDTO, LoginDTO, tx); } foreach (var detail in PayConfigurationDTO.PayConfigurationDetailArray) { await _payConfigurationDAL.SavePayConfigurationDetail(detail, LoginDTO, tx); } return PayConfigurationDTO.PayConfigurationId; }, null, -1, -1, trans, isNew); await _QueryExecutor.CommitAsync(trans); return isNew ? SuccessResponse.SaveSuccessMessage : SuccessResponse.UpdateSuccessMessage; } catch (Exception) { await _QueryExecutor.RollbackAsync(trans); throw; } } catch (Exception) { throw; } } } }