using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Logging; using GB5Shared.DTO.Framework.Login; using GB5Shared.EntityHandler; using GB5Shared.EventLogPublish; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using PayRollDAL.CustomeCode.EmiChangeRequest; using PayRollDAL.DTO.EmiChangeRequest; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; using System.Threading.Tasks; using static GB5Shared.GB5Constant.Constant; namespace PayRollBLL.EmiChangeRequest { public class EmiChangeRequestBLL : IEmiChangeRequestBLL { private readonly IEmiChangeRequestDAL _EmiChangeRequestDAL; private readonly AutoNumber _AutoNumber; private readonly IQueryExecutor _QueryExecutor; private readonly BaseEntityAppService _baseEntityAppService; private readonly VoucherNumberService _VoucherNumberService; public EmiChangeRequestBLL(IEmiChangeRequestDAL IEmiChangeRequestDAL, AutoNumber autoNumber, IQueryExecutor IQueryExecutor, BaseEntityAppService baseEntityAppService, VoucherNumberService voucherNumberService) { _EmiChangeRequestDAL = IEmiChangeRequestDAL; _AutoNumber = autoNumber; _QueryExecutor = IQueryExecutor; _baseEntityAppService = baseEntityAppService; _VoucherNumberService = voucherNumberService; } public async Task GetEmiChangeRequest(int EmiChangeRequestId, LoginDTO LoginDTO) { try { return await _EmiChangeRequestDAL.GetEmiChangeRequest(EmiChangeRequestId, LoginDTO); } catch (Exception) { throw; } } public async Task GetSelectListEmiChangeRequest(int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { try { return await _EmiChangeRequestDAL.GetSelectListEmiChangeRequest(FirstNumber, MaxResult, CriteriaDTO, LoginDTO); } catch (Exception ex) { throw new Exception("Error in GetSelectListEmiChangeRequest", ex); } } public async Task SaveEmiChangeRequest(EmiChangeRequestDTO EmiChangeRequestDTO, LoginDTO LoginDTO) { try { if (EmiChangeRequestDTO == null) throw new ArgumentNullException(nameof(EmiChangeRequestDTO)); bool isNew = EmiChangeRequestDTO.EmiChangeRequestId == 0; // Payroll already processed for this OU/PayPeriod/Employee — save/update not allowed int Count = await _EmiChangeRequestDAL.CheckSaveUpdationPossible( EmiChangeRequestDTO.OUId, EmiChangeRequestDTO.PayPeriodId, EmiChangeRequestDTO.EmployeeId, LoginDTO); if (Count > 0) throw new InvalidOperationException("Emi Change Request cannot be saved/updated - Payroll has already been processed for this Employee's Pay Period."); // EmiChangeRequestDate must fall within the selected Period's date range var PeriodRange = await _EmiChangeRequestDAL.GetPeriodDateRange(EmiChangeRequestDTO.EmiChangeRequestPeriodId, LoginDTO); if (EmiChangeRequestDTO.EmiChangeRequestDate < PeriodRange.FromDate || EmiChangeRequestDTO.EmiChangeRequestDate > PeriodRange.ToDate) throw new InvalidOperationException("EmiChangeRequest Date is not within the selected Period's date range."); // Pre-Transaction : Auto Number var EmiChangeRequestAutoNumber = await _AutoNumber.GetAutoNumber( 1, AUTONUMBERCONSTANT.EMICHANGEREQUEST, LoginDTO); var Trans = await _QueryExecutor.BeginTransactionAsync(LoginDTO); try { await _baseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTEMICHANGEREQUEST, EventTypeConstant.SAVEEMICHANGEREQUESTID, EmiChangeRequestDTO, LoginDTO, async tx => { if (isNew) { EmiChangeRequestDTO.EmiChangeRequestId = EmiChangeRequestAutoNumber.StartNumber; EmiChangeRequestDTO.EmiChangeRequestCreatedbyId = LoginDTO.UserId; EmiChangeRequestDTO.EmiChangeRequestCreatedOn = DateTime.UtcNow; string? GeneratedNumber = await _VoucherNumberService.GetNextVoucherNumberAsync( EmiChangeRequestDTO.BIZTransactionTypeId, EmiChangeRequestDTO.EmiChangeRequestDate, LoginDTO, tx); if (GeneratedNumber != null) EmiChangeRequestDTO.EmiChangeRequestNumber = GeneratedNumber; } EmiChangeRequestDTO.EmiChangeRequestModifiedbyId = LoginDTO.UserId; EmiChangeRequestDTO.EmiChangeRequestModifiedOn = DateTime.UtcNow; int Result; if (isNew) { Result = await _EmiChangeRequestDAL.SaveEmiChangeRequest(EmiChangeRequestDTO, LoginDTO, tx); } else { Result = await _EmiChangeRequestDAL.UpdateEmiChangeRequest(EmiChangeRequestDTO, LoginDTO, tx); } return Result; }, null, BIZTRANSACTIONCLASSCONSTANT.EMICHANGEREQUEST, BizTransactionConstant.EMICHANGEREQUEST, Trans, isNew); await _QueryExecutor.CommitAsync(Trans); if (isNew) { return SuccessResponse.SaveSuccessMessage + EmiChangeRequestDTO.EmiChangeRequestNumber; } else { return SuccessResponse.UpdateSuccessMessage + EmiChangeRequestDTO.EmiChangeRequestNumber; } } catch (Exception) { await _QueryExecutor.RollbackAsync(Trans); throw; } } catch (Exception) { throw; } } public async Task DeleteEmiChangeRequest(int EmiChangeRequestId, LoginDTO LoginDTO) { try { return await _EmiChangeRequestDAL.DeleteEmiChangeRequest(EmiChangeRequestId, LoginDTO); } catch (Exception) { throw; } } } }