using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; 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 MarketingDAL.CustomCode.LeadSource; using MarketingDAL.DTO.LeadSource; namespace MarketingBLL.LeadSource { public class LeadSourceBLL : ILeadSourceBLL { private readonly ILeadSourceDAL _LeadSourceDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; public LeadSourceBLL(ILeadSourceDAL LeadSourceDAL, AutoNumber AutoNumber, IValidation Validation) { _LeadSourceDAL = LeadSourceDAL; _AutoNumber = AutoNumber; _Validation = Validation; } public async Task GetLeadSource(int LeadSourceId, LoginDTO LoginDTO) { try { return await _LeadSourceDAL.GetLeadSource(LeadSourceId, LoginDTO); } catch (Exception) { throw; } } public async Task GetSelectListLeadSource(CriteriaDTO criteriaDTO, LoginDTO loginDTO) { try { return await _LeadSourceDAL.GetSelectListLeadSource(criteriaDTO, loginDTO); } catch (Exception) { throw; } } public async Task SaveLeadSource(LeadSourceDTO LeadSourceDTO, LoginDTO LoginDTO) { if (LeadSourceDTO == null) throw new ArgumentNullException(nameof(LeadSourceDTO)); AutoNumberDTO? autoNumberDTO = null; try { await _Validation.NotEmpty(LeadSourceDTO.LeadSourceCode, nameof(LeadSourceDTO.LeadSourceCode)); await _Validation.NotEmpty(LeadSourceDTO.LeadSourceName, nameof(LeadSourceDTO.LeadSourceName)); LeadSourceDTO.LeadSourceModifiedById = LoginDTO.UserId; LeadSourceDTO.LeadSourceModifiedOn = DateTime.UtcNow; bool isNew = LeadSourceDTO.LeadSourceId == 0; if (isNew) { int detailCount = LeadSourceDTO.LeadSourceDetailArray?.Count ?? 0; int totalRequired = 1 + detailCount; autoNumberDTO = await _AutoNumber.GetNumberAsync(totalRequired, "LEADSOURCE", LoginDTO); int nextId = autoNumberDTO.StartNumber; LeadSourceDTO.LeadSourceId = nextId++; LeadSourceDTO.LeadSourceCreatedById = LoginDTO.UserId; LeadSourceDTO.LeadSourceCreatedOn = DateTime.UtcNow; if (LeadSourceDTO.LeadSourceDetailArray?.Count > 0) { foreach (var detail in LeadSourceDTO.LeadSourceDetailArray) { detail.LeadSourceDetailId = nextId++; detail.LeadSourceId = LeadSourceDTO.LeadSourceId; } } await _LeadSourceDAL.SaveLeadSource(LeadSourceDTO, LoginDTO); return $"{SuccessResponse.SaveSuccesfullyCode_Name} {LeadSourceDTO.LeadSourceCode}&{LeadSourceDTO.LeadSourceName}"; } else { await _LeadSourceDAL.UpdateLeadSource(LeadSourceDTO, LoginDTO); return $"{SuccessResponse.UpdateSuccessfullyCode_Name} {LeadSourceDTO.LeadSourceCode}&{LeadSourceDTO.LeadSourceName}"; } } catch { if (autoNumberDTO != null && LeadSourceDTO.LeadSourceId > 0) { await _AutoNumber.RollbackAutoNumber("LEADSOURCE", autoNumberDTO.StartNumber, LoginDTO); } throw; } } public async Task DeleteLeadSource(int LeadSourceId, LoginDTO LoginDTO) { try { var detailsResult = await _LeadSourceDAL.DeleteLeadSourceDetail(LeadSourceId, LoginDTO); if (detailsResult <= 0) return $"{ErrorResponse.DeleteNotFoundMessage}"; var parentResult = await _LeadSourceDAL.DeleteLeadSource(LeadSourceId, LoginDTO); if (parentResult <= 0) return $"{ErrorResponse.DeleteNotFoundMessage}"; return $"{SuccessResponse.DeleteSuccessMessage}"; } catch (Exception ex) { throw new Exception($"Error Deleting LeadSource ID {LeadSourceId}", ex); } } } }