using FrameworkDAL.CustomCode.Port; using FrameworkDAL.DTO.GBPeriod; using GB5Shared.Resource.Response; using FrameworkDAL.DTO.Port; using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Validation; using System.ComponentModel.DataAnnotations; namespace FrameworkBLL.Port { public class PortBLL : IPortBLL { private readonly IPortDAL _PortDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; public PortBLL(IPortDAL PortDAL, AutoNumber AutoNumber,IValidation validation) { _PortDAL = PortDAL; _AutoNumber = AutoNumber; _Validation = validation; } public async Task GetPort(int PortId, LoginDTO LoginDTO) { try { return await _PortDAL.GetPort(PortId, LoginDTO); } catch (Exception) { throw; } } public async Task GetSelectListPort(CriteriaDTO criteriaDTO, LoginDTO LoginDTO) { try { return await _PortDAL.GetSelectListPort(criteriaDTO, LoginDTO); } catch (Exception) { throw; } } public async Task SavePort(PortDTO PortDTO, LoginDTO LoginDTO) { if (PortDTO == null) throw new ArgumentNullException(nameof(PortDTO)); AutoNumberDTO? autoNumberDTO = null; try { await _Validation.NotEmpty(PortDTO.PortName, nameof(PortDTO.PortName)); await _Validation.NotEmpty(PortDTO.PortCode, nameof(PortDTO.PortCode)); PortDTO.PortModifiedById = LoginDTO.UserId; PortDTO.PortModifiedOn = DateTime.UtcNow; int initialId = PortDTO.PortId; int count = 1 + initialId; if (initialId == 0) { AutoNumberDTO AutoNumberDTO = await _AutoNumber.GetNumberAsync(1, "PORT", LoginDTO); PortDTO.PortId = AutoNumberDTO.StartNumber; PortDTO.PortCreatedById = LoginDTO.UserId; PortDTO.PortCreatedOn = DateTime.UtcNow; await _PortDAL.SavePort(PortDTO, LoginDTO); return $"{SuccessResponse.SaveSuccessMessage} {PortDTO.PortId}"; } else { await _PortDAL.UpdatePort(PortDTO, LoginDTO); return $"{SuccessResponse.UpdateSuccessMessage} {PortDTO.PortId}"; } } catch (ValidationException vex) { throw new Exception(vex.Message); } catch (Exception) { if (autoNumberDTO != null && PortDTO.PortId > 0) await _AutoNumber.RollbackAutoNumber("PORT", PortDTO.PortId, LoginDTO); throw; } } public async Task DeletePort(int PortId, LoginDTO LoginDTO) { try { return await _PortDAL.DeletePort(PortId, LoginDTO); } catch (Exception) { throw; } } } }