using FrameworkDAL.CustomCode.Address; using FrameworkDAL.CustomCode.TRMAddress; using FrameworkDAL.DTO.Address; using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.ResponseStandard; using System; using System.Threading.Tasks; namespace FrameworkBLL.Address { public class AddressBLL : IAddressBLL { private readonly IAddressDAL _addressDAL; private readonly ITRMAddressDAL _trmAddressDAL; private readonly AutoNumber _autoNumber; public AddressBLL(IAddressDAL addressDAL, ITRMAddressDAL trmAddressDAL, AutoNumber autoNumber) { _addressDAL = addressDAL; _trmAddressDAL = trmAddressDAL; _autoNumber = autoNumber; } public async Task GetAddress(int AddressId, string LanguageId, LoginDTO LoginDTO) { try { if (LanguageId == "EN") { return await _addressDAL.GetAddress(AddressId, LanguageId, LoginDTO); } else { return await _trmAddressDAL.GetTRMAddress(AddressId, LanguageId, LoginDTO); } } catch (Exception ex) { throw new Exception("Error while fetching address details.", ex); } } public async Task GetAddressDetail(int ObjectTypeId, int ObjectId, LoginDTO LoginDTO) { try { return await _addressDAL.GetAddressDetail(ObjectTypeId, ObjectId, LoginDTO); } catch (Exception ex) { throw new Exception("Error while fetching address detail.", ex); } } public async Task GetSelectListAddress(int FirstNumber, int MaxResult, CriteriaDTO criteriaDTO, LoginDTO LoginDTO) { try { return await _addressDAL.GetSelectListAddress(FirstNumber, MaxResult, criteriaDTO, LoginDTO); } catch (Exception ex) { throw new Exception("Error while fetching address select list.", ex); } } public async Task GetSelectListAddressNew(CriteriaDTO criteriaDTO, LoginDTO LoginDTO) { try { return await _addressDAL.GetSelectListAddressNew(criteriaDTO, LoginDTO); } catch (Exception ex) { throw new Exception("Error while fetching new address select list.", ex); } } public async Task SaveAddress(AddressDTO AddressDTO, string LanguageId, LoginDTO LoginDTO) { try { int initialId = AddressDTO.AddressId; int count = 1 + initialId; if (initialId == 0) { if (LanguageId != "EN") throw new Exception("The data must be entered in English for the first time."); AutoNumberDTO autoNumberDTO = await _autoNumber.GetNumberAsync(count, "ADDRESS", LoginDTO); AddressDTO.AddressId = autoNumberDTO.StartNumber; await _addressDAL.SaveAddress(AddressDTO, LanguageId, LoginDTO); return "Address details saved successfully."; } else if (LanguageId == "EN") { await _addressDAL.UpdateAddress(AddressDTO, LoginDTO); return "Address details updated successfully."; } else { int translationCount = await _addressDAL.CountAddress(AddressDTO, LanguageId, LoginDTO); AddressDTO.LanguageId = LanguageId; if (translationCount == 0) { await _trmAddressDAL.SaveTRMAddress(AddressDTO, LoginDTO); return "Address Translation details saved successfully."; } else { await _trmAddressDAL.UpdateTRMAddress(AddressDTO, LoginDTO); return "Address Translation details updated successfully."; } } } catch (Exception ex) { throw new Exception("Error while saving address details.", ex); } } public async Task> DeleteAddress(int AddressId, LoginDTO LoginDTO) { try { var trmResult = await _trmAddressDAL.DeleteTRMAddress(AddressId, LoginDTO); if (!trmResult.IsSuccess) { return Result.Failure("Failed to delete TRM Address. Parent not deleted."); } var addrResult = await _addressDAL.DeleteAddress(AddressId, LoginDTO); if (!addrResult.IsSuccess) { return Result.Failure("TRM Address deleted, but failed to delete Address."); } return Result.Success("Address and TRM Address deleted successfully."); } catch (Exception ex) { throw new Exception("Error while deleting address details.", ex); } } } }