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 PayrollDAL.DTO.AdditionDeductionDetail; using PayRollDAL.CustomeCode.AdditionDeductionDetail; using System.ComponentModel.DataAnnotations; namespace PayRollBLL.AdditionDeductionDetail { public class AdditionDeductionDetailBLL : IAdditionDeductionDetailBLL { private readonly IAdditionDeductionDetailDAL _additionDeductionDetailDAL; private readonly AutoNumber _autoNumber; private readonly IValidation _validation; public AdditionDeductionDetailBLL( IAdditionDeductionDetailDAL additionDeductionDetailDAL, AutoNumber autoNumber, IValidation validation) { _additionDeductionDetailDAL = additionDeductionDetailDAL; _autoNumber = autoNumber; _validation = validation; } public async Task GetAdditionDeductionDetail(int additionDeductionDetailId, LoginDTO loginDTO) { try { return await _additionDeductionDetailDAL.GetAdditionDeductionDetail(additionDeductionDetailId, loginDTO); } catch (Exception) { throw; } } public async Task SaveAdditionDeductionDetail(AdditionDeductionDetailDTO additionDeductionDetailDTO, LoginDTO loginDTO) { if (additionDeductionDetailDTO == null) throw new ArgumentNullException(nameof(additionDeductionDetailDTO)); AutoNumberDTO? autoNumberDTO = null; try { await _validation.NotEmpty(additionDeductionDetailDTO.AdditionDeductionDetailFieldCode, nameof(additionDeductionDetailDTO.AdditionDeductionDetailFieldCode)); additionDeductionDetailDTO.AdditionDeductionDetailModifiedById = loginDTO.UserId; additionDeductionDetailDTO.AdditionDeductionDetailModifiedOn = DateTime.UtcNow; additionDeductionDetailDTO.AdditionDeductionDetailSourceType = loginDTO.SourceType; if (additionDeductionDetailDTO.AdditionDeductionDetailId == 0) { autoNumberDTO = await _autoNumber.GetAutoNumber(1, "AdditionDeductionDetail", loginDTO); additionDeductionDetailDTO.AdditionDeductionDetailId = autoNumberDTO.StartNumber; additionDeductionDetailDTO.AdditionDeductionDetailCreatedById = loginDTO.UserId; additionDeductionDetailDTO.AdditionDeductionDetailCreatedOn = DateTime.UtcNow; await _additionDeductionDetailDAL.SaveAdditionDeductionDetail(additionDeductionDetailDTO, loginDTO); return $"{SuccessResponse.SaveSuccessMessage} {additionDeductionDetailDTO.AdditionDeductionDetailId}"; } else { await _additionDeductionDetailDAL.UpdateAdditionDeductionDetail(additionDeductionDetailDTO, loginDTO); return $"{SuccessResponse.UpdateSuccessMessage} {additionDeductionDetailDTO.AdditionDeductionDetailId}"; } } catch (ValidationException vex) { throw new Exception(vex.Message); } catch (Exception) { if (autoNumberDTO != null && additionDeductionDetailDTO.AdditionDeductionDetailId > 0) { await _autoNumber.RollbackAutoNumber("AdditionDeductionDetail", additionDeductionDetailDTO.AdditionDeductionDetailId, loginDTO); } throw; } } public async Task DeleteAdditionDeductionDetail(int additionDeductionDetailId, LoginDTO loginDTO) { try { return await _additionDeductionDetailDAL.DeleteAdditionDeductionDetail(additionDeductionDetailId, loginDTO); } catch (Exception) { throw; } } public async Task GetSelectListAdditionDeductionDetail( int firstNumber, int maxResult, CriteriaDTO criteriaDTO, LoginDTO loginDTO, bool isCount = false) { try { if (firstNumber == 0 && maxResult == 0) { firstNumber = 0; maxResult = 10; } return await _additionDeductionDetailDAL.GetSelectListAdditionDeductionDetail( firstNumber, maxResult, criteriaDTO, loginDTO, isCount); } catch (Exception ex) { throw new Exception($"Error in GetSelectListAdditionDeductionDetail BLL: {ex.Message}", ex); } } public async Task GetAdditionDeductionDetailListAsync( int firstNumber, int maxResult, CriteriaDTO criteriaDTO, LoginDTO loginDTO, bool isCount = false) { try { (int validatedFirstNumber, int validatedMaxResult) = ValidatePagination(firstNumber, maxResult); return await _additionDeductionDetailDAL.GetAdditionDeductionDetailListAsync( validatedFirstNumber, validatedMaxResult, criteriaDTO, loginDTO, isCount); } catch (Exception ex) { throw new Exception($"Error in GetAdditionDeductionDetailListAsync BLL: {ex.Message}", ex); } } private (int FirstNumber, int MaxResult) ValidatePagination(int firstNumber, int maxResult) { if (firstNumber == -1 && maxResult == -1) return (firstNumber, maxResult); int validatedFirstNumber = firstNumber < -1 ? -1 : firstNumber; int validatedMaxResult = maxResult < -1 ? -1 : maxResult; const int MAX_RECORDS = 1000; if (validatedMaxResult > MAX_RECORDS) validatedMaxResult = MAX_RECORDS; return (validatedFirstNumber, validatedMaxResult); } } }