using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; using AdminDAL.CustomCode.Reason; using AdminDAL.DTO.Reason; using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using GB5Shared.ResponseStandard; using GB5Shared.Validation; namespace AdminBLL.Reason { public class ReasonBLL : IReasonBLL { private readonly IReasonDAL _ReasonDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; public ReasonBLL(IReasonDAL IReasonDAL, AutoNumber AutoNumber, IValidation Validation) { _ReasonDAL = IReasonDAL; _AutoNumber = AutoNumber; _Validation = Validation; } public async Task GetReason(int ReasonId, LoginDTO LoginDTO) { try { return await _ReasonDAL.GetReason(ReasonId, LoginDTO); } catch (Exception) { throw; } } public async Task GetSelectListReason(CriteriaDTO criteriaDTO, LoginDTO loginDTO) { try { return await _ReasonDAL.GetSelectListReason(criteriaDTO, loginDTO); } catch (Exception) { throw; } } public async Task SaveReason(ReasonDTO ReasonDTO, LoginDTO LoginDTO) { if (ReasonDTO == null) throw new ArgumentNullException(nameof(ReasonDTO)); AutoNumberDTO? autoNumberDTO = null; try { await _Validation.NotEmpty(ReasonDTO.ReasonCode, nameof(ReasonDTO.ReasonCode)); await _Validation.NotEmpty(ReasonDTO.ReasonName, nameof(ReasonDTO.ReasonName)); ReasonDTO.ReasonModifiedById = LoginDTO.UserId; ReasonDTO.ReasonModifiedOn = DateTime.UtcNow; int count = 1; if (ReasonDTO.ReasonId == 0) { autoNumberDTO = await _AutoNumber.GetAutoNumber(count, "REASON", LoginDTO); ReasonDTO.ReasonId = autoNumberDTO.StartNumber; ReasonDTO.ReasonCreatedById = LoginDTO.UserId; ReasonDTO.ReasonCreatedOn = DateTime.UtcNow; await _ReasonDAL.SaveReason(ReasonDTO, LoginDTO); return $"{SuccessResponse.SaveSuccessMessage} {ReasonDTO.ReasonId}"; } else { await _ReasonDAL.UpdateReason(ReasonDTO, LoginDTO); return $"{SuccessResponse.UpdateSuccessMessage} {ReasonDTO.ReasonId}"; } } catch (ValidationException vex) { throw new Exception(vex.Message); } catch (Exception) { if (autoNumberDTO != null && ReasonDTO.ReasonId > 0) await _AutoNumber.RollbackAutoNumber("REASON", ReasonDTO.ReasonId, LoginDTO); throw; } } public async Task DeleteReason(int ReasonId, LoginDTO LoginDTO) { try { return await _ReasonDAL.DeleteReason(ReasonId, LoginDTO); } catch (Exception) { throw; } } } }