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 MMDAL.CustomCode.Specification; using MMDAL.DTO.Specification; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MMBLL.Specification { public class SpecificationBLL : ISpecificationBLL { private readonly ISpecificationDAL _SpecificationDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; public SpecificationBLL(ISpecificationDAL SpecificationDAL, AutoNumber AutoNumber, IValidation Validation) { _SpecificationDAL = SpecificationDAL; _AutoNumber = AutoNumber; _Validation = Validation; } public async Task GetSpecification(int SpecificationId, LoginDTO LoginDTO) { try { return await _SpecificationDAL.GetSpecification(SpecificationId, LoginDTO); } catch (Exception) { throw; } } public async Task GetSelectListSpecification(CriteriaDTO criteriaDTO, LoginDTO LoginDTO) { try { return await _SpecificationDAL.GetSelectListSpecification(criteriaDTO, LoginDTO); } catch (Exception) { throw; } } public async Task SaveSpecification(SpecificationDTO SpecificationDTO, LoginDTO LoginDTO) { if (SpecificationDTO == null) throw new ArgumentNullException(nameof(SpecificationDTO)); AutoNumberDTO? autoNumberDTO = null; try { await _Validation.NotEmpty(SpecificationDTO.SpecificationName, nameof(SpecificationDTO.SpecificationName)); SpecificationDTO.SpecificationModifiedById = LoginDTO.UserId; SpecificationDTO.SpecificationModifiedOn = DateTime.UtcNow; bool isNew = SpecificationDTO.SpecificationId == 0; if (isNew) { int detailCount = SpecificationDTO.SpecificationDetailArray?.Count ?? 0; int totalRequired = 1 + detailCount; autoNumberDTO = await _AutoNumber.GetNumberAsync(totalRequired, "SPECIFICATION", LoginDTO); int nextId = autoNumberDTO.StartNumber; SpecificationDTO.SpecificationId = nextId++; SpecificationDTO.SpecificationCreatedById = LoginDTO.UserId; SpecificationDTO.SpecificationCreatedOn = DateTime.UtcNow; if (SpecificationDTO.SpecificationDetailArray?.Count > 0) { foreach (var detail in SpecificationDTO.SpecificationDetailArray) { detail.SpecificationDetailId = nextId++; detail.SpecificationId = SpecificationDTO.SpecificationId; } } await _SpecificationDAL.SaveSpecification(SpecificationDTO, LoginDTO); return $"{SuccessResponse.SaveSuccess}"; } else { await _SpecificationDAL.UpdateSpecification(SpecificationDTO, LoginDTO); return $"{SuccessResponse.UpdateSuccess}"; } } catch { if (autoNumberDTO != null && SpecificationDTO.SpecificationId > 0) { await _AutoNumber.RollbackAutoNumber("SPECIFICATION", autoNumberDTO.StartNumber, LoginDTO); } throw; } } public async Task DeleteSpecification(int SpecificationId, LoginDTO LoginDTO) { try { var detailsResult = await _SpecificationDAL.DeleteSpecificationDetail(SpecificationId, LoginDTO); if (detailsResult <= 0) return $"{ErrorResponse.DeleteNotFoundMessage}"; var parentResult = await _SpecificationDAL.DeleteSpecification(SpecificationId, LoginDTO); if (parentResult <= 0) return $"{ErrorResponse.DeleteNotFoundMessage}"; return $"{SuccessResponse.DeleteSuccessMessage}"; } catch (Exception ex) { throw new Exception($"Error Deleting Specification ID {SpecificationId}", ex); } } } }